![initramfs에서 새 루트로의 Hub_root - "잘못된 인수" 오류](https://linux55.com/image/136817/initramfs%EC%97%90%EC%84%9C%20%EC%83%88%20%EB%A3%A8%ED%8A%B8%EB%A1%9C%EC%9D%98%20Hub_root%20-%20%22%EC%9E%98%EB%AA%BB%EB%90%9C%20%EC%9D%B8%EC%88%98%22%20%EC%98%A4%EB%A5%98.png)
initramfs rootfs에서는 ivot_root를 사용할 수 없으며 잘못된 매개변수를 받게 됩니다. 실제 파일 시스템만 교체할 수 있습니다.
물론:
- Fedora Linux 28 -
dracut
initramfs 사용. rd.break
커널 명령줄에 옵션을 추가하여 initramfs 셸로 부팅합니다.cd /sysroot
usr/bin/pivot_root . mnt
-> 값 pivot_root
에 해당하는 "잘못된 매개변수"로 인해 실패합니다 .errno
EINVAL
이에 대한 설명은 없습니다 man 2 pivot_root
.
EINVAL
put_old아래는 아니고새로운 뿌리.
왜 실패했나요? 다음 댓글 작성자는 "그렇다면 Linux는 초기 사용자 공간을 어떻게 종료할 것인가?"라고 대답했습니다.
답변1
Linux와 달리 initrd
Linux는 제거를 허용하지 않습니다 initramfs
. 이는 분명히 커널 코드를 단순하게 유지하는 데 도움이 됩니다.
pivot_root
대신 이 명령을 사용할 수 있습니다 switch_root
. 다음 프로세스를 수행합니다. 이렇게 하면 switch_root
initramfs 메모리를 확보하기 위해 이전 루트 디렉터리의 모든 파일이 삭제되므로 이 명령을 실행할 위치에 주의해야 합니다.
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
이므로 이 경우는 향후 버전에서 언급될 것입니다.