AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 732197
Accepted
Tim Stoop
Tim Stoop
Asked: 2015-10-29 03:07:30 +0800 CST2015-10-29 03:07:30 +0800 CST 2015-10-29 03:07:30 +0800 CST

传递变量以在 Debian Jessie 安装的预种子文件中使用

  • 772

是否可以通过引导提示向 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 文件中将命令连接在一起?但我更愿意将脚本放在单独的文件中。但是,如果不可能,那也不可能。

debian
  • 3 3 个回答
  • 6087 Views

3 个回答

  • Voted
  1. wheeler
    2018-08-11T11:37:49+08:002018-08-11T11:37:49+08:00

    这取决于您使用的操作系统,但 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_porthello

    在我的ubuntu.seed文件中,我有以下行将hello环境变量打印到文件中:

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

    当我导入并启动 OVA 时,该文件将world作为其内容位于我的主目录中。

    • 5
  2. Best Answer
    Tim Stoop
    2015-10-29T07:54:45+08:002015-10-29T07:54:45+08:00

    好的,我自己解决了(在@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=。

    • 2
  3. dragon788
    2018-09-20T17:52:31+08:002018-09-20T17:52:31+08:00

    在寻求解决几乎相同的问题时,我了解到了debian-installer. 如果您在 URL 中要设置为其他命令执行其相对提取的点处preseed_fetch添加 a,则可以使用从 URL 中提取。/./rootpath

    给定一个带有 preseed 文件夹的服务器和一个带有您要使用的其他文件的脚本文件夹,如果您通过了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”下找到。

    • 1

相关问题

  • 关闭 FTP

  • 如何在同一台电脑上从 putty 连接 debian vmware

  • debian- 文件到包的映射

  • Debian Ubuntu 网络管理器错误 [关闭]

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve