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


29

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

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

감사!

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


아래 사람들은 initrd를 다루지 만, initrd가 사용되는 이유에 대해서는 거의 논의가 없습니다. 필자는 데비안과 같은 배포판이 동일한 아키텍처의 많은 다른 머신에서 하나의 커널을 사용하기를 원하지만, 아마도 다른 하드웨어를 사용하기를 원하기 때문입니다. 이것은 커널 모듈을 통해 하드웨어 지원을 모듈화함으로써 가능합니다. initrd는 부팅을 위해 많은 하드웨어 지원이 필요하지 않으며, 일단 부팅되면 필요한 하드웨어 모듈을로드하여 진행합니다. 이에 대한 정교 / 수정에 감사드립니다.
Faheem Mitha

/ boot 디렉토리가 없기 때문에 / mount를 먼저 마운트하지 않고 / boot를 마운트 할 수 없습니다.
psusi

답변:


20

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


2
LFS (linuxfromscratch.org)와 같은 initrd가 없다면?
Mr. Shickadance

@씨. Shickadance : LFS가 어떻게 작동하는지 살펴 보지 않았지만 커널에 필요한 모든 모듈이 컴파일되어 있는지 (또는 GRUB 2를 통해로드되었는지 확인하십시오. 실제 루트 파티션에서 시작할 수 있습니다.
geekosaur

4
@씨. 시카 댄스. initrd가없는 것은 LFS만이 아닙니다. 자신의 커널을 컴파일하는 사람은 initrd를 사용하지 않는 옵션이 있습니다. 이것이 Gentoo에서하는 것입니다.
jonescb

1
@Faheem : grub2 모듈은 커널 모듈과 다릅니다. grub2가 커널 모듈을로드 할 수있는 능력이 있지만, 내가 모르는 한 가지는 Linux 커널에서 작동하는지 또는 * BSD (커널 모듈을 로딩하는 부트 로더가 정상)에서만 작동하는지입니다. 커널에로드 된 모듈의 주소 맵을 찾을 수있는 곳을 가르쳐야한다고 생각 하며 모든 사람이 grub2로 이동해야합니다 (grub1은 여전히 ​​일부 배포판에서 표준입니다).
geekosaur

1
pivot_root가 더티 해킹으로 간주되어 initrd가 initramfs로 대체되었습니다.
psusi

41

고대에는 커널이 루트 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.


1
chroot 후에 tmpfs가 자동으로 마운트 해제됩니까? 그냥 사라지나요?
jiggunjer

@jiggunjer, 아니오, 여전히 존재합니다. / root 디렉토리를 제외하고는 비어 있고 더 이상 사용되지 않습니다.
psusi

나는 당신이 언급 한 모든 루트 fs 반복에 대해 새로운 것을 배웠습니다. 좋은 답변입니다!
jpaugh

3

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

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

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

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

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

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


3
이것은 initrd / initramfs가 없을 때 올바른 설명이지만 퍼즐 조각이 없습니다. 일반적으로 커널은 장치 /dev/sda1가 파일 시스템의 항목이기 때문에 장치를 식별합니다 . 동일한 장치를 수행 cp -p /dev/sda1 /tmp/foo하고 /tmp/foo나타낼 수 있습니다. 커널 명령 행에서 커널은 일반적인 장치 이름 지정 규칙을 따르는 내장 구문 분석기를 사용합니다 sda1. 첫 번째 SCSI 유사 디스크의 첫 번째 파티션을 의미합니다.
Gilles 'SO- 악한 중지'

@Gilles 그래서 현대 커널은 여전히 ​​UUID 기반 볼륨 마운트를 처리 할 수 ​​없습니까? 없이 initrd또는 initramfs나는 의미한다. /dev/sdx폼 에서 "간단한"파티션이어야 합니까?
jiggunjer

1
@jiggunjer 최신 커널은 UUID로 볼륨 검색을 지원합니다. 참조하십시오 init/do_mounts.c.
Gilles 'SO- 악마 그만해'

1

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

예를 들어 Grub에서 menu.lst:

kernel /boot/linux root=/dev/sda2

1

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

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


1
Grub은 특히 grub2에서 파일 시스템을 '마운트'하는 능력을 가지고 있습니다. 물론, / doing / 할 수있는 모든 것은 한 스트라이프 또는 다른 스트라이프의 부팅 가능한 커널을 찾는 것입니다. 또한 커널은 하드 드라이브에 중요한 드라이버를 커널이 모듈로 컴파일하지 않는 한 initrd를 요구 하지 않습니다 .
Shadur

5
ibm.com/developerworks/linux/library/l-linuxboot 이것은 부팅 할 때 Linux Kernel이 수행하는 작업을 상당히 간결하게 요약 한 것입니다.
jsbillings

2
마운트 맨 페이지 에서 @Shadur : Unix 시스템에서 액세스 할 수있는 모든 파일은 /를 기반으로하는 파일 계층 구조 인 하나의 큰 트리로 정렬됩니다. 이러한 파일은 여러 장치에 분산 될 수 있습니다. mount 명령은 일부 장치에서 찾은 파일 시스템을 큰 파일 트리에 연결합니다. GRUB에서 사용하는 파일 시스템은 파일 계층 구조에 연결되어 있지 않으므로 마운트 되지 않습니다 .
D4RIO

1
@Shadur, BTW : 또 다른 루트 파일 시스템이기 때문에 initrd가 필요하지 않다는 것이 분명하지만, 커널은 부팅에 필요한로드를로드 한 다음 부팅하고 마지막으로 다른 모든 것을로드하기 때문에 일반적으로 작은 부팅 시간 루트로 사용됩니다.
D4RIO

1
@ d4rio 그것들은 리눅스가 아닌 GRUB에 의해 마운트됩니다. grub을 부트 로더가 아닌 자체 마이크로 커널 OS로 생각하면 이해하기가 더 쉽습니다.
Shadur

1

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

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

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

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