2015年7月23日木曜日

arch linux で lxcを動かす

本文章はarch linuxをlxcホストにしようと
  https://wiki.archlinux.org/index.php/Linux_Containers を参考にして

  # lxc-create -n playtime -t /usr/share/lxc/templates/lxc-archlinux
 を実行し
  ... is corrupted (invalid or corrupted package (PGP signature))
と言われ正常に動作できなかった環境向けに
arch linuxをlxcホストとしてarch linuxをコンテナとして動かすという文章になります。


またこの文章を見る前に大変参考になる
  http://hachulog.blogspot.jp/2013/03/lxcarchlinux.html

を参照することを強く推奨します。

(2016年 11月21日追記 )
実は先日新規にarch linuxのlxcホストサーバーを構築していて気がついたのですが、
どうもPGP関係のログの箇所で止まることに関しては
arch wiki https://wiki.archlinuxjp.org/index.php/Linux_Containers の通り
システムエントロピーが足りない(?)ことが原因している可能性があります。 
裏でhavegedを起動してしまえばそもそも本文章のようなことをしないでと思われます。
(追記終わり)
 
(というか上記様の構築方法を参考にしようとしていたら現在だと少し後半の作業が不必要だったり差異があって
1つのまとまった文章としてこっそり後でどこからでも見れるものを用意しようとしてこの記事は存在します。)


 
悩ましいところとしては
  • # lxc-create -n playtime -t /usr/share/lxc/templates/lxc-archlinux がうまく動いてくれない? 
  • /usr/share/lxc/templates/lxc-archlinux がおかしい?
  • lxc-create とか lxc-atattch が変?(少なくとも手元ではlxc-attachでpacmanするとPGP云々で正常ではない
という感じ

 

本文章では下記のような構成にてコンテナを動かします。
 
  • lxcの原理とか動かねぇとかしったこっちゃないがlxcを使ってみたい自宅ネットワーク管理者向け 
  • macvlanを用いて既存のネットワークに直にコンテナを出す
  • 初期設定を除き最終的にsshdでの管理を行う
  • lxcのコンテナの開始停止自動実行等はsystemdにて行う
  • コンテナの中のarch linuxは強引にarchをベアメタルインストールするときのようにpacstrapにてインストールする。 

ホストの環境
  %uname -r
  4.1.2-2-ARCH

ホストで必要なパッケージ
  # pacman -S arch-install-scripts lxc

 
コンテナ sample の作成
 
  下記設定にてsampleを作成した場合
    ホスト名 sample.localdomain 
    ネットワークインターフェース eth0 
    IPアドレス 192.168.1.128
    ゲートウェイ 192.168.1.254
  というsampleが出来上がります。

    # cd /lxc/var/lib/lxc

    # mkdir sample
    # mkdir -m 0755 /sample/rootfs
    # vi /lxc/sample/config
 
autodevを使わずにsample直下にはrootfsとconfigのみとなり、configにて/dev下をホワイトリスト形式で許可します。 
(デバイスの箇所は http://hachulog.blogspot.jp/2013/03/lxcarchlinux.html 様そのままです。)
 
  lxc.utsname にてホスト名
  lxc.network.link にて、既に通信が可能なネットワークインターフェースを指定します。
 
/lxc/sample/config 

lxc.utsname                     = sample.localdomain

lxc.network.type                = macvlan
lxc.network.macvlan.mode        = vepa
lxc.network.flags               = up
lxc.network.link                = lxcdmz0
lxc.network.name                = eth0

lxc.network.ipv4                = 192.168.1.128/24
lxc.network.ipv4.gateway        = 192.168.1.254
# device configration
lxc.pts                         = 1024
lxc.tty                         = 4 
 lxc.rootfs = /var/lib/lxc/sample/rootfs
# deny all devices
lxc.cgroup.devices.deny         = a

# /dev/tty0..3
lxc.cgroup.devices.allow        = c 4:0 rwm
lxc.cgroup.devices.allow        = c 4:1 rwm
lxc.cgroup.devices.allow        = c 4:2 rwm
lxc.cgroup.devices.allow        = c 4:3 rwm

# /dev/tty
lxc.cgroup.devices.allow        = c 5:0 rwm
# /dev/console
lxc.cgroup.devices.allow        = c 5:1 rwm
# /dev/ptmx
lxc.cgroup.devices.allow        = c 5:2 rwm

# /dev/null
lxc.cgroup.devices.allow        = c 1:3 rwm
# /dev/zero
lxc.cgroup.devices.allow        = c 1:5 rwm
# /dev/random
lxc.cgroup.devices.allow        = c 1:8 rwm
# /dev/urandom
lxc.cgroup.devices.allow        = c 1:9 rwm

# /dev/pts/*
lxc.cgroup.devices.allow        = c 136:* rwm
# /dev/rtc
lxc.cgroup.devices.allow        = c 254:0 rwm



# device configration
lxc.pts                         = 1024
lxc.tty                         = 4
sample/rootfs に pacstrapでシステムを入れます。
  # pacstrap -i -d /var/lib/lxc/sample/rootfs/ base openssh

sampleを起動してみます。
  # systemctl start lxc@sample

sampleの状態を確認します。
  # systemctl status lxc@sample
  # lxc-ls -f
  # ping 192.168.1.128
 
動いている場合lxc-ls -fの結果が下記のようになります。
 
NAME       STATE    IPV4             IPV6  GROUPS  AUTOSTART
------------------------------------------------------------
sample     STOPPED  192.168.1.128    -     -       NO

 
 
(注意 macvlanの仕様により同じインターフェースからは通信できません。
例えば、NICが1つしかないホストでmacvlan使っている場合上記ではホストからping通りません。
デュアルNIC等で別なインターフェースから飛ばすか、別なマシンからpingテストして下さい) 
 
sampleに乗り込みます。
  # lxc-console -n sample -t tty1
    => root パスワード無しでログイン

sshで管理出来るようにするまで設定します。
 rootのパスワード設定
  # passwd
 
 管理ユーザー等作成
  # useradd -m hoge
  # passwd hoge 
 
 時刻を日本にお住まいなら日本に設定
  # timedatectl set-timezone Asia/Tokyo
 
 journalctl -xeして確認するとsystemdがコンクリフトさせている箇所があるので /dev/nullへ対処
  # ln -s /dev/null /etc/systemd/system/systemd-udevd.service
  # ln -s /dev/null /etc/systemd/system/systemd-udevd-control.socket
  # ln -s /dev/null /etc/systemd/system/systemd-udevd-kernel.socket
  # ln -s /dev/null /etc/systemd/system/proc-sys-fs-binfmt_misc.automount
 
 sshdの自動起動
  # systemctl enable sshd
 
 sampleから抜けます。
  # exit

C-a qでsampleから抜けて、ホストマシンに戻る
 諸々内部を荒らしたのでリスタート
  # systemctl restart lxc@sample
 
 自動スタートさせたい場合
  # systemctl enable lxc@sample 
 
sshでアクセスしてみましょう
  # ssh hoge@192.168.1.128
念のためにログは確認してみましょう
  # journalctl -xe 
 
上記でsshdで管理出来るlxcのコンテナが少なくとも手元では動いていますが
 
既知の問題として
  # lxc-attach -n sample 実行後
     pacmanとかzshとかが動いてくれない
     -> 何かあった場合はホストから # lxc-cosole -n sample -t tty1 して乗り込む

ということは確認しています。(sshdで管理しているので気にしないことにしていますが…)