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

内核对外提供了一些文件系统,以便自己和用户空间进行通信。 它们是虚拟文件系统,并不占用磁盘空间,其内容保留在内存中。

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

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

6.2.1. 创建初始设备节点

在内核引导系统时,它需要一些设备节点,特别是 consolenull 两个设备。 它们需要创建在硬盘上,这样在 udevd 启动前即可使用,特别是在 Linux 使用 init=/bin/bash 内核选项启动的时候。 运行以下命令创建它们:

mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3

6.2.2. 挂载和填充 /dev

用设备文件填充 /dev 目录的推荐方法是挂载一个虚拟文件系统(例如 tmpfs), 然后在设备被发现或访问时动态地创建设备文件。 这个工作通常由 Udev 在系统引导时完成,但我们的新系统还没有 Udev, 也没有被引导过,因此必须手工挂载和填充 /dev。 这通过绑定挂载宿主系统的 /dev 目录就可以实现,绑定挂载是一种特殊挂载类型, 它允许在另外的位置创建某个目录或挂载点的映像。 运行以下命令进行绑定挂载:

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

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

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

mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

devpts 挂载选项的含义:

gid=5

这保证 devpts 创建的所有设备节点都属于 ID 为 5 的组, 我们之后会把这个 ID 分配给 tty 组。这里使用组 ID 而不是名称, 因为宿主系统的 tty 组可能有不同的 ID 。

mode=0620

该选项确保 devpts 创建的所有设备节点具有权限码 0620 (所有者可读写,组成员可写)。与上一个选项结合使用, 可以保证 devpts 创建符合 grantpt() 要求的设备节点, 摆脱对 Glibc pt_chown 辅助程序 (默认不安装)的依赖。

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

if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi