构建自己的initrd时如何填充/ dev目录?


9

我正在尝试学习有关initrd的知识。我已按照本教程从头开始构建自己的initrd,并在其上安装了busybox。然后我用isolinux从中制作了一个.iso,因此可以在virtualbox中对其进行测试。效果很好!

我有来自busybox的基本命令,所以我想挂载文件系统。但是/ dev目录几乎是空的(没有sda),除了我在按照教程学习时创建的某些文件之外。我了解了udev,我认为这是我所需要的。但是,我不确定该如何进行。

我应该只是从udev中获取最新的源代码,对其进行编译并将其添加到initrd吗?然后在我的初始化脚本中调用/ bin / udev或类似的内容?还是有其他/更好的方法来填充/ dev目录?

编辑:一些其他信息和有关我已经做的更新。

  • 我在虚拟框中测试所有内容。我只是在虚拟盒子中安装了ubuntu minimal,从initrd中创建了一个.iso,然后从virtualbox中的iso中启动。
  • 我使用了vmlinuz,并将/lib/modules其存在于debian-businesscard.iso上,然后将其复制到我的initrd中,该initrd是按照前面链接的教程创建的。
  • 内核有 CONFIG_DEVTMPFS=y
  • 有些设备显示在中/dev,如tty0-tty63和其他一些设备,但没有sda / hda。
  • lspci -k在我当前正在运行的操作系统和虚拟框来检查哪些模块使用。SATA Controller说它ahci用作模块。
  • 当我执行modprobe -v ahci它抱怨了很多关于“未知符号:ata_some_stuff”,但之后它返回像SCSI Subsystem initializedATA-6: VBOX HARDDISKDirect-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

有谁知道我在做什么错,我应该怎么做?

Answers:


12

尽管吉尔斯的答案是正确的,但这是老派的:-)。另一个需要注意的事项(比术语更能说明问题)是您链接的指南是有关如何创建initramfs(而不是initrd)的说明。两者相似,并且用途相同,但是图像的存储和加载方式不同。

无论如何,您问题的答案实际上非常简单。

  1. devtmpfs在内核中启用(CONFIG_DEVTMPFS=y
  2. mount -t devtmpfs none /dev作为init脚本中的第一件事运行。

而已。devtmpfs将/dev像udev一样填充。你甚至不需要预先填充/dev与像基础(在initramfs镜像)nullzeroconsole


谢谢你的评论。我运行了您的命令,现在有更多设备,但仍然没有要挂载的sda或hda。有什么我忘了做的事吗?我使用从debians live系统获得的vmlinuz内核,我是否应该自己编译?
卡利托

@Carlito此内核是否启用了devtmpfs(检查配置文件)?Debian最近才切换到devtmpfs。
吉尔(Gilles)'所以

@Gilles没有提供配置文件,但是我加载了从debian获得的内核,该配置文件说CONFIG_DEVTMPFS=y,但是我仍然没有任何sda设备。我认为这是因为我尚未加载任何模块(lsmod不返回任何内容)。我应该加载哪些模块以获取文件系统设备?还是我忘记了其他东西?
卡利托

@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的末尾,在将控制权转移到实际的根分区之前,您需要udevd像从initrd的所有其他程序一样停止。这不会从中删除任何设备/dev。使用mount --move /dev /root/dev移动安装/dev到真正的根。

Gentoo有一个initramfs指南和一个initramfs Wiki页面,其中提到了udev。Initramfs是initrd的现代继承者,它使用cpio归档文件而不是文件系统映像,并且具有不同的进程接口(在initrd上,/linuxrc必须退出,而在initramfs上,/init必须exec从真实根目录进行初始化);如今,大多数系统都已切换(即使该文件仍可能称为initrd)。


感谢您的回答。我得出的结论是,我实际上制作了一个initramfs而不是initrd。但是我使用从debians live系统中获得的vmlinuz内核,应该为此真正编译我自己的内核(以便我知道有哪些模块可以加载硬盘驱动器),或者可以使用基本模块使用某种最小版本?我可能会下载最新的udev并尝试编译并运行它。
卡利托

@Carlito我建议首先尝试使用Debian内核,因为在编译自己的内核时,忘记必要的驱动程序是一个常见错误。
吉尔(Gilles)'所以

但是我怎么得到一个呢?我只是复制了在debian-businesscard.iso中找到的vmlinuz(可能不是最好的主意)。我是否应该复制从ubuntu或debian获得的标准内核以及整个/ lib / modules目录?
卡利托(Carlito)2012年

@Carlito您至少需要硬件所需的所有模块。通过浏览列表可能很难找到所有您需要的东西。找出所需内容的最佳方法是lsmod在工作系统上运行。因此,从所有这些开始,然后在需要节省空间的情况下进行智能修剪。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.