- 追加された行はこの色です。
- 削除された行はこの色です。
- LXC へ行く。
#author("2022-03-28T08:47:16+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
あとは普通にやりましょう。
** イメージをエクスポートする(よそに持ち出したり保存する) [#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'' 」とか書けるわね。