커널은 루트 파티션을 어떻게 마운트합니까? 커널은 부팅시 어떻게 올바르게 마운트합니까? 이것에 대한 모든

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

이것에 대한 모든 정교함이 좋을 것입니다. 마치 기본적인 것이 빠진 것 같은 느낌이 듭니다. 나는 주로 프로세스와 작업 순서에 관심이 있습니다.

감사!

편집 : 내가 물어봐야 할 것은 루트 커널 매개 변수에 사용되는 dev 파일의 줄을 따라 더 많은 것이라고 생각합니다. 예를 들어, 루트 매개 변수를 root = / dev / sda2로 지정한다고 가정하십시오. 커널은 / dev / sda2 파일을 어떻게 매핑합니까?



답변

Linux는 처음에 램 디스크 ( initrd“INITial RamDisk”의 경우)를로 부팅 /합니다. 이 디스크에는 실제 루트 파티션 (필요한 드라이버 및 파일 시스템 모듈 포함)을 찾을 수있을만큼 충분합니다. 루트 파티션을에있는 임시 마운트 지점에 마운트 initrd한 다음 pivot_root(8)루트와 임시 마운트 지점을 교환하여 호출 initrd될 위치를 두고 umount실제 루트 파일 시스템을 on으로 둡니다 /.


답변

고대에는 커널이 루트 fs의 장치 주 / 부 번호를 알 수 있도록 하드 코딩되었으며 커널에 내장 된 모든 장치 드라이버를 초기화 한 후 해당 장치를 마운트했습니다. 이 rdev유틸리티는 커널 이미지의 루트 장치 번호를 다시 컴파일하지 않고도 수정할 수 있습니다.

결국 부트 로더가 등장하여 커널에 명령 행을 전달할 수있었습니다. 경우 root=인수가 전달되었습니다, 그 루트 파일 대신 값에 내장이었다 커널 말했다. 드라이버는 여전히 커널에 내장되어 있어야하는 액세스가 필요했습니다. 인수는 /dev디렉토리 의 일반적인 장치 노드처럼 보이지만 /dev루트 fs가 마운트되기 전에 디렉토리 가 없기 때문에 커널은 거기에서 dev 노드를 찾을 수 없습니다. 대신 잘 알려진 특정 장치 이름이 커널에 하드 코딩되어 문자열을 장치 번호로 변환 할 수 있습니다. 이 때문에 커널은와 같은 것을 인식 할 수 /dev/sda1있지만 /dev/mapper/vg0-root볼륨 UUID 와 같은 이국적인 것은 인식 할 수 없습니다 .

나중에 initrd사진에 등장했습니다. 커널과 함께 부트 로더는 initrd일종의 압축 파일 시스템 이미지 인 이미지를 로드 할 것 입니다. 커널은이 이미지를 램 디스크로 압축 해제하고 램 디스크를 루트 fs로 마운트합니다. 이 이미지에는 실제 드라이버 대신 몇 가지 추가 드라이버와 부팅 스크립트가 포함되어 있습니다 init. 이 부트 스크립트는 하드웨어를 인식하고 RAID 어레이 및 LVM과 같은 것을 활성화하고 UUID를 감지하며 커널 명령 줄을 구문 분석하여 실제 루트를 찾습니다. 그런 다음 실제 루트 fs를에 마운트 /initrd한 다음 pivot_root시스템 호출을 실행 하여 커널 스왑 //initrd그런 다음 /sbin/init실제 루트에서 실행 /initrd하여 램 디스크 를 마운트 해제 하고 해제 합니다.

마지막으로 오늘 우리는 initramfs. 이것은와 비슷 initrd하지만 램 디스크에로드되는 압축 파일 시스템 이미지 대신 압축 된 cpio 아카이브입니다. tmpfs가 루트로 마운트되고 아카이브가 여기에서 추출됩니다. pivot_root더티 핵으로 간주되는 을 사용하는 대신 initramfs부트 스크립트는에 실제 루트를 마운트 /root하고 tmpfs 루트의 모든 파일을 삭제 한 다음 chroot/root및 exec를 삭제합니다 /sbin/init.


답변

/ etc의 구성 파일에 액세스하지 않고 커널이 루트 파티션 인 파티션을 “알고있는”방법을 묻는 것처럼 들립니다.

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

이러한 명령 행 옵션 중 하나는이며 root, 여기서 루트 파일 시스템을 지정할 수 있습니다 root=/dev/sda1.

커널이 initrd를 사용한다면, 부트 로더는 커널에게 현재 위치를 알려주거나 initrd를 표준 메모리 위치에 넣을 책임이 있습니다 (최소한 Guruplug에서 작동하는 방식입니다).

루트 파일 시스템을 찾을 수 없다는 불만을 시작한 직후 커널 패닉을 지정할 수는 없습니다.

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


답변

Grub은 /boot파티션을 마운트 한 다음 커널을 실행합니다. Grub의 설정에서 커널은 루트 장치로 무엇을 사용해야하는지 알려줍니다.

예를 들어 Grub에서 menu.lst:

kernel /boot/linux root=/dev/sda2

답변

C’mon, GRUB은 / boot를 “마운트”하지 않고 단지 ‘menu.lst’와 일부 모듈을 읽습니다. 또한 LINUX 커널의 일부도 아닙니다. 커널을 호출하면 루트 파티션과 함께 “루트”인수를 전달합니다. 최악의 경우, 커널은 / boot가 마운트되었음을 ​​알고 있습니다 (LOL).

다음으로, geekosaur가 옳습니다. Linux는 압축 된 이미지 형식의 초기 램 디스크를 사용한 다음을 호출하여 실제 루트 파일 시스템을 마운트합니다 pivot_root. 따라서 Linux는 이미지와 로컬 디스크 드라이브에서 실행을 시작합니다.


답변

부트 로더는 grub이나 lilo 등 무엇이든 커널에게 root=플래그를 어디에서 찾아야하는지 알려주고 커널 initrd을 부팅하기 전에 메모리에 초기 램 디스크를로드합니다 .

그런 다음 커널은 하드웨어 및 장치 드라이버를로드하고 테스트하여 시스템에서 볼 수있는 내용을 찾습니다 (입력하여이 진단 정보를 검토 할 수 있습니다 dmesg. 요즘에는 너무 빨리 스크롤되어 볼 수 있음). root=매개 변수입니다.

initrd가 있으면 먼저 마운트되고 루트 파일 시스템이 마운트되기 전에 해당 모듈 / 장치 드라이버가로드되고 프로브됩니다. 이렇게하면 하드 드라이브의 드라이버를 모듈로 컴파일 할 수 있으며 여전히 부팅 할 수 있습니다.