LXDで仮想マシンのルートディスクとルートパーティションを拡張する
はじめに
はじめに - 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つです。
- LXD VM - how to set disk size? - General - Linux Containers Forum
- Root partition size in profile not applied to vm - General - Linux Containers Forum
- How can I expand the size of VM - General - Linux Containers Forum
コンテナーと違って仮想マシンの場合は 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