首页 > 系统管理 > LFS > LFS7.6 013 开始建立LFS系统
2015
03-10

LFS7.6 013 开始建立LFS系统

LFS7.6 013 开始建立LFS系统

1.改变所有者:

目前,$LFS/tools 目录属于 lfs 用户,该用户仅存在于宿主系统上。 如果 $LFS/tools 目录保持原样, 那么该目录内文件的所有者的 user ID 就没有对应的账号。 这会带来安全上的问题, 这是因为以后创建一个用户帐号的时候, 可能会得到(与 lfs 用户 –译者 )同样的 user ID ,他就成了 $LFS/tools 目录及内部所有文件的所有者, 那么这些文件就会面临被恶意操作的危险。

为了避免该问题,在建立 /etc/passwd 文件的时候,你可能要向新的 LFS 系统中添加与宿主系统的 user ID 和 group ID相同的 lfs 用户, 还有一个更好的办法就是通过下面的指令把 $LFS/tools 目录的所有者改为 root 用户:

chown -R root:root $LFS/tools

虽然一旦完成 LFS 系统,就可以把 $LFS/tools 目录删除, 但是可以保留该目录,用来构建多个相同版本的 LFS 系统,如何以最好的方法备份 $LFS/tools 目录取决于个人喜好。

2.首先让我们为虚拟内核文件系统建立挂载目录:

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

3.创建初始设备节点:

内核在引导系统时要求存在某些设备节点,特别是 console 和 null 设备。 为了在 udevd 启动之前以及 Linux 以 init=/bin/bash 启动时,这些设备节点可以使用,就必须在硬盘上创建它们。 通过运行下面的命令来创建这些设备:

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

4.挂载并填充/dev目录:

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

5.挂载虚拟内核文件系统:

现在挂载剩余的虚拟内核文件系统:

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

6.在某些主机系统,/dev/shm是一个连接/run/shm符号链接。/run tmpfs应该先挂载,所以在这种情况下只需要创建一个目录。

代码如下:

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

7.进入Chroot环境:

现在将要进入 chroot 环境来开始编译安装最终的 LFS 系统了, 目前我们只使用临时构建的工具。以root身份运行以下命令进入构建环境:

chroot "$LFS" /tools/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h

详解:

env 命令的参数 -i 的作用是清除所有 chroot 环境变量, 然后,仅仅重设变量 HOME, TERM, PS1 和 PATH 的值。 TERM=$TERM 设定虚拟根环境中的 TERM 的值与 chroot 外面的一样。 这个值是让像 vim 和 less 之类的程序可以正确操作。 如果还需要重新设置其它的值,如 CFLAGS 或 CXXFLAGS ,这里是个不错的位置。

从现在开始,不再需要 LFS 变量了,因为所有的工作都被限制在 LFS 文件系统里。 这是由于已经告诉了 Bash shell, $LFS 是现在的根(/)目录。

注意,这里 /tools/bin 位于 PATH 的后部, 这就是说 , 一旦最终版本安装完成, 就不再使用临时工具了。 为了使 shell 无法"记住"可执行二进制代码的位置, 需要通过使用 +h 参数关闭 bash 的散列功能。

注意此时 bash提示符会显示:I have no name! 这是正常的, 因为还没有创建 /etc/passwd 文件。

8.创建系统目录结构:

mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}
case $(uname -m) in
x86_64) ln -sv lib /lib64
ln -sv lib /usr/lib64
ln -sv lib /usr/local/lib64 ;;
esac
mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

解释:

缺省的创建目录的权限模式为 755, 但也并非所有的目录都如此。 以上的命令有两处有所不同: 一个是 root 用户的主目录,另外两个是临时文件目录。

第一个权限模式的改变是确保其他人不能进入到 /root 目录中——同样的, 这个模式也适用于让其它的普通用户可以工作在自己的目录中。第二个权限模式的改变, 确保任何用户都可以写 /tmp 和 /var/tmp 目录, 但不能从中删除其它用户的文件, 这是由"sticky位", 也就是"1777"中的最高位"1"来设定的。

9.创建必需的文件和符号连接:

一些程序使用固化的路径(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
sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
ln -sv bash /bin/sh

10.历史上,一个常规的Linux系统在 /etc/mtab 中有一个已挂载文件系统的列表。现代内核保持这种内部列表,并通过 /proc 文件系统将其公开给用户。来满足实用程序的期望,/etc/mtab的存在,创建以下符号链接

ln -sv /proc/self/mounts /etc/mtab

11.为了让 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
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/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:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty: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:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
nogroup:x:99:
users:x:999:
EOF

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

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

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

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

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

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

14.切换到工作目录:

cd /sources

15.从现在开始,如果重启,你需要登录root,执行下面的代码来恢复工作目录:

export LFS=/mnt/lfs
mount -v -t ext4 /dev/sdb2 $LFS
/sbin/swapon /dev/sdb1
mount -v --bind /dev $LFS/dev
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
chroot "$LFS" /tools/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
cd /sources
export LFS=/sources

下面开始安装基础系统软件。下一步:LFS7.6 014 Linux-3.16.2 API Headers + Man-pages-3.72




最后编辑:
作者:PurStar
PurStar
这个作者貌似有点懒,什么都没有留下。
捐 赠您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击

留下一个回复