lxc で ストレージを変更する。(pool/volume間の移動)
lxd を使って、コンテナを起動しているときに、そのコンテナが乗っかってるストレージを切り替えたい。
今回は、起動しているコンテナのストレージを、ボリューム(プール)間で移動して、使ってるボリュームを移動させる
操作の概要
全体の操作の流れ
lxc stop NAME
lxc move NAME NAME-tmp --storage=st02
lxc move NAME-tmp NAME
以下では、lxdMosaicのストレージを default から bt02 に切り替える。
現在のストレージを確認する。
現在のストレージは次のように確認できる。
$ lxc storage list
+---------+--------+--------------------------------------------+-------------+---------+
| NAME | DRIVER | SOURCE | DESCRIPTION | USED BY |
+---------+--------+--------------------------------------------+-------------+---------+
| bt01 | btrfs | /var/snap/lxd/common/lxd/disks/bt01.img | | 2 |
+---------+--------+--------------------------------------------+-------------+---------+
| bt02 | btrfs | /var/snap/lxd/common/lxd/disks/bt02.img | | 0 |
+---------+--------+--------------------------------------------+-------------+---------+
| default | zfs | /var/snap/lxd/common/lxd/disks/default.img | | 10 |
+---------+--------+--------------------------------------------+-------------+---------+
今回は、 zfs の default から btrfs で作った bt02 へコンテナを移動させる
default ストレージを使ってるコンテナを確認する。
lxc の storage コマンドで 、show のサブコマンドを利用して、default の状況を見る、
lxc storage show default
config:
size: 100GB
source: /var/snap/lxd/common/lxd/disks/default.img
zfs.pool_name: default
description: ""
name: default
driver: zfs
used_by:
- /1.0/images/27438783f0b038d0a49ec19c8360903d785c3585654dee8959e9295c5c7615a2
- /1.0/instances/apache-php72
- /1.0/instances/lxdMosaic
- /1.0/instances/nextcloud
- /1.0/instances/ubuntu1804
- /1.0/profiles/default
status: Created
locations:
- none
いくつもの、コンテナがこのストレージ上に展開されていることがわかる。
images はコンテナイメージの格納場所だと思う。
ストレージを動かす方法
起動中のコンテナは、最初に停止しておく。
lxc の stop コマンドに、コンテナ名を指定して停止する。
lxc stop lxdMosaic
lxc の info コマンドで、停止を確認
lxc info lxdMosaic
Name: lxdMosaic
Location: none
Remote: unix://
Architecture: x86_64
Created: 2021/03/24 07:34 UTC
Status: Stopped
Type: container
Profiles: default
ストレージ移動は lxd の移動と同様
ストレージの移動は、lxd の通常移動と同じ様になる。
通常では、サーバー間のコンテナ移動と同様のコマンドになるのだが。
今回は、同一サーバー内での移動になる。
そのため、一時的に別名に移動させ、その際にストレージを指定する
lxc コンテナを一時的な名前で移動(ストレージ変更)
lxc move lxdMosaic lxdMosaic-tmp --storage=bt02
移動は、そこそこ時間かかる。nvme のSSDなのだが、ちょっと時間が必要だったね。
時間がかかるので --verbose を使ったほうがいいかもしれない。と思って --verbose してみたが、進捗は表示されませんでした。経過を見る方法はなさそう。
元の名前に戻す。
lxc move lxdMosaic-tmp lxdMosaic
zfs→btrfs
/ btrfs → btrfs
の場合、内部的に rsync で移動している模様。
rsync か、そりゃ時間かかるわ
zfs → zfs
の場合、zfs send を使って移動してた
どっちにしても、時間はかかる。
lxc move の使い方は次の通り。
lxc move はヘルプを見れば、その使い方としてremote への移動が想定されているようだ。
しかし、今回は、ストレージを移動させたいので、別名として移動させたわけですね。
takuya@m75q-1:~$ lxc help move
Description:
Move instances within or in between LXD servers
Usage:
lxc move [<remote>:]<instance>[/<snapshot>] [<remote>:][<instance>[/<snapshot>]] [flags]
Aliases:
move, mv
Examples:
lxc move [<remote>:]<source instance> [<remote>:][<destination instance>] [--instance-only]
Move an instance between two hosts, renaming it if destination name differs.
lxc move <old name> <new name> [--instance-only]
Rename a local instance.
lxc move <instance>/<old snapshot name> <instance>/<new snapshot name>
Rename a snapshot.
Flags:
-c, --config Config key/value to apply to the target instance
-d, --device New key/value to apply to a specific device
--instance-only Move the instance without its snapshots
--mode Transfer mode. One of pull (default), push or relay. (default "pull")
--no-profiles Unset all profiles on the target instance
-p, --profile Profile to apply to the target instance
--stateless Copy a stateful instance stateless
-s, --storage Storage pool name
--target Cluster member name
--target-project Copy to a project different from the source
lxc で消せないコンテナができる
lxc move で移動をしていたら、削除も移動も出来ないコンテナが出来た。再現方法は次の通り
- lxc move を途中で強制終了する。
- lxc move でbtrfs を使っている。
こうなってしまうと、だいぶめんどくさい。
これらを消すには。
btrfsで管理しているので、btrfs のイメージを loop デバイスからマウントして、btrfs から削除してしまい、lxc から強引に消すことで解決した