作者:lvjinhua
日期:2005.11.13
上一回的主要内容就是: 在 lfs 用户下, 使用交叉编译技术, 在 $LFS/tools 目录下构建了一个临时的开发环境, 此开发环境包含了后续步骤将使用到的各种C/C++编译器, 各种库文件, 连接器, 文本编译器和一些Linux 下的常用工具软件, 需要再次说明的是, 这些工具是独立于宿主系统的. 并且在为 $LFS/tools 建立了一个符号连接 /tools 以方便引用. 本回我们将使用这些 /tools 下的工具构建我们的基本系统软件; 注意,本回构造出来的软件已经是最终软件, 废话少说, 开始吧->
注意: 到这一步已不再使用上一回的 lfs 用户, 而使用 chroot 切换一个虚拟系统, 此系统将 $LFS 目录作为其根目录进行操作, 因此在此下边的 /bin 目录不再是宿主系统的 /bin 目录, 我们的后续操作将在些虚拟系统下完成.
1. 挂载虚拟内核文件系统( 这一步依然在宿主系统的 lfs 用户下完成 )
所谓虚拟内核文件系统就是指那些由内核产生但不存在于磁盘上的文件系统, 可以使用它们与内核进行通信.
首先建立挂载目录: mkdir -p $LFS/{proc,sys} , 然后加载它们: mount -t proc proc $LFS/proc ; mount -t sysfs sysfs $LFS/sys , 后边的操作将在虚拟系统下挂载一些附加文件系统, 在此一并完成: mount -t tmpfs tmpfs $LFS/dev ; mount -t tmpfs tmpfs $LFS/dev/shm ; mount -t devpts -o gid=4,mode=620 devpts $LFS/dev/pts
2. 进入 chroot 虚拟环境
哈哈, 准备工作进行到这一步, 也算是完成一半了, 临时编译环境全部构建完成, 在 /tools 目录下, 后续的编译操作全部使用这下边的工具, 包括各种库, 完全不依赖于宿主系统; 我们也为切换到虚拟系统创建了必要的虚拟内核文件系统; 现在在宿主系统中退出 lfs 用户, 回到 root 用户, 运行如下命令进入虚拟系统:
chroot "$LFS" /tools/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin /tools/bin/bash --login +h
解释下上边的命令: "$LFS" 表示使用环境变量 LFS 作为虚拟系统的根目录, 在这里就是使用 /mnt/lfs 目录作为虚拟系统的根目录. -i 表示清除所有从宿主系统继承过来的环境变量. PS1='\u:\w\$' 表明命令行指示符显示当前用户名与当前工作目录. 在PATH 变量中将 /tools/bin放在最后是为了尽可能地使用新编译出来的工具, +h 的作用是使bash关闭它的 hash 记忆功能, 使其每次都重新按PATH 的指示搜索命令, 不记忆以前使用过的命令位置.
为了安全, 改变 /tools 目录的所有者: chown -R 0:0 /tools , 其中的 0:0 代表 root:root .
接下来的工作是创建虚拟环境所必须的目录树结构, 必要的配置文件, 符号连接, 使其符合 FHS 标准.
3. 安装系统必须的工具与库.
最后就是按照LFS的安装说明安装完所有的工具与库. 再说一次, 这里使用的编译工具和库全部来自 /tools 目录, 与宿主系统无任何关联.
虚拟系统的目录树,必须的工具与库均安装完成, 进入下一回.