Debian

預置安裝後 Debian 安裝程序不會退出

  • August 19, 2021

我正在進行預置安裝,其中涉及debconf在 debian 安裝程序中顯示 INFO 消息。在 late_command 結束時,我希望系統彈出安裝 cdrom,並重新啟動我的實例。問題是它沒有以這種方式執行,而是返回到 debian 安裝程序菜單,為了完成安裝過程,它只留下了手動關閉和從磁碟引導以彈出安裝 cdrom 的選項。

重要的是要準確地說,這種意外行為僅在我開始使用debconf INFO消息時出現(它之前按預期工作,因此preseed.cfg通常正確配置),因此它與它直接相關。

以下是以下內容:我的,late_command part由其啟動的腳本,安裝完成的時間,以及我被引導回來的螢幕。late_command``debconf``syslog

late_command:

d-i preseed/late_command string \
cp -rf /cdrom/build /target/home/device; \
/bin/sh /target/home/machine/build/deployment-preseed-track.sh; \
chmod +x /target/home/machine/build/deployment-preseed.sh; \
in-target --pass-stdout ./home/machine/build/deployment-preseed.sh > /target/var/log/installation.log; \
in-target rm -rf /home/machine/build;

deployment-preseed-track.sh(它基本上是通過掃描日誌來檢測部署進度)

#!/bin/sh

. /usr/share/debconf/confmodule
. "/home/machine/build/variables.sh"

logFile="/target${INSTALLATION_LOG_LOCATION}"
templatePath="/target/tmp/deployment_progress_tracker.templates"

cat > "${templatePath}" << 'EOF'
Template: deployment_progress_tracker/progress/fallback
Type: text
Description: ${STEP}...
EOF

debconf-loadtemplate deployment_progress_tracker "${templatePath}"
db_progress START 0 1 deployment_progress_tracker/progress

watchLogs () {
 deploymentDone=false
 while ! $deploymentDone
 do
   if [ -f "${logFile}" ]; then
     step=$(grep -E -o -a -h "Progress-step: .*" "${logFile}" | tail -1 | sed 's/Progress-step: //')
     if [ -z "${step##*$DEPLOYMENT_FINISHED*}" ]; then
       deploymentDone=true
     elif [ -n "${step}" ]; then
       db_subst deployment_progress_tracker/progress/fallback STEP "${step}"
       db_progress INFO deployment_progress_tracker/progress/fallback
     fi
   fi
   sleep 3
 done
}

系統日誌

回到這個螢幕

經過幾天的嘗試失敗後,我會回復自己。

Debconf 不是罪魁禍首。發生的事情是我編排腳本呼叫的方式(後台跟踪器和前台部署腳本)沒有給 debian 安裝程序以乾淨、預期的方式殺死後台腳本的機會。只要部署腳本被不一致地終止或未終止,就會隨機導致部署成功或失敗。

在了解發生了什麼之前,我很難嘗試使用 debconf,但自從我終於明白了,這就是我最終讓它每次都能無縫工作的結果。

我沒有將部署腳本deployment-preseed.sh作為前台程序啟動,將跟踪器deployment-preseed-track.sh作為後台程序啟動,而是完全相反,即:deployment-preseed-track.sh作為前台程序和deployment-preseed.sh後台程序。

我相應地更新了late_command

d-i preseed/late_command string \
cp -rf /cdrom/build /target/home/device; \
chmod +x /target/home/machine/build/deployment-preseed.sh; \
(in-target --pass-stdout ./home/machine/build/deployment-preseed.sh > /target/var/log/installation.log &); \
/bin/sh /target/home/machine/build/deployment-preseed-track.sh; \
in-target rm -rf /home/machine/build;

引用自:https://serverfault.com/questions/1074794