您的发行版看起来像 Ubuntu,对吗?如果是这样,那么生成 initrd 的命令是:
(假设您的当前目录与包含内核源代码的目录相同)
update-initramfs -c -k `cat include/config/kernel.release`
然后是:
update-grub
initrd 和 rootfs 的逻辑(大致)是这样的:
首先做一个 blkid 和 df:
blkid
/dev/sda5: UUID="251ce906-e4db-4eac-a2c7-58d5e1ed86a3" TYPE="reiserfs"
df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 24412432 22360832 2051600 92% /
none 2959228 2352 2956876 1% /dev
你会看到 rootfs 位于 /boot 所在的 reiserfs 上。所以这意味着当内核加载时 reiserfs 内核模块必须在那里,否则它无法读取 /boot,vmlinuz 内核映像喜欢的地方。所以initrd就是为了这个目的。
使用 initrd(你可以随时执行 gunzip -c existing_initrd_file | cpio -idmv)解压内容并查看所有 fs.*ko 文件。我的是:
./lib/modules/2.6.32-33-generic/kernel/fs/reiserfs/reiserfs.ko
./lib/modules/2.6.32-33-generic/kernel/fs/nfs_common/nfs_acl.ko
然后你尝试将其与配置文件匹配:
CONFIG_REISERFS_FS=m
但是如果你已经完成了 CONFIG_REISERFS_FS=y,那么你将不需要在 initrd 中的 reiserfs.ko。
总之,您现在的问题是缺少 initrd 文件,或者如果在命令行中指定了 initrd 文件,则 initrd 中缺少必要的 fs 内核模块,这将使您能够读取 /boot 目录。
是的,这也不完全正确,当涉及 grub2 时 - /boot/grub 将包含它自己的 fs 内核模块来加载 /boot 目录,并且 grub.cfg 将具有必要的 insert reiserfs 语句来加载模块。对不起,太多细节无法描述。