出售域名  LinuxTags

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


出售域名  LinuxTags

host by aosp.me  CDN