web-dev-qa-db-ja.com

Debian Jessieインストールのpreseedファイルで使用する変数を渡す

ブートプロンプトを介して変数をDebianインストーラーに追加して、その変数をpreseedファイルで使用できるようにすることは可能ですか?

特に、次の問題を解決しようとしています。

通常、サーバーからダウンロードされるかなり広範なポストインストールスクリプトがあります。しかし、ここで、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インストーラはこれらを必要な値に置き換えません。そのため、preseedファイルで使用できる環境変数のような変数をインストーラーに渡すことができるのではないかと考えていました。

ヒントやヒントは大歓迎です!

編集:late_commandをbootコマンドに追加しようとしましたが、それはピックアップされませんでした。

編集:preseed/runを試しましたが、in-targetコマンドを許可しない別の環境で実行されました。

編集:これは回避策になる可能性があります: debian preseedファイルにコマンドを一緒にパイプするにはどうすればよいですか? しかし、スクリプトを別のファイルに含めることをお勧めします。それが不可能な場合、それは不可能です。

7
Tim Stoop

OK、私は自分で解決しました(@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
Tim Stoop

使用しているOSによって異なりますが、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」を使用することです。

カーネルによって取得されず、環境変数として解釈されなかった残りの引数は、通常はinit(1)プログラムであるPID 1に渡されます。 initプロセスに渡される最も一般的な引数は、シングルユーザーモードでコンピューターを起動し、通常のすべてのデーモンを起動しないように指示するWordの「単一」です。システムにインストールされている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_proxypacker_Hostpacker_portおよびhelloパラメータは完全にオプションであり、カーネルによって環境変数に変換されます。

私のubuntu.seedファイル、hello環境変数をファイルに出力する次の行があります。

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

OVAをインポートして起動すると、そのファイルはホームディレクトリにworldがコンテンツとして含まれます。

3
wheeler

ほぼ同じ問題を解決しようとしているときに、debian-installerに組み込まれている魔法について学びました。 preseed_fetchを使用して、他のコマンドがrootpathとして設定したいURLのポイントに/./を追加すると、他のコマンドに対して相対的なフェッチを実行できます。 。

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
0
dragon788