7.3. 准备虚拟内核文件系统

用户态程序使用内核创建的一些文件系统和内核通信。这些文件系统是虚拟的:它们并不占用磁盘空间。它们的内容保留在内存中。必须将它们被挂载到 $LFS 目录树中,这样 chroot 环境中的程序才能找到它们。

首先创建这些文件系统的挂载点:

mkdir -pv $LFS/{dev,proc,sys,run}

7.3.1. 挂载和填充 /dev

在 LFS 系统的正常引导过程中,内核自动挂载 devtmpfs/dev,并在引导过程中,或对应设备被首次发现或访问时动态地创建设备节点。udev 守护程序可能修改内核创建的设备节点的所有者或访问权限,或创建一些新的设备节点或符号链接,以简化发行版维护人员或系统管理员的工作。(详见第 9.3.2.2 节 “设备节点的创建”。) 如果宿主系统支持 devtmpfs,我们可以简单地将 devtmpfs 挂载到 $LFS/dev 并依靠内核填充其内容。

但是一些宿主系统的内核可能不支持 devtmpfs;这些宿主系统使用其他方法填充 /dev。因此,为了在任何宿主系统上都能填充 $LFS/dev,只能绑定挂载宿主系统的 /dev 目录。绑定挂载是一种特殊挂载类型,它允许通过不同的位置访问一个目录树或一个文件。运行以下命令进行绑定挂载:

mount -v --bind /dev $LFS/dev

7.3.2. 挂载虚拟内核文件系统

现在挂载其余的虚拟内核文件系统:

mount -v --bind /dev/pts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

在某些宿主系统上,/dev/shm 是一个指向 /run/shm 的符号链接。我们已经在 /run 下挂载了 tmpfs 文件系统,因此在这里只需要创建一个目录。

在其他宿主系统上,/dev/shm 是一个 tmpfs 的挂载点。此时,绑定挂载 /dev 只会在 chroot 环境中生成 /dev/shm 目录。这样,我们必须显式挂载一个 tmpfs:

if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
else
  mount -t tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm
fi