为了让安装时软件包过程中方便访问,我们最好建立一个目录来解压和编译源码包。我们在我们的工作目录/mnt/lfs中建立一个名字为sources的目录 既可以用来存储软件包和补丁,也可以作为工作目录。使用这个目录的好处是,所有需要的部件都在 LFS 分区上,构建过程中的所有步骤都可以访问到。
要创建这个目录,在开始下载之前用 root 用户登录,并运行下面的命令:
mkdir -v $LFS/sources
把目录设置为可写和 sticky 模式,这里"Sticky"的意思是虽然某个目录对于多个用户有写入的权限,但这个目录中的文件只有其所有者才能删除。请运行下面的命令使目录可写,并设置 sticky 模式:
chmod -v a+wt $LFS/sources
下边编译的所有程序都将安装到 $LFS/tools 目录下,以便与后边教程中编译的程序隔离开来。这里编译的程序只是临时使用的工具,不是最终 LFS 系统的组成部分。把这些程序放到一个单独的目录下,在使用过之后简单的删除掉就可以了。这样做也可以防止这些程序与系统中相同的程序混淆(新手很容易出现这样的事情)。相关知识点:chmod a+wt是将目录或文件的属性设置为1777,这样任何人都可以对其进行读写。
以 root 用户运行下面的命令来创建所需的目录:
mkdir -v $LFS/tools
下一步是在宿主系统上创建一个 /tools 符号链接,指向 LFS 分区上新创建的目录,这个命令同样要作为 root 用户运行:
ln -sv $LFS/tools /
注意:ln -sv $LFS/tools执行后应该会提示
`/tools' -> `/mnt/lfs/tools'
表示正确。
相关知识点:
上面这两句就建立了神奇的工具链目录(是工具链目录不是工具链),这样的创建方式是为了在创建工具链和使用工具链创建目标系统的时候对于工具链的位置都是/tools,这样可保证工具链的正常使用
添加 LFS 用户
以 root 用户登录的时候,如果出现操作错误就足以损坏甚至摧毁系统,因此,我们推荐使用一个无特权的用户来编译和安装软件包。建议您新建一个名为 lfs 的组,并在其中添加一个名为 lfs 的用户,我们将在安装过程中使用这个用户。以 root 用户运行下列命令来添加新用户:
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
命令行选项的含义:
- -s /bin/bash 指定 bash 作为 lfs 用户的默认 shell
- -g lfs 将 lfs 用户添加到 lfs 组
- -m 为 lfs 用户创建 home 目录
- -k /dev/null 这个参数通过修改输入位置为特殊的空设备来防止从框架目录(默认为 /etc/skel)拷贝文件
- lfs 这是所创建的组和用户的实际名字
为了可以使用 lfs 用户登录(与从 root 用户切换到 lfs 用户不同,这种切换不需要 lfs 用户有一个密码),必须先为 lfs 用户设置一个密码(设置lfs密码,设置为空就行了,也就是输入密码的时候直接回车就成。):
passwd lfs
通过把 lfs 用户设置为 $LFS/tools 目录的所有者来授予 lfs 用户对该目录的完全访问权限:
chown -v lfs $LFS/tools
如果您依照建议创建了独立的工作目录,请将该目录的所有权赋予 lfs 用户:
chown -v lfs $LFS/sources
接下来,以 lfs 用户登录。您可以通过一个虚拟控制台,或者通过显示管理器,或者用下面的切换用户命令:
su - lfs
"-" 参数指示 su 开启一个登陆Shell(login shell)而不是非登陆Shell(non-login shell),这两种 shell 的不同之处请参考 bash(1) 和 info bash 。这时候你会发现命令行提示符已经由#改为了$
设置工作环境
通过给 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
这里利用了bash的环境变量的设置文件将lfs的环境设置为符合编译工具链要求的最少的环境参数
这里面最重要的就是PATH这个参数,目的是为了能够利用工具链里面的工具制作工具链:首先查找/tools/bin下是否有需要的命令,如果没有再到/bin和/usr/bin下找,然后用/bin或/usr/bin下面的命令来帮助生成需要的命令并放在/tools/bin下,这样此消彼涨,最终可完成一个自给自足的工具链。 到此为止就可以开始工具链的制作了,不过制作LFS是一个漫长而浩大的工程,所以要一直开机直到完成有时候比较困难,特别是在机器速度比较慢的情况下,能够重新启动到最后工作的状态是很重要的。在不同的阶段重新启动并恢复状态的步骤不完全相同,所以本文会在不同的阶段讨论重新启动恢复到工作状态的方法和步骤。
来源:oschina
链接:https://my.oschina.net/u/176906/blog/30408