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

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


ln -sv /tools/bin/{bash,cat,echo,grep,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

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:

uucp: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 标准基础(LSB,Linux Standard Base,http://www.linuxbase.org)只是推荐 root 组的 GID 为 0,另一个组 bin GID 为 1 。其它所有的组名和 GID 均由系统管理员自由设定,因为比较好的软件包一般都不依赖于 GID ,而只是使用组名。

为了能够移出 "I have no name!",则现在需要启用 shell。因为完整的 Glibc 在 第五章 中已经安装,而且 /etc/passwd/etc/group文件也已创建,用户名和组名现在可以开始使用了:


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

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

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


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 文件记录错误的登录尝试。


Host by Alair