initramfs에서 새 루트로의 Hub_root - "잘못된 인수" 오류

initramfs에서 새 루트로의 Hub_root - "잘못된 인수" 오류

initramfs rootfs에서는 ivot_root를 사용할 수 없으며 잘못된 매개변수를 받게 됩니다. 실제 파일 시스템만 교체할 수 있습니다.

물론:

  1. Fedora Linux 28 - dracutinitramfs 사용.
  2. rd.break커널 명령줄에 옵션을 추가하여 initramfs 셸로 부팅합니다.
  3. cd /sysroot
  4. usr/bin/pivot_root . mnt

-> 값 pivot_root에 해당하는 "잘못된 매개변수"로 인해 실패합니다 .errnoEINVAL

이에 대한 설명은 없습니다 man 2 pivot_root.

EINVAL put_old아래는 아니고새로운 뿌리.

왜 실패했나요? 다음 댓글 작성자는 "그렇다면 Linux는 초기 사용자 공간을 어떻게 종료할 것인가?"라고 대답했습니다.

답변1

Linux와 달리 initrdLinux는 제거를 허용하지 않습니다 initramfs. 이는 분명히 커널 코드를 단순하게 유지하는 데 도움이 됩니다.

pivot_root대신 이 명령을 사용할 수 있습니다 switch_root. 다음 프로세스를 수행합니다. 이렇게 하면 switch_rootinitramfs 메모리를 확보하기 위해 이전 루트 디렉터리의 모든 파일이 삭제되므로 이 명령을 실행할 위치에 주의해야 합니다.

initramfs는 rootfs입니다. rootfs를 피봇루트하거나 마운트 해제할 수 없습니다. 대신, rootfs의 모든 항목을 삭제하여 공간을 확보하고(-xdev / -exec rm '{}' ';' 찾기), rootfs를 새 루트로 덮어쓰고(cd /newmount; mount --move . /; chroot .), stdin /stdout/stderr 새 /dev/console에 연결하고 새 초기화를 실행합니다.

제안된 셸 명령은 C 코드에서만 대략적으로 동일합니다. 이 명령이 모두 쉘에 내장되어 있지 않으면 실제로 작동하지 않습니다. 첫 번째 명령은 initramfs :-)에서 모든 프로그램과 기타 파일을 제거하기 때문입니다.


Rootfs는 2.6 시스템에 항상 존재했던 ramfs(또는 활성화된 경우 tmpfs)의 특수 인스턴스입니다. rootfs를 마운트 해제할 수 없는 이유는 init 프로세스를 종료할 수 없는 것과 거의 같습니다. 빈 목록을 확인하고 처리하기 위해 특수 코드를 사용하는 대신 커널은 특정 목록이 종료되지 않도록 더 작고 간단하게 보장할 수 있습니다. 텅 비게 된다.

https://github.com/torvalds/linux/blob/v4.17/Documentation/filesystems/ramfs-rootfs-initramfs.txt

답변2

fs/namespace.c의 ivot_root 시스템 호출에 대한 설명:

또한 현재 루트 디렉터리는 "rootfs"(초기 ramfs) 파일 시스템에 있을 수 없습니다. 바라보다문서/파일 시스템/ramfs-rootfs-initramfs.txt 이 상황에서 대안.

나는 제출했다이에 대한 매뉴얼 페이지 프로젝트 패치man 2 pivot_root이므로 이 경우는 향후 버전에서 언급될 것입니다.

관련 정보