我有一个完全定制的、最小的、嵌入式 Linux(vanilla、3.3.8、i486、Vortex86dx)系统,它从 initramfs 映像启动。不使用标准分发脚本,仅使用单个 rcS 文件进行初始化。
我有一个 IDE 闪存盘,有两个分区:/dev/hda1 和 /dev/hda2。
由于这是固定系统的最小嵌入式发行版,因此它有一个静态 /dev 目录,其中包含 /dev/hda1 和 /dev/hda2,并且没有 UDEV。
当 init 调用 rcS 时,/dev/hda1 条目不再存在。此时尚未运行其他脚本、用户应用程序或守护程序。 /dev/hda1出现已被内核删除(?)
如果我在开发过程中通过 NFS 根文件系统启动目标,则不会遇到同样的问题。
我使用 Buildroot 通过 device_table_dev.txt 文件创建 /dev 目录。例如
# IDE Devices
/dev/hda b 640 0 0 3 0 0 0 -
/dev/hda b 640 0 0 3 1 1 1 4
我检查了 Buildroot 输出/图像中的 rootfs.tar.gz。 /dev 目录包含 /dev/hda1:
brw-r----- 1 root root 3, 0 Jul 2 13:44 hda
brw-r----- 1 root root 3, 1 Jul 2 13:44 hda1
brw-r----- 1 root root 3, 2 Jul 2 13:44 hda2
brw-r----- 1 root root 3, 3 Jul 2 13:44 hda3
brw-r----- 1 root root 3, 4 Jul 2 13:44 hda4
我在目标上的启动后目录列表(在脚本顶部的 rcS 内完成)如下所示:
brw-r----- 1 root root 3, 0 Jul 2 12:44 hda
brw-r----- 1 root root 3, 2 Jul 2 12:44 hda2
brw-r----- 1 root root 3, 3 Jul 2 12:44 hda3
brw-r----- 1 root root 3, 4 Jul 2 12:44 hda4
/dev/hda1 丢失。 /dev/hda2 是同一磁盘上的一个分区,但它仍然存在。奇怪的。
如果我运行 Busybox 实用程序“mdev -s”,它会在目标上恢复 /dev/hda1 并且正常工作。例如我可以安装它
以前有人见过这种行为吗?
内核会删除 /dev 中的条目吗?
答案1
子系统在引导时udev
创建并安装tmpfs
文件系统。/dev
当检测到设备时,内容由内核填充。由于tmpfs
驻留在虚拟内存中,它不是持久的,因此您的更改在重新启动后不会保留。即使您已经有了/dev
,安装新的文件系统也会隐藏该目录,并且看起来您的所有设备特殊信息都已被删除。他们没有,但最终的结果是一样的:特价不是你所期望的。
我怀疑您会发现您的hda
和hdaX
条目已被替换为sda
和sdaX
条目。或者,检查/proc/devices
并/proc/partitions
获取udev
分配给驱动器的名称。
有时,像这样的快速而肮脏的解决方案fdisk -l /dev/[sh]d[a-z]
会有所帮助(如果每种类型的磁盘少于 26 个,效果会更好)。
顺便说一句,使用的命名方案udev
是标准化的,你的静态/dev
可能比遵循约定更糟糕。如果udev
认为是的话/dev/sda
,就这样吧。您可以避免日后潜在的怪异和误解。