web-dev-qa-db-ja.com

Linuxを初期起動時に自己構成する

手動の操作や自動化ソフトウェアを使用せずに、最小限で安全なLinuxバリアントを使用してVirtualBoxイメージを作成、開始、構成する単一のシェルスクリプトを作成したいと思います。

VirtualBoxイメージの作成は簡単ですが、初めて起動した後、SSH経由で残りの構成スクリプトを実行する前に、現在、次のように入力する必要があります。

setup-Alpine
reboot
ifconfig eth1 192.168.56.101
adduser joe

ホストからファイルをコピーするかスクリプトを実行することでこれを解決できると思いましたが、これには現在の選択であるAlpineLinuxでは利用できない「ゲストの追加」が必要なようです。

最初のスクリプトを開始した後、手動で操作せずにこのプロセスを完全に自動化するにはどうすればよいですか?

4
forthrin

次の最後にカスタムコマンドを追加することをお勧めします。

/etc/rc.local

これは、ディストリビューションが起動した後に実行される最初のファイルです。

3
ebal

あなたの仕事は、Linuxディストリビューションのインストールの自動化のようです。インストールイメージを変更し、自動化スクリプトを組み込む方がおそらく効率的です。

その他のオプション:

  • どういうわけかシリアルコンソールを入手し、ログインシェルが利用可能であることを期待します。次に、expectを使用してコンソールが表示されるのを待ち、手動で入力しているコマンドを発行します。 (QEMUを使用すると、これを実行できます。VBoxがこれをどのように処理するかわかりません。)
  • スクリプトと依存関係を保持する小さなディスクを作成します。次に、入力する必要があるのは次のようなものだけです。

    mount /dev/sdb1 /mnt && /mnt/script.sh
    
  • VMにローカルネットワーク接続があることを確認し、次のような操作を行います。

    curl 192.168.56.1 | sh
    

一部のディストリビューションのインストールメディアは、カーネルコマンドラインから構成URLを読み取ります。詳細については、ディストリビューションのドキュメントを参照してください。

2
Lekensteyn

マシンを希望どおりに構成するために実行できる一連のスクリプトがあると仮定すると、ebalが提案するように、/ etc/rc.local(またはディストリビューションの同等物)の最後でそれらを実行できます。そのスクリプトは、ブートプロセスの最後、gettyがinitによって生成される直前に実行されます。

/etc/rc.localの最後に次のようなものを追加することをお勧めします。

test -x /sbin/system-setup-step1.sh && /sbin/system-setup-step1.sh && reboot
test -x /sbin/system-setup-step2.sh && /sbin/system-setup-step2.sh && reboot
test -x /sbin/system-setup-step3.sh && /sbin/system-setup-step3.sh && reboot
# ... for however many steps are needed for your use case

次に、これらの各スクリプトの最後で、実行する必要がなくなったことを示すために実行ビットを削除し(ただし、ユーザーがスクリプトの実行内容を確認したい場合に備えて、スクリプトをディスクに残します)、次の名前を保存します。スクリプトをどこかに置き、シーケンス内の次のスクリプトの先頭にある以前に実行されたスクリプトを確認します。たとえば、これがsystem-setup-step2.shは次のようになります:

#!/bin/bash

test $(cat /var/tmp/last-system-setup-step) = "system-setup-step1.sh" || exit 1

# ... do stuff ...

# indicate that this doesn't need to run again
/bin/chmod -x "$0"
printf '%s' $(basename "$0") > /var/tmp/last-system-setup-step
# finished successfully
exit 0

各スクリプトの上部近くのテスト条件を調整します。

このように、システムは何度も再起動し、最後にこれらすべてのtest条件を通過して、ログインプロンプト(または設定したその他の条件)に到達します。これは、どのスクリプトも実行しないためです。実行ビットを設定します。何か問題が発生した場合、構成と再起動のプロセスは単に停止します。

元のイメージで、/ var/tmp/last-system-setup-stepが存在し、空であることを確認して、迷惑なエラーを回避します。

上記はテストされていません(ブラウザで記述されています)が、要点を理解する必要があることに注意してください。

1
a CVn

記録として、virtualbox-guest-additionsパッケージがテストで利用可能でした。

2017年1月24日以降、Edgeバージョンのコミュニティリポジトリで利用できるようになりました。

テストリポジトリを使用するには、次のことを行う必要があります。

 export ALPINEVER=v3.5
 echo "http://dl-cdn.alpinelinux.org/Alpine/$ALPINEVER/testing" >> /etc/apk/repositories

もちろん、実際に使用しているAlpineのバージョンでALPINEVERを変更する必要があります。

1

(特にVirtualBoxで)仮想マシンをセットアップしようとしている場合は、 Vagrant の使用を検討することをお勧めします。

次のような単純なテキストファイルでVM)を定義できます。

# -*- mode: Ruby -*-
# vi: set ft=Ruby :

Vagrant.configure("2") do |config|

    # Specify the base image or "box"
    config.vm.box = "ubuntu/xenial64"

    # Define networking
    config.vm.network "private_network", ip: "192.168.50.4"

    # Share folders between the Host and the guest
    config.vm.synced_folder "../shared", "/shared"

    # Run "provisioners" that change the guest
    config.vm.provision :Shell, :inline, "touch hello_world"
    config.vm.provision "Shell", path: "script.sh"

    # You can even use tools like Ansible or Puppet:
    config.vm.provision "ansible" do |ansible|
        ansible.playbook = "playbook.yml"
    end
end

Vagrantを使用すると、特に仮想マシンでのネットワークの管理が簡単になりますが、仮想マシンのセットアップ方法を簡単に定義することもできます。また、VM)を定義するVagrantfileがあるため、バイナリOVAやまたはと比較して、これを他のユーザーと簡単に共有したり、(Gitなどのソース管理システムに)バックアップしたりできます。同等。

multi machine セットアップを検討し始めると、さらに興味深いものになります。ここでは、すべてのゲストが相互に通信できる必要があります。

アルパインを使用したい場合は、 vagrant-Alpineプラグイン

0
ydaetskcoR