initrd가 마운트 해제되면 initrd가 마운트한 디렉터리의 파일은 어떻게 되나요?

initrd가 마운트 해제되면 initrd가 마운트한 디렉터리의 파일은 어떻게 되나요?

Linux가 부팅되면 initrd부팅 프로세스를 추가로 지원하는 데 필요한 기본 지원 파일과 커널 모듈이 설치됩니다. Linux 운영 체제에서의 후속 rootfs설치 및 제거 . initrd제 질문은 initrd마운트 해제된 경우 사용자가 어떻게 마운트된 파일을 계속 볼 수 있느냐는 것 initrd입니다.

예를 들면 다음과 같습니다 . /etc등 의 일부 파일/lib

답변1

그런 다음 Linux 운영 체제에서 rootfs가 마운트되고 initrd가 제거됩니다.

정확히 "제거 가능"하지는 않습니다. 대부분의 Linux 배포판은 설치 가능한 initrd를 사용하지 않습니다.년도.대신 그들은 얻을 수 있는 아카이브인 "initramfs"를 사용합니다.추출됨원래 "/"에 마운트된 RAM 파일 시스템(tmpfs)을 입력합니다. 이 initrd=옵션이 여전히 지정되어 있지만 동작은 원래 initrd 메커니즘과 완전히 다릅니다.

내 질문은 initrd를 제거할 때 왜 /etc, /lib, /bin, /usr, .. 디렉토리와 그 내용이 여전히 존재하는가입니다.

initramfs의 관점에서 볼 때 실제로는 "/etc" 또는 "/lib"가 아니기 때문입니다. initramfs"/"를 직접 마운트하지 마십시오.- initramfs그 자체"/" - 대신 "/mnt" 또는 "/newroot"와 같은 위치에 실제 루트 파일 시스템을 마운트하므로 이러한 디렉토리는"/newroot/lib" 등으로 시작합니다.

initramfs가 완료한 마지막 단계 중 하나는 "pivot_root()" 또는 "mount(MS_MOVE)"입니다."/newroot"를 새로운 "/"로 만듭니다., 본질적으로 두 개의 마운트를 교체합니다(이전 "/", 즉 initramfs는 하위 마운트로 이동됩니다).

initramfs에서 추출된 최소 "/bin", "/etc" 및 "/lib"하다그 과정에서 사라집니다.

즉, 프로세스는 대략 다음과 같습니다.

  1. 커널은 에 빈 tmpfs를 마운트합니다 /.
  2. 커널은 initramfs.cpio 아카이브를 //bin, /lib 등에 최소한의 파일이 포함된 메모리에 압축을 풉니다.
  3. 커널은 /initinitramfs의 "코어"를 실행합니다.
  4. initramfs /init 스크립트는 커널 명령줄에서 "root="를 읽고(또는 다른 방법을 사용하여) 실제 루트 파일 시스템을 /newroot유사한 위치에 마운트합니다. 이 시점에서 파일은 /newroot/lib, /newroot/home 등에 있습니다.
  5. initramfs는 "/newroot/run"의 tmpfs나 "/newroot/usr"의 NFS 기반 /usr과 같이 /newroot 아래에 필요한 다른 항목을 선택적으로 설치할 수 있습니다.
  6. initramfs /init는 다음 두 가지 방법 중 하나로 /newroot사용될 수 있다고 생각합니다 ./
    • initramfs "/"로 추출된 모든 파일을 삭제한 다음행동"/newroot"를 "/"에 마운트하고(지금은 비어 있는 tmpfs를 덮어쓰고 영원히 유지됨) chroot()를 사용하여 영구적으로 만듭니다. 이것은 Arch Linux의 initramfs가 switch_root 도구를 사용하여 수행하는 작업입니다.
    • 또는ivot_root()를 호출하여 initramfs/를 /newroot로 "교환"하고 후자를 new/로 변환한 다음 initramfs를 /run/initramfs와 같은 위치로 이동한 다음 마운트 해제할 수 있습니다. 이 방법이 여전히 사용되는지 확실하지 않습니다.
  7. 마지막으로, 이제 "/"가 실제 루트이므로 /init(여전히 메모리에서 실행 중)는 실제 루트 파일 시스템을 실행합니다 /sbin/init.

일반적으로 initramfs /init는 간단한 쉘 스크립트입니다(항상 그런 것은 아니지만 systemd의 전체 복사본일 수도 있음). 당신은 볼 수 있습니다아키텍처 mkinitcpio /init. 이는 내부적으로 "overlay using mount(MS_MOVE)" 방법을 사용합니다.루트 디렉터리 전환유틸리티 리눅스에서.

관련 정보