최근 온라인 과정에서 RHEL/CentOS 강사는 다음을 언급했습니다.
그런 다음 부트로더는 커널을 실행합니다. 커널 단계에서 커널은 램디스크를 메모리에 로드합니다. 이 램디스크는 임시 루트 파일 시스템으로 사용됩니다. 이 파일 시스템에는 커널 모듈, 드라이버 및 시작 파일도 포함됩니다.그런 다음 커널은 램디스크를 마운트 해제하고 루트 파일 시스템을 하드 디스크에 마운트합니다.그런 다음 첫 번째 프로세스를 실행하여 초기화 단계를 시작합니다. 초기화 단계에서는 상위 프로세스가 실행됩니다. 이전 버전의 Red Hat에서는 이것이 Init 프로세스였습니다.
이것은 나에게 거꾸로 보인다. 커널에는 전체 프로세스 중에 사용 가능한 일부 파일 시스템이 필요하지 않습니까? 위에서 강조 표시된 줄은 파일 시스템이 전혀 실행되지 않았던 짧은 순간이 있었음을 나타냅니다.
답변1
부트로더가 램디스크[...]를 제거합니까?
아니요.
그런 다음 커널은 램디스크를 마운트 해제하고 루트 파일 시스템을 하드 디스크에 마운트합니다. 그런 다음 첫 번째 프로세스를 실행하여 초기화 단계를 시작합니다.
이것은 잘못된 것입니다.
initramfs에는 이라는 프로그램이 포함되어 있습니다 /init
. 프로그램이 실행되고 첫 번째(사용자) 프로세스입니다.initramfs가 여전히 존재하지만. 실제로 진행 중인 제거를 유발하는 것은 바로 이 프로그램입니다.
/init
Debian 9 Linux에서 사용되는 프로그램 입니다 .. 페도라에는Dracut이라는 유사한 시스템. 보시다시피 스크립트는 모듈을 로드하고, 후크를 실행하고, 최종 루트 파일 시스템을 마운트하고, 마지막으로 run-init
klibc-utils 패키지의 프로그램으로 자신을 덮어씁니다. (이전 버전이 사용되었거나 사용 가능한 콘텐츠를 기반으로 run-init
함 switch_root
) Dracut은 아직 사용 중입니다.switch_root
. 이때 드라캇완전한 systemd-udevd
하위 시스템이 생성되었습니다.장치를 실행 및 자동으로 감지하고, 해당 장치에 대한 데몬을 실행하고, 볼륨을 마운트합니다. DASD에 의해 생성된 데몬은 systemd-udevd
계속해서 병렬로 실행됩니다 switch_root
.
프로그램run-init
그런 다음 initramfs의 내용을 삭제하고 새 루트 파일 시스템에 자신을 추가한 후 chroot
열고 해당 파일 시스템에 있는 프로그램으로 덮어씁니다./dev/console
init
init
, 커널 명령줄에 이름이 지정된 변수를 사용하거나/init
첫 번째 프로그램에서 가정한 이 변수의 기본값. switch_root
약간의 차이는 있지만 효과는 거의 동일합니다. Dracut은 init
프로그램 이름을 전달합니다.커널 명령줄에서도 가져옵니다..
보시다시피,어느 것도 아니다핵심...도 아니다부트로더는 이들 중 하나를 트리거합니다. 프로그램이 /init
프로세스 #1로 시작되면 부트로더는 완전히 사라지고 커널은 해당 /init
프로그램, 즉 생성된 후크의 프로그램, 그리고 다른 두 프로그램을 덮어쓰기만 하면 됩니다.
이 없습니다아니요이 프로세스 중에는 /init
프로세스 #1이 initramfs의 프로그램을 사용하여 시작되는 순간부터 파일 시스템이 마운트될 수 없습니다. 항상 하나 이상의 프로세스가 실행되고 있으며 해당 프로세스에는 작업 디렉터리, 루트 디렉터리 및 프로그램 이미지 파일이 있어야 하며, 모두 마운트된 볼륨의 vnode를 참조해야 합니다.어딘가에.
원본 initramfs는 마지막 마운트 지점이 이동되고 이를 사용하는 마지막 프로세스(예: 각 프로세스의 현재 디렉터리, 각 프로세스의 루트 디렉터리 또는 프로그램 이미지 파일)가 사라질 때만 존재한다는 것을 알 수 있습니다. 또는 마찬가지로 run-init
작업 switch_root
디렉터리와 루트 디렉터리를 다른 볼륨으로 전환하고 다른 볼륨에 있는 파일의 프로그램 이미지로 자신을 덮어씁니다. systemd 사람들은 시스템 수명 동안 여전히 존재하는 해당 볼륨의 이미지에서 실행되는 프로그램이 있기 때문에 initramfs가 실제로 전혀 사라지지 않을 가능성을 고려했습니다.
따라서 실제로 일어나는 일은 원래 initramfs와 최종 루트 파일 시스템이 모두둘 다프로세스의 특정 시점에 존재했으며 실제로 그 이후였을 수도 있습니다. 한 지점에서 멀리 떨어져 있다영루트 파일 시스템에는 점이 있습니다.많은 종류의루트 파일 시스템인 경우 (initramfs에 대한 참조가 사라지면서) 다시 1로 떨어집니다. ( , , , 및 /proc
의 파일 시스템은 /runtime에 존재하므로/sys
/dev
/run
/dev/shm
/dev/pts
run-init
switch_root
모두마운트된 파일 시스템(루트 및 기타)의 수는 부팅 프로세스 전체에서 항상 2보다 훨씬 높습니다. )
추가 읽기
- 하랄드 회이어(2013-10).델라쿠르. 버전 3.0. kernel.org.
- Lennart Petlinget al. (2013). 루트 파일 시스템을 위한 systemd 및 스토리지 데몬. freedesktop.org.
답변2
실행 중인 커널은필요파일 시스템은 구성해야 하는 네트워크 인터페이스의 범위를 넘어서 마운트됩니다. 물론 파일 시스템(또는 프로세스와 같이 커널에서 실행되는 일부 코드 init
)이 임시 rootfs에서 다음으로 이동하는 동안 해당 파일을 적극적으로 사용하지 않는 한 진짜 루트FS.
커널이 처음 부팅된 시점부터 initrd가 설치될 때까지(또는 initrd를 사용하지 않는 경우 실제 rootfs) 커널에 파일 시스템이 마운트되지 않는다는 점을 기억하십시오. 이는 초기 하드웨어 감지와 장치 및 드라이버 초기화 후 얼마 후에 발생합니다.