《LinuxFromScratch》第三部分:構建LFS系統第六章:安裝基本的系統軟體-6.63.Systemd-219

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

             systemd 軟體包包含用於控制啟動、執行和關閉系統的程式。

大概編譯時間:
2.1 SBU
需要磁碟空間
815 MB

6.63.1.安裝 systemd

首先建立檔案使得當使用第五章中編譯的
Util-Linux 以及停用預設的 LTO(連結時優化) 時能順利編譯 systemd:

cat > config.cache << "EOF"
KILL=/bin/kill
HAVE_BLKID=1
BLKID_LIBS="-lblkid"
BLKID_CFLAGS="-I/tools/include/blkid"
HAVE_LIBMOUNT=1
MOUNT_LIBS="-lmount"
MOUNT_CFLAGS="-I/tools/include/libmount"
cc_cv_CFLAGS__flto=no
EOF

預設要停用 LTO 是因為它會使
systemd
以及其它輔助程式連結到
libgcc_s.so、導致編譯速度下降以及編譯後程式碼量更大。

另外,修復一個使用第五章中編譯的 Util-Linux 時的編譯錯誤:

sed -i "s:blkid/::" $(grep -rl "blkid/blkid.h")

應用下面的補丁使得安裝 compat
pkg-config
檔案但不安裝在 LFS 中沒有用的 compat 庫:

patch -Np1 -i ../systemd-219-compat-1.patch

停用一個總是失敗的測試例程:

sed -i "s:test/udev-test.pl ::g" Makefile.in

準備編譯 systemd:

./configure --prefix=/usr                                           
            --sysconfdir=/etc                                       
            --localstatedir=/var                                    
            --config-cache                                          
            --with-rootprefix=                                      
            --with-rootlibdir=/lib                                  
            --enable-split-usr                                      
            --disable-gudev                                         
            --disable-firstboot                                     
            --disable-ldconfig                                      
            --disable-sysusers                                      
            --without-python                                        
            --docdir=/usr/share/doc/systemd-219                     
            --with-dbuspolicydir=/etc/dbus-1/system.d               
            --with-dbussessionservicedir=/usr/share/dbus-1/services 
            --with-dbussystemservicedir=/usr/share/dbus-1/system-services

配置選項的含義:

--config-cache

該選項告訴編譯系統使用之前建立的
config.cache 檔案。

--with-root*

這些選項確保核心程式以及共享庫安裝到根目錄的子目錄中。

--enable-split-usr

該選項確保系統中 /bin、/lib 和 /sbin 目錄沒有到
/usr 對應位置的符號連結時 systemd 仍能正常工作。

--disable-gudev
--without-python

這些選項停用 LFS 沒有提供所需依賴的可用功能。

--disable-firstboot

該選項防止安裝系統初次啟動時會進行設定的 systemd 服務。由於
LFS 中所有都要手動設定,它們並無用處。

--disable-ldconfig

該選項防止安裝啟動時會執行
ldconfig
而導致啟動時間過長的 systemd 單元。儘管對於類似 LFS
之類的源發行版並無用處,如果需要該功能的話可以移除這個選項。

--disable-sysusers

該選項防止安裝設定 /etc/group/etc/passwd 檔案的 systemd 服務。本章前面章節中已經建立了這兩個檔案。

--with-dbus*

這些選項確保 D-Bus 配置檔案安裝到了正確的位置。

編譯軟體包:

make LIBRARY_PATH=/tools/lib

該軟體包有個測試套件,但只能在安裝後執行。

安裝軟體包:

make LD_LIBRARY_PATH=/tools/lib install

移動 NSS 庫到 /lib

mv -v /usr/lib/libnss_{myhostname,mymachines,resolve}.so.2 /lib

移除一個不必要的目錄:

rm -rfv /usr/lib/rpm

建立和 Sysvinit 相容的符號連結,使得 systemd 作為預設的啟動系統:

for tool in runlevel reboot shutdown poweroff halt telinit; do
     ln -sfv ../bin/systemctl /sbin/${tool}
done
ln -sfv ../lib/systemd/systemd /sbin/init

移除一個到不存在組的引用並修復一個配置檔案使得啟動時不會導致
systemd-tmpfiles 失敗:

sed -i "s:0775 root lock:0755 root root:g" /usr/lib/tmpfiles.d/legacy.conf
sed -i "/pam.d/d" /usr/lib/tmpfiles.d/etc.conf

建立 systemd-journald
需要的 /etc/machine-id 檔案:

systemd-machine-id-setup

由於測試套件高度依賴於宿主系統的核心配置,一些測試很可能失敗。另外還需要做些更改使得不會查詢本章後面
Util-Linux 軟體包安裝的一個程式。用以下命令測試結果:

sed -i "s:minix:ext4:g" src/test/test-path-util.c
make LD_LIBRARY_PATH=/tools/lib -k check

6.63.2. systemd 軟體包內容

安裝的程式:
bootctl, busctl, coredumpctl, halt,
hostnamectl, init, journalctl, kernel-install, localectl,
loginctl, machinectl, networkctl, poweroff, reboot, runlevel,
shutdown, systemctl, systemd-analyze, systemd-ask-password,
systemd-cat, systemd-cgls, systemd-cgtop, systemd-delta,
systemd-detect-virt, systemd-escape, systemd-hwdb,
systemd-inhibit, systemd-machine-id-setup, systemd-notify,
systemd-nspawn, systemd-path, systemd-run,
systemd-stdio-bridge, systemd-tmpfiles,
systemd-tty-ask-password-agent, telinit, timedatectl, 和
udevadm
安裝的庫:
libnss_myhostname.so.2,
libnss_mymachines.so.2, libnss_resolve.so.2, libsystemd.so, 和
libudev.so
安裝目錄:
/etc/binfmt.d, /etc/init.d, /etc/kernel,
/etc/modules-load.d, /etc/sysctl.d, /etc/systemd,
/etc/tmpfiles.d, /etc/udev, /etc/xdg/systemd, /lib/systemd,
/lib/udev, /usr/include/systemd, /usr/lib/binfmt.d,
/usr/lib/kernel, /usr/lib/modules-load.d, /usr/lib/sysctl.d,
/usr/lib/systemd, /usr/lib/tmpfiles.d,
/usr/share/doc/systemd-219, /usr/share/factory,
/usr/share/systemd, /var/lib/systemd, 和
/var/log/journal

簡要介紹

bootctl

用於查詢韌體和啟動管理設定

busctl

用於自檢和監控 D-Bus 匯流排

coredumpctl

用於檢索 systemd 日誌生成的核心轉儲

halt

通常呼叫帶
-h
引數的 shutdown
命令,除非已經是執行等級 0,然後告訴核心暫停系統;它會在
/var/log/wtmp
檔案中標記正準備關閉系統。

hostnamectl

用於查詢或更改系統名稱以及相關的設定

init

核心初始化硬體後接管載入程式而啟動的第一個程式,它會啟動設定的其它程式。

journalctl

用於查詢 systemd 日誌的內容

kernel-install

用於向 / 從 /boot 中新增或移除核心以及 initramfs 映象

localectl

用於查詢和更改系統地區和鍵盤佈局設定

loginctl

用於自檢和控制 systemd 登入管理器的狀態

machinectl

用於自檢和控制 systemd 虛擬機器和容器註冊管理器的狀態

networkctl

用於檢查 systemd-networkd 所看到的網路連結狀態

poweroff

告訴核心暫停系統並關閉計算機
(檢視 halt

reboot

告訴核心重啟系統
(檢視 halt

runlevel

報告之前和當期的執行等級、即
/var/run/utmp 檔案中的最後一個執行等級記錄

shutdown

以安全的方式關閉系統、向所有程式傳送訊號並通知所有登入的使用者

systemctl

用於自檢和控制 systemd 系統和服務管理器的狀態

systemd-analyze

用於確定當前引導中的系統啟動效能

systemd-ask-password

通過命令列中的問題訊息用於向使用者查詢系統密碼或口令

systemd-cat

用於連線程式日誌的 STDOUT 和 STDERR

systemd-cgls

以樹的形式遞迴顯示指定 Linux 控制組層次結構的內容

systemd-cgtop

按照 CPU、記憶體和磁碟 I/O 負載的順序顯示本地 Linux 控制組層次結構的頂層控制組

systemd-delta

用於識別和比較 /etc 中覆蓋
/usr 對應部分的配置檔案

systemd-detect-virt

在虛擬化環境中檢測執行情況

systemd-escape

用於在 systemd 單元名稱中包含轉義字串

systemd-hwdb

使用者管理硬體資料庫(hwdb)

systemd-inhibit

用於在關機、睡眠或空閒休眠鎖時執行程式

systemd-machine-id-setup

啟動時系統安裝程式用隨機生成的 ID 初始化儲存到
/etc/machine-id 的機器 ID

systemd-notify

守護程式指令碼用於通知 init 系統狀態更改

systemd-nspawn

用於在輕量級容器空間中執行命令或作業系統

systemd-path

用於查詢系統和使用者路徑

systemd-run

用於建立並執行一個臨時 .service 或 .scope 單元並在其中執行指定命令

systemd-tmpfiles

基於配置檔案格式和
tmpfiles.d
指定的位置建立、刪除以及清理易變的和臨時檔案和目錄

systemd-tty-ask-password-agent

用於列出或執行正在等待的 systemd 密碼請求

telinit

告訴 init 要更改的執行等級

timedatectl

用於查詢和更改系統時間和設定

udevadm

通用 Udev 管理工具:控制 udevd 守護程式、從 Udev 資料庫提供資訊、
監控 uevent、等待 uevent 完成、檢測 Udev 配置、為指定裝置觸發 uevents

libsystemd

systemd 工具庫

libudev

用於獲取 Udev 裝置資訊的庫


相關文章