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 から強引に消すことで解決した