내 자신의 initrd를 빌드 할 때 / dev 디렉토리를 채우는 방법은 무엇입니까?


9

initrd에 대해 배우려고합니다. 이 튜토리얼 을 따라 처음부터 자체 initrd를 빌드하고 busybox를 설치했습니다. 그런 다음 isolinux로 .iso를 만들었으므로 virtualbox에서 테스트 할 수 있습니다. 잘 작동합니다!

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

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

편집 : 내가 이미 한 일에 대한 추가 정보 및 업데이트.

  • 나는 가상 상자에서 모든 것을 테스트합니다. 방금 가상 상자에 최소 우분투를 설치하고 initrd에서 .iso를 만든 다음 virtualbox의 iso에서 부팅했습니다.
  • 나는 vmlinuz를 사용했고 /lib/modulesdebian-businesscard.iso에 있었고 이전에 연결 한 튜토리얼에 따라 만든 initrd로 복사했습니다.
  • 커널은 CONFIG_DEVTMPFS=y
  • /devtty0-tty63과 같은 일부 장치는 다른 장치에 나타나지만 sda / hda는 없습니다.
  • lspci -k내 현재 실행중인 OS와 가상 상자는 사용되는 모듈을 확인합니다. 모듈로 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

누구든지 내가 뭘 잘못하고 있고 무엇을해야하는지 아는 사람이 있습니까?

답변:


12

gilles의 대답은 정확하지만 구식입니다 :-). 또 다른 참고 항목 (다른 용어보다 용어에 대한 nitpick)은 initrd가 아닌 initramfs를 만드는 방법에 대한 지침입니다. 이 둘은 비슷하며 같은 목적으로 사용되지만 이미지를 저장하고로드하는 방법이 다릅니다.

어쨌든 귀하의 질문에 대한 답변은 실제로 정말 간단합니다.

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

그게 다야. devtmpfs는 /devudev와 같이 채워집니다 . /devinitramfs 이미지 null에서 zero, 또는 같은 기본 사항 을 미리 채울 필요조차 없습니다 console.


귀하의 의견에 감사드립니다. 나는 당신의 명령을 실행했고 이제 더 많은 장치가 있지만 여전히 마운트 할 sda 또는 hda가 없습니다. 내가 잊어 버린 것이 있습니까? 데비안 라이브 시스템에서 가져온 vmlinuz 커널을 사용합니다. 실제로 직접 컴파일해야합니까?
Carlito

@Carlito이 커널에 devtmpfs가 활성화되어 있습니까 (구성 파일 확인)? 데비안은 최근에 devtmpfs로 전환했습니다.
Gilles 'SO- 악마 그만'10

@Gilles 구성 파일이 제공되지 않았지만 데비안에서 가져온 커널을로드했지만 구성 파일에 따르면 CONFIG_DEVTMPFS=y여전히 sda 장치가 없습니다. 나는 모듈을로드하지 않았기 때문이라고 생각합니다 (lsmod는 아무것도 반환하지 않습니다). 파일 시스템 장치를 얻기 위해 어떤 모듈을로드해야합니까? 아니면 내가 잊어 버린 것이 있습니까?
Carlito

@Carlito 그렇습니다 /dev. 드라이브가 아닌 다른 항목이 표시되면 devtmpfs가 작동하고 디스크 컨트롤러 모듈이 없을 것입니다 (추정 한대로). 불행히도 필요한 드라이버 / 모듈을 알 수있는 유일한 방법은 커널 구성에서 각 정보를 읽거나 실행 lspci -k중인 Linux 시스템에서 실행하는 것입니다 (시스템의 다양한 구성 요소가 사용하는 커널 드라이버를 보여줍니다) .
Patrick

1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=y은 initramfs에 영향을 미치지 않습니다. 커널 도움말 텍스트 : "이 옵션은 initramfs 기반 부팅에 영향을 미치지 않습니다. 여기서 rootfs를 마운트 한 후 devtmpfs 파일 시스템을 항상 수동으로 마운트해야합니다"
Patrick

4

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

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

udevd바이너리 이외에도 udevinitrd 의 다른 부분이 필요합니다 . 이것은에서 구성 파일이 포함 /etc/udev의의 기본 구성 /lib/udev과 같은뿐만 아니라 도우미 바이너리 scsi_id도의를 /lib/udev. initrd에 포함하는 udev 규칙에서 호출 된 모든 프로그램이 필요합니다.

initrd가 끝나면 제어권을 실제 루트 파티션으로 옮기기 전에 initrd에서 udevd다른 모든 프로그램처럼 중지해야합니다 . 이 기기는에서 제거되지 않습니다 /dev. mount --move /dev /root/dev마운트 /dev를 실제 루트 로 이동하는 데 사용 합니다.

젠투에는 initramfs 안내서initramfs 위키 페이지가 있는데, 그중에서도 udev를 언급합니다. Initramfs는 파일 시스템 이미지가 아닌 cpio 아카이브를 사용하고 다른 프로세스 인터페이스 (initrd에서는 /linuxrc종료해야하지만 initramfs에서는 실제 루트에서 초기화 /init해야 함)를 사용하여 initrd의 최신 후속 제품입니다 exec. 요즘 대부분의 시스템은 파일이 여전히 initrd라고 불릴지라도 전환했습니다.


답변 주셔서 감사합니다. 나는 실제로 initrd 대신 initramfs를 만들었다는 결론에 도달했다. 그러나 나는 데비안 라이브 시스템에서 얻은 vmlinuz 커널을 사용합니다. 실제로이 커널을 컴파일해야합니다 (하드 드라이브를로드 할 모듈이 있는지 알고 있습니다). 기본 모듈과 함께 사용할 수있는 최소한의 버전이 있습니까? ? 아마도 최신 udev를 다운로드하여 컴파일하고 실행하려고 시도 할 것입니다.
Carlito

@Carlito 필자는 커널을 컴파일 할 때 필요한 드라이버를 잊어 버리는 것이 일반적인 실수이므로 데비안 커널을 먼저 사용해 보는 것이 좋습니다.
Gilles 'SO- 악마 그만'10

하지만 어떻게 얻을 수 있습니까? 방금 debian-businesscard.iso에서 찾은 vmlinuz를 복사했습니다 (아마도 최고의 아이디어는 아닙니다). 우분투 또는 데비안에서 가져온 표준 커널과 전체 / lib / modules 디렉토리를 복사해야합니까?
Carlito

@Carlito 최소한 하드웨어에 필요한 모든 모듈이 필요합니다. 목록을 탐색하여 필요한 모든 것을 찾기가 어려울 수 있습니다. 필요한 것을 찾는 가장 좋은 방법 lsmod은 작업 시스템 에서 실행 하는 것입니다. 따라서 모든 것을 시작한 다음 공간을 절약해야 할 경우 지능적으로 정리하십시오.
Gilles 'SO- 악마 그만'10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.