背景
如題,在postinst文件中直接執行了ldconfig命令, chroot 環境下出錯,安裝失敗
分析
chroot 環境下不能用 ldconfig 和 systemctl
但是:如果環境是 chroot,系統有可能沒完整掛載 /proc、/dev、系統路徑,跑 ldconfig 就容易段錯誤(core dump)。
解決
加條件判斷,出錯后也繼續執行接下來的安裝任務,防止影響安裝。
- chroot 環境下不能用 systemctl,要添加條件判斷
is_chroot() {if [ -f /proc/1/sched ]; then # 看 /proc/1/sched 這個文件存不存在。? 這個文件是記錄系統 第一個進程(PID 1) 的狀態。? 正常系統里 PID 1 是 systemd,如果沒這個文件,大概率是特種環境(比如 chroot)。# 檢查 init 是不是 systemd 打開 /proc/1/comm 這個小文件,看里面是不是寫著 systemd。 ? 這個文件保存了 PID 1 的名字。 ? 如果看到是 systemd,說明是正常啟動的系統,不是 chroot。if grep -q "systemd" /proc/1/comm 2>/dev/null; thenreturn 1 # 不是 chrootelsereturn 0 # 是 chrootfielsereturn 0 # 沒有 /proc,肯定是 chrootfi
}if ! is_chroot; thenif command -v systemctl >/dev/null 2>&1; then #檢查有沒有 systemctl 這個命令。 ? 有些很精簡的系統,可能沒裝 systemctl,所以這里保險一點,先檢查systemctl daemon-reload || truesystemctl enable xxx.service || truesystemctl daemon-reload || truefielseecho "Running in chroot, skipping systemctl operations."fi
-
ldconfig = 幫 Linux 記住最新的動態庫,避免程序找不到庫出錯。
-
Debian 包管理系統中常見的腳本有:
preinst:在安裝前執行。用于檢查環境、備份等操作。postinst:在安裝后執行。用于配置服務、創建文件等任務。prerm:在卸載前執行。用于停止服務、清理工作。postrm:在卸載后執行。用于刪除配置文件、清理系統。config:用于配置交互,接收用戶輸入并生成配置文件。