我正在尝试为克隆部署。我有一块 NIC,它需要一些驱动程序,这些驱动程序无法开箱即用,但在 Ubuntu 安装中可以正常工作,因此我认为只需使用我从中启动 Ubuntu 的内核和 initrd 进行 PXE 启动即可(由于对 Linux 不是很精通,我想不出更好的方法,尝试构建自己的内核但未能产生可用的 NIC)。
我正在运行最新的 18.04.2 安装。因此,我将文件:
vmlinuz-4.18.0-20-generic
和复制initrd.img-4.18.0-20-generic
到我的 PXE 系统的正确位置,并尝试从它们启动。
这是(ipxe)启动命令行(图像位置已缩短以便于阅读):
kernel http://.../IpxeBoot?filename=vmlinuz-4.18.0-20-generic&type=kernel initrd=initrd.img-4.18.0-20-generic root=/dev/ram0 rw ramdisk_size=1560000 web=http://.../ USER_TOKEN= task=debug consoleblank=0
imgfetch --name initrd.img-4.18.0-20-generic http://.../IpxeBoot?filename=initrd.img-4.18.0-20-generic&type=bootimage
boot
启动时,一堆相关设备被初始化(包括我的 NIC!)但随后我遇到以下错误:
gave up waiting for root file system device
ALERT! /dev/ram0 does not exist. Dropping to a shell!
我已经发现这个问题,这意味着我需要在启动时执行额外的步骤,以便加载 brd 模块并将 initrd 转换为实际可用的 ram 磁盘。有人建议这样做add "brd rd_size=16777216" to /etc/initramfs/modules
,但当我解压 initrd.img-4.18.0-20-generic 文件(使用unmkinitramfs
)时,没有 /etc/initramfs。(我还注意到我应该使用rd_nr=1 rd_size=1048576
只创建 ram0,而不是 ram0 到 ram15)。
我该如何解决启动错误?如果这涉及到加载 brd,我该如何针对此内核版本进行加载?
答案1
初始 ramdisk(在您的情况下是initrd.img-4.18.0-20-generic
)是update-initramfs
在内核安装到系统中时由工具自动生成的。
update-initramfs
检查您的系统并添加所需的模块initrd
以便在启动期间加载。
您可以将脚本放在两个位置initial ramdisk
:
/usr/share/initramfs-tools
和
/etc/initramfs-tools
对于您来说,您必须将该行插入/etc/initramfs-tools/modules
并运行
update-initramfs -u
适合您当前的内核。
然后检查结果:
mkdir myinitramfs
cd myinitramfs
zcat /boot/initrd.img-4.18.0-20-generic | cpio --extract
cat conf/modules
检查你的模块是否在列表中