LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1054|回复: 8

在debian sarge中建立自己的initrd--debian initrd DIY

[复制链接]
发表于 2007-4-3 20:33:22 | 显示全部楼层 |阅读模式
首先建立2M的ext2文件系统镜像,我们将要把所需要的一些文件拷贝到这个镜像中去,然后这个镜像在压缩后就成为了我们今天的工作任务initrd。
dd if=/dev/zero of=~/myinitrd bs=1k count=2000
创建一个2000k的整块文件,一定不能有碎片
mke2fs ~/myinitrd
创建一个ext2文件系统
mount -t ext2 ~/myinitrd /mnt/initrd -o loop
mkdir /mnt/initrd/lib
cp /lib/ld-linux.so.2 /mnt/initrd/lib/
cp /lib/libc.so.6 /mnt/initrd/lib
wajig instll ash
mkdir /mnt/initrd/bin
cp /bin/ash /mnt/initrd/bin
mkdir /mnt/initrd/sbin
cp /sbin/insmod /mnt/initrd/sbin
拷贝这些文件过去,其实是实现了initrd中需要使用的/sbin/insmod以及/bin/ash两个命令,只所以没有采用/bin/bash是因为bash太大,而且还要依赖别的库。
下面进入比较重要的部分,如何找到所需要的用来加载根文件系统的内核模块。
我就以我的VMWare系统为例加以说明。
我用的ext3文件系统,根据/lib/modules/2.6.8-2-386/modules.dep文件找到所依赖的其它模块jbd。
scsi的host控制器的模块是mptscsih根据上述文件找到所依赖的mptbase和scsi_mod,并且根据经验知道所有scsi硬盘的支持还需要sd_mod。
因为默认的内核都没有把这些模块编译进去,所以咱们把它们收集起来并且放到initrd中去。将这些模块文件都拷贝到/mnt/initrd/lib。
下面就是写linuxrc文件,目的就是加载所需要的模块使得内核可以加载到真正的根文件系统。
#!/bin/ash
/sbin/insmod /lib/scsi_mod.ko
/sbin/insmod /lib/sd_mod.ko
/sbin/insmod /lib/mptbase.ko
/sbin/insmod /lib/mptscsih.ko
/sbin/insmod /lib/jbd.ko
/sbin/insmod /lib/ext3.ko
将这个文件拷贝到/mnt/initrd下
这样initrd就制作完毕了。
卸载此文件系统:umount /mnt/initrd
gzip -9 ~/myinitrd
cp -f ~/myinitrd.gz /boot/myinitrd.img

现在就可以在grub启动之时进行测试
如果是有devfs支持的内核,那么在kernel 那行将root=/dev/sdaX 换成root=/dev/discs/disc0/partX。(devfs的命名规则就是这样写的,所以就根据它的规则我们改过来。)
如果没有devfs的支持,那么需要在initrd中自己创建/dev目录并且用mknode创建设备文件,或者直接将本机上的hd*,sd*拷贝过去。
initrd那一行改为:initrd=/boot/myinitrd.img
按b键启动。
这时候应该可以正常引导系统了。如果我们可以成功,那么就可以把刚才的改动保存在/boot/grub/menu.lst,这样就不需要每次启动系统时手动改grub的启动参数了。

我们可以在initrd中增加对vesafb的支持,这个就留给以后再去尝试了。
发表于 2007-4-3 20:59:01 | 显示全部楼层
这招 Sarge 下用老内核(2.6.13)以前的还行,可是自 2.6.14 以後版本的内核取消了 devfs,用新的内核便会派不上用场了

我个人不是太喜欢 initrd,特别在 Debian,缺点多的是,制作脚本众多又不统一,好处倒是看不到,realtang 兄的看法如何?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-3 22:13:23 | 显示全部楼层
确实只有2.6.13以前的内核可以这样干的。不过,觉得devfs挺好的东西,说不用就不用了,可惜。
另外自己编译内核,省去initrd也比较理想。
回复 支持 反对

使用道具 举报

发表于 2007-4-7 08:12:19 | 显示全部楼层
我也觉得 devfs 挺好的,但很多 kernel hacker 们不是这样想,争论曾经没有休止,但最终还是败阵给 udev。。。可惜。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-7 09:40:12 | 显示全部楼层
现在一些嵌入式的系统还在用2.4的内核,对这些系统来说,devfs还是不可或缺的呢。
毕竟2.4的内核没有提供sysfs。
回复 支持 反对

使用道具 举报

发表于 2007-4-7 18:13:48 | 显示全部楼层
也许不一定,记得以前有兄弟做迷你系统时就连 devfs 也省下,直接 mknod 来达成的,帖子要找一找了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-8 01:24:21 | 显示全部楼层
Debian sarge的默认2.6.8的安装在/dev文件系统是采用MAKEDEV脚本来创建设备文件系统成。虽然内核支持devfs,但是Debian并没有启用,应该是安装devfsd之后就会自动启动devfs但是俺没有试过。
安装2.6.18以后内核会用udevd通过sysfs来创建设备文件系统。我只是觉得奇怪的是,devfs配合hotplug使用就可以完成设备的coldplug和hotplug。
udev却可以同时完成这两件事,并且在udev使用的时候/proc/sys/kernel/hotplug已经是为空的了。
不过devfs的一个部分,devpts还是保留了下来。也算对它的一种保存吧。
回复 支持 反对

使用道具 举报

发表于 2007-4-8 01:48:05 | 显示全部楼层
Post by d00m3d
这招 Sarge 下用老内核(2.6.13)以前的还行,可是自 2.6.14 以後版本的内核取消了 devfs,用新的内核便会派不上用场了

我个人不是太喜欢 initrd,特别在 Debian,缺点多的是,制作脚本众多又不统一,好处倒是看不到,realtang 兄的看法如何?


官方提供的一共就三种吧,yaid啥的那个不好用,另两个差不多。这个跟devfs没多少关系啊。
看看制作initrd的那个程序,加两个模块直接用那个就可以了。
回复 支持 反对

使用道具 举报

发表于 2007-4-8 07:23:46 | 显示全部楼层
有关系,旧版 mkinitrd (initrd-tools 提供的)脚本做出来的 initrd 是会依赖 devfs 的

曾几何时,我也用过它来协助移动硬盘上的 Debian 来起动,但时代(内核)进步,现在已无需借它来提供延时,可把它废掉了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表