나는 알고 싶다:
initrd
부팅 프로세스의 첫 번째 부분에 사용하고 pivot_root
실제 디스크에 루트를 배치하는 목적은 무엇입니까? 왜 디스크에 있는 것을 사용하지 않는 걸까요?
답변1
왜 디스크에 있는 것을 사용하지 않는 걸까요?
당신은 할 수 있습니다. initrd(또는 커널 2.6.13 이후 더 새롭고 널리 사용되는 버전인 initramfs)를 사용할 필요가 없습니다.
이를 사용하는 이유는 배포 커널이 일반적이고 즉시 사용 가능한 광범위한 하드웨어를 지원해야 하기 때문입니다. 루트 파일 시스템을 마운트하는 데 중요한 여러 하드웨어용 드라이버 중 일부는 상호 배타적일 수 있지만(확실하지는 않습니다), 그럼에도 불구하고 모든 가능성을 구축하면(사용자가 해야 할 일) 매우 큰 커널에 차이가 생길 것입니다.
따라서 드라이버는 커널에 내장되어 있지 않고 별도의 바이너리 모듈에 위치합니다. 이는 initramdfs/initrd의 주요 페이로드입니다. 이를 통해 커널은 루트 파일 시스템을 올바르게 마운트할 수 있도록 적절한 하드웨어 드라이버를 로드할 수 있습니다.
답변2
initrd가 나타나기 전에는 루트 파일 시스템으로 사용할 파티션의 장치 이름을 커널 명령줄에 전달해야 했습니다. 커널에는 이 이름을 구문 분석하고 일부 공통 문자열을 인식하여 이를 잘 알려진 dev_t
숫자 로 변환하는 특별한 일회성 코드가 있습니다 . 즉, 커널은 내부적으로 장치를 단순히 배열의 숫자 인덱스로 이해하고 장치를 마운트하려면 장치 번호를 알아야 합니다.
플러그 앤 플레이와 핫 플러그가 등장하기 전에는 시스템에 항상 존재하는 디스크가 한두 개만 있을 때 이 접근 방식이 제대로 작동했습니다. 루트 파일 시스템이 그렇다면 /dev/hda1
항상 그렇습니다. 그러나 플러그 앤 플레이의 출현으로 인해 이 문제가 덜 중요해졌습니다. 요즘에는 내부 디스크 드라이브, USB, iCSI 등이 12개 있을 수 있으며 부팅 시간을 개선하기 위해 병렬로 검색되므로 장치 이름이 먼저 응답하는 장치에 따라 변경될 수 있습니다. 이는 커널을 의미합니다. 명령줄이 쉽게 잘못되어 부팅할 수 없게 됩니다.
이 문제를 해결하기 위해 UUID가 도입되었습니다. sda인지 sde인지 UUID로 장치를 지정하면 항상 올바른 드라이브가 검색됩니다. 그러나 이를 위해서는 실제로 드라이브를 살펴봐야 하며 단순한 정적 이름-> dev_t
커널 부팅 코드 매핑보다 더 복잡합니다. 우리는 커널이 이렇게 복잡한 상황에 적합하지 않다고 판단하여 initrd가 탄생했습니다. 올바른 루트 장치를 식별하고 설치하는 데 필요한 모든 유틸리티가 있을 수 있습니다. 또한 네트워크를 가동하고 nfs 또는 iSCSI 루트에 액세스하기 위해 DHCP 임대를 얻는 등 임의로 복잡한 작업을 수행할 수도 있습니다. initrd가 필요한 다른 사항으로는 raid 설정, lvm 또는 디스크 액세스 암호화 등이 있습니다.
답변3
착란그것은 완벽하게 요약됩니다. 초기 가상 디스크(또는초기화 프로그램) 예임의로 선택할 수 있는. 이는 /usr
모범 사례로 광고되었던 별도의 파일 시스템에 있는 경우와 같은 일부 경우에 필요합니다 .
반품,체계, 많은 Linux 배포판에서 발견되며,/usr
시작 시 사용할 수 있어야 합니다 .. 그렇지 않으면 다음을 제공해야 합니다.초기화 프로그램/usr
실제 루트로 전환하기 전에 올바르게 마운트된 루트 파일 시스템을 준비하십시오.
아름다운 스플래시 화면을 갖추려면초기화 프로그램. 모든 최신 주요 배포판은 부팅 시 악명 높은 로그 메시지 스트림 대신 부팅 스플래시 화면을 제공합니다.
답변4
initrd의 임무는 실제 루트 장치를 사용 가능하게 만들고 해당 장치로 전환하는 것입니다. 실제 루트 장치는 (예를 들어) 하드 드라이브의 파티션, 네트워크의 nfs 공유, USB 스틱의 파일 시스템, 의사 파일 시스템 등이 될 수 있습니다.
거의 모든 initrd에는 이라는 루틴이 있습니다 mountroot
. 이것은 올바른 루트 파일 시스템을 검색하고 이를 마운트하는 기능입니다(보통 /root
initrd 자체에(루트의 홈 디렉토리와 혼동하지 마십시오)).
부팅 관리자는 커널과 initrd가 있는 디스크(또는 어디든)의 올바른 위치를 가리켜야 합니다. 커널이 실행되고 initrd가 시스템 RAM으로 직접 압축 해제됩니다. /
일반적으로 initrd 라는 스크립트가 있습니다 init
. 의사 파일 시스템(sysfs, procfs, dev...)이 마운트되는 부분입니다. (를 통해) 액세스할 수 있는 일부 환경 변수도 있습니다( /proc/cmdline
예 debug
: , break
, ...).
루트 파일 시스템이 마운트되면 스크립트가 정리되고 새 루트로 전환됩니다. 그러면 이 프로세스는 /sbin/init
이전 init-scripts pid인 pid 번호 1을 대체합니다. 그 이후로 나머지 부팅 프로세스를 완료하기 위한 다양한 메커니즘(upstart, SysVinit, systemd)이 있습니다.