|
|

楼主 |
发表于 2006-10-3 08:54:33
|
显示全部楼层
在http://wiki.linuxfromscratch.org/livecd/browser/branches/6.1.1/查看所有代码。
1. 分析initramfs/init.c,发现函数mountlfscd()是问题的起因。
2. 大刀阔斧,直接删除init.c里面检查CD核对CD的部分,也就是从/* Try to open CD drive to see if we can use it */到/* Try to mount the cd drive*/之前(169到223行)的部分。
3. 第17行,加上一个"/dev/hda1", 这里我还删去了所有的我自己没有的设备,这样速度会快一些,这也是我说只支持hda1的原因。
4. 看init.h,这里面将32行中的iso9660改成ntfs,这也是我说的只支持ntfs的原因。
5. 看Makefile中的编译方法,用这个命令编译:gcc init.c -o init -static -Os -s -Wall
6. 准备好initramfs_data.cpio.gz的目录,比如tmp,在里面建立dev,bin,.tmpfs,.union四个目录,然后将/dev里面的loop0, null, console和hda1四个设备文件复制到tmp/dev里,将编译好的init复制到tmp里。
7. 看Makefile里面建立initramfs_data.cpio.gz的方法,进入到tmp目录,用这个命令建立:find . | cpio -o -H newc | gzip -9 > ../initramfs_data.cpio.gz
由于livecd里面的内核将除了iso9660之外的所有文件系统都编译成模块,所以要重新编译内核。下面是编译内核的分析(只需要增加ntfs):
8. 首先在运行 uname -a知道livecd内核版本是2.6.11.12
9. 分析packages/linux里面的Makefile,发现需要给内核源代码做三个patch:squashfs2.2-patch,reiser4-for-2.6.11-5.patch和unionfs-1.0.14
10. 其中只有unionfs-1.0.14的复杂一点,要先在packages/unionfs中用它提供的unionfs-1.0.14-fix_builtin-1.patch和unionfs-1.0.14-fixes-1.patch两个patch对unionfs-1.0.14做patch,然后再用unionfs-1.0.14中的patch-kernel.sh脚本对内核源代码做patch
11. 三个patch做好之后基本大功告成,将packages/linux中的config文件复制到内核源代码目录中并改名为.config
12. 看packages/linux中的Makefile知道如何编译内核:
make menuconfig (在文件系统里面将ntfs选成嵌入内核)
make
make modules_install
cp arch/i386/boot/bzImage linux
全部完成。
请多多指教。 |
|