現在、Raspberry Pi 5 で運用している NAS サーバはサーバアプリケーションに samba を利用しており、記憶媒体は USB 接続の外付け HDD で運用しています。この HDD は論理パーティションで区切っているのですが、今回は NAS サーバに Linux の LVM2 を導入し、柔軟にサイズ変更などが可能な論理ボリュームに移行したいと思います。

また、現在の HDD では USB を挿すだけで誰の PC からもデータが見える状態ですので、ついでに論理ボリュームの暗号化もしていきます。

概要

まず、現在の外付け HDD の状況は下記のとおりです。

$ df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
...
/dev/sda2      fuseblk  3.3T  3.1T  186G  95% /mnt/usbhdd1
/dev/sda3      hfsplus  1.9T  273G  1.6T  15% /mnt/usbhdd2
/dev/sda4      exfat    403G   41G  362G  10% /mnt/usbhdd3
...
$ fdisk -l
ディスク /dev/sda: 5.46 TiB, 6001175126016 バイト, 11721045168 セクタ
Disk model: EZAZ-00SF3B0
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: ...

デバイス      開始位置    最後から     セクタ サイズ タイプ
/dev/sda1           34       32767      32734    16M Microsoft 予約領域
/dev/sda2        32768  7010641919 7010609152   3.3T Microsoft 基本データ
/dev/sda3   7010641920 10877123759 3866481840   1.8T Apple HFS/HFS+
/dev/sda4  10877386752 11720781823  843395072 402.2G Microsoft 基本データ

図にするとこんな感じです。

image-20250817023941061

Windows 用の NTFS、macOS 用の MacOS 拡張、共有用の extFAT にそれぞれ論理パーティションを分けています。

こうなっている理由は、現在 NAS 用に使っている外付け HDD は、NAS サーバの導入前は元々 Windows PC や MacBook などに直接 USB 接続して利用していたためです。しかし、Linux で運用する NAS サーバを導入した今、OS によるファイルシステムの違いは NAS サーバ側が吸収してくれているので、論理パーティションによる分割は不要になりました。むしろ各パーティションで微妙に空き領域が残ってしまう、いわばフラグメンテーション状態になってしまっています。

そこで、今回はこれを最終的にはこうしたいと思っています。

image-20250817023949580

論理パーティション的には(管理領域を除いて)すべて LVM としてフォーマットしておき、その上に論理ボリューム(LV)という仮想ブロックデバイスとして ext4、btrfs といった各ファイルシステムや、バックアップ用の snapshot 領域を作成していきたいと思っています。

従来の論理パーティションではパーティションの順序を意識しなければならないために、拡張・縮小の難易度が高いです。一方、Linux の論理ボリュームは論理パーティション内の空きブロックから作成されるので、ボリュームの順序を意識する必要がなく、後からでも簡単に拡張・縮小できます。

LVM の概要

LVM (Logical Volume Manager) は Linux に備わる機能で、1つ以上の物理デバイスにまたがって論理ボリュームを作成したり、後から領域を柔軟に拡張・縮小できる機能です。LVM には下記の用語があります。

PV (Physical Volume)

物理的なボリューム、すなわち従来の通常のパーティション(/dev/sda など)です。LVM は PV に指定された1つないしは複数のボリュームの空き領域から論理ボリュームを作成します。PV に指定されたボリュームは空で、なんのファイルシステムも存在しないベアメタルな状態である必要があります。

PV は PE (Physical Extent) という単位に区切られ、この PE をかき集めて後に説明する LV を作ります。

Physical Volume という名前がついていますが、論理パーティション(/dev/sda2/dev/sdb3 など)に対しても指定できます。

VG (Volume Group)

1つ以上の PV からなるグループです。LVM は VG ごとに論理ボリュームの作成先を自動で選択します。

image-20250817023729081

LV (Logical Volume)

LVM で作成される論理ボリュームです。作成時には作成先の VG を指定して、VG 内の空き PE から指定サイズ分の論理ボリュームを作成します。

image-20250817023916376

device mapper

LVM やブロックデバイスの根幹となる技術です。1つないしは複数のデバイスのブロックに対してブロックデバイス用に linear mapping したり、ブロックデバイスへの read/write アクセスを暗号化したり、といった操作を透過的に実現します。これらの操作はファイルシステムよりも下のカーネルモジュールレイヤで行われますので、ファイルシステムやユーザアプリケーションは device mapper の存在を意識する必要は基本的にはありません。

device mapper に関連するデバイス(ターゲットという)は dm-* から始まります。たとえばこんなものがあります。

  • dm-linear
    VG に指定されたデバイスの空き領域から仮想ブロックデバイスを作成する。LV の作成に必須。
  • dm-crypt
    仮想ブロックデバイスに対するアクセスをハードウェアに対して暗号化する。ハードウェアには暗号化された状態で保存される。アクセスするにはパスフレーズや鍵ファイルによる認証を必要とする。
  • dm-snapshot
    仮想ブロックデバイスの差分バックアップを CoW によって取る。差分しか保存されないが、作成時点の状態にデバイスを戻すことができる。
  • dm-verity
    仮想ブロックデバイスからハッシュツリーを作成し、整合性を検証し改ざんを検知できるようにする。

device mapper の面白いところはレイヤ構造として作れるところです。例えば、物理デバイスを暗号化したうえで論理ボリュームを作成したり、あるいは逆に論理ボリュームを作成した上にボリュームを暗号化する、といった自由自在な組み合わせでデバイスを作成できます。

image-20250817162244794

やったこと

1. データ退避

これからフォーマットする(= LVM を作成する)NTFS パーティション内のファイルをすべて退避させました。

ここは本題ではないので詳細は割愛しますが、今回一番時間がかかった作業でした。ただでさえ 3TiB 以上のデータがあるというのに、退避先が手元にないためです。

まずはパーティションを切って NTFS の後ろに退避用のパーティションを作成。

image-20250817163039614

3.3TiB でほぼ満杯状態のパーティションのデータのうち、2.2TiB 分を後ろに作った領域にコピーしていきます。

sda           8:0    0   5.5T  0 disk
├─sda1        8:1    0    16M  0 part
├─sda2        8:2    0   3.3T  0 part /mnt/usbhdd1
└─sda3        8:3    0   2.2T  0 part /mnt/usbhdd2  ← これ

残りの 1.1TiB 分は…うーん、どうしよう…

2weekslater

圧縮するなり、PC 内臓の別の HDD に移すなり、クラウドストレージに移すなりしてなんとか退避させました。データの整合性チェックとか含めて進めてたら2週間経ってしまいました。

2. LVM 用のパーティションを作成する

いよいよ LVM を外付け HDD に導入していきたいと思います。

LVM2 のインストール

環境に LVM2 が入っていない場合、あらかじめインストールしておきます。

$ sudo apt update
$ sudo apt install lvm2

unmount する

後に LVM 用パーティションとなる /dev/sda2 をフォーマットします。

sda           5.5T
├─sda1         16M
├─sda2        3.3T ntfs /mnt/usbhdd1  ← これ
└─sda3        2.2T ext4 /mnt/usbhdd2

まずは unmount しましょう。

$ sudo umount /mnt/usbhdd1
umount: /mnt/usbhdd1: target is busy.

target is busy と言われてしまいました。何も置いてないはずですが?

やむなく再起動。あとから気づいたんですが、普通に NAS 接続で Windows のエクスプローラで開いていたのが原因っぽいです。

parted でフォーマットする

まずは深呼吸して、いよいよ /dev/sda2 をフォーマットしていきます。くれぐれも退避先である /dev/sda3 をフォーマットしないよう要注意。

$ sudo parted /dev/sda
GNU Parted 3.6
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) print
モデル: WDC WD60 EZAZ-00SF3B0 (scsi)
ディスク /dev/sda: 6001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前                          フラグ
 1    17.4kB  16.8MB  16.8MB                    Microsoft reserved partition  msftres
 2    16.8MB  3589GB  3589GB  ntfs              Basic data partition          msftdata
 3    3589GB  6001GB  2412GB  ext4              primary

今回フォーマットするパーティションは NTFS である2番目のパーティションです。

で、今回の場合、2番目のパーティションの領域が、開始:16.8MB、終了:3589GB となっています。

よくよく見ると、今回フォーマットしたくない3番目のパーティションも 3589GB~ 開始となっています。また、1番目のパーティションも ~16.8MB となっています。

これではパーティションの領域が被ってしまい、前後のパーティションに影響が及びかねません。もう少し細かい単位、すなわちセクタ単位で見てみましょう。

(parted) unit s print
モデル: WDC WD60 EZAZ-00SF3B0 (scsi)
ディスク /dev/sda: 11721045168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始         終了          サイズ       ファイルシステム  名前                          フラグ
 1    34s          32767s        32734s                         Microsoft reserved partition  msftres
 2    32768s       7010641919s   7010609152s  ntfs              Basic data partition          msftdata
 3    7010641920s  11721043967s  4710402048s  ext4              primary

これで正確な領域がわかりました。セクタ番号が 32768s ~ 7010641919s ですので、この範囲でパーティションを作成していきます。

まずはパーティションを削除。くれぐれも番号を間違えないように!

(parted) rm 2
(parted) unit s print
モデル: WDC WD60 EZAZ-00SF3B0 (scsi)
ディスク /dev/sda: 11721045168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始         終了          サイズ       ファイルシステム  名前                          フラグ
 1    34s          32767s        32734s                         Microsoft reserved partition  msftres
 3    7010641920s  11721043967s  4710402048s  ext4              primary

2番目のパーティションが削除されました。

次に、同じ領域にパーティションを作成していきます。先ほど取得したセクタ番号で指定します。ラベル名は「lvm2」としました。

(parted) mkpart lvm2 32768s 7010641919s
(parted) unit s print
モデル: WDC WD60 EZAZ-00SF3B0 (scsi)
ディスク /dev/sda: 11721045168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始         終了          サイズ       ファイルシステム  名前                          フラグ
 1    34s          32767s        32734s                         Microsoft reserved partition  msftres
 2    32768s       7010641919s   7010609152s                    lvm2
 3    7010641920s  11721043967s  4710402048s  ext4              primary

無事にパーティションが作成されました。

次に lvm フラグを立てておきます。

(parted) set 2 lvm on
(parted) print
モデル: WDC WD60 EZAZ-00SF3B0 (scsi)
ディスク /dev/sda: 11721045168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始         終了          サイズ       ファイルシステム  名前                          フラグ
 1    34s          32767s        32734s                         Microsoft reserved partition  msftres
 2    32768s       7010641919s   7010609152s                    lvm2                          lvm
 3    7010641920s  11721043967s  4710402048s  ext4              primary

これにて完了です。parted から出ます。

(parted) quit

…と思ったんですけど、なぜかその後 NTFS が復活してました。なんですかこれ?

$ lsblk -o NAME,SIZE,TYPE,FSTYPE
sda           5.5T disk
├─sda1         16M part
├─sda2        3.3T part ntfs
└─sda3        2.2T part ext4

wipefs でファイルシステムのシグネチャを削除してみます。

$ sudo wipefs -a /dev/sda2
/dev/sda2: オフセット 0x00000003 にある 8 バイト (ntfs) を消去しました: 4e 54 46 53 20 20 20 20
$ lsblk -o NAME,SIZE,TYPE,FSTYPE
sda           5.5T disk
├─sda1         16M part
├─sda2        3.3T part
└─sda3        2.2T part ext4

今度こそ NTFS が消えました。NTFS パーティションの削除だったら Linux でやるより Windows でやったほうが良かったかもしれませんね。

何がともあれ、パーティションは消えたものとして LVM の作成に移ります。

PV を作成する

まずは /dev/sda2 上に PV (Physical Volume) を作成します。

$ sudo pvcreate /dev/sda2
  Physical volume "/dev/sda2" successfully created.

そして VG (Volume Group) を作成します。今回の場合、VG に指定するのは /dev/sda2 のみです。

今回は nas-vg と名付けました。

$ sudo vgcreate nas-vg /dev/sda2
  Volume group "nas-vg" successfully created

ここからは、各利用用途に応じて論理ボリューム (LV) を作成していきます。

まずは通常の LVM を 1TiB 分作ってみます。作成後、ext4 でフォーマットしておきます。名前は normal-lv としておきます。「

$ sudo lvcreate -L 1TB -n normal-lv nas-vg
  Logical volume "normal-lv" created.

無事、nas-vg/normal-lv が作成されました。

$ sudo lvs
  LV        VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  normal-lv nas-vg -wi-a----- 1.00t
$ lsblk
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                      8:0    0   5.5T  0 disk
├─sda1                   8:1    0    16M  0 part
├─sda2                   8:2    0   3.3T  0 part
│ └─nas--vg-normal--lv 254:0    0     1T  0 lvm
└─sda3                   8:3    0   2.2T  0 part

最後に ext4 を作成します。

$ sudo mkfs.ext4 /dev/nas-vg/normal-lv
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 268435456 4k blocks and 67108864 inodes
Filesystem UUID: ...
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo mount /dev/nas-vg/normal-lv /mnt/usbhdd1/
$ df -hT
Filesystem                     Type   Size  Used Avail Use% Mounted on
tmpfs                          tmpfs  794M  7.8M  786M   1% /run
/dev/mmcblk0p2                 ext4    58G   50G  5.6G  90% /
tmpfs                          tmpfs  3.9G   12K  3.9G   1% /dev/shm
tmpfs                          tmpfs  5.0M   12K  5.0M   1% /run/lock
/dev/mmcblk0p1                 vfat   505M  189M  316M  38% /boot/firmware
tmpfs                          tmpfs  794M  120K  794M   1% /run/user/123
tmpfs                          tmpfs  794M  112K  794M   1% /run/user/1000
/dev/mapper/nas--vg-normal--lv ext4  1007G   28K  956G   1% /mnt/usbhdd1

無事、ext4 としてマウントできました。

このままだと root ユーザしか書き込めないので、所有者をユーザに変更しておきます。

$ sudo chown <USER>:<USER> /mnt/usbhdd1/

LVM を拡張する

先ほど作成した LV を拡張してみます。とりあえず +1.5 TiB 分拡張してみましょう。

$ sudo lvextend -L +1.5TB /dev/nas-vg/normal-lv
  Size of logical volume nas-vg/normal-lv changed from 1.00 TiB (262144 extents) to 2.50 TiB (655360 extents).
  Logical volume nas-vg/normal-lv successfully resized.

これだけでは LV が拡張されたのみでファイルシステムには反映されていませんので、ファイルシステムにも反映します。

$ sudo resize2fs /dev/nas-vg/normal-lv
$ df -hT
Filesystem                     Type   Size  Used Avail Use% Mounted on
tmpfs                          tmpfs  794M  7.8M  786M   1% /run
/dev/mmcblk0p2                 ext4    58G   50G  5.6G  90% /
tmpfs                          tmpfs  3.9G   12K  3.9G   1% /dev/shm
tmpfs                          tmpfs  5.0M   12K  5.0M   1% /run/lock
/dev/mmcblk0p1                 vfat   505M  189M  316M  38% /boot/firmware
tmpfs                          tmpfs  794M  120K  794M   1% /run/user/123
tmpfs                          tmpfs  794M  112K  794M   1% /run/user/1000
/dev/mapper/nas--vg-normal--lv ext4   2.5T   28K  2.4T   1% /mnt/usbhdd1

無事、拡張できました。

3. LV を dm-crypt 化する

デバイスの暗号化のために dm-crypt ターゲットを作成します。

マウントのたびにパスフレーズを要求することもできますが、今回は fstab で起動時に自動マウントできるようにしたいので、鍵ファイルを作成します。

わかりやすく名前も crypt-lv に変えておきます(任意)。

$ sudo lvrename nas-vg/normal-lv crypt-lv
  Renamed "normal-lv" to "crypt-lv" in volume group "nas-vg"

⚠以降、先ほど作成した LV をフォーマットします。暗号化ボリュームと非暗号ボリュームの両方とも必要な場合は別途 LV を作成してください!⚠

鍵ファイルの作成

/dev/urandom から作成します。

$ sudo dd if=/dev/urandom of=/root/my-lv.key bs=4096 count=1
$ sudo chmod 600 /root/my-lv.key

dm-crypt デバイスを作成する

crypt-lv に対して luksFormat します。

確認とパスフレーズの設定が求められます。

$ sudo cryptsetup luksFormat /dev/nas-vg/crypt-lv

WARNING!
========
This will overwrite data on /dev/nas-vg/crypt-lv irrevocably.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/nas-vg/crypt-lv:
パスフレーズを確認:

dm-crypt デバイスのマッピング&ファイルシステム作成

暗号化済みブロックデバイスとして利用できるよう、dm-crypt デバイスをマッピングします。

ここでは crypt-lv と名付けています。

$ sudo cryptsetup open /dev/nas-vg/crypt-lv crypt-lv

すると /dev/mapper/crypt-lv からアクセス可能になります。

もう一度 ext4 ファイルシステムを作成します。

$ sudo mkfs.ext4 /dev/mapper/crypt-lv
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 671084544 4k blocks and 167772160 inodes
Filesystem UUID: ...
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

無事、dm-crypt デバイスに対して ext4 を作成できました。

鍵ファイルの適用&自動認証設定&自動マウント

先ほど作成した鍵ファイルを適用し、crypttab に設定しておきます。

ここでもパスフレーズの入力が求められます。

$ sudo cryptsetup luksAddKey /dev/nas-vg/crypt-lv /root/crypt-lv.key
Enter any existing passphrase:

/etc/crypttab にデバイスと鍵ファイルのマッピングを追加します。

# <target name> <source device>         <key file>      <options>
crypt-lv        /dev/nas-vg/crypt-lv    /root/crypt-lv.key      luks  

自動マウントさせたいので、/etc/fstab には下記のように設定しました。

ytani@raspberry-pi-5:~$ cat /etc/fstab
...
/dev/mapper/crypt-lv /mnt/usbhdd1 ext4 defaults,nofail 0 0

4. LV を拡張する

今ドア LV + dm-crypt + ext4 領域を 100GiB 分拡張してみます。

手順としては下記のとおりです。

  1. LV を 100 GiB 分拡張する
  2. dm-crypt 領域をデバイスの全領域(=LV のサイズ)に拡張する
  3. ファイルシステム(ext4)を全領域(=LV のサイズ)に拡張する

まずは現状確認。

$ sudo lvs
  LV       VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  crypt-lv nas-vg -wi-ao---- 2.50t

現在は 2.5 TiB です。ここにさらに 100 GiB 追加し 2.6 TiB にします。

最初に、LV を lvextend -L +<拡張サイズ> <デバイス> で拡張します。

$ sudo lvextend -L +100G /dev/nas-vg/crypt-lv
  Size of logical volume nas-vg/crypt-lv changed from 2.50 TiB (655360 extents) to <2.60 TiB (680960 extents).
  Logical volume nas-vg/crypt-lv successfully resized.

次に、cryptsetup resize <target名> で dm-crypt 領域に拡張分を反映させます。

ここでは crypt 領域のパスフレーズの入力が求められます。

$ sudo cryptsetup resize crypt-lv
Enter passphrase for /dev/mapper/nas--vg-crypt--lv:

これが完了したら、あとはファイルシステムを拡張するだけです。

ext4 の場合、resize2fs <デバイス> で拡張します。

$ sudo resize2fs /dev/mapper/crypt-lv
resize2fs 1.47.0 (5-Feb-2023)
Please run 'e2fsck -f /dev/mapper/crypt-lv' first.

しかし、ここで先に e2fsck でファイルシステムをチェックするように求められました。

愚直に実行すると、extent の最適化をするか?の質問が延々と続きます。

$ sudo e2fsck -f /dev/mapper/crypt-lv
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking iノードs, blocks, and sizes
Iノード 38801713 extent tree (at level 1) could be shorter.  Optimize<y>? yes
Iノード 40895790 extent tree (at level 1) could be shorter.  Optimize<y>? yes
Iノード 41943331 extent tree (at level 1) could be shorter.  Optimize<y>? yes
...

最適化をしてもよいですが若干時間がかかります。しなくとも動作上問題はないはずです。

e2fsck-y ですべての最適化に対して yes、-n で no を選択できます。

完了後、もう一度 resize2fs を実行し、

$ sudo resize2fs /dev/mapper/crypt-lv
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/mapper/crypt-lv to 697298944 (4k) blocks.
The filesystem on /dev/mapper/crypt-lv is now 697298944 (4k) blocks long.
$ sudo lvs
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  crypt-lv nas-vg -wi-ao---- <2.60t
ytani@raspberry-pi-5:~$ df -hT
...
/dev/mapper/crypt-lv ext4   2.6T  2.2T  248G  91% /mnt/usbhdd1

2.60 TiB への拡張が完了しました。

5. データを戻す

退避していたデータを元あった場所に戻していきます。

最終形態

最終的にはこんな感じにしました。

$ sudo lvs
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  btrfs-lv nas-vg -wi-ao---- 50.00g
  crypt-lv nas-vg -wi-ao----  3.18t
$ lsblk
...
sda                     8:0    0   5.5T  0 disk
├─sda1                  8:1    0    16M  0 part
├─sda2                  8:2    0   3.3T  0 part
│ ├─nas--vg-crypt--lv 254:0    0   3.2T  0 lvm
│ │ └─crypt-lv        254:1    0   3.2T  0 crypt /mnt/usbhdd1
│ └─nas--vg-btrfs--lv 254:2    0    50G  0 lvm
│   └─btrfs-lv        254:3    0    50G  0 crypt /mnt/usbhdd3
└─sda3                  8:3    0   2.2T  0 part  /mnt/usbhdd2

image-20250817165316946

作成したのは ext4 用の LV と btrfs 用の LV。前者は普通に写真データなどのバックアップ用、後者はこれまでの実験データなどのログファイル保管用です。

btrfs は zstd などによる透過圧縮を提供していて、これを利用するとファイルシステムに書き込むと自動で圧縮、読み込み時には自動で展開してくれます。アクセス性能は低下する一方、データログなどのテキストファイルは圧縮効果が高く、かつアクセス頻度もかなり低いのでこのように使い分けました。実際、11 GB ほどあるデータをたったの 3.4GB に圧縮してくれています。

まだ退避先用の論理パーティションを削除していないんですが、これはデータの整合性チェック完了後に削除予定です。削除したら ext4 用の LV を拡張するなり、dm-snapshot を作成するなりして空き領域を活用していきたいと思っています。

おわりに

以上、論理パーティションから LVM への移行に関する奮闘記でした。数 TB レベルになるとデータのコピーでかなり時間を食いますが、のちの利便性、ボリューム管理の柔軟性を加味すれば十分やる価値はあると思います。せっかく device mapper が使えるようになったので今後も色々遊んでみたいと思います。