#author("2024-11-06T04:50:57+09:00","default:yakumo_murakami","yakumo_murakami") #author("2024-11-06T04:51:55+09:00","default:yakumo_murakami","yakumo_murakami") [[FrontPage]] #contents * 何? [#gd1ae430] LXDを用いて簡単にLXCを使う記事です。 ''正直、今まで素のLXCでやってた苦労は何だったのってくらい簡単'' なので、急ぎなのにLXCが思うように動かない、なんでって泣いてるアナタには超おすすめです!勉強はあとからでもできるんだから。……だけどもちろん、自己責任で☆ なお、環境はUbuntu18.04でためしてます。 * 参考 [#w4297aa6] - [[Linux Containers - LXD - はじめに - コマンドライン>https://linuxcontainers.org/ja/lxd/getting-started-cli/]] インストールについては、オフィシャル情報を参考に。 * 未解決問題 [#vb9304ef] ブリッジで Ubuntu使ってると、mobaXtermと相性悪い気がします。 * 基本 [#p26e4b70] ** コンテナ作成 [#c61122f0] $ lxc launch ubuntu:18.04 ubuntu1804 ** チェック [#x14ae096] $ 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 | +------------+---------+----------------------+-----------------------------------------------+------------+-----------+ $ ** 再起動時にはどうなる? [#ofe22a0a] 自動的にこちらも起動するみたい。cronとかがちゃんと動くかは、また後日ね。 * 保守 [#d63513c5] ** 助けて!ストレージがいっぱいになっちゃった! [#pfb9f89c] *** ストレージプールを確認する [#f4e7aaae] $ lxc storage list *** ストレージプールをひとつ作ってみる [#sae0d5e4] 名前は 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 *** 未検証の作法 [#lff13968] ああ、今回やらなかったけど、こんな事もできるらしいわよ。 $ lxc storage create siro btrfs source=/dev/sdb1 Storage pool siro created あと、ストレージプールから実際のノードに割り振られるわけだけど、明示的にノードに割り当てるサイズを制限もできるそうよ。 たぶんストレージプールのサイズも変更できると思うけど、こちらは試してないわ。 ** 作ったコンテナに入ってみる [#u3e6d1cd] $ lxc exec ubuntu1804 -- /bin/bash ** 直接コマンド実行 [#q4a9cd14] $ lxc exec ubuntu1804 -- apt-get update ** コンテナの停止 [#gc51708f] $ lxc stop ubuntu1804 ** 停めているコンテナの開始 [#i4bbc1c2] $ lxc start ubuntu1804 ** 停めているコンテナの削除 [#if355303] $ lxc delete ubuntu1804 消してもイメージがあればすぐ作り直せるので、恐れず。 ** ファイル転送 [#wb59e4c0] *** コンテナからファイルを取得 [#t490ff18] $ lxc file pull ubuntu1804/etc/hosts . *** コンテナへファイルを送る [#r1dde067] ''注意: ディレクトリに転送時、最後を / にしてディレクトリだよーと明示しないとエラーになりますよ!(たとえば /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# * 応用 [#dfc9a1de] ** コンテナを作る前にイメージだけもらってくる。 [#a6811f97] 一番便利な応用といえば、まずこれでしょう。 同じ環境をたくさん作りたい時、いちいち遠いサーバからもらってくるのは大変です。~ まずローカルにイメージをもらってくるのがいいです。~ たとえば以下のように。 $ 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 で、実にわずかな時間で新しいノードが動き出します。 ** 今使っているコンテナを元に新しいコンテナを作る [#kf3c30a2] minecraftというコンテナを元に、minecraft2を作ってみる。 *** イメージ minesave を作る。 [#hed02865] $ lxc publish minecraft --alias minesave *** 確認する。 [#l73fe7e7] $ 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) | +---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+ *** イメージ minesave を元に minecraft2 を作る。 [#s1f1d48f] $ lxc launch local:minesave minecraft2 あとは普通にやりましょう。 ** 今使っているコンテナを元に新しいコンテナを作る(copy編) [#we7ed616] ** 【YetAnother】今使っているコンテナを元に新しいコンテナを作る(copy編) [#we7ed616] imageを作らずに直接コピーします。ただし動作中のコンテナが停止するかも。 $ lxc copy minecraft minecraft2 実は、うちでローカルDNSサーバを複写したんですけど、サーバのセグメントにブリッジしてIPも振って普通のノードとして動かして居たせいか、古いのが停止して新しい方が稼働しました。設定上並走できないから当然といえば当然かしらね。 ** イメージをエクスポートする(よそに持ち出したり保存する) [#b3e95127] すでにイメージ生成ずみとします。名前は minesave で *** コマンド(lxc image export) [#mada5d61] $ lxc image export minesave . イメージのエクスポート中: 22% (63.01MB/s) : イメージのエクスポートに成功しました! *** 確認(ls -ltr) [#kaa0a206] $ ls -ltr -rw-rw-r-- 1 user group 5653668973 5月 18 09:44 20e33573e6d1cd273fe04fa9525d1d275c8ffa851aad49d2a9cf1043f11c6f09.tar.gz ** イメージをインポートする(よそから持ち込んだり復活させる) [#sb9a4d3a] さきほどエクスポートしたのを取り込んでみます。 *** コマンド(lxc image import) [#n185def8] $ lxc image import 20e33573e6d1cd273fe04fa9525d1d275c8ffa851aad49d2a9cf1043f11c6f09.tar.gz --alias minesave2 aliasは必須ではなく、ツケ忘れた場合はフィンガープリントを指定すればいいのです。 でも、 ''面倒くさくないですか?'' 私は aliasを付けるほうが楽でいいです。'' *** おわったら確認(lxc image list) [#s3f28454] lxc image には list, delete等いろいろな機能があります。importも ''ネット上のイメージなどの取り込みもできます。'' 詳しくは確認を。 *** tar玉をもってきてコマンド実行( [#r604fc90] ** 母艦と違う環境を作ってみる [#aafff619] これも昔より簡単になりました。今回は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 ** イメージのロード時間について [#oddc5c42] 作ったことのない環境のコンテナを作ろうとすると、ネットからロードするので時間がかかります。しかし、一度ロードするとイメージが保管されるようで、同じ環境の作成なら、あとは数秒です。 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秒とかからないでしょう。 ** 所有イメージを確認する [#xcf15c0b] コンテナはイメージを元に作成されるわけですが、もっているイメージを確認するには? $ 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) | +-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+ $ うーん、便利! ** コンテナにssh loginできない時 [#s64c5fd3] X転送でfirefox使いたいときとか困るよね。 permissionがどうのと言われて切られるなら、これはコンテナ側のsshdの設定でいけるわ。自分の使いたい認証を許可してみて。 ** ブリッジで通常IPにノード作成 [#u8f62d3c] ほら、出島マシンとかローカルDNSとか、仮想で作って皆で使いたいのってあるよね。 うちは 192.168.1.* なので、そこに DHCP でノードを置いてみます。 *** Bridgeを作る。 [#c60d1e46] 詳しくは、[[こちら>make_Bridge]]を参照してブリッジを作る。名前は br0 に。 *** Bridge プロファイルを作る [#r0e4746d] LXD/LXC用の設定profileを作る。 ただし最近はデフォルト(default)設定の方もローカルブリッジの設定があるので、それをコピーして改造してみます。 $ lxc profile copy default bridge $ lxc profile edit bridge デフォルト設定の中に「lxdbr0」の記述があるのを、br0に訂正して保存。 *** 対象のコンテナを停止する [#e9f6d6ee] $ lxc stop ubuntu1804 *** コンテナのプロファイルをブリッジ用に変更 [#t967ae86] $ lxc config edit ubuntu1804 下記の場所を修正する。 profiles: - default このように。 profiles: - bridge *** 対象のコンテナを開始する [#l2c463e5] $ 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 | +------------+---------+---------------------+--------------------------------------------+------------+-----------+ $ *** (問題)OSをアップデートしたら前に作ったprofileに変更できなくなった(アップデート前に変更ずみのやつは動く) [#r60d861d] Ubuntu16.04の時に作った bridge に、18.04にアップグレードしてから新しく作ったノードを変更しようとしたらエラーになってしまった。 →新環境でprofileを再度作ればいい。 ''bridge2'' とか。 さあ、どんどんためそう! * 雑品 [#q7ee8b68] ** (Ruby) lxc list から IP をとりだす [#td1ba7c5] *** ~/bin/getip.rb [#l67c2986] 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 *** test.rb [#v2b5eb2f] 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'' 」とか書けるわね。