寫在前面
本章將完成臨時系統構建的最後缺失部分和各種包構建所需的工具。
解決了所有循環依賴關係後,就可以使用與主機操作系統完全隔離的“chroot”環境進行構建。
注意:接下來的指令,需要切換回root權限下執行
改變所有者
我們需要將$LFS下文件的所有者設置爲root,命令如下
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -R root:root $LFS/lib64 ;; esac
隨後,我們需要創建即將用來掛在文件系統的目錄,命令如下
mkdir -pv $LFS/{dev,proc,sys,run}
安裝和填充/dev
我們需要將宿主系統中的/dev掛載到$LFS下的dev中,命令如下
mount -v --bind /dev $LFS/dev
執行後會獲得如下輸出:
掛載虛擬內核文件系統
掛載剩下的虛擬內核文件系統
mount -v --bind /dev/pts $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run
在某些主機系統中,/dev/shm是到/run/shm的符號鏈接。上面掛載了/run tmpfs,在本例中需要創建shm目錄,命令如下
if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi
進入Chroot環境
現在,構建其餘所需工具所需的所有包都已在系統中,是時候進入chroot環境來完成其餘臨時工具的安裝了。
我們切換到chroot環境下正式構建LFS系統了,運行以下命令進入當前僅使用臨時工具的環境
chroot "$LFS" /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/usr/bin:/usr/sbin \ /bin/bash --login
輸入後,我們可以看到以下開頭信息:
警告:在這之後的處理中,都是在chroot下進行的,如果出現機器重啓的情況,需要重新“掛載和激活/dev” 和“掛載虛擬文件系統”以及“創建shm目錄”
建立文件夾
我們創建一些根目錄集
mkdir -pv /{boot,home,mnt,opt,srv}
通過以下命令在根級別以下創建所需的子目錄集
mkdir -pv /etc/{opt,sysconfig} mkdir -pv /lib/firmware mkdir -pv /media/{floppy,cdrom} mkdir -pv /usr/{,local/}{include,src} mkdir -pv /usr/local/{bin,lib,sbin} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} mkdir -pv /var/{cache,local,log,mail,opt,spool} mkdir -pv /var/lib/{color,misc,locate} ln -sfv /run /var/run ln -sfv /run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp
第一個install確保了不是所有人都可以進入/根目錄
第二個install確保任何用戶都可以寫入/tmp和/var/ tmp目錄,但不能從其中刪除其他用戶的文件
創建符號連接
創建符號連接的命令如下
ln -sv /proc/self/mounts /etc/mtab
我們創建/ect/hosts文件,命令如下
cat > /etc/hosts << EOF 127.0.0.1 localhost $(hostname) ::1 localhost EOF
爲了讓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:/usr/bin/false daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/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: input:x:24: mail:x:34: kvm:x:61: uuidd:x:80: wheel:x:97: users:x:999: nogroup:x:65534: EOF
我們添加一個用戶tester,並在第8章刪除該賬號,添加命令如下
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd echo "tester:x:101:" >> /etc/group install -o tester -d /home/tester
我們發現,有一句I have no name的提示,如圖所示:
由於我們已經創建了/etc/passwd和/etc/group,因此,我們可以讓I have no name的提示消失
消失的方法:開多一個終端,進入lfs chroot,然後輸入以下指令
exec /usr/bin/bash --login
效果如圖
我們可以發現no name的提示已消失
添加日誌文件
Login,Agetty和init需要使用一系列的日誌文件來記錄系統的操作,我們需要創建三個日誌文件
touch /var/log/{btmp,lastlog,faillog,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記錄的是失敗的登陸嘗試
程序安裝
第七章中也有很多程序需要安裝
注意:安裝的方式和之前有一定的區別
一定要在chroot下進行安裝!!!(否則你會和我一樣白做兩個快照)
可以看下面這張截圖來確定路徑
我們直接按照LFS-BOOK進行安裝即可
文件清理
在第七章的末尾,我們需要進行一系列的文件清理
注意,此時我們需回到chroot下
我們需要清理掉/usr/share下info,man,doc三個目錄下的所有文件
LFS-BOOK上寫到:清理這些文件將節約約35M的空間,這三個目錄裏下的文件,實際空間佔用如下:
我們可以通過rm -rf指令對其文件進行刪除
rm -rf /usr/share/{info,man,doc}/*
我們需要刪除若干個.la文件,指令如下:
find /usr/{lib,libexec} -name \*.la -delete
由於/tools目錄將不再被使用,因此可以將其刪除,並釋放約1GB空間,指令如下:
rm -rf /tools
文件備份
在LFS-BOOK中,介紹了對這些文件進行備份或恢復的方法。
但由於VMware提供了強大的快照功能,我們因此將採用簡單粗暴的辦法進行備份和恢復。
因此,本章不進行講解