4.1. 关于环境变量

4.1.1. LFS

环境变量 LFS 的使用贯穿全书。保持 LFS 总是已定义是很重要的,它应该被设置为 LFS 分区的挂载点。用下面的命令检查它的设置是否恰当:echo $LFS

请确认输出的是 LFS 分区挂载点的路径,如果您遵循我们的例子,则应该是 /mnt/lfs 。如果输出结果不正确,用下述命令设置它:export LFS=/mnt/lfs

设置这个环境变量的好处是您以后可以按照原样输入形如 mkdir $LFS/tools 的命令,当 shell 处理这个命令行的时候,会自动用 /mnt/lfs (或者该环境变量所设定的值)替换 $LFS

当您离开然后重新进入当前工作环境的时候(像 su 到 root 或者其他用户),不要忘记检查 $LFS 是否设置正确。

4.1.2. 创建 $LFS/tools 目录

第五章:构建临时编译环境 中编译的所有程序都将安装到 $LFS/tools 目录下,以便与 第六章:安装系统基础软件 中编译的程序隔离开来。这里编译的程序只是临时使用的工具,不是最终 LFS 系统的组成部分。把这些程序放到一个单独的目录下,在使用过之后简单的删除掉就可以了。这样做也可以防止这些程序与宿主系统中相同的程序混淆( 第五章:构建临时编译环境 )中容易出现这样的事情)。

root 用户运行下面的命令来创建所需的目录:mkdir -v $LFS/tools

下一步是在宿主系统上创建一个 /tools 符号链接,指向 LFS 分区上新创建的目录,这个命令同样要作为 root 用户运行:ln -sv $LFS/tools /

上述命令是正确的,ln 命令的语法有了一点变化。如果您认为发现了一个错误,在报告它之前,先用 info coreutils ln 和 ln(1) 命令查看手册页。

所创建的符号链接使得将要编译的工具链总是位于 /tools 目录下,这意味着编译器、汇编器和连接器在本章(这时我们还在使用宿主系统的一些工具)和下一章(这时我们"chrooted"到了 LFS 分区)都可以使用。

设置工作环境

通过给 bash shell 创建两个新的启动文件来设置一个良好的工作环境。用 lfs 用户登录,输入下面的命令来创建一个新的 .bash_profile 文件:

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

作为 lfs 用户登录的时候,初始 shell 通常是一个登陆 shell(*login* shell) ,它会首先读取宿主系统的 /etc/profile 文件(可能包含一些设置和环境变量),然后继续读取 .bash_profile 文件来完成登录初始化。.bash_profile 文件中的 exec env -i.../bin/bash 命令用完全空的环境来取代当前的环境(除了继承 HOME, TERM, PS1 变量外)。这样能保证我们的编译环境不会被宿主系统中不必要的或者有潜在危险的环境变量所影响,从而确保获得一个干净的工作环境。

另一个新的 shell 实例是非登陆shell(non-login shell),它不读取 /etc/profile 或 .bash_profile 文件,而是读取 .bashrc 文件。现在创建 .bashrc 文件:

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF

set +h 命令关闭 bash 的 hash 功能,hash 通常是一个有用的特性:bash 使用一个 hash 表来记录可执行文件的完整路径,以避免为了找到同一个可执行文件而反复搜索 PATH 里的目录。然而,新工具装好之后就要立即使用,通过关闭 hash 功能,当要运行程序的时候,shell 将总是搜索 PATH 里的目录,这样新工具一编译好,shell 就可以在 $LFS/tools 目录里找到,而不是执行所记忆的其它地方的旧版本程序。

将用户文件创建掩码(umask)设为 022 ,使得新创建的文件和目录只有所有者可写,其他用户只能读取和运行(open(2) 系统调用的默认模式是新文件权限 644,新目录权限 755)。

LFS 环境变量应该设为所选择的挂载点。

LC_ALL 环境变量控制着某些程序的本地化,使其显示的信息遵循指定国家的惯例。如果宿主系统使用的 Glibc 版本低于 2.2.4,将 LC_ALL 环境变量设置为"POSIX"或"C"以外的值(在本章中)可能会在您退出虚根环境后再想返回的时候出现问题。请把 LC_ALL 设置为"POSIX"或"C"(这两者是等价的)以确保在虚根环境中的所有东西都像预期的那样正常工作。

通过把 /tools/bin 放在 PATH 的最前面, 第五章:构建临时编译环境 中所有的程序安装好后,就可以立即被 shell 运行。将这一点和关闭 hash 功能结合起来,预防了宿主系统的旧程序在不该运行的时候却被运行了的风险。

最后,为了完全准备好编译临时工具的工作环境,导入刚刚创建的 profile 文件:source ~/.bash_profile

下一节:许多人都想知道编译和安装一个软件包预计需要多长时间。因为 Linux From Scratch 可以在多种不同的系统上创建,准确估计所需的时间是不可能的。最快的系统上编译安装最大的软件包(Glibc)大约需要 20 分钟,但在很慢的系统上可能耗费长达三天时间。我们不提供准确时间,代之以标准编译时间单位(SBU)来度量。