|
|
发表于 2007-4-26 17:05:01
|
显示全部楼层
Post by keenor
一
1) 为什么使用initramfs:我的跟分区在LVM上
2) 为什么写这篇文章:实在搞得很闹心
3) 为什么不是initrd:趋势
4) 为什么from scratch:我不喜欢自动生成的做了一堆我不知道的事情,尤其是加载一堆模块
二
首先实现一个目录树,里面有你要的命令。我的方法是这样的,先cp bash过去目标目录的bin子目录,然后在cd到目标目录中chroot .,他告诉你不行,你把ld-linux.2.so也cp过去,他说还是不行,但是这回他说缺了具体哪个.so,你就从主系统里cp过去,循环这个过程。当然你可以使用busybox,我图省事就那么干了。bin里面,至少放上mount,ls,chroot,udev相关的那些。
三
linux内核在加载initramfs后,会执行根目录下的init,一般那是个脚本,在里面有如下过程:
1 mount -t proc proc /proc
2 mount -t sysfs sys /sys
3 udev start
4 加载module,启动lvm等等,在这里完成
5 mount /dev/mapper/vol-lfs /newroot (这是我的lvm上的lfs根分区)
6 umount /sys
7 umount /proc
8 exec chroot /newroot /sbin/init
四
1 关于init脚本,是kernel里面定的,指定执行那个文件
2 udev依赖挂载/sys,挂载/proc
3 有些发行版initramfs里面,会在/dev上再挂一个tmpfs,我觉得手工打造的话没必要,因为本来就在内存里,注意留出一定空间就行
4 关于上面init的最后一行,最终根文件系统的init,init如果检查到自己的pid是0,他就会做初始化计算机的事情,所以前面加exec
5 关于pivot_root,如果你去看内核文档里相关内容,他会告诉你先执行pivot_root,再chroot,但实际上,你不能在2.6.13以后的内核启动到initramfs中使用pivot_root,2.6.13是可以的,2.6.14就不行,会出错误Invalid argument。有人讨论过这个问题。跟root_fs有关。但是上面例子中的做法是正确的,我看过gentoo,ubuntu的initramfs,跟上面的例子是一样的。FC的做法是使用红帽自己的nash里的内部命令switchroot,我没找到nash的原代码,得下srpm盘,有点麻烦。但估计它的做法跟chroot一样,也是调用系统调用chroot。
6 目录树先使用cpio打成一个包,然后用gzip压缩。就可以用lilo,grub等加载。具体命令:
1) cd到那个目录
2) find . -print | cpio -o -H newc | gzip -9 > /boot/initramfs.gz
本文将不断完善。今天有点着急,先贴个能说明大概意思的吧。
二
我跟晨想在做的东西里专门有这样个程序来处理。
四
3.如果你不再要了挂不挂关系不大,而有些系统可能主系统dev目录下是空的,所以一般的做法是mount --move过去。proc和sys同。
5.pivot_root是必要的,switch_root和run-init都会调用pivot_root. |
|