それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

lxc で ストレージを変更する。(pool/volume間のlxcストレージを移動)

lxc で ストレージを変更する。(pool/volume間の移動)

lxd を使って、コンテナを起動しているときに、そのコンテナが乗っかってるストレージを切り替えたい。

今回は、起動しているコンテナのストレージを、ボリューム(プール)間で移動して、使ってるボリュームを移動させる

操作の概要

ストレージを 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 で移動している模様。

f:id:takuya_1st:20210518040925p:plain

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