是否可以通过启动提示向 Debian 安装程序添加变量,以便该变量可以在预置文件中使用?
具体来说,我正在尝试解决以下问题:
我们有一个相当广泛的安装后脚本,通常是从服务器下载的。但现在我想创建 Packer 映像并将安装后脚本与其他 Packer 文件一起保存在版本控制中。要访问预安装,我可以在启动命令中执行“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 添加到启动命令中,但是没有成功。
编辑:尝试了预置/运行,但它在不同的环境中运行,不允许目标命令。
编辑:这可以是一种解决方法:如何在 debian 预置文件中将命令连接在一起?但我更希望将脚本放在单独的文件中。如果不可能的话,那就不可能了。
答案1
这取决于您使用的操作系统,但 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
作为其内容。
答案2
好的,我自己解决了这个问题(在@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=。
答案3
在寻求解决相同问题的过程中,我了解到了 中的一些魔法。如果您在 URL 中想要设置为 的位置添加 ,则debian-installer
可以使用preseed_fetch
来从 URL 中提取,以供其他命令执行相对提取。/./
rootpath
给定一个具有预置文件夹和脚本文件夹的服务器,其中包含您想要使用的其他文件,如果您通过,url=http://{{.HTTPIP}}:{{.HTTPPort}}/http/./preseed/ubuntu.seed
那么您可以引用相对于根路径的其他文件,如preseed_fetch /scripts/somescript.sh /tmp/somescript.sh
。
d-i preseed/late_command string preseed_fetch /scripts/late_script /tmp/late_script; \
log-output -t late_script sh /tmp/late_script
更多信息请访问https://hands.com/di/lenny/start.cfg和https://hands.com/di/在标题“url=magic”下。