언제 switch_root에서 pivot_root를 사용 하시겠습니까?


19

nfs 대신 ceph를 통해 시스템을 네트워크 부팅하기 위해 Linux init 프로세스를 더 잘 이해하고 싶습니다.

이 과정에서 나는 두 가지 형태의 스위칭 루트를 발견했습니다. 하나는 switch_root이고 다른 하나는 pivot_root입니다. 이 스크립트는 pxe 부팅 프로세스를 사용하여 tftp를 통해 얻은 메모리 파일 시스템 (initramfs)에서 실행됩니다.

언제 다른 것을 사용 하시겠습니까? 나는 두 개의 init 스크립트에서 모두 루트에 배치 된 것을 보았습니다.

답변:


16

나는 여기서 훌륭한 설명을 발견했다 . 그러나 대답에서 이해 한 것의 짧은 형식을 시도해 보겠습니다.

더 짧은 버전

  1. 시스템이 부팅되는 동안 초기 사용자 공간이 필요합니다. initramfs 또는 initrd를 사용하여 달성 할 수 있습니다.
  2. initrd실제 FILE SYSTEM 인 ramdisk에로드됩니다 .
  3. 다시 initramfs는 것입니다 하지 파일 시스템 .
  4. 들어 initrd를 pivot_root 사용하고 위해 initramfs에 switch_root 사용됩니다.

더 긴 버전

이제 위에서 언급 한 내용에 대해 자세히 설명하겠습니다.

initramfs와 initrd는 같은 목적으로 사용되지만 두 가지 차이점이 있습니다. 가장 분명한 차이점은 initrd가 램 디스크에로드된다는 것입니다. 램 디스크에 마운트 된 실제 파일 시스템 (일반적으로 ext2)으로 구성됩니다. 반면에, initramfs는 파일 시스템이 아닙니다. tmpfs로 압축 해제 된 (압축 된) cpio 아카이브 (newc 유형)입니다. 이로 인해 initramfs가 initrd보다 조금 더 최적화되어 커널 부트 프로세스에서 조금 일찍로드 될 수있는 부작용이 있습니다. 또한 커널은 미리 정의 된 램 디스크 크기에 의존하지 않고 실제로로드 된 것에 맞게 tmpfs의 크기를 조정할 수 있기 때문에 메모리의 initramfs 크기는 더 작습니다.

또 다른 부작용 차이점이 있습니다. 루트 장치 (및 장치 전환) 처리 방법. initrd는 램으로 압축 해제 된 실제 파일 시스템이므로 루트 장치는 실제로 램 디스크 여야합니다. initramfs에는 initramfs가 압축 해제 된 tmpfs가되는 커널 "rootfs"가 있습니다 (커널이 initramfs를로드하는 경우 rootfs는 단순히 root = kernel boot 매개 변수를 통해 지정된 파일 시스템 임). 이 임시 rootfs는 root = boot 매개 변수로 지정해서는 안됩니다 (연결된 장치가 없기 때문에 그렇게 할 수있는 방법이 없습니다). 이것은 initramfs를 사용할 때 여전히 실제 루트 장치를 커널로 전달할 수 있음을 의미합니다. initrd를 사용하면 실제 루트 장치가 무엇인지 처리해야합니다. 또한 "진짜"이후 initrd를 가진 루트 장치는 램 디스크이고, 커널은 하나의 실제 장치 (램 디스크)에서 다른 장치 (실제 루트)로 루트 장치를 사용해야합니다. initramfs의 경우, initramfs 공간 (tmpfs)은 실제 장치가 아니므로 커널은 실제 장치를 전환하지 않습니다. 따라서 pivot_root 명령은 initrd와 함께 사용되지만 initramfs에는 다른 명령을 사용해야합니다. Busybox는이를 위해 switch_root를 제공하고 klibc는 new_root를 제공합니다. initramfs에는 다른 명령을 사용해야합니다. Busybox는이를 위해 switch_root를 제공하고 klibc는 new_root를 제공합니다. initramfs에는 다른 명령을 사용해야합니다. Busybox는이를 위해 switch_root를 제공하고 klibc는 new_root를 제공합니다.


2
나는 pivot_root과거에 initramfs에 사용 switch_root했지만 그 당시에는 존재하지 않았습니다. switch_root의 편리한 방법이 될 것으로 보인다 pivot_root좀 더 정리도 이동 않는 /proc /sys/dev등뿐 아니라 루트 자체
다니엘 알더

2
initramfs rootfs에서 pivot_root를 사용할 수 없습니다. Invalid Argument가 발생합니다. 실제 파일 시스템 만 피벗 할 수 있습니다.
TiCPU

@TiCPU 그렇다면 리눅스는 어떻게 초기 사용자 공간을 빠져 나 갑니까?
Melab

제공된 솔루션이 잘못된 것 같습니다. Linus 자신은 pivot_root () 또는 chroot ()가 현재 프로세스 참조를 변경한다고 말합니다 /. 내 이해에서 그것은 어떤 경로가 될 수 있으며 실제 "디스크"와 관련이 없습니다.
erikbwork

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.