LXDを用いて簡単にLXCを使う記事です。
正直、今まで素のLXCでやってた苦労は何だったのってくらい簡単 なので、急ぎなのにLXCが思うように動かない、なんでって泣いてるアナタには超おすすめです!勉強はあとからでもできるんだから。……だけどもちろん、自己責任で☆
なお、環境はUbuntu18.04でためしてます。
インストールについては、オフィシャル情報を参考に。
ブリッジで Ubuntu使ってると、mobaXtermと相性悪い気がします。
$ lxc launch ubuntu:18.04 ubuntu1804
$ lxc list +------------+---------+----------------------+-----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------+---------+----------------------+-----------------------------------------------+------------+-----------+ | ubuntu1804 | RUNNING | 10.212.159.61 (eth0) | fd54:f781:dc1b:b01e:216:3eff:fe98:a997 (eth0) | PERSISTENT | 0 | +------------+---------+----------------------+-----------------------------------------------+------------+-----------+ $
自動的にこちらも起動するみたい。cronとかがちゃんと動くかは、また後日ね。
$ lxc storage list
名前は siro で作ってみましょう。
$ lxc storage create siro btrfs
できたかしら、確認。
$ lxc storage list +---------+-------------+--------+--------------------------------+---------+ | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY | +---------+-------------+--------+--------------------------------+---------+ | default | | btrfs | /var/lib/lxd/disks/default.img | 9 | +---------+-------------+--------+--------------------------------+---------+ | siro | | btrfs | /var/lib/lxd/disks/siro.img | 0 | +---------+-------------+--------+--------------------------------+---------+ $ lxc storage info siro
じゃあ、できたプールを使ってノード作成してみるわね。
$ lxc launch ubuntu:20.04 mc11 --storage siro Creating mc11 Starting mc11
ああ、今回やらなかったけど、こんな事もできるらしいわよ。
$ lxc storage create siro btrfs source=/dev/sdb1 Storage pool siro created
あと、ストレージプールから実際のノードに割り振られるわけだけど、明示的にノードに割り当てるサイズを制限もできるそうよ。 たぶんストレージプールのサイズも変更できると思うけど、こちらは試してないわ。
$ lxc exec ubuntu1804 -- /bin/bash
$ lxc exec ubuntu1804 -- apt-get update
$ lxc stop ubuntu1804
$ lxc start ubuntu1804
$ lxc delete ubuntu1804
消してもイメージがあればすぐ作り直せるので、恐れず。
$ lxc file pull ubuntu1804/etc/hosts .
注意: ディレクトリに転送時、最後を / にしてディレクトリだよーと明示しないとエラーになりますよ!(たとえば /home/ubuntu でなく /home/ubuntu/)
$ lxc file push examples.desktop ubuntu1804/tmp/ $ $ lxc exec ubuntu1804 -- /bin/bash root@ubuntu1804:~# cd /tmp root@ubuntu1804:/tmp# ls -ltr total 12 -rw-r--r-- 1 1001 1001 8980 Sep 9 21:52 examples.desktop root@ubuntu1804:/tmp#
一番便利な応用といえば、まずこれでしょう。
同じ環境をたくさん作りたい時、いちいち遠いサーバからもらってくるのは大変です。
まずローカルにイメージをもらってくるのがいいです。
たとえば以下のように。
$ lxc image copy images:debian/buster/amd64 local: --alias save_buster --auto-update イメージのコピーが成功しました! $ lxc image list +-----------------------------------+--------------+--------+---------------------------------------------+--------+------------+-------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +-----------------------------------+--------------+--------+---------------------------------------------+--------+------------+-------------------------------+ | save_buster | 92f3ac1b8123 | no | Debian buster amd64 (20180930_05:24) | x86_64 | 122.41MB | Oct 1, 2018 at 12:39am (UTC) | +-----------------------------------+--------------+--------+---------------------------------------------+--------+------------+-------------------------------+
たとえば、こんな感じになります。
auto-update がちゃんと効くのかは正直わかりませんが、効けば定期的に最新に更新されているはずです。
上記の場合、次からは lxc launch local:save_buster nodename で、実にわずかな時間で新しいノードが動き出します。
minecraftというコンテナを元に、minecraft2を作ってみる。
$ lxc publish minecraft --alias minesave
$ lxc image list +---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+ | minesave | f5943bb3067f | no | | x86_64 | 17781.27MB | Nov 4, 2017 at 12:17pm (UTC) | +---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+ | ubuntu1804-20180606 | 903ca4859b62 | no | | x86_64 | 192.27MB | Sep 11, 2017 at 5:29pm (UTC) | +---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+ | | 087952830a12 | no | Debian stretch amd64 (20171103_22:42) | x86_64 | 103.43MB | Nov 4, 2017 at 2:20am (UTC) | +---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+ | | 8fc2e3ec4809 | no | ubuntu 16.04 LTS amd64 (release) (20171026.1) | x86_64 | 156.17MB | Nov 2, 2017 at 8:05pm (UTC) | +---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+
$ lxc launch local:minesave minecraft2
あとは普通にやりましょう。
すでにイメージ生成ずみとします。名前は minesave で
$ lxc image export minesave . イメージのエクスポート中: 22% (63.01MB/s) : イメージのエクスポートに成功しました!
$ ls -ltr -rw-rw-r-- 1 user group 5653668973 5月 18 09:44 20e33573e6d1cd273fe04fa9525d1d275c8ffa851aad49d2a9cf1043f11c6f09.tar.gz
さきほどエクスポートしたのを取り込んでみます。
$ lxc image import 20e33573e6d1cd273fe04fa9525d1d275c8ffa851aad49d2a9cf1043f11c6f09.tar.gz --alias minesave2
aliasは必須ではなく、ツケ忘れた場合はフィンガープリントを指定すればいいのです。
でも、 面倒くさくないですか?
私は aliasを付けるほうが楽でいいです。''
lxc image には list, delete等いろいろな機能があります。importも ネット上のイメージなどの取り込みもできます。 詳しくは確認を。
これも昔より簡単になりました。今回はUbuntuが親なのでDebianを作ってみます。
$ lxc launch images:debian/stretch/amd64 stretch01 stretch01 を作成中 stretch01 を起動中 $ lxc list +------------+---------+-----------------------+-----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------+---------+-----------------------+-----------------------------------------------+------------+-----------+ | stretch01 | RUNNING | 192.168.123.36 (eth0) | fd2b:b97c:f7fa:c547:216:3eff:fe6c:5143 (eth0) | PERSISTENT | 0 | +------------+---------+-----------------------+-----------------------------------------------+------------+-----------+ | ubuntu1804 | RUNNING | 192.168.123.76 (eth0) | fd2b:b97c:f7fa:c547:216:3eff:fe15:cefe (eth0) | PERSISTENT | 0 | +------------+---------+-----------------------+-----------------------------------------------+------------+-----------+ $
おお。
なお、stretchでTimezoneがUTCなのをローカルタイムにしたいなら、以下を。
# timedatectl set-timezone Asia/Tokyo
作ったことのない環境のコンテナを作ろうとすると、ネットからロードするので時間がかかります。しかし、一度ロードするとイメージが保管されるようで、同じ環境の作成なら、あとは数秒です。
Debianを作ったので、同じDebianの stretch02 を作ってみましょう。
$ lxc launch images:debian/stretch/amd64 stretch02 stretch02 を作成中 stretch02 を起動中 $ lxc list +------------+---------+------------------------+-----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------+---------+------------------------+-----------------------------------------------+------------+-----------+ | stretch01 | RUNNING | 192.168.123.36 (eth0) | fd2b:b97c:f7fa:c547:216:3eff:fe6c:5143 (eth0) | PERSISTENT | 0 | +------------+---------+------------------------+-----------------------------------------------+------------+-----------+ | stretch02 | RUNNING | 192.168.123.141 (eth0) | fd2b:b97c:f7fa:c547:216:3eff:feac:4ce0 (eth0) | PERSISTENT | 0 | +------------+---------+------------------------+-----------------------------------------------+------------+-----------+ | ubuntu1804 | RUNNING | 192.168.123.76 (eth0) | fd2b:b97c:f7fa:c547:216:3eff:fe15:cefe (eth0) | PERSISTENT | 0 | +------------+---------+------------------------+-----------------------------------------------+------------+-----------+
はい。わかりにくいでしょうけど、速いマシンなら2秒とかからないでしょう。
コンテナはイメージを元に作成されるわけですが、もっているイメージを確認するには?
$ lxc image list +-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+ | | b0209bc0666c | no | Debian stretch amd64 (20170908_22:42) | x86_64 | 103.41MB | Sep 9, 2017 at 10:05pm (UTC) | +-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+ | | 58f90cbf6892 | no | ubuntu 16.04 LTS amd64 (release) (20170815.1) | x86_64 | 154.11MB | Sep 9, 2017 at 2:40pm (UTC) | +-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+ $
うーん、便利!
X転送でfirefox使いたいときとか困るよね。
permissionがどうのと言われて切られるなら、これはコンテナ側のsshdの設定でいけるわ。自分の使いたい認証を許可してみて。
ほら、出島マシンとかローカルDNSとか、仮想で作って皆で使いたいのってあるよね。
うちは 192.168.1.* なので、そこに DHCP でノードを置いてみます。
詳しくは、こちらを参照してブリッジを作る。名前は br0 に。
LXD/LXC用の設定profileを作る。
ただし最近はデフォルト(default)設定の方もローカルブリッジの設定があるので、それをコピーして改造してみます。
$ lxc profile copy default bridge $ lxc profile edit bridge
デフォルト設定の中に「lxdbr0」の記述があるのを、br0に訂正して保存。
$ lxc stop ubuntu1804
$ lxc config edit ubuntu1804
下記の場所を修正する。
profiles: - default
このように。
profiles: - bridge
$ lxc start ubuntu1804 $ lxc list +------------+---------+---------------------+--------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------+---------+---------------------+--------------------------------------------+------------+-----------+ | ubuntu1804 | RUNNING | 192.168.1.47 (eth0) | 2408:210:84:5100:216:3eff:fe58:a3e1 (eth0) | PERSISTENT | 0 | +------------+---------+---------------------+--------------------------------------------+------------+-----------+ $
Ubuntu16.04の時に作った bridge に、18.04にアップグレードしてから新しく作ったノードを変更しようとしたらエラーになってしまった。
→新環境でprofileを再度作ればいい。 bridge2 とか。
さあ、どんどんためそう!
/bin/getip.rb†
class String def _getIP c = `lxc list`.split("\n") (0..c.length-1).each{|i| if c[i] !~ /eth0/ c[i] = nil else c[i].gsub!(/\ /,'') c[i] = c[i].split("\|") if c[i][1] != self c[i] = nil else c[i] = c[i][3].split("(")[0] end end } c.compact! if c.length > 1 c = c[0] if c.class == Array && c.length == 1 c end end
require "#{ENV['HOME']}/bin/getip.rb" ARGV.each{|q| p q._getIP }
そんで、使ってみる。
$ lxc list +------------+---------+---------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------+---------+---------------------+----------------------------------------------+------------+-----------+ | crawler01 | RUNNING | 192.168.1.25 (eth0) | 2001:c90:8000:6cc3:216:3eff:feff:7d56 (eth0) | PERSISTENT | 0 | +------------+---------+---------------------+----------------------------------------------+------------+-----------+ | ubuntu1804 | RUNNING | 192.168.1.24 (eth0) | 2001:c90:8000:6cc3:216:3eff:fe98:a997 (eth0) | PERSISTENT | 0 | +------------+---------+---------------------+----------------------------------------------+------------+-----------+ $ ruby test.rb crawler01 "192.168.1.25" $
どうかな。
応用すると「 全てのマシンで apt-get update 」とか書けるわね。