現在、Wineのビルドスクリプトを書いています。
Wine WOW64版のビルドには、(他の方法もありますが)lxcコンテナを使用する必要があります 。これをbashスクリプトに落としこむには、lxcコンテナをbashスクリプトで外部からコマンド操作しなければなりません。
つまり、bashスクリプトからlxcを呼び出し、lxcコンテナ内部でコマンド実行する必要があるのですが、この方法を見つけるのに少し手間取ってしまいました。
(検索キーワードに『lxc 自動実行 コマンド スクリプト』などを使うと、autostartの方法がヒットして目的の情報に辿りつけなかったため。)
lxc-attachコマンド実行の様子 |
lxcは、主にデプロイや実行をテストする用途に使われていると思っていたため、
『クリーンな環境を立ち上げて、外からコンテナ内でテストスクリプトを走らせる』
という使い方はすぐに見つかると思っていたのですが。
lxcを紹介しているサイトは多くの場合、初心者向けにlxcコンテナをターミナル上で立ち上げて終わりか、上級者が最初から設定ファイルを書くことを前提にしているかのどちらかでした。
設定ファイルが無くても、手動ならばlxcコンテナのターミナルからコマンド実行ができるのですから、これをコマンドで実現する方法は存在するはずです。
そしてlxcのコマンドを探しまわり実験を行った結果、以下のことがわかりました。
lxc-start では lxc-execute のコマンド指定に相当するオプションが使用できません。
lxc-execute はlxc-startよりも制限が多く、設定ファイルを用意しないと実用できません。
lxc-attach コマンドが、外部からコンテナ内でコマンド実行する方法として適している。
lxc-attachの詳細な解説はこちらで見ることができます。
http://manpages.ubuntu.com/manpages/trusty/ja/man1/lxc-attach.1.html
lxc-attach コマンドの使い方
lxcをインストールします。
sudo apt-get install lxc -y
lxcコンテナを作成します。
(今回は例としてWineビルドに使用する32bitコンテナを作成しています)
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386
lxcコンテナを立ち上げます。
sudo lxc-start -n my32bitbox -d -o log.txt
lxcコンテナ内でのコマンド実行を、外部から指示します。
sudo lxc-attach -n my32bitbox -- uname -a
以上です。
lxcコンテナ内でのコマンド実行を確かめるために、64bitホストから32bitコンテナのuname -aコマンドを呼んでいます。
成功していれば、32bitカーネルの返事が返ってきます。
lxcコンテナ応答の例:
Linux my32bitbox 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 i686 athlon i686 GNU/Linux
なお、lxcコンテナの起動を忘れてlxc-attachを実行すると、
lxc-attach: failed to get the init pid
というエラーメッセージが表示されます。