为了省下一张光盘,我想让LFS从硬盘启动进行安装,这里的从硬盘启动我希望启动的是LFS光盘里的系统,因为用LFS光盘环境安装成功的几率比较大。这里对实现过程做个记录。
1.未成功的方法:
我开始认为只要把光盘中的内容解出来,然后设置系统启动时运行光盘的内核就可以了,所以我先在虚拟机中配置好DOS环境,把LFS光盘解压到硬盘中,再由loadlin.exe调入LFS内核,结果启动过程出现如下错误:
重试三次后自动关机。
2.寻找原因
从google搜索couldn't find an LFS LiveCD,找到一个init.c文件,发现这个程序是在LFS光盘启动时运行的,负责LFS光盘系统的文件系统的初始化,正是这个程序把LFS光盘中的root.ext2文件挂载到系统的。它默认总是从光驱设备中寻找LFS光盘,如果没有找到则提示上述错误。如果把它修改成从其它设备中读取root.ext3文件,应该是可以实现从硬盘启动的。
从lfs(http://wiki.linuxfromscratch.org/livecd/browser/trunk/initramfs?rev=1503)网站取得init.c、init.h、iso9660.h、Makefile文件,先不做任何修改,用gcc init.c编译,结果提示如下错误:
提示链接时找不到上述的函数,没招了又去问google,在http://www.linuxsir.org/bbs/showthread.php?p=1706682#post1706682发现必须以livecd为编译环境才可以正常编译。于是在虚拟机中用LFS光盘启动,在livecd环境中编译,问题依旧。该文还提供了另外一个链接http://www.linuxsir.org/bbs/showthread.php?t=274629,上面有更详细的介绍,但都是介绍6.2-5之前的版本,虽然已经很详细,但对我这样的菜鸟(对比一下人家用的编译命令和我用的编译命令就能看出来我有多菜)来说还是不够,我的问题依然没有解决。后来终于在http://bbs.znpc.net/viewthread.php?tid=3630发现问题原因,6.2-5版(应该是6.2版吧)与之前版本的编译参数不同,必须要加-ldevmapper参数才行。其实在http://www.linuxsir.org/bbs/showthread.php?t=274629已经说的很明白了,只是自己没有看懂。
总结一句话,就是要仔细研读Makefile文件,里面已经写的很清楚。
我的想法是让修改init.c让它从硬盘的某个分区挂载root.ext3而不是从光盘挂载,但我遇到的问题是不做任何修改直接运行编译后的程序都出错,错误如下:
无法继续了-_-
自己C语言好烂!
1.未成功的方法:
我开始认为只要把光盘中的内容解出来,然后设置系统启动时运行光盘的内核就可以了,所以我先在虚拟机中配置好DOS环境,把LFS光盘解压到硬盘中,再由loadlin.exe调入LFS内核,结果启动过程出现如下错误:
Searching for the CD named lfslivecd-x86-6.2-5
/dev/hdc:Drive not ready
I couldn't find an LFS LiveCD in any drive!!
I'm going to wait 10 seconds and try again (Try 0/3)
/dev/hdc:Drive not ready
I couldn't find an LFS LiveCD in any drive!!
I'm going to wait 10 seconds and try again (Try 0/3)
重试三次后自动关机。
2.寻找原因
从google搜索couldn't find an LFS LiveCD,找到一个init.c文件,发现这个程序是在LFS光盘启动时运行的,负责LFS光盘系统的文件系统的初始化,正是这个程序把LFS光盘中的root.ext2文件挂载到系统的。它默认总是从光驱设备中寻找LFS光盘,如果没有找到则提示上述错误。如果把它修改成从其它设备中读取root.ext3文件,应该是可以实现从硬盘启动的。
从lfs(http://wiki.linuxfromscratch.org/livecd/browser/trunk/initramfs?rev=1503)网站取得init.c、init.h、iso9660.h、Makefile文件,先不做任何修改,用gcc init.c编译,结果提示如下错误:
/tmp/ccXDnpgw.o: In function `main':
init.c:(.text+0x43b): #ff0000 reference to `dm_task_create'
init.c:(.text+0x451): undefined reference to `dm_task_set_name'
init.c:(.text+0x464): undefined reference to `dm_task_set_major'
init.c:(.text+0x474): undefined reference to `dm_task_set_minor'
init.c:(.text+0x4b8): undefined reference to `dm_task_add_target'
init.c:(.text+0x4c6): undefined reference to `dm_task_run'
init.c:(.text+0x4d4): undefined reference to `dm_task_destroy'
collect2: ld 返回 1
init.c:(.text+0x43b): #ff0000 reference to `dm_task_create'
init.c:(.text+0x451): undefined reference to `dm_task_set_name'
init.c:(.text+0x464): undefined reference to `dm_task_set_major'
init.c:(.text+0x474): undefined reference to `dm_task_set_minor'
init.c:(.text+0x4b8): undefined reference to `dm_task_add_target'
init.c:(.text+0x4c6): undefined reference to `dm_task_run'
init.c:(.text+0x4d4): undefined reference to `dm_task_destroy'
collect2: ld 返回 1
提示链接时找不到上述的函数,没招了又去问google,在http://www.linuxsir.org/bbs/showthread.php?p=1706682#post1706682发现必须以livecd为编译环境才可以正常编译。于是在虚拟机中用LFS光盘启动,在livecd环境中编译,问题依旧。该文还提供了另外一个链接http://www.linuxsir.org/bbs/showthread.php?t=274629,上面有更详细的介绍,但都是介绍6.2-5之前的版本,虽然已经很详细,但对我这样的菜鸟(对比一下人家用的编译命令和我用的编译命令就能看出来我有多菜)来说还是不够,我的问题依然没有解决。后来终于在http://bbs.znpc.net/viewthread.php?tid=3630发现问题原因,6.2-5版(应该是6.2版吧)与之前版本的编译参数不同,必须要加-ldevmapper参数才行。其实在http://www.linuxsir.org/bbs/showthread.php?t=274629已经说的很明白了,只是自己没有看懂。
总结一句话,就是要仔细研读Makefile文件,里面已经写的很清楚。
我的想法是让修改init.c让它从硬盘的某个分区挂载root.ext3而不是从光盘挂载,但我遇到的问题是不做任何修改直接运行编译后的程序都出错,错误如下:
Kernel panic - not syncing:VFS:Unable to mount root fs on unknown-block(1.0)
无法继续了-_-
自己C语言好烂!