initramfs에서 블록 장치를 자동으로 감지하는 방법은 무엇입니까?

initramfs에서 블록 장치를 자동으로 감지하는 방법은 무엇입니까?

isolinux를 기반으로 사용자 정의 Alpine 이미지를 구축 중입니다. 기본적으로 rootfs를 압축하여 overlayfs로 마운트합니다.

부트로더가 제대로 작동하고 커널이 로드되지만 initramfs에서 멈췄습니다. 다음이 있다고 가정해 보겠습니다.

#!/bin/sh
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
/bin/busybox --install -s

rescue_shell() {
    echo "Something went wrong. Dropping you to a shell."
    #/bin/busybox --install -s
    /bin/sh || exec /bin/busybox sh
}
mount -t sysfs sysfs /sys
mount -t proc  proc /proc
mkdir  -p /dev/pts

mount -t devtmpfs -o exec,nosuid,mode=0755,size=2M devtmpfs /dev 2>/dev/null \
        || mount -t tmpfs -o exec,nosuid,mode=0755,size=2M tmpfs /dev

[ -c /dev/ptmx ] || mknod -m 666 /dev/ptmx c 5 2
[ -d /dev/pts ] || mkdir -m 755 /dev/pts
mount -t devpts -o gid=5,mode=0620,noexec,nosuid devpts /dev/pts
# shared memory area (later system will need it)
[ -d /dev/shm ] || mkdir /dev/shm
mount -t tmpfs -o nodev,nosuid,noexec shm /dev/shm

/bin/sh
# other code left for simplicity

그래서 일단 입력하면 /bin/sh로드된 모듈이 없고 특히 블록 장치의 경우 모듈을 설치한 다음 압축된 이미지를 추출한 다음 오버레이를 설치해야 합니다 /dev/sda./dev/sr0

/proc/partitions를 나열하면 장치만 제공됩니다. ram[0-15]이는 부팅 후 RAM에 로드되므로 의미가 있습니다.

그렇다면 제 질문은 사용 가능한 하드웨어를 기반으로 장치를 감지할 수 있는 방법이 있느냐는 것입니다. 저도 시도해 보았지만 mdev여전히 블록 장치를 얻을 수 없습니다. 맞습니다 mdev.conf. 테스트는 VirtualBox에서 수행되었습니다. 감사해요.

답변1

sysfs 인터페이스를 통해 노출된 모달리아를 사용하여 행운을 시험해 볼 수 있습니다.

예시 보기https://patchwork.openembedded.org/patch/148854/이는 다음을 나타냅니다.

echo "/sbin/mdev" > /proc/sys/kernel/hotplug
mdev -s
find /sys/ -name modalias -print0 | xargs -0 sort -u -z | xargs -0 modprobe -abq

제가 직접 테스트한 것은 아닙니다. 또한 이는 지원되지 않을 수 있는 BusyBox modprobe를 사용하는 것으로 보이지 않습니다 . 그래도 초기 initramfs가 어떻게 생겼는지 -ab확인해 볼 가치가 있습니다 ./sys

모달리아에 대한 추가 링크:

관련 정보