Debian

傳遞變數以在 Debian Jessie 安裝的預種子文件中使用

  • May 29, 2020

是否可以通過引導提示向 Debian 安裝程序添加變數,以便可以在預置文件中使用該變數?

特別是,我正在嘗試解決以下問題:

我們有一個相當廣泛的安裝後腳本,通常從伺服器下載。但現在我想創建 Packer 映像並將安裝後腳本與其他 Packer 文件一起保存在版本控制中。要訪問 preseed,我可以在啟動命令中執行“preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg”。但現在我希望安裝程序從同一位置下載安裝後腳本。

目前,安裝後掛鉤如下所示:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://our.public.server/postinstall.jessie.sh ; sh /tmp/postinstall.sh

理想情況下,我想做類似的事情:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://{{ .HTTPIP }}:{{ .HTTPPort }}/postinstall.jessie.sh ; sh /tmp/postinstall.sh

但當然 Debian 安裝程序不會用所需的值替換那些。所以我在想有可能將類似環境變數的變數傳遞給我們可以在預種子文件中使用的安裝程序。

任何提示或提示表示讚賞!

編輯:嘗試將 late_command 添加到引導命令中,但沒有被採納。

編輯:嘗試預置/執行,但它在不允許 in-target 命令的不同環境中執行。

編輯:這可能是一種解決方法:如何在 debian preseed 文件中將命令連接在一起?但我更願意將腳本放在單獨的文件中。但是,如果不可能,那也不可能。

好的,我自己解決了(在@lieter_ 的幫助下)。不太自豪,但它有效:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://`cat /proc/cmdline | sed 's/.*url=\([^ ]\+\).*/\1/'`/d-i/jessie/postinstall.sh ; sh /tmp/postinstall.sh

這正是我所需要的,因為我們在安裝時總是在命令行中添加一個 url=。

這取決於您使用的作業系統,但 Linux 核心將允許您將環境變數指定為核心參數。Linux 核心文件有一些很好的資訊(重要段落加粗):

參數列表

核心命令行被解析為由空格分隔的字元串列表(引導參數)。大多數引導參數具有以下形式:

 name[=value_1][,value_2]...[,value_10]

其中’name’是一個唯一的關鍵字,用於標識核心的哪一部分關聯值(如果有)將被賦予。注意 10 的限制是真實的,因為目前程式碼每個關鍵字只處理 10 個逗號分隔的參數。(但是,在異常複雜的情況下,您可以使用最多 10 個附加參數的相同關鍵字,> 假設設置函式支持它。)

大多數排序都編碼在核心源文件 init/main.c 中。首先,核心檢查參數是否是任何特殊參數’root=’、’nfsroot=’、’nfsaddrs=’、‘ro’、‘rw’、‘debug’或’init’。這些特殊參數的含義如下所述。

然後它遍歷一個設置函式列表,以查看指定的參數字元串(例如’foo’)是否與特定設備或核心部分的設置函式(‘foo_setup()’)相關聯。如果您將 foo=3,4,5,6 行傳遞給核心,那麼核心將搜尋 bootsetups 數組以查看 ‘foo’ 是否已註冊。如果是,那麼它將呼叫與 ‘foo’ (foo_setup()) 關聯的設置函式,並將核心命令行中給出的參數 3、4、5 和 6 傳遞給它。

**如上所述,任何不被接受為設置函式的“foo=bar”形式的任何內容都會被解釋為要設置的環境變數。

一個(無用的?)範例是使用 ‘TERM=vt100’ 作為引導參數。**

任何未被核心拾取且未被解釋為環境變數的剩餘參數然後被傳遞到 PID 1,這通常是 init(1) 程序。傳遞給 init 程序的最常見參數是單詞“single”,它指示它以單使用者模式啟動電腦,而不是啟動所有常用的守護程序。檢查系統上安裝的 init(1) 版本的手冊頁,以查看它接受哪些參數。

這是我的建構器boot_command中的部分virtualbox-iso(適用於 Ubuntu 18.04):

boot_command:
 - '<esc><esc><enter><wait>'
 - '/install/vmlinuz noapic fb=false '
 - 'auto=true '
 - 'hostname={{.Name}} '
 - 'url=http://{{.HTTPIP}}:{{.HTTPPort}}/ubuntu.seed '
 - 'initrd=/install/initrd.gz '
 - 'http_proxy={{user `http_proxy`}} '
 - 'packer_host={{.HTTPIP}} '
 - 'packer_port={{.HTTPPort}} '
 - 'hello=world '
 - 'quiet --- <enter>'

http_proxy、和參數是完全可選的packer_host,會被核心轉換成環境變數。packer_port``hello

在我的ubuntu.seed文件中,我有以下行將hello環境變數列印到文件中:

d-i preseed/late_command string echo $hello > /target/home/packer/hello

當我導入並啟動 OVA 時,該文件將world作為其內容位於我的主目錄中。

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