《LinuxFromScratch》第三部分:構建LFS系統第六章:安裝基本的系統軟體-6.6.建立必需的檔案和符號連結

行者武松發表於2017-11-08

         有些程式裡會使用寫死的路徑呼叫其它暫時還未安裝的程式。為了滿足這種型別程式的需要,我們將建立一些符號連結,在完成本章內容後這些軟體會安裝好,並替代之前的符號連結:

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

每個軟連結的目的:

/bin/bash

許多 bash 指令碼指定了 /bin/bash

/bin/cat

這個路徑在 Glibc 的配置指令碼里寫死了。

/bin/echo

這個是為了滿足 Glibc 測試套件裡的一個測試用例,它會檢測 /bin/echo

/bin/pwd

某些 configure 指令碼,特別是 Glibc 的,寫死了這個路徑。

/bin/stty

這個路徑在 Expect 軟體中寫死了,所以在 Binutils 和 GCC 測試套件中會需要它。

/usr/bin/perl

許多 Perl 指令碼寫死了這個路徑呼叫 perl 執行程式。

/usr/lib/libgcc_s.so{,.1}

Glibc 需要這個讓 pthreads 庫正常工作。

/usr/lib/libstdc++{,.6}

在 Glibc 的一些測試套件中需要這個,而且在 GMP 的 C++ 支援中也會需要。

/usr/lib/libstdc++.la

這個可以預防引用 /tools 位置,在裝好 GCC 後新的引用位置是 /usr/lib/libstdc++.la

/bin/sh

許多 shell 指令碼寫死了位置 /bin/sh

由於歷史原因,Linux 在檔案/etc/mtab中維護一個已掛載檔案系統的列表。而現代核心改為在內部維護這個列表,並通過
/proc 檔案系統輸出給使用者。為了滿足一些依賴 /etc/mtab
檔案的應用程式,我們要建立下面的符號連結:

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

為了讓 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
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
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:
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:
nogroup:x:99:
users:x:999:
EOF

這裡建立的使用者組沒有參照任何標準 — 它們一部分是為了滿足本章中配置 Udev 的需要,還有一部分來自一些現存 Linux
發行版的通用設定。另外,某些測試套件也依賴特定使用者或組。而 Linux 標準規範 (LSB,參見http://www.linuxbase.org)只要求以組 ID(GID)為 0 建立使用者組 root
以及以 GID 為 1 建立使用者組 bin。系統管理員可以自由分配其它所有使用者組名字和 GID,因為優秀的程式不會依賴
GID 數字,而是使用組名。

為了移除 “I have no name!” 的提示符,可以開啟一個新 shell。由於完整的 Glibc 已經在 第五章 裡裝好了,而且已經建立好了
/etc/passwd/etc/group 檔案,使用者名稱和組名就可以正常解析了:

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

注意這裡使用了 +h 引數。這樣會告訴
bash 不要使用它內建的路徑雜湊功能。而不加這個引數的話,
bash 將會記住曾經執行過程式的路徑。為了在新編譯安裝好程式後就能馬上使用,引數
+h 將在本章中一直使用。

程式 loginagetty
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/log/wtmp 會記錄所有的登入和登出動作。檔案
/var/log/btmp 會記錄失敗的登入嘗試。

[Note]

注意

檔案 /run/utmp 會記錄當前已登入的使用者。這個檔案會在啟動指令碼中動態建立。

注:下面的注意事項為譯者根據第五章新增。

[重要]

重要

再次強調構建過程:

  1. 把所有原始檔和補丁放到 chroot 環境可訪問的目錄,例如 /mnt/lfs/sources/。但是千萬不能把原始檔放在 /mnt/lfs/tools/ 中。

  2. 進入到原始檔目錄。

  3. 對於每個軟體包:

    1. tar 程式解壓要編譯的軟體包。

    2. 進入到解壓後建立的目錄中。

    3. 根據指南說明編譯軟體包。

    4. 回退到原始檔目錄。

    5. 除非特別說明,刪除解壓出來的目錄和所有編譯過程中生成的 <package>-build 目錄。


相關文章