この記事は、Ubuntu 16 で作業されている次の記事を、Ubuntu 20, 22 でもやってみたものです。
@miyase256 - ディスク間データ移行で学ぶ LVM/ブートローダ/ファイルシステム
経緯
自宅サーバにて Ubuntu Server 22.04 を利用しています。HDD に代替処理保留中のセクタが見つかったのですが、ディスクを交換するにあたって、なるべく再インストールはしたくありませんし、その間動作を止めるのも避けたいと考えました。
ディスクをクローンしようとも考えたのですが、初期設定でインストールすると LVM が使われており、概念は知っているものの実際に管理したことはありませんでした。
Raspberry Pi の移行(Classmethod - Raspberry Piを極限まで無駄なくバックアップする)はやったことがあるのですが、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 システムパーティション
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/ブートローダ/ファイルシステム - データコピー を参照してください。
まず /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 が上に来ることもあるので注意が必要となる。(ちなみに私は、起動しなくなったと勘違いして作業をやり直した。)
起動
データの移行が成功していることを祈りながら起動する。
起動しなかった場合も、起動順を前のものに変更して、やり直すことができる。
最後に
元記事のお陰で、データの移行に成功しました。ありがとうございました。
他の方々にも役立てばと多い、記事にしてみました。
同じように困った状況に置かれた方々の力になれたら幸いです。
ちなみに、仮想環境でこの方法を検証したのち実際の環境で作業したのですが、再インストールと同じぐらい手間がかかった気がします。勉強になったので、良かったですが。