前一篇中,我們在tools中安裝了臨時建構工具。本章我們會進入建構環境中,正式的建構lfs系統。
建立建構環境
1. 準備虛拟核心檔案系統
1.1 建立即将用來挂載檔案系統的目錄:
mkdir -pv $LFS/{dev,proc,sys,run}
1.2 建立初始裝置節點:
LFS文檔的解釋:核心引導系統的時候,依賴于幾個裝置節點,特别是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
1.3 挂載和激活/dev
将宿主系統中的/dev挂載到$LFS下的dev下:
mount -v --bind /dev $LFS/dev
1.4 挂載虛拟檔案系統
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
建立shm目錄:
if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
1.5 進入chroot環境
現在可以切換到chroot環境下正式建構lfs系統了,關于chroot可以閱讀如下的檔案進行了解:
https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
以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
注意事項:
在這之後的進行中,都是在chroot下進行的,如果出現機器重新開機的情況,需要重新“挂載和激活/dev” 和“挂載虛拟檔案系統”以及“建立shm目錄”
2. 開始建構
2.1 建立lfs檔案系統目錄:
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,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}
使用ls檢視一下,會發現和宿主系統的根目錄下的結構類似。
2.2 建立lfs檔案系統目錄:
有些程式會使用寫死的路徑調用還未安裝的程式,為了滿足這種程式的需要,我們需要建立一些符号連結,在安裝好這寫程式後,會替代這些符号連結。
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
ln -sv /proc/self/mounts /etc/mtab
建立密碼(/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
systemd-bus-proxy: x:72:72:systemd Bus Proxy:/:/bin/false
systemd-journal-gateway: x:73:73:systemd Journal Gateway:/:/bin/false
systemd-journal-remote: x:74:74:systemd Journal Remote:/:/bin/false
systemd-journal-upload: x:75:75:systemd Journal Upload:/:/bin/false
systemd-network: x:76:76:systemd Network Management:/:/bin/false
systemd-resolve: x:77:77:systemd Resolver:/:/bin/false
systemd-timesync: x:78:78:systemd Time Synchronization:/:/bin/false
systemd-coredump: x:79:79:systemd Core Dumper:/:/bin/false
nobody: x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
執行如下建立/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:
systemd-bus-proxy: x:72:
systemd-journal-gateway: x:73:
systemd-journal-remote: x:74:
systemd-journal-upload: x:75:
systemd-network: x:76:
systemd-resolve: x:77:
systemd-timesync: x:78:
systemd-coredump: x:79:
nogroup: x:99:
users: x:999:
EOF
如上x之前沒有空格,具體指令可以複制lfs文檔中對應章節的指令。
移除“I have no name!”的提示符:
exec /tools/bin/bash --login +h
添加日志檔案:
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/log/wtmp會記錄登入登出的動作,/var/log/lastlog會記錄最後一次登陸的資訊,/var/log/btmp記錄的是失敗的登陸嘗試。
至此建立建構環境的準備工作完成,下一步就是編譯和安裝程式,這個與上一篇的操作類似,為了防止出錯,後續一篇還是會加上這一步的内容。