Edited at

systemd-nspawnメモ

More than 1 year has passed since last update.


環境


  • ホストOS: Antergos

  • コンテナOS: Arch
    開発環境ごとにコンテナを作成


Dockerとかよく知らん


  • コンテナ自体よくわかってないけどとりあえず動いてるからその設定まとめ


設定


とりあえずコンテナインストール

sudo pacman -S arch-install-scripts

# UserのHomeディレクトリにコンテナをインストールする
# コンテナを数種類入れたいのでdevelディレクトリを作成してその下に各種コンテナをインストールする.
# 今回Archにしてるが,例えば言語ごとにコンテナを分けるときは言語名とかもでも.
sudo pacstrap -i -c -d ~/devel/arch base base-devel --ignore linux


  • kernelは共有のため--ignoreでLinuxカーネルインストールをしないように設定


とりあえず出来たか確認のためLoginする

sudo systemd-nspawn -b -D ~/devel/arch --bind=/var/cache/pacman/pkg

# 抜ける場合はCtrl+]を三回繰り返す


pacmanキャッシュの共有


  • コンテナOSもホストと同じくArchなのでパッケージDLのキャッシュを共有させる

  • そのため上記のように--bindをつける


ホストと共有するフォルダの生成


  • --bindは何個か一緒に使えるっぽいのでもう1個--bindを追加して共有フォルダを作る

sudo systemd-nspawn -b -D ~/devel/arch --bind=/var/cache/pacman/pkg --bind=/home/UserName/dev:/root/dev


  • ホストOSのディレクトリ:コンテナOSのディレクトリ 的な書き方

  • コンテナ側は存在してない場合作成してくれる

  • ホスト側の内容が優先されてるような感じで先にコンテナ側でディレクトリを作成して中にファイルを入れてる状態でbindするとホスト側の情報で上書きされる.

  • が,--bindオプション無しで起動するともとのデータは残ってたりした.--bindすることでコンテナ内のデータは書き換わらずにホスト側のディレクトリにリンクが貼られてそれがコンテナ側で表示されてる?のかも

これでファイル共有が出来たのでコンテナ内の開発環境をホスト側で好きなIDEでいじって共有することができると思われる

(これ知る前にnvimでコンテナ内開発環境作り続けた時間よ,,)

また追加事項あれば追加していきます.

machinectl使わないのかてのはあれです.ちょっとDir移動するのが面倒でやってないです.


Network設定


  • systemd-networkdを使用してホストとコンテナをBridgeでつなげる


ホスト側


  • systemd-networkdとsystemd-resolvedを使えるようにする

systemctrl disable NetworkManager

systemctrl stop NetworkManager
systemctrl enable systemd-networkd systemd-resolved
systemctrl start systemd-networkd systemd-resolved

#resolveの設定(たしかこんなの)
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf


  • /etc/systemd/network/内にbridge用の設定を追加していく

  • br0.netdev

#大文字小文字間違えないように

[NetDev]
Name=br0
Kind=bridge


  • br0.network

[Match]

Name=br0

[Network]
DHCP=v4


  • eth.network

[Match]

Name=en*

[Network]
DHCP=v4
Bridge=br0
IPForward=kernel
IPMasquerage=yes

#無線も共存しているため追記
[DHCP]
RouteMetric=10

systemctrl restart systemd-networkd

#これでホスト側一覧にbr0が追加されているはず
ip a #で確認


コンテナ側


  • 起動コマンドにネットワーク設定追加

sudo systemd-nspawn --network-bridge=br0 -b -D ~/devel/arch --bind=/var/cache/pacman/pkg --bind=/home/UserName/dev:/root/dev

なげー..

面倒くさいので今はpythonスクリプト書いて環境名渡したら勝手にコマンド入れてくれるやつで走らせています.(machinectrlつかえば楽?)

これでコンテナ側に個別のIPとか渡せてwgetしてもDLできたしpacman -Syuできた.

ので喜んでたら

次回ログインしたときに全く使えなくなって今積んでます...笑

ArcnWikiとかでも他に情報もないし海外Blog系読んでも解決できず..なんだろう...

解決したらまた追記します.