6.6. 创建必需的文件与符号连接

一些程序使用固化的路径(hard-wired paths)指向一些目前还不存在的程序上。 为了兼容这些程序, 可以创建一些符号链接, 然后在软件安装之后用实际文件进行替代:

ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
ln -sv bash /bin/sh

一个常规的Linux系统在 /etc/mtab 中有一个已挂载文件系统的列表。 正常情况下, 这个文件在我们挂载一个新的文件系统的时候会被创建。 因为我们在 chroot 环境下不会再挂载任何文件系统, 所以我们需要为那些用到 /etc/mtab 的程序创建一个空文件:.

touch /etc/mtab

为了让 root 用户可以登录而且用户名"root"可以被识别,在这里需要创建相应的 /etc/passwd/etc/group 文件。

使用下面的命令创建 /etc/passwd 文件:

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF

root 的真正密码将在后面设置("x"在这里只是一个占位符)。

下面的命令创建 /etc/group 文件:

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
mail:x:34:
nogroup:x:99:
EOF

这里创建的用户组并不是某个标准所要求的部分——它们是本章的Udev配置所需要的, 并且是一些现有的Linux发行版的一部分。 Linux 标准基础(LSB,请参考 http://www.linuxbase.org)只是推荐"root"组的 GID 为 0,另一个组"bin"的 GID 为 1 。其它所有的组名和 GID 均由系统管理员自由设定,因为写得好的程序一般都不依赖于 GID , 而只是使用组名。

为了消除"I have no name!"提示符,现在启动新的shell。 因为完整的 Glibc 在 Chapter 5 中已经安装,而且 /etc/passwd/etc/group 文件也已创建, 用户名和组名现在可以开始使用了:

exec /tools/bin/bash --login +h

注意这里使用了 +h 参数。这是告诉 bash 不能使用其内部哈希表查找路径。 如果没有使用这个参数, 则 bash将会记住已经执行的二进制代码的路径。 为了让新编译安装的二进制代码可以马上投入使用,在这一章中,我们使用 +h 关闭了此功能。

程序 login, agetty, 和 init (以及其他一些程序) 使用一些日志文件来记录信息, 比如谁在什么时候登录了系统等等。然而如果这些日志文件不存在, 这些程序则无法写入。 下面初始化这些日志文件,并设置适当的权限:

touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/run/utmp /var/log/lastlog
chmod -v 664 /var/run/utmp /var/log/lastlog

/var/run/utmp 文件记录当前登录的用户。/var/log/wtmp 文件记录所有的登录和退出。 /var/log/lastlog 记录每个用户最后的登录信息。/var/log/btmp 文件记录错误的登录尝试。