LinuxSir.cn,穿越时空的Linuxsir!

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

成功将livecd安装在硬盘上

[复制链接]
发表于 2006-10-3 08:00:05 | 显示全部楼层 |阅读模式
使用的是lfslivecd-x86-6.1.1-4.iso,应该只要是镜像里面含有.root.sqfs这个文件的都可以。
只支持.root.sqfs放在hda1,文件系统必须ntfs,因为我编译的内核里面只增加了ntfs嵌入进内核。
我使用ntldr载入grldr,menu.lst这样编写:
title LFS Live CD
kernel (hd0,0)/linux
initrd (hd0,0)/initramfs_data.cpio.gz

需要linux内核文件和initramfs_data.cpio.gz的请在这里下载:
http://sandro.yang.googlepages.com/copyleft.htm
或者直接用gast:guestk登录gmail(http://mail.google.com/a/sandro.3322.org)自取。

.root.sqfs文件可以从下载官方的lfslivecd-x86-6.1.1-(x).iso(x=1, 2, 3, 4)中提取,也可以从我制作的四合一启动光盘中提取:
iso文件692M
http://www.box.net/public/ucenhngdsq
MutiBoot.iso (691.99 MB)
发表于 2006-10-3 08:06:26 | 显示全部楼层
恳请 Sandr0 兄把心得跟大家一起分享,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-3 08:16:58 | 显示全部楼层
所有编译工作都是在LFS LiveCD中完成的,呵呵
其实我也是新手,有很多地方也不清楚,反正就读源代码,边改边试,现在算是成功了吧
下面的帖子马上写下我分析的详细步骤。
回复 支持 反对

使用道具 举报

发表于 2006-10-3 08:18:04 | 显示全部楼层
期待中。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 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

全部完成。

请多多指教。
回复 支持 反对

使用道具 举报

发表于 2006-10-3 09:27:03 | 显示全部楼层
这下我的A230(没光驱、只支持USB软驱)有福了;感到ing......
谢谢!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-3 09:36:34 | 显示全部楼层
呵呵,我也是深知没有光驱的痛苦啊。我的光驱被我做diablo的镜像,一张烂盘,读了一个通宵,还是没搞定,然后就读不了盘了,后来我擦了一下激光头,又可以勉强读了,可是LiveCD只能读一半,有时可以有时不行,而且进不了x,郁闷啊。上面的东西都是在别人的电脑上编译的。

在硬盘上运行还有一个好处就是速度快很多,呵呵
回复 支持 反对

使用道具 举报

发表于 2006-10-4 10:27:34 | 显示全部楼层
感谢 Sandr0 的分享,相信有很多人可以受惠了,精华鼓励之!

Sandr0 兄似乎对 C 很精通,上次从那个内核的 init/do_mounts.c 得到不少启动,要向 Sandr0 兄学习学习。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-4 19:42:24 | 显示全部楼层
版主过奖了,我只不过是看得懂一点点C代码而已,乱改改也许还行,真要我写,肯定不行啦。还要多向大家学习!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-30 06:10:47 | 显示全部楼层
我又研究了一下,现在6.2的CD也可以安装到硬盘上了。
6.2系列的livecd和6.1变动很大,有很多新功能,最新的6.2-3中的xorg是最新发布的7.1,还有中文支持方面,现在locale里面可以选简体中文繁体中文GBK,BIG5,UNICODE,还有scim中文输入法,网络工具也很全,还有gaim聊天呢,可能唯一缺的就是多媒体了,我现在就是在硬盘上的livecd系统下发的帖,呵呵。
6.2的光盘做法也变了,不用6.1的squashfs了,是采用基于iso9660和linux内核的透明压缩来做的。这样安装到硬盘的方式也要相应改变。
6.2光盘里面的root.ext2镜像里面还包含200多M的lfs-sources,如果去掉这个,光盘文件大小可以压缩到272M。
如果不要删除任何东西,做起来相对简单,只需要重新编译一下init,并重新打包initramfs.cpio.gz就可以了。6.2的内核中编译了ext文件系统,所以如果将iso文件放在ext格式的分区中,就也不需要重新编译内核。init.c中还是先删掉检查光盘标签的那部分,然后在加载光盘那段前面加两行(以我安装在/dev/hda8上为例):
  1. mount("/dev/hda8", "/hda8", "ext3", 0, 0);
  2. losetup("/dev/loop2", "/hda8/lfslivecd-x86-6.2-3.iso", O_RDONLY);
复制代码

然后将加载光盘那行的curdevice改成"/dev/loop2"。
如果要删掉lfs-sources,想压缩空间,就相对复杂一点,除了要做上面的工作,还要解压root.ext2来做相应的删减。可以参照
http://wiki.linuxfromscratch.org ... -howto.txt?rev=1744
上面的步骤。
如果需要的话,我可以把我删除掉lfs-sources的root.iso(272M)做成bt种子发布。
回复 支持 反对

使用道具 举报

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

本版积分规则

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