Linux From Scratch: Chapter 3
chroot,即 change root,用于改变当前进程及其子进程的根目录到指定的目录,创建一个隔离的环境。这是我们脱离宿主系统的第一步,后续所有的操作都在 chroot 环境下进行。从现在开始,所有的命令都要以 root 身份执行,所以必须要小心,否则可能对 LFS 系统造成损害。 chroot 前准备 第一步是改变所有者。目前,$LFS 目录树的所有者都是 lfs,这个用户只存在于宿主系统,并不存在于 LFS 系统。为此,我们要将 $LFS/* 目录的所有者都改为 root: chown --from lfs -R root:root $LFS/{usr,var,etc,tools} case $(uname -m) in x86_64) chown --from lfs -R root:root $LFS/lib64 ;; esac Linux 延续了 UNIX 一切皆文件的设计哲学,根目录下有一些目录是用来和内核进行通信的,比如 /dev、/proc 等,它们被称作虚拟内核文件系统(Virtual Kernel File Systems)。在 chroot 环境中构建系统时,应用程序需要这些接口来获取硬件信息或向内核发送指令,所以必须先把它们挂载到 $LFS 目录树中。 先创建挂载点: mkdir -pv $LFS/{dev,proc,sys,run} 对于/dev 的挂载,在正常的引导过程中,内核会自动挂载 devtmpfs 到 /dev,LFS 官方书考虑到一些内核可能不支持 devtmpfs,选择绑定挂载宿主系统的 /dev 目录: mount -v --bind /dev $LFS/dev 接下来挂载其余的虚拟内核文件系统: mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts 其中 gid=5 使所有通过 devpts 文件系统创建的设备节点属于编号为 5 的组,mode=0620 使得所有通过 devpts 创建的设备节点的权限模式为 0620,即所属用户可读写,所属组可写。这两个选项共同保证 devpts 创建的设备节点符合 grantpt() 函数的要求,这样就不需要 Glibc 的 pt_chown 辅助程序。 ...