为 bash shell
创建两个启动文件来设置一个好的工作环境。以 lfs
用户身份登录,执行下面的命令创建一个新的 .bash_profile
:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
当以 lfs
用户登录的时候,初始shell通常是一个
login shell,它会读取宿主的
/etc/profile
(一般会包含一些设置和环境变量),然后读取
.bash_profile
。.bash_profile
文件中的 exec env -i.../bin/bash
命令把正在运行的shell替换为一个完全是空环境的新shell,只保留 HOME
,TERM
,和 PS1
变量。这确保了没有我们不想要的、有潜在危险危险的环境变量会从宿主系统泄漏进构建环境。。这里用到的技术实现了确保有一个干净环。
shell的新实例是一个 non-login
shell,它不读取 /etc/profile
或 .bash_profile
文件,而是读取 .bashrc
文件。现在创建 .bashrc
文件:
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT 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” (这两个是等价的)确保在chroot环境中的每件事情都会像所预期的那样。
LFS_TGT
变量设置一个非默认的但兼容的机器描述,用于构建我们的交叉编译器和连接器以及交叉编译我们的临时工具链。更多信息在第 5.2 节 “工具链技术注解”。
通过把 /tools/bin
放在标准PATH
前面,在第
5
章中安装的所有程序在它们安装后会马上被shell找到。这样再结合关闭hash,限制了在第五章中相同的程序被安装后,来自宿主的旧程序被运行的风险。
最后,为使构建临时工具的环境完全准备好,source 刚刚创建的用户profile:
source ~/.bash_profile