자체 initrd를 구축할 때 /dev 디렉토리를 어떻게 채우나요?

자체 initrd를 구축할 때 /dev 디렉토리를 어떻게 채우나요?

initrd에 대해 알아보려고 합니다. 나는 팔로우했다이 튜토리얼처음부터 나만의 initrd를 만들고 거기에 busybox를 설치했습니다. 그런 다음 isolinux를 사용하여 .iso를 만들어 virtualbox에서 테스트할 수 있었습니다. 좋은 결과!

busybox의 기본 명령이 있으므로 파일 시스템을 마운트하고 싶습니다. 하지만 /dev 디렉토리는 튜토리얼을 따라가면서 생성한 일부 파일을 제외하고는 거의 비어 있습니다(sda 없음). 나는 udev에 대해 배웠고 이것이 나에게 필요한 것이라고 생각합니다. 하지만 어떻게 진행해야 할지 모르겠습니다.

udev에서 최신 소스 코드를 가져와서 컴파일하고 initrd에 추가해야 합니까? 그런 다음 내 초기화 스크립트에서 /bin/udev 또는 이와 유사한 것을 호출합니까? 아니면 /dev 디렉토리를 채우는 또 다른/더 좋은 방법이 있습니까?

편집하다:내가 수행한 작업에 대한 추가 정보 및 업데이트입니다.

  • 가상 상자에서 모든 것을 테스트했습니다. 방금 Virtual Box에 ubuntu Minimal을 설치하고 initrd에서 .iso를 만들고 VirtualBox의 ISO에서 부팅했습니다.
  • 나는 /lib/modulesvmlinuz와 debian-businesscard.iso의 파일을 사용하여 이전에 링크된 튜토리얼에 따라 만든 initrd에 복사했습니다.
  • 커널은CONFIG_DEVTMPFS=y
  • /devtty0-tty63 및 기타 몇 가지 장치와 같은 일부 장치가 있지만 sda/hda는 없습니다.
  • lspci -k현재 운영 체제와 가상 상자에서 실행하여 어떤 모듈이 사용되고 있는지 확인합니다. 모듈 SATA Controller로 사용된다고 합니다 .ahci
  • 실행하면 modprobe -v ahci많은 "알 수 없는 기호: ata_some_stuff"에 대해 불평하지만 SCSI Subsystem initialized, ATA-6: VBOX HARDDISK및 와 같은 것을 반환합니다 Direct-Access ATA VBOX HARDDISK. 그러나 하드 드라이브 장치를 여전히 찾을 수 없습니다 /dev.

내 현재 /init/스크립트는 다음과 같습니다.

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

내가 뭘 잘못하고 있고 어떻게 해야 하는지 아는 사람 있나요?

답변1

Giles의 답변은 정확하지만 구식입니다 :-). 주목할 만한 또 다른 점은(무엇보다 용어에 대해 더 자세히 살펴보는 것입니다) 링크한 가이드가 initrd가 아니라 initramfs를 만드는 방법에 대한 지침이라는 것입니다. 둘 다 유사하고 동일한 목적을 제공하지만 이미지를 저장하고 로드하는 방법이 다릅니다.

어쨌든, 귀하의 질문에 대한 대답은 실제로 매우 간단합니다.

  1. devtmpfs커널에서 활성화( CONFIG_DEVTMPFS=y)
  2. mount -t devtmpfs none /dev스크립트에서 가장 먼저 실행합니다 init.

그게 다야. devtmpfs는 /devudev처럼 채워집니다. /dev(initramfs 이미지에서) , 또는 등을 사용하여 기본 사항을 미리 채울 필요조차 없습니다 .nullzeroconsole

답변2

Udev는 /dev커널에 로드된 드라이버와 해당 드라이버에서 감지한 장치를 기반으로 자동으로 채워집니다. 장치의 이름과 권한은 관리자가 세부적으로 조정할 수 있는 일련의 규칙을 기반으로 합니다. 대부분의 Linux 시스템은 udev를 사용해야 합니다. 예외는 시스템 설정 시 하드웨어 구성이 알려져 있고 나중에 변경되지 않는 시스템(일반적으로 내장형)입니다.

일반적으로 udev시작 시퀀스 초기에 이를 호출합니다. 이 전에 수행해야 하는 몇 가지 작업 중 하나는 마운트 /proc/sys데몬을 시작한 후 udevadm trigger --action=add; udevadm settleudev를 호출하여 커널에서 보류 중인 모든 이벤트를 처리하고( trigger) 계속하기 전에 이벤트가 처리될 때까지 기다립니다( settle). 그런 다음 계속해서 루트 파일 시스템이 포함된 장치를 찾을 수 있습니다.

바이너리 외에도 udevdinitrd에 다른 부분도 필요합니다. udev여기에는 구성 파일 /etc/udev, 기본 구성 /lib/udev및 initrd에 포함된 udev 규칙에서 호출해야 하는 프로그램 scsi_id과 같은 보조 바이너리가 포함됩니다./lib/udev

initrd가 끝나면 실제 루트 파티션으로 제어권을 넘기기 전에 udevdinitrd의 다른 모든 프로그램처럼 중지 해야 합니다. 이렇게 해도 장치가 제거되지는 않습니다 /dev. mount --move /dev /root/dev설치를 /dev실제 루트 디렉터리로 이동하는 데 사용됩니다 .

젠투에는 하나가 있습니다initramfs 가이드그리고initramfs 위키 페이지udev 등이 언급되었습니다. Initramfs는 initrd의 최신 후속 버전으로, 파일 시스템 이미지 대신 cpio 아카이브를 사용하며 다른 프로세스 인터페이스를 갖습니다(initrd에서는 /linuxrc종료해야 하고, initramfs에서는 실제 루트에서 초기화 /init해야 함 exec)(비록 오늘날 대부분의 시스템에는 스위치가 있음에도 불구하고). 파일은 여전히 ​​initrd라고 불릴 수 있습니다).

관련 정보