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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS