Linux が初期起動時に独自に設定できるようにする

Linux が初期起動時に独自に設定できるようにする

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

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

setup-alpine
reboot
ifconfig eth1 192.168.56.101
adduser joe

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

初期スクリプトが実行されたら、手動で対話することなくこのプロセスを完全に自動化できますか?

答え1

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

/etc/rc.local

デプロイの開始時に実行される最初のファイルです。

答え2

あなたの仕事はLinuxディストリビューションのインストールを自動化しているようです。インストールイメージを変更し、自動化されたスクリプトを統合する方が効率的です。

その他のオプション:

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

    mount /dev/sdb1 /mnt && /mnt/script.sh
    
  • 仮想マシンにローカルネットワーク接続があることを確認し、次の手順を実行します。

    curl 192.168.56.1 | sh
    

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

答え3

必要な方法でシステムを構成するための実行可能なスクリプトセットがあると仮定すると、ebalが提案したように、/etc/rc.local(または配布に対応するエントリ)の末尾でスクリプトを実行できます。このスクリプトは、init が getty を生成する直前に、ブートプロセスの最後に実行されます。

/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が存在し、空であることを確認して、迷惑なエラーを避けてください。

上記はテストされていませんが(ブラウザで書かれています)、ポイントを特定する必要があります。

答え4

仮想マシン(特にVirtualBox)を設定する場合は、次のことをお勧めします。徒歩旅行者

次のように、単純なテキストファイルで仮想マシンを定義します。

# -*- 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などのソース管理システム)を実行できます。

観察を始めるともっと面白くなります。複数のマシンすべてのゲストが互いに通信できる設定が必要です。

Alpineを使用したい場合は確認してください。vagrant-alpine入れる

関連情報