nfs 네트워크가 아닌 ceph를 통해 시스템을 부팅하기 위해 Linux init 프로세스를 더 잘 이해하고 싶습니다.
이 과정에서 저는 두 가지 형태의 루트 전환을 만났습니다. 하나는 스위치루트(switch_root)라고 하고 다른 하나는 피봇루트(pivot_root)라고 합니다. 이러한 스크립트는 pxe 부팅 프로세스를 사용하여 tftp를 통해 얻은 메모리 내 파일 시스템(initramfs)에서 실행됩니다.
언제 다른 것을 사용 하시겠습니까? 루트 디렉토리에 있는 일부 초기화 스크립트에서 둘 다 사용되는 것을 본 적이 있습니다.
답변1
멋진 설명을 찾았습니다여기. 그러나 답변에 대한 나의 이해를 더 짧은 형식으로 표현해 보겠습니다.
더 짧은 버전
- 시스템이 부팅되면 초기 사용자 공간이 필요합니다. initramfs 또는 initrd를 사용하여 구현할 수 있습니다.
- 초기화 프로그램램디스크에 로드되었습니다실제이다 파일 시스템.
- 파일 시스템 초기화예아니요ㅏ파일 시스템.
- ~을 위한초기화 프로그램
pivot_root
사용파일 시스템 초기화switch_root
사용된.
확장 버전
이제 위에서 말한 내용을 자세히 설명하겠습니다.
initramfs와 initrd는 동일한 목적으로 사용되지만 두 가지 차이점이 있습니다. 가장 분명한 차이점은 initrd가 램디스크에 로드된다는 것입니다. 램디스크에 마운트된 실제 파일 시스템(보통 ext2)으로 구성됩니다. 반면에 initramfs는 파일 시스템이 아닙니다. 이는 tmpfs에 압축이 풀린 (압축된) cpio 아카이브(newc 유형)입니다. 이는 initramfs가 더 최적화되어 initrd보다 커널 부팅 프로세스에서 더 일찍 로드될 수 있다는 부작용이 있습니다. 또한 커널은 미리 정의된 램디스크 크기에 의존하는 대신 실제로 로드된 내용을 기반으로 tmpfs의 크기를 조정할 수 있고 램디스크가 계속 사용되는 동안 사용한 램을 정리할 수 있기 때문에 메모리 내 initramfs의 크기가 더 작습니다( ivot_root 구현 세부 사항으로 인해).
부작용으로 인한 또 다른 차이점은 루팅된 장치를 처리하는 방법(그리고 해당 장치로 전환하는 방법)입니다. initrd는 RAM에 압축이 풀린 실제 파일 시스템이므로 루트 장치는 실제로 램디스크여야 합니다. initramfs의 경우 initramfs가 압축을 푸는 tmpfs가 되는 커널 "rootfs"가 있지만(커널이 initramfs를 로드하는 경우, 그렇지 않은 경우 rootfs는 root= 커널 부팅 매개변수를 통해 지정된 파일 시스템일 뿐입니다), 이 임시 rootfs는 그렇지 않아야 합니다. root= 부팅 매개변수로 지정됩니다(연결된 장치가 없기 때문에 이를 수행할 방법이 없습니다). 이는 initramfs를 사용할 때 실제 루트 장치를 커널에 전달할 수 있음을 의미합니다. initrd를 사용하면 실제 루트 장치를 직접 처리해야 합니다. 또한 initrd가 있는 "실제" 루트 장치는 램디스크이므로 커널은 실제로 루트 장치를 하나의 실제 장치(램디스크)에서 다른 장치(실제 루트 장치)로 전환해야 합니다. initramfs의 경우 initramfs 공간(tmpfs)은 실제 장치가 아니므로 커널은 실제 장치를 전환하지 않습니다. 따라서ivot_root 명령은 initrd와 함께 사용되지만 initramfs에는 다른 명령을 사용해야 합니다. Busybox는 이 작업을 수행하기 위해 switch_root를 제공하고 klibc는 new_root를 제공합니다.
답변2
pivot_root
어떤 목적으로 원래 루트를 보존하려는 경우에 사용됩니다. pivot_root
두 개의 장착 지점을 바꿉니다.
switch_root
원래 루트를 버리고 싶을 때 사용됩니다. switch_root는 chroot
공통 마운트 지점(/dev, /proc, /sys 등)을 새 루트 디렉터리로 이동하고 이전 루트 디렉터리의 모든 항목을 삭제하려고 시도하는 데코레이션입니다 .
개념적으로 를 사용한 pivot_root
다음 설치 이동 및 제거를 직접 수행하는 것은 를 사용하는 것과 기능적으로 동일합니다 switch_root
.
또한 중요: pivot_root
initramfs와 함께 사용할 수 없습니다.