LFS(Linux From Scratch)構建過程全記錄(七):進入Chroot並構建臨時工具

寫在前面

本章將完成臨時系統構建的最後缺失部分和各種包構建所需的工具。

解決了所有循環依賴關係後,就可以使用與主機操作系統完全隔離的“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提供了強大的快照功能,我們因此將採用簡單粗暴的辦法進行備份和恢復。

因此,本章不進行講解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章