커널은 루트 파티션을 어떻게 마운트합니까?

커널은 루트 파티션을 어떻게 마운트합니까?

내 질문은 별도의 /boot 파티션에서 Linux 시스템을 부팅하는 것에 관한 것입니다. 대부분의 구성 파일이 별도의 / 파티션에 있는 경우 커널은 부팅 시 이를 어떻게 적절하게 마운트합니까?

이에 대한 자세한 설명이 있으면 좋을 것입니다. 뭔가 기본적인 것이 빠진 것 같은 느낌이 듭니다. 제가 가장 중요하게 생각하는 것은 작업의 프로세스와 순서입니다.

감사해요!

편집: 제가 물어봐야 할 것은 루트 커널 매개변수에 사용되는 개발 파일에 대해 더 많은 것입니다. 예를 들어, 루트 매개변수를 root=/dev/sda2로 지정한다고 가정해 보겠습니다. 커널은 /dev/sda2 파일의 매핑을 어떻게 가지고 있습니까?

답변1

고대에는 루트 파일 시스템의 장치 메이저/마이너 번호를 알고 커널에 내장된 모든 장치 드라이버를 초기화한 후 장치를 설치하도록 커널이 하드코딩되어 있었습니다. 이 rdev유틸리티를 사용하면 커널 이미지를 다시 컴파일하지 않고도 커널 이미지의 루트 장치 번호를 수정할 수 있습니다.

결국 부트로더가 나타나고 명령줄을 커널에 전달할 수 있습니다. 인수가 전달 되면 root=내장된 값이 아닌 루트 파일 시스템이 어디에 있는지 커널에 알려줍니다. 액세스가 필요한 드라이버는 여전히 커널에 내장되어야 합니다. 인수는 디렉토리의 일반 장치 노드처럼 보이지만 루트 fs가 마운트되기 전에는 /dev분명히 디렉토리가 없으므로 커널은 그곳에서 개발 노드를 찾을 수 없습니다. /dev대신, 잘 알려진 특정 장치 이름이 커널에 하드코딩되어 문자열이 장치 번호로 변환될 수 있습니다. 따라서 커널은 와 같은 것을 인식할 수 있지만 볼륨 UUID와 같은 더 이국적인 것은 인식 /dev/sda1할 수 없습니다 ./dev/mapper/vg0-root

나중에 initrd사진에 등장합니다. 부트로더는 initrd일종의 압축된 파일 시스템 이미지인 커널과 함께 이미지를 로드합니다(gzip으로 압축된 ext2 이미지, gzip으로 압축된 romfs 이미지, squashfs가 결국 지배적임). 커널은 이 이미지를 램디스크로 압축을 풀고 램디스크를 루트 fs로 마운트합니다. 이미지에는 실제 것보다 몇 가지 추가 드라이버와 부팅 스크립트가 포함되어 있습니다 init. 이러한 부팅 스크립트는 하드웨어를 식별하고, RAID 어레이 및 LVM과 같은 항목을 활성화하고, UUID를 감지하고, 실제 루트 디렉터리를 찾기 위해 커널 명령줄을 구문 분석하는 등 다양한 작업을 수행합니다. 이제 UUID, 볼륨 레이블 및 기타 고급 콘텐츠를 통해 루트 디렉터리를 지정할 수 있습니다. 그런 다음 실제 루트 파일 시스템을 여기에 마운트하고 시스템 호출을 /initrd수행하여 pivot_root커널을 교체 한 다음 /실제 루트에서 exec를 수행한 다음 램디스크를 마운트 해제하고 해제합니다./initrd/sbin/init/initrd

마지막으로 오늘 우리는 이것을 가지고 있습니다 initramfs. 이것은 비슷 initrd하지만 램디스크에 로드된 압축 파일 시스템 이미지 대신 압축된 cpio 아카이브입니다. tmpfs를 루트로 마운트하고 거기에 아카이브를 추출합니다. pivot_root더티 해킹으로 간주되는 것을 사용하는 대신 부팅 스크립트는 initramfs실제 루트 디렉토리를 마운트하고 /roottmpfs 루트 디렉토리의 모든 파일을 삭제한 다음 chroot단계적으로 실행 /root하고 를 실행합니다 /sbin/init.

답변2

Linux는 원래 부팅을 위해 램디스크( initrd"INITial RamDisk"라고 함) 를 사용했습니다 /. 이 디스크에는 실제 루트 파티션(필요한 드라이버 및 파일 시스템 모듈 포함)을 찾을 수 있는 충분한 공간이 있습니다. 의 임시 마운트 지점에 루트 파티션을 마운트한 다음 실제 루트 파일 시스템이 에 있는 동안 편집할 위치 에 있도록 루트 및 임시 마운트 지점을 교환하도록 initrd호출합니다 .pivot_root(8)initrdumount/

답변3

/etc의 구성 파일에 액세스하지 않고 커널이 어떤 파티션이 루트 파티션인지 "알는" 방법을 묻는 것 같습니다.

커널은 다른 프로그램과 마찬가지로 명령줄 인수를 받아들일 수 있습니다. GRUB 또는 대부분의 다른 부트 로더는 명령줄 인수를 사용자 입력으로 받아들이거나 이를 저장하고 메뉴를 통해 다양한 명령줄 인수 조합을 제공할 수 있습니다. 부트로더는 커널을 로드할 때 명령줄 인수를 커널에 전달합니다(이 규칙의 이름이나 메커니즘은 모르지만 응용 프로그램이 실행 중인 커널의 호출 프로세스로부터 명령줄 인수를 받는 방법과 비슷할 것입니다).

이러한 명령줄 옵션 중 하나는 root루트 파일 시스템(예: root=/dev/sda1.

커널이 initrd를 사용하는 경우 부트로더는 커널에 위치를 알려주거나 initrd를 표준 메모리 위치에 배치하는 역할을 합니다. (제 생각에는) 이것이 적어도 내 Guruplug에서 작동하는 방식입니다.

하나를 지정하지 않고 루트 파일 시스템을 찾을 수 없다고 불평하기 시작하자마자 커널 패닉이 발생하는 것은 전적으로 가능합니다.

이 옵션을 커널에 전달하는 다른 방법이 있을 수 있습니다.

답변4

어서, GRUB은 /boot를 "마운트"하지 않고 "menu.lst"와 일부 모듈만 읽을 뿐이며 LINUX 커널의 일부도 아닙니다. 커널을 호출할 때 루트 파티션과 함께 "루트" 인수를 전달합니다. 최악의 경우 커널은 /boot가 설치되어 있다는 것만 알고 있습니다(웃음).

다음: geekosaur가 옳습니다. Linux는 초기 램디스크에 압축된 이미지 형식을 사용한 다음 pivot_root. 따라서 Linux는 이미지에서 실행을 시작한 다음 로컬 디스크 드라이브에서 실행됩니다.

관련 정보