(注:本文于2月28日修改)
III. 构建 LFS 系统
挂载虚拟内核文件系统
为虚拟内核文件系统建立挂载目录:
$ mkdir -pv $LFS/{dev,proc,sys}
创建初始设备节点:
$ mknod -m 600 $LFS/dev/console c 5 1
$ mknod -m 666 $LFS/dev/null c 1 3
挂载并填充 /dev 目录:
$ mount -v --bind /dev $LFS/dev
现在挂载虚拟内核文件系统:
$ mount -vt devpts devpts $LFS/dev/pts
$ mount -vt tmpfs shm $LFS/dev/shm
$ mount -vt proc proc $LFS/proc
$ mount -vt sysfs sysfs $LFS/sys
为了方便使用源码包,将lfs-sources里面所有源码包复制到$LFS/sources目录中:
$ cp -v /lfs-sources/* $LFS/sources/
进入 Chroot 环境,以便不受主系统的影响来制作目标系统:
$ 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
此时 bash 提示符会显示“I have no name! :/#”因为 /etc/passwd 还没有创建。
如果此时重启了,需要再执行一次上面带*号的命令
创建系统目录结构:
$ mkdir -pv /{bin,boot,etc/opt,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/{doc,info,locale,man}
$ mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
$ mkdir -pv /usr/{,local/}share/man/man{1..8}
$ for dir in /usr /usr/local; do
ln -sv share/{man,doc,info} $dir
done
$ mkdir -v /var/{lock,log,mail,run,spool}
$ mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
创建必需的文件与符号连接,在目标系统的编译过程中,部分编译程序会用绝对路径来寻找命令或文件:
$ 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
为用到/etc/mtab的程序创建一个空文件:
$ touch /etc/mtab
创建root用户和必要的组:
$ 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"在这里只是一个占位符)。
$ 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
启动新的shell,驱除"I have no name!"提示符:
$ exec /tools/bin/bash --login +h
初始化日志文件,并设置适当的权限:
$ 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
到目前为止,创建目标系统的准备工作已基本完成,下面将开始目标系统的软件包安装。
(未完待续)