/init(또는 /linuxrc) 스크립트는 /dev에 임시 장치 노드를 생성합니까?

/init(또는 /linuxrc) 스크립트는 /dev에 임시 장치 노드를 생성합니까?

다음 줄을 실행하는 GRUB를 고려해보세요:

kernel /vmlinuz root=/dev/sda1 ro
initrd /initrd

Linux 커널은 부팅 시 /dev/sda1장치 노드를 어떻게 찾나요?

initrd/initramfs 이미지에는 저장소에 대한 액세스를 허용하기 위해 메모리에 로드되는 저장소(등) 장치용 모듈이 포함되어 있다는 것을 알고 있습니다. 나를 괴롭히는 것은 root=/dev/sda1커널이 커널 매개변수를 얼마나 정확하게 구문 분석하는지입니다.

initrd/initramfs의 (또는) 스크립트가 /init디렉터리를 생성한 다음 그 안에 장치 노드를 생성합니까? 아니면 "주" 및 "부" 숫자가 커널에 하드코딩되어 있습니까?/linuxrc/dev/dev/sda1/dev/sda1

답변1

initramfs가 있는 경우 커널은 initramfs의 압축을 풀고 설치한 /init다음 실행됩니다. 다른 모든 것은 /init실행 파일에 의해 처리됩니다. 이는 또한 커널이 root부팅 매개변수에 지정된 장치를 설치하지 않음을 의미합니다.

다른 배포판은 다른 initramfs 프레임워크를 사용합니다. 예를 들어델라쿠르페도라의 경우 또는initramfs 도구데비안의 경우. 가장 일반적인 해결책은 udev, mdev또는 이와 유사한 것을 사용하는 것입니다 devtmpfs. 일부는 그냥 사용할 수도 있습니다MAKEDEV정적 레이아웃을 생성하거나 장치 파일을 이미지에 통합합니다.

initramfs 없이 부팅하는 경우 커널은 예를 들어 알려진 메이저/마이너 번호가 있는 장치에서만 부팅할 수 있지만 /dev/sda1lvm 장치에서는 부팅할 수 없습니다.

답변2

루트 장치의 주 장치 번호와 부 장치 번호는 모두 커널 이미지에 저장됩니다( rdev자세한 내용은 맨페이지 참조).

그러나 커널 명령줄 인수는 커널에 의해 해석되지 않습니다. 초기 ramdisk initrd에는 최소한의 Linux가 포함된 파일 시스템이 포함되어 있으며 일반적으로 해석 부분을 수행합니다. initrd 작동 방식은 배포판에 따라 다릅니다. 여기에는 노드 /dev/sda1 또는 런타임에 노드를 생성하는 일부 스크립트/프로그램이 포함될 수도 있습니다.

Debian 기반 Linux를 사용하는 경우 다음과 같이 램디스크의 압축을 풀 수 있습니다.

mkdir /tmp/initrd
cd /tmp/initrd
zcat /boot/path/to/initrd | cpio -iv

debian initrds는 어떻게 작동하는지 볼 수 있는 스크립트입니다. 커널이 initrd의 압축을 푼 후 init이제 /tmp/initrd. 에 있는 블록을 참고하세요 for x in $(cat /proc/cmdline); do.

/proc/cmdlineGrub을 사용하여 전달된 인수는 어디에 있습니까(이제 셸을 사용하여 검사/검증할 수 있습니다!). Debians initrd에 대해 더 자세히 알아보고 싶다면 root=/dev/nfsGrub에 옵션을 전달하여 커널/initrd가 NFS 공유를 루트 파일 시스템으로 사용하도록 할 수 있다는 것을 알 수 있습니다. 이렇게 하면 /dev/nfs노드가 생성되거나 설치되지 않습니다. 단지 initrd에게 무엇을 해야 할지 알려줄 뿐입니다.

마지막으로 이러한 각 initrd는 init=기본 옵션 과 같은 특정 옵션이 제공되는 명령을 실행합니다./sbin/init

제목의 원래 질문으로 돌아가서: yes /init(아마도)는 런타임에 노드를 생성합니다. 다양한 프로그램/경험적 방법/부두를 사용하여 루트 파일 시스템을 마운트하는 방법을 알아냅니다.

답변3

초기 코드 는 mdev기본적으로 udev모든 장치를 검색하고 /dev폴더의 초기 내용을 생성하는 프로그램을 실행합니다. 그러면 커널이 효율적으로 실행 mount /dev/sda1 /되고 전체 시스템 검색을 시작할 수 있습니다.

바라보다여기더 알고 싶나요 mdev?

메이저 및 마이너 번호는 실제로 장치 드라이버이고 정적 메이저 번호를 사용하는 커널 모듈에 하드 코딩되어 있습니다(예:문서/devices.txt커널 소스 코드에서). 대부분의(모두?) 디스크 드라이버 커널 모듈이 이 범주에 속합니다. 따라서 @Ulrich Dangel이 말했듯이 일부 커널은 필요한 모듈이 커널 이미지에 정적으로 링크되어 있는 한 initramfs/initrd 없이 부팅할 수 있습니다.

관련 정보