LVM を使用している Ubuntu を別ディスクに移行したい（再インストールなし、Live USBなし）

この記事は、Ubuntu 16 で作業されている次の記事を、Ubuntu 20, 22 でもやってみたものです。
[@miyase256 - ディスク間データ移行で学ぶ LVM/ブートローダ/ファイルシステム](https://qiita.com/miyase256/items/a5c1247981ed229a23fb)

## 経緯
自宅サーバにて Ubuntu Server 22.04 を利用しています。HDD に代替処理保留中のセクタが見つかったのですが、ディスクを交換するにあたって、なるべく再インストールはしたくありませんし、その間動作を止めるのも避けたいと考えました。
ディスクをクローンしようとも考えたのですが、初期設定でインストールすると LVM が使われており、概念は知っているものの実際に管理したことはありませんでした。
Raspberry Pi の移行（[Classmethod - Raspberry Piを極限まで無駄なくバックアップする](https://dev.classmethod.jp/articles/raspberry-pi-dump-and-restore/)）はやったことがあるのですが、LVM だと単純にディスクの中身をコピーするだけではできなさそうです。

そこで、動作中にシステムイメージを別ディスクに移行する手順を仮想環境で検証し、上手くいったので使ってみることにしました。

必要となりそうな前提知識は、最初に紹介した記事でも一部は紹介されています。
* 管理者権限でのコマンド実行
* 簡単なシェルスクリプトの構文
* MBR と GPT の違い
* ディスク /dev/sda とパーティション /dev/sda1 の違い
* LVM
* ブートローダ
* ファイルシステム

本来、動作中のシステムイメージをコピーすることは「道路を走行中の車を修理するようなもの」らしいです。探しものをしていたときに見つけたサイトに書いてました。

## 移行作業
検証環境は Hyper-V 上の Ubuntu Server 22.04。実際の環境も 22.04 （インストール時は 20.04）。
システムはディスク1台にインストールされている。
今回は、パーティション構成はそのままで別の仮想ディスクに移行する。

### 移行前の状況確認
移行前仮想ディスク sda は、GPT パーティション 128GB。Ubuntu Server をほとんど初期設定でインストールした状態となっている。
移行先仮想ディスク sdb は、64GB で作成している。

sda1 は /boot/efi にマウント。1GB程度。ESP（EFI パーティション）なので FAT32 でフォーマット。
sda2 は /boot にマウント。2GB程度。ext4 でフォーマット。
sda3 は LVM として利用しており、ubuntu--vg-ubuntu--lv が / にマウント。 ext4 でフォーマット。

lsblk コマンドでパーティションについて調べる。
```
$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.3M  1 loop /snap/core20/1822
loop1                       7:1    0 111.9M  1 loop /snap/lxd/24322
loop2                       7:2    0  49.8M  1 loop /snap/snapd/18357
sda                         8:0    0   128G  0 disk
+-sda1                      8:1    0     1G  0 part /boot/efi
+-sda2                      8:2    0     2G  0 part /boot
+-sda3                      8:3    0 123.9G  0 part
  +-ubuntu--vg-ubuntu--lv 253:0    0    62G  0 lvm  /
sdb                         8:16   0    64G  0 disk
```

parted コマンドでディスクについて調べる。
```
$ sudo parted -l
Model: Msft Virtual Disk (scsi)
Disk /dev/sda: 137GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  1128MB  1127MB  fat32              boot, esp
 2      1128MB  3276MB  2147MB  ext4
 3      3276MB  136GB   133GB

Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 66.5GB
Sector size (logical/physical): 512B/4096B
Partition Table: loop
Disk Flags:

Number  Start  End     Size    File system  Flags
 1      0.00B  66.5GB  66.5GB  ext4
```

df コマンドでマウント状態を調べる。
```
$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                               90M  2.4M   87M   3% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   61G  5.0G   53G   9% /
tmpfs                              446M     0  446M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  131M  1.7G   8% /boot
/dev/sda1                          1.1G  6.1M  1.1G   1% /boot/efi
tmpfs                               90M  4.0K   90M   1% /run/user/1000
```

元記事では、MBR ディスクで構成され、SWAP パーティションが存在するよう。こちらの環境とは少し異なりますので注意をしてください。

### パーティションの作成
fdisk コマンドの後継の gdisk コマンドで /dev/sda の現状を調べる。
gdisk は GPT ディスクや AFT 規格（4KBセクタサイズ）に対応しているらしい。fdisk は完全ではないらしい…？使い方はほぼ同じだった。
コマンドの引数にディスクを指定すると、対話式で設定できる。終了時に w で実際に書き換え、q であれば書き換えない。

```
$ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p（Print: 現在のパーティション構成を表示）
Disk /dev/sda: 268435456 sectors, 128.0 GiB
Model: Virtual Disk
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 1311ABCF-DD4B-4D5F-AB0A-94263868BA60
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 266338270
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2203647   1.0 GiB     EF00
   2         2203648         6397951   2.0 GiB     8300
   3         6397952       266336255   123.9 GiB   8300
   
Command (? for help): q
```

sda1 のパーティションコードは EF00 のため、ESP（EFI システムパーティション）と分かる。起動時に UEFI ファームウェアによって起動されるブートローダが格納されている。Windows にもある。
ESP についてはこちらが詳しい。→[ArchLinux - EFI システムパーティション](https://wiki.archlinux.jp/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)
sda2 のパーティションコードは 8300 で、Linux の /boot ディレクトリが入っている。先程のブートローダによって起動される Linux のあれこれが入っているらしい。
sda3 のパーティションコードは 8300 で、Linux の / ディレクトリ以下が入っている LVM がある。

gdisk コマンドを使い、sda の構成を参考に sdb のパーティションを作成する。sdb1, sdb2 は同じような容量で作成し、sdb3 はディスク容量を使い切るように作成する。
```
$ sudo gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Command (? for help): n（New:  パーティション新規作成）
Partition number (1-128, default 1): 1（1番目に作成する）
First sector (34-134217694, default = 2048) or {+-}size{KMGTP}: 2048（パーティションの始まりのセクタ番号）
Last sector (2048-134217694, default = 134217694) or {+-}size{KMGTP}: +1GB（パーティションの終わりは、始めから数えて1GB目のセクタ番号）
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): EF00（ESP 用パーティションコード）
Changed type of partition to 'EFI system partition'

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-134217694, default = 2099200) or {+-}size{KMGTP}: （デフォルト値は1番目のパーティションの次のセクタ番号）
Last sector (2099200-134217694, default = 134217694) or {+-}size{KMGTP}: +2GB
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): （デフォルト値は Linux 用パーティションコード）
Changed type of partition to 'Linux filesystem'

Command (? for help): n
Partition number (3-128, default 3): 3
First sector (34-134217694, default = 6293504) or {+-}size{KMGTP}:
Last sector (6293504-134217694, default = 134217694) or {+-}size{KMGTP}: （デフォルト値はディスクいっぱいを使うセクタ番号）
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sdb: 134217728 sectors, 64.0 GiB
Model: Virtual Disk
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 48EC5B49-4AF2-4E7A-8479-E46DA8B8BC45
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 134217694
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  EF00  EFI system partition
   2         2099200         6293503   2.0 GiB     8300  Linux filesystem
   3         6293504       134217694   61.0 GiB    8300  Linux filesystem

Command (? for help): w（Write: ディスクを書き換えて終了）

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
```

作成後の確認
```
user@v-linux-sv2:~$ sudo gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sdb: 134217728 sectors, 64.0 GiB
Model: Virtual Disk
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 48EC5B49-4AF2-4E7A-8479-E46DA8B8BC45
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 134217694
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  EF00  EFI system partition
   2         2099200         6293503   2.0 GiB     8300  Linux filesystem
   3         6293504       134217694   61.0 GiB    8300  Linux filesystem

Command (? for help): q（Quit: 保存せずに終了）
```

### LVM PV(Physical Volume)作成
pvs コマンドで現在の PV を確認する。sda3 に作成されていることが分かる。
```
$ sudo pvs
  PV         VG        Fmt  Attr PSize    PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <123.95g 61.97g
  ```

pvcreate コマンドで sdb3 に PV を作成する。
```
$ sudo pvcreate /dev/sdb3
  Physical volume "/dev/sdb3" successfully created.
```

作成した PV を確認する。sdb3 に PV は作成したものの VG はまだなので空っぽ。
```
user@v-linux-sv2:~$ sudo pvs
  PV         VG        Fmt  Attr PSize    PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <123.95g  61.97g
  /dev/sdb3            lvm2 ---   <61.00g <61.00g
```

### LVM VG(Volume Group)作成
vgs コマンドで現在の VG を確認する。ubuntu-vg という名前で作成されていることが分かる。
```
$ sudo vgs
  VG        #PV #LV #SN Attr   VSize    VFree
  ubuntu-vg   1   1   0 wz--n- <123.95g 61.97g
```

vgcreate コマンドで PV である sdb3 に、新しい VG を ubuntu2-vg という名前で作成する。
```
$ sudo vgcreate ubuntu2-vg /dev/sdb3
  Volume group "ubuntu2-vg" successfully created
```

作成した VG を確認する。
```
$ sudo vgs
  VG         #PV #LV #SN Attr   VSize    VFree
  ubuntu-vg    1   1   0 wz--n- <123.95g  61.97g
  ubuntu2-vg   1   0   0 wz--n-  <61.00g <61.00g
```

### LVM LV(Logical Volume)作成
lvs コマンドで現在の LV を確認する。先程作成した ubuntu2-vg の中身は空っぽなので表示されない。
```
$ sudo lvs
  LV        VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- 61.97g
```

lvcreate コマンドで ubuntu2-vg に、LV を ubuntu2-lv という名前で作成する。容量にこだわりはなかったが、48GiB にしてみた。
```
$ sudo lvcreate -n ubuntu2-lv -L 48g ubuntu2-vg
  Logical volume "ubuntu2-lv" created.
```

作成した LV を確認する。
```
$ sudo lvs
  LV         VG         Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv  ubuntu-vg  -wi-ao---- 61.97g
  ubuntu2-lv ubuntu2-vg -wi-a----- 48.00g
```

### パーティション構成の確認
ここまで作成してきたパーティション構成を確認する。
sdb3 の下に ubuntu2--vg-ubuntu2--lv という記述があり、VG の ubuntu2-vg、VG の中の LV にubuntu2-lv という LVM 構成が存在することが分かる。名前に - (ハイフン) があると、2つ重ねて表記するっぽい。
```
$ sudo lsblk
NAME                        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                         7:0    0  63.3M  1 loop /snap/core20/1822
loop1                         7:1    0 111.9M  1 loop /snap/lxd/24322
loop2                         7:2    0  49.8M  1 loop /snap/snapd/18357
sda                           8:0    0   128G  0 disk
+-sda1                        8:1    0     1G  0 part /boot/efi
+-sda2                        8:2    0     2G  0 part /boot
+-sda3                        8:3    0 123.9G  0 part
  +-ubuntu--vg-ubuntu--lv   253:0    0    62G  0 lvm  /
sdb                           8:16   0    64G  0 disk
+-sdb1                        8:17   0     1G  0 part
+-sdb2                        8:18   0     2G  0 part
+-sdb3                        8:19   0    61G  0 part
  +-ubuntu2--vg-ubuntu2--lv 253:1    0    48G  0 lvm
```

### ファイルシステム作成
ESP となる sdb1 は FAT32 でフォーマットする。
Linux システムとなる sdb2 ,ubuntu2-lv は ext4 でフォーマットする。

mkfs.fat コマンドで sdb1 に FAT32 ファイルシステムを作成する。
```
$ sudo mkfs.fat -F 32 /dev/sdb1
mkfs.fat 4.2 (2021-01-31)
```

mkfs.ext4 コマンドで sdb2 に ext4 ファイルシステムを作成する。
```
$ sudo mkfs.ext4 /dev/sdb2
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: 45bc47ac-63ef-4521-8d50-179cd1d476e9
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

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

mkfs.ext4 コマンドで LV (ubuntu2-lv) に ext4 ファイルシステムを作成する。
```
$ sudo mkfs.ext4 /dev/ubuntu2-vg/ubuntu2-lv
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 12582912 4k blocks and 3145728 inodes
Filesystem UUID: 5f122961-8b41-45a5-bef9-0b4cfb2ba0e3
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424

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

### マウント
移行先のディスクを /mnt/new_root にマウントする。
/ (root) に近い方から順にマウント先ディレクトリを作成し、マウントしていく。
つまり、ubuntu2-lv を / に、sdb2 を /boot に、sdb3 を /boot/efi にマウントしていく。
```
$ sudo mkdir -p /mnt/new_root
$ sudo mount /dev/ubuntu2-vg/ubuntu2-lv /mnt/new_root/
$ sudo mkdir -p /mnt/new_root/boot
$ sudo mount /dev/sdb2 /mnt/new_root/boot
$ sudo mkdir -p /mnt/new_root/boot/efi
$ sudo mount /dev/sdb1 /mnt/new_root/boot/efi
```

マウントの状態を確認する。`df -h` でも同様に確認できる。
```
$ sudo lsblk
NAME                        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                         7:0    0  63.3M  1 loop /snap/core20/1822
loop1                         7:1    0 111.9M  1 loop /snap/lxd/24322
loop2                         7:2    0  49.8M  1 loop /snap/snapd/18357
sda                           8:0    0   128G  0 disk
+-sda1                        8:1    0     1G  0 part /boot/efi
+-sda2                        8:2    0     2G  0 part /boot
+-sda3                        8:3    0 123.9G  0 part
  +-ubuntu--vg-ubuntu--lv   253:0    0    62G  0 lvm  /
sdb                           8:16   0    64G  0 disk
+-sdb1                        8:17   0     1G  0 part /mnt/new_root/boot/efi
+-sdb2                        8:18   0     2G  0 part /mnt/new_root/boot
+-sdb3                        8:19   0    61G  0 part
  +-ubuntu2--vg-ubuntu2--lv 253:1    0    48G  0 lvm  /mnt/new_root
```

### データコピー
Linux のファイルシステムは、複雑にマウントして構成されているため、ディレクトリが存在してもそのままコピーする必要がないものもある。
詳しくは元記事 [ディスク間データ移行で学ぶ LVM/ブートローダ/ファイルシステム - データコピー](https://qiita.com/miyase256/items/a5c1247981ed229a23fb#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B3%E3%83%94%E3%83%BC) を参照してください。

まず /boot/efi の中には EFI ディレクトリが存在するはず。その中に、UEFI ファームウェアが起動する UEFI ブートローダが格納されているらしい。
/boot/efi/ の中身の確認したのち、rsync コマンドを用いてコピーする。-a オプションをつけることで権限とかをそのままコピーできる。
```
$ ls -la /boot/efi/
$ for f in /boot/efi/; do sudo rsync -a $f /mnt/new_root/boot/efi/; done
$ ls -la /boot/efi/
```

/boot の中には efi ディレクトリがあるが、そちらは sdb1 がマウントされているだけなので、sdb2 にコピーするときは efi ディレクトリを除外する必要がある。
/boot/ の中身を確認したのち、コピーする。
```
$ for f in /boot/!(efi|lost+found); do echo $f; done
$ for f in /boot/!(efi|lost+found); do sudo rsync -a $f /mnt/new_root/boot/; done
```

コピーしないでも良いディレクトリは除外して / の直下を確認する。
```
$ for f in /!(sys|proc|dev|run|snap|mnt|boot|lost+found); do echo $f; done
/bin
/etc
/home
/lib
/lib32
/lib64
/libx32
/media
/opt
/root
/sbin
/srv
/swap.img
/tmp
/usr
/var
```

これらをコピーする。ファイルの量によっては時間がかかる。
```
$ for f in /!(sys|proc|dev|run|snap|mnt|boot|lost+found); do sudo rsync -a $f /mnt/new_root/; done
```

lost+found ディレクトリは削除してもよい。

### コピーしなかったディレクトリの新規作成、バインドマウント
後でコピー先のディレクトリ /mnt/new_root に chroot するため、コピーしなかった各種ディレクトリはバインドマウントする。
バインドマウントとは、同じデバイスを複数の場所にマウントすること。

マウント先ディレクトリを作成する。
```
$ sudo mkdir -p /mnt/new_root/{sys,proc,dev,run,snap,mnt}
```

コピーしなかったものは、--bind オプションでバインドマウントする。
```
$ for f in /{sys,proc,dev,run,snap,mnt}; do sudo mount --bind $f /mnt/new_root$f; done
```

パーミッションを確認し、異なれば合わせる。（こちらの環境では一致）
```
$ stat /{sys,proc,dev,run,snap,mnt} -c '%a'
555
555
755
755
755
755
$ stat /mnt/new_root/{sys,proc,dev,run,snap,mnt} -c '%a'
555
555
755
755
755
755
```

## ブートローダの GPT への登録
ディレクトリ /mnt/new_root に chroot する。
chroot すると、この中では /mnt/new_root が / に見える。抜けたいときは exit する。
```
$ sudo chroot /mnt/new_root/
(chroot)# （プロンプトはこの記事での表記。環境による。）
```

chroot 環境でのブロックデバイスの情報を確認する。
すごい。sdbがルートに見えている。
```
(chroot)# lsblk
NAME                        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                         7:0    0  63.3M  1 loop
loop1                         7:1    0 111.9M  1 loop
loop2                         7:2    0  49.8M  1 loop
sda                           8:0    0   128G  0 disk
+-sda1                        8:1    0     1G  0 part
+-sda2                        8:2    0     2G  0 part
+-sda3                        8:3    0 123.9G  0 part
  +-ubuntu--vg-ubuntu--lv   253:0    0    62G  0 lvm  /mnt
sdb                           8:16   0    64G  0 disk
+-sdb1                        8:17   0     1G  0 part /boot/efi
+-sdb2                        8:18   0     2G  0 part /boot
+-sdb3                        8:19   0    61G  0 part
  +-ubuntu2--vg-ubuntu2--lv 253:1    0    48G  0 lvm  /
```

GPT の MBR にブートローダ（grub）をインストールする。
MBR があるのはディスクの先頭なので、引数にはディスクを与える。
今回は sdb に grub をインストールしたいので、引数は /dev/sdb になる。
```
(chroot)# grub-install /dev/sdb
Installing for x86_64-efi platform.
grub-install: warning: EFI variables cannot be set on this system.
grub-install: warning: You will have to complete the GRUB setup manually.
Installation finished. No error reported.
```

update-grub する。
```
(chroot)# update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.15.0-76-generic
Found initrd image: /boot/initrd.img-5.15.0-76-generic
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done
```

exit で抜ける。
```
(chroot)# exit

$ （プロンプトがもとに戻る）
```

## fstab の編集
Linux が起動しディスクをマウントするとき、接続順が変わっても良いように UUID など接続順に依存しない ID を指定している。マウント時の設定が /etc/fstab に記載されているため、こちらも修正する必要がある。

まずは移行前のシステムで /bootにマウントしているデバイスの ID を確認する。
```
$ sudo blkid /dev/sda1
/dev/sda1: UUID="DBE9-2C46" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="1d50f754-b728-4f9a-9771-925326f89b5f"
$ sudo blkid /dev/sda2
/dev/sda2: UUID="1dc3dccc-2fbe-4bc0-a29e-b27bae8f83c7" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="1e4b9ca6-5158-4d00-a6f9-c82d7c1e38b2"
$ sudo blkid /dev/sda3
/dev/sda3: UUID="h7duJd-bRXC-6xOT-sdwy-NY9u-3n8t-Owu0Gt" TYPE="LVM2_member" PARTUUID="d153db6f-29d6-45bd-8197-994a2299b335"
```

移行先も調べる。
```
$ sudo blkid /dev/sdb1
/dev/sdb1: UUID="75DD-4090" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="09e0eda9-8ea3-4614-9ec7-4159da464f0a"
$ sudo blkid /dev/sdb2
/dev/sdb2: UUID="45bc47ac-63ef-4521-8d50-179cd1d476e9" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="ca1ba69a-f5fa-4b07-ba05-0afb251c908b"
$ sudo blkid /dev/sdb3
/dev/sdb3: UUID="4j747J-5k9i-j5MJ-bBas-poHP-gTfH-MA7EX6" TYPE="LVM2_member" PARTLABEL="Linux filesystem" PARTUUID="3d6c6ad8-735d-4597-9f83-f4bd6d857e0f"
```


現在の fstab を確認する。移行先の fstab を確認するため、chroot で入り直し、/etc/fstab を開く。
```
$ sudo chroot /mnt/new_root
(chroot)#

(chroot)# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-eNEmJunHBihmvlWlr8a2xqNwm3W2hfICzg24JYn9y9NP3OK3mAbzgPTMqE9nBy6c / ext4 defaults 0 1 （ubuntu2-lv のものに書き換える）
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/1dc3dccc-2fbe-4bc0-a29e-b27bae8f83c7 /boot ext4 defaults 0 1 （sdb2 のものに書き換える）
# /boot/efi was on /dev/sda1 during curtin installation
/dev/disk/by-uuid/DBE9-2C46 /boot/efi vfat defaults 0 1 （sdb1 のものに書き換える）
/swap.img       none    swap    sw      0       0
```

ルートディレクトリのマウントにおいて、/dev/ubuntu-vg/ubuntu-lv の指定は by-id が使われているので、/dev/disk/by-id から ubuntu2-lv の ID を調べる。
「ubuntu2--vg-ubuntu2--lv」→「dm-1」→「dm-uuid-LVM-dewPV20Yn5ZrR2m033yFzxFq6le39rfFv6vmPSxztq7KhUcKUCU8YzxiltVpmw97」のようにたどる。
```
$ ls -l /dev/disk/by-id/dm-*
lrwxrwxrwx 1 root root 10 Jun 30 19:53 /dev/disk/by-id/dm-name-ubuntu2--vg-ubuntu2--lv -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jun 30 19:53 /dev/disk/by-id/dm-name-ubuntu--vg-ubuntu--lv -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jun 30 19:53 /dev/disk/by-id/dm-uuid-LVM-DKELsRcM18qTdaXjA3dq48DvSsDX1vLcmMfPM39BTHFO4XNdtC9jOA0kyZ1ZgAIp -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jun 30 19:53 /dev/disk/by-id/dm-uuid-LVM-eNEmJunHBihmvlWlr8a2xqNwm3W2hfICzg24JYn9y9NP3OK3mAbzgPTMqE9nBy6c -> ../../dm-0
```

編集する。
```
(chroot)# cat /etc/fstab

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
#/dev/disk/by-id/dm-uuid-LVM-eNEmJunHBihmvlWlr8a2xqNwm3W2hfICzg24JYn9y9NP3OK3mAbzgPTMqE9nBy6c / ext4 defaults 0 1
 /dev/disk/by-id/dm-uuid-LVM-DKELsRcM18qTdaXjA3dq48DvSsDX1vLcmMfPM39BTHFO4XNdtC9jOA0kyZ1ZgAIp / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
#/dev/disk/by-uuid/1dc3dccc-2fbe-4bc0-a29e-b27bae8f83c7 /boot ext4 defaults 0 1
 /dev/disk/by-uuid/45bc47ac-63ef-4521-8d50-179cd1d476e9 /boot ext4 defaults 0 1
# /boot/efi was on /dev/sda1 during curtin installation
#/dev/disk/by-uuid/DBE9-2C46 /boot/efi vfat defaults 0 1
 /dev/disk/by-uuid/75DD-4090 /boot/efi vfat defaults 0 1
/swap.img       none    swap    sw      0       0
```

fstab を反映させてみる。
ここでエラーが出たら適宜直す。
```
(chroot)# mount -a
```

そしてシャットダウンする。
```
(chroot)# exit

$ shutdown -h now
```

## UEFI の設定変更
起動するディスクを、移行先ディスクに切り替える。単純に順番を入れ替えるだけで良い。
Hyper-V などの仮想環境でも必要であり、間違って PXE が上に来ることもあるので注意が必要となる。（ちなみに私は、起動しなくなったと勘違いして作業をやり直した。）

## 起動
データの移行が成功していることを祈りながら起動する。
起動しなかった場合も、起動順を前のものに変更して、やり直すことができる。

## 最後に
元記事のお陰で、データの移行に成功しました。ありがとうございました。
他の方々にも役立てばと多い、記事にしてみました。
同じように困った状況に置かれた方々の力になれたら幸いです。

ちなみに、仮想環境でこの方法を検証したのち実際の環境で作業したのですが、再インストールと同じぐらい手間がかかった気がします。勉強になったので、良かったですが。