新手玩Linux ---- 从Linux From Scratch开始学习Linux (四)

为了让安装时软件包过程当中方便访问,咱们最好创建一个目录来解压和编译源码包。咱们在咱们的工做目录/mnt/lfs中创建一个名字为sources的目录 既能够用来存储软件包和补丁,也能够做为工做目录。使用这个目录的好处是,全部须要的部件都在 LFS 分区上,构建过程当中的全部步骤均可以访问到。shell

要建立这个目录,在开始下载以前用 root 用户登陆,并运行下面的命令:bash

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 用户spa

root 用户登陆的时候,若是出现操做错误就足以损坏甚至摧毁系统,所以,咱们推荐使用一个无特权的用户来编译和安装软件包。建议您新建一个名为 lfs 的组,并在其中添加一个名为 lfs 的用户,咱们将在安装过程当中使用这个用户。以 root 用户运行下列命令来添加新用户:命令行

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs

命令行选项的含义:code

-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是一个漫长而浩大的工程,因此要一直开机直到完成有时候比较困难,特别是在机器速度比较慢的状况下,可以从新启动到最后工做的状态是很重要的。在不一样的阶段从新启动并恢复状态的步骤不彻底相同,因此本文会在不一样的阶段讨论从新启动恢复到工做状态的方法和步骤。
相关文章
相关标签/搜索