FrontPage

何?

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を作ってみる。

イメージ minesave を作る。

$ 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)  |
+---------------------+--------------+--------+-----------------------------------------------+--------+------------+------------------------------+

イメージ minesave を元に minecraft2 を作る。

$ lxc launch local:minesave minecraft2

あとは普通にやりましょう。

イメージをエクスポートする(よそに持ち出したり保存する)

すでにイメージ生成ずみとします。名前は minesave で

コマンド(lxc image export)

$ lxc image export minesave .
イメージのエクスポート中: 22% (63.01MB/s)
:
イメージのエクスポートに成功しました!

確認(ls -ltr)

$ ls -ltr 
-rw-rw-r-- 1 user group 5653668973  5月 18 09:44 20e33573e6d1cd273fe04fa9525d1d275c8ffa851aad49d2a9cf1043f11c6f09.tar.gz

イメージをインポートする(よそから持ち込んだり復活させる)

さきほどエクスポートしたのを取り込んでみます。

コマンド(lxc image import)

$ lxc image import 20e33573e6d1cd273fe04fa9525d1d275c8ffa851aad49d2a9cf1043f11c6f09.tar.gz --alias minesave2

aliasは必須ではなく、ツケ忘れた場合はフィンガープリントを指定すればいいのです。

でも、 面倒くさくないですか?

私は aliasを付けるほうが楽でいいです。''

おわったら確認(lxc image list)

lxc image には list, delete等いろいろな機能があります。importも ネット上のイメージなどの取り込みもできます。 詳しくは確認を。

tar玉をもってきてコマンド実行(

母艦と違う環境を作ってみる

これも昔より簡単になりました。今回は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)  |
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
$

うーん、便利!

コンテナにssh loginできない時

X転送でfirefox使いたいときとか困るよね。

permissionがどうのと言われて切られるなら、これはコンテナ側のsshdの設定でいけるわ。自分の使いたい認証を許可してみて。

ブリッジで通常IPにノード作成

ほら、出島マシンとかローカルDNSとか、仮想で作って皆で使いたいのってあるよね。

うちは 192.168.1.* なので、そこに DHCP でノードを置いてみます。

Bridgeを作る。

詳しくは、こちらを参照してブリッジを作る。名前は br0 に。

Bridge プロファイルを作る

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         |
+------------+---------+---------------------+--------------------------------------------+------------+-----------+
$

(問題)OSをアップデートしたら前に作ったprofileに変更できなくなった(アップデート前に変更ずみのやつは動く)

Ubuntu16.04の時に作った bridge に、18.04にアップグレードしてから新しく作ったノードを変更しようとしたらエラーになってしまった。

 →新環境でprofileを再度作ればいい。 bridge2 とか。

さあ、どんどんためそう!

雑品

(Ruby) lxc list から IP をとりだす

/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

test.rb

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 」とか書けるわね。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS