一些程序使用固化的路径(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
文件记录错误的登录尝试。