如何自动探测 initramfs 中的块设备?

如何自动探测 initramfs 中的块设备?

我正在构建一个基于 isolinux 的自定义 Alpine 映像。基本上,我正在压缩rootfs,并将其安装为overlayfs。

Bootloader 工作正常,内核加载,但我卡在 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 接口公开的 modalias 试试运气。

参见示例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,它可能不支持-ab.尽管如此,还是值得检查一下您/sys在早期 initramfs 中的样子。

有关 modalias 的更多链接:

相关内容