成功编译并运行linux from scratch 7.7 system,有必要作下总结。
本次用的编译LFS的环境是:
虚拟机是virtalbox
宿主系统为CentOS 7.0 x86_64 (core版本)
LFS版本为 7.7 system
我用两块硬盘,一块安装宿主系统,另一个作为LFS的编译安装盘,编译成功后,脱离宿主系统那块硬盘,单独引导启动LFS linux的那块硬盘,登录进入LFS linux。
虚拟机上安装好centos后,在虚拟机上加一块硬盘,大小20G左右,分区如下
磁盘驱动器:/dev/sdb 大小:21474836480 字节,21.4 GB 磁头数:255 每磁道扇区数:63 柱面数:2610 名称 标志 分区类型 文件系统 [标签] 大小 (MB) ------------------------------------------------------------------------------ sdb1 启动 主分区 ext2 131.61 sdb2 主分区 swap 1019.94 sdb5 逻辑分区 ext4 20323.30*
sdb1分100多M以后打算给/boot的单独分区,sdb2给swap分区,sdb5 作为系统根目录。
然后根据LFS手册说明创建好文件系统,把sdb5挂载到/mnt/lfs作为工作目录。按手册下载源文件,创建目录,配置环境等,就开始编译工具链,编译工具链有几个地方需要注意
1,手册中所有的软件编译命令都默认在解压出来的软件目录中进行,也就是说必须先用tar解压,再cd进行软件目录。
2,编译完成后用"cd .. "退出软件目录,回到source目录
3,除非特别说明,删除解压出来的目录和所有编译过程中生成的 <package>-build 目录。也就是说编译成功后把解压出来的源文件目录删除,如果有build目录,也要删除,以免影响下下编译。
编译工具链的系统基础软件都很顺利。
由于打算给/boot单独的分区,在编译内核之前,在chroot环境中,先挂载sdb1分区到/boot目录
mount -t ext2 /dev/sdb1 /boot
这样编译出来的kernel就会安装到sdb1分区上。
接下配置grub启动
cat > /boot/grub/grub.cfg << "EOF" # Begin /boot/grub/grub.cfg set default=0 set timeout=5 insmod ext2 set root=(hd1,5) menuentry "GNU/Linux, Linux 3.19-lfs-7.7-systemd" { linux /vmlinuz-3.19-lfs-7.7-systemd root=/dev/sdb5 ro } EOF
完成后,一切看上去已经很OK,于是把宿主系统的那块硬盘卸掉,单独启动LFS linux,也成功出现了系统菜单选择,选择后回车后傻眼了,提示找不到分区。
通过grub命令发现,硬盘是hd0,而不是hd1,原因很简单,原来宿主系统还是,宿主系统那块盘是hd0,LFS 系统的那块盘是hd1,而现在已经把宿主系统的硬盘卸掉了,只剩下一块LFS linux,理所当然是hd0。
于是在grub命令下,于是手动设置root和加载linux内核
set root=(hd0,5)
linux /vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda5 ro
boot
成功加载内核并启动后,报他个错误,也是没发现sdb硬盘,这让我想到了/etc/fstab 的配置,里面还是sdb,没办在,登录不进系统。
于是关闭虚拟机,重新把宿主系统的那块硬盘加入,引导进入宿主系统,用chroot进入lfs环境,修改/etc/fstab文件如下:
# Begin /etc/fstab /dev/sda5 / ext4 defaults 1 1 /dev/sda1 /boot ext2 defaults 0 0 /dev/sda2 swap swap pri=1 0 0 # End /etc/fstab
在chroot环境中,把lfa linux的/boot分区挂进来,修改/boot/grub/grub.cfg文件,修改后内容如下
set default=0 set timeout=5 insmod ext2 set root=(hd0,5) menuentry "GNU/Linux, Linux 3.19-lfs-7.7-systemd" { linux (hd0,1)/vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda5 ro }
保存退出。
关闭系统,把宿主系统卸掉,只引导LFS linux盘,成功进入系统,用root登录,各功能都正常。