🎲

LXDで仮想マシンのルートディスクとルートパーティションを拡張する

2021/11/30に公開

はじめに

はじめに - LXDドキュメント翻訳プロジェクト で説明されているように LXD はコンテナーだけでなく仮想マシンも扱うことができます。

ゲスト OS でホスト OS とは異なるカーネルを使いたい場合には仮想マシンを使う必要があります。

LXD で提供されている仮想マシンのイメージはディスクとルートパーティションのサイズが約 4GB とかなり小さいので、必要に応じて拡張する必要があります。

その手順を調べたのでメモしておきます。

仮想マシンのイメージは images: 配下のを使う

コンテナーの場合、起動した後 lxc exec コンテナー名 bash で bash を起動して使っていました。

Trying LXD virtual machines - LXD - Linux Containers Forum
で知ったのですが、仮想マシンの場合は lxc exec を使うには仮想マシン内で lxd-agent というデーモンを動かす必要があります。

images: 配下の Ubuntu の仮想マシンであれば lxd-agent が自動起動するようになっているそうです。

例えば Ubuntu 18.04 LTS の仮想マシンのイメージは以下の4種類がありました。

$ lxc image list images: | grep 'ubuntu/18.04.*VIRTUAL-MACHINE'
| ubuntu/18.04 (7 more)                     | 53e5f452dd02 | yes    | Ubuntu bionic amd64 (20211129_09:10)              | x86_64       | VIRTUAL-MACHINE | 238.63MB  | Nov 29, 2021 at 12:00am (UTC) |
| ubuntu/18.04/arm64 (3 more)               | d8a3262f4806 | yes    | Ubuntu bionic arm64 (20211129_13:06)              | aarch64      | VIRTUAL-MACHINE | 224.81MB  | Nov 29, 2021 at 12:00am (UTC) |
| ubuntu/18.04/cloud (3 more)               | a45e3dede902 | yes    | Ubuntu bionic amd64 (20211129_09:20)              | x86_64       | VIRTUAL-MACHINE | 249.13MB  | Nov 29, 2021 at 12:00am (UTC) |
| ubuntu/18.04/cloud/arm64 (1 more)         | b9a155eff489 | yes    | Ubuntu bionic arm64 (20211129_13:24)              | aarch64      | VIRTUAL-MACHINE | 234.44MB  | Nov 29, 2021 at 12:00am (UTC) |

なお、lxd-agent が無くても lxc console 仮想マシン名 でコンソールを使うことは可能です。
ただしログインプロンプトが出るので利用するイメージのユーザーIDとパスワードを調べる必要があります。
コンソールを抜けるのは Ctrl-a q です。

初回起動時にディスクとルートパーティションを拡張したい場合は images:ubuntu/*/cloud のイメージを使う

この項の情報源は以下の3つです。

コンテナーと違って仮想マシンの場合は lxc コマンドでディスクサイズを設定してもディスクとパーティションテーブルは拡張してくれますが、パーティションのリサイズまではしないとのことです。

ただし images:ubuntu/*/cloud のイメージであれば cloud-init と growpart コマンドにより初回起動時にパーティションの拡張を行ってくれます。

例えば Ubuntu 18.04 LTS の仮想マシンを bionic-vm という名前で作成し、ルートディスクを20GBにしてルートパーティションも拡張するには以下のようにすればOKでした。

lxc init images:ubuntu/18.04/cloud bionic-vm --vm
lxc config device override bionic-vm root size=20GB
lxc start bionic-vm

起動後 lxc list を何回か実行して観察したところ、初回起動後一度再起動がかかっているようでした。
具体的には最初に IPv6 アドレスがついてその後 IPv4 アドレスがついてその後 STATE カラムが RUNNING から STOPPED に変わって再度 RUNNING になっていました。
おそらく growpart コマンドと resize2fs コマンドが自動で実行されて再起動するようになっていると思われます。

再起動後 lxc exec bionic-vm bash で仮想マシンに入って df -h で確認するとルートパーティションも拡張されていました。

ディスクを拡張したいがパーティションは自動で拡張したくない場合は images:ubuntu/* のイメージを使う

images:ubuntu/*/cloud のイメージだと初回起動時に growpart コマンドが自動実行されるので、ルートパーティションを拡張せずに別パーティションを追加したい場合などには困ることになります。
images:ubuntu/* のイメージであれば growpart コマンドは自動で実行されないので、こちらを使うと良いそうです。

また images:ubuntu/* のイメージで仮想マシンを作って後からディスクとパーティションを拡張したい場合も同様に対応可能です。

コンテナ作成時にディスクを拡張しておくには以下の手順にします。

lxc init images:ubuntu/18.04 bionic-vm --vm
lxc config device override bionic-vm root size=20GB
lxc start bionic-vm

lxc launch images:ubuntu/18.04 bionic-vm --vm でデフォルトのディスクサイズで作成した後から変えたい場合は
lxc config device override bionic-vm root size=20GB のように変更して
lxc restart bionic-vm で再起動すればよいです。

設定した内容は以下のコマンドで確認できます。

$ lxc config device show bionic-vm
root:
  path: /
  pool: default
  size: 20GB
  type: disk

ルートパーティションの拡張は以下のようにします。

まず lxc exec bionic-vm bash で仮想マシン内に入ります。

df -h でルートパーティションのデバイス名を確認します。以下の例では /dev/sda2 です。

root@bionic-vm:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            481M     0  481M   0% /dev
tmpfs            99M  640K   98M   1% /run
/dev/sda2       3.8G  772M  3.0G  21% /
tmpfs           491M     0  491M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           491M     0  491M   0% /sys/fs/cgroup
tmpfs            50M   10M   41M  20% /run/lxd_agent
/dev/sda1        99M  3.2M   96M   4% /boot/efi

cat /proc/partitions で拡張前のディスクとパーティションのサイズを確認します。
以下の例では sda は 20GB、 sda2 は 4GB です。

root@bionic-vm:~# cat /proc/partitions
major minor  #blocks  name

   8        0   19531256 sda
   8        1     102400 sda1
   8        2    4090863 sda2

growpart -h を実行して使い方を確認します。

root@bionic-vm:~# growpart -h
growpart disk partition
   rewrite partition table so that partition takes up all the space it can
   options:
    -h | --help       print Usage and exit
         --fudge F    if part could be resized, but change would be
                      less than 'F' bytes, do not resize (default: 1048576)
    -N | --dry-run    only report what would be done, show new 'sfdisk -d'
    -v | --verbose    increase verbosity / debug
    -u | --update  R  update the the kernel partition table info after growing
                      this requires kernel support and 'partx --update'
                      R is one of:
                       - 'auto'  : [default] update partition if possible
                       - 'force' : try despite sanity checks (fail on failure)
                       - 'off'   : do not attempt
                       - 'on'    : fail if sanity checks indicate no support

   Example:
    - growpart /dev/sda 1
      Resize partition 1 on /dev/sda

最後の例を参考にしつつ、ここでは /dev/sda のパーティション 2 を拡張するので
growpart /dev/sda 2 と実行します。実行結果を以下に示します。

root@bionic-vm:~# growpart /dev/sda 2
CHANGED: partition=2 start=206848 old: size=8181727 end=8388575 new: size=38855631,end=39062479

その後 exit で仮想マシンを抜けて lxc restart bionic-vm で仮想マシンを再起動します。

これで /dev/sda2 のパーティションの拡張までは完了で、残りはファイルシステムの拡張です。

lxc exec bionic-vm bash で仮想マシン内に入ります。

df -h では /dev/sda2 のサイズはまだ変わっていませんが cat /proc/partitions で sda2 のサイズは増えています。

resize2fs /dev/sda2 コマンドを実行してファイルシステムを拡張します。実行結果を以下に示します。

root@bionic-vm:~# resize2fs /dev/sda2
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 3
The filesystem on /dev/sda2 is now 4856953 (4k) blocks long.

実行後に df -h を実行すると /dev/sda2 のサイズが約 18GB と大きくなっていました。

Discussion