用户态程序使用内核创建的一些文件系统和内核通信。这些文件系统是虚拟的:它们并不占用磁盘空间。它们的内容保留在内存中。必须将它们被挂载到 $LFS 目录树中,这样 chroot 环境中的程序才能找到它们。
首先创建这些文件系统的挂载点:
mkdir -pv $LFS/{dev,proc,sys,run}
在 LFS 系统的正常引导过程中,内核自动挂载 devtmpfs
到
/dev
,并在引导过程中,或对应设备被首次发现或访问时动态地创建设备节点。udev
守护程序可能修改内核创建的设备节点的所有者或访问权限,或创建一些新的设备节点或符号链接,以简化发行版维护人员或系统管理员的工作。(详见第 9.3.2.2 节 “设备节点的创建”。)
如果宿主系统支持 devtmpfs
,我们可以简单地将
devtmpfs
挂载到 $LFS/dev
并依靠内核填充其内容。
但是一些宿主系统的内核可能不支持 devtmpfs
;这些宿主系统使用其他方法填充 /dev
。因此,为了在任何宿主系统上都能填充 $LFS/dev
,只能绑定挂载宿主系统的 /dev
目录。绑定挂载是一种特殊挂载类型,它允许通过不同的位置访问一个目录树或一个文件。运行以下命令进行绑定挂载:
mount -v --bind /dev $LFS/dev
现在挂载其余的虚拟内核文件系统:
mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run
devpts 文件系统挂载选项的含义:
gid=5
该选项使得所有通过 devpts 文件系统创建的设备节点属于编号为 5 的组。我们将会为 tty
组分配这个编号。因为宿主系统可能为 tty
组分配不同的编号,此处指定组编号而不是组名。
mode=0620
该选项使得所有通过 devpts 创建的设备节点的权限模式为 0620 (所属用户可读写,所属组可写)。该选项和前一选项共同保证 devpts 创建的设备节点符合 grantpt() 函数的要求,这样就不需要 Glibc 的 pt_chown 辅助程序 (默认不会安装该程序)。
在某些宿主系统上,/dev/shm
是一个符号链接,通常指向
/run/shm
目录。我们已经在 /run 下挂载了 tmpfs
文件系统,因此在这里只需要创建一个访问权限符合要求的目录。
在其他宿主系统上,/dev/shm
是一个 tmpfs
的挂载点。此时,绑定挂载 /dev 只会在 chroot 环境中生成 /dev/shm 目录。这样,我们必须显式挂载一个 tmpfs:
if [ -h $LFS/dev/shm ]; then install -v -d -m 1777 $LFS$(realpath /dev/shm) else mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm fi