10 October 2021

SATA SSDからNVMe SSDにLinuxパーティションをクローン。UEFIブートとGRUBの再構成

2021年8月に購入したNVMe M.2 SSDにWindows 11をクリーンインストールし、既存のSATA SSDからUbuntu 18.04のパーティションをクローンコピーしてデュアルブート起動できるようにするまでの流れ。

文中で、「コマンドライン」「端末」で作業する場合は、(起動ドライブ自身をいじれない制限を回避するため)USB起動ライブDVDのUbuntu端末で作業を行っている。

NVMe M.2 SSDのUEFIパーティションにGRUB2をインストール

作業前の状況は、SATA SSDには常用しているWindowsとUbunuがデュアルブートでインストールされており、NVMe M.2 SSDにはWindows 11がクリーンインストールされた直後の状態とする。

最初の作業は、NVMe M.2 SSDにUbuntuをクリーンインストールすることで、UEFIブートパーティションにGRUB2をセットアップする。

必要なのはGRUB2だけであり、Ubuntuは不要なので、インストール直後にUbuntuパーティションは削除する。

20211010-partition-grub.png

作業前後の状況(NVMe M.2のUEFIパーティションにGRUB2をインストール)
ubuntu@ubuntu:~$ sudo lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  vfat   SYSTEM      947F-F17C                            
├─sda2                                                          
├─sda3  ntfs   Windows     786685CD66858C96                     
├─sda4  ntfs               BAC2921EC291DF47                     
├─sda5  ntfs   WinRE_DRV   BC02870B0286CA3A                     
├─sda6  swap               046944a6-e95a-4774-bdea-ed92ac2e72c2 
├─sda7  ext4   ubuntu18.04 a04269a9-79f4-4c67-ad4c-f6d5278612d2 
├─sda8  ext4   ubuntu20.04 55e586a6-358d-4c98-8ef8-7f7d3652201b 
├─sda9  ntfs   TEMP        DE0E157E0E15513F
├─sda10 ntfs   DATA        C61EC4391EC42471                     
├─sda11 ntfs   VM-NTFS     30B4DD69B4DD3258                     
└─sda12 ext4   vm-ext4     3a6a63bb-b5d9-40d0-ba63-682b5e35ab04 

ubuntu@ubuntu:~$ sudo lsblk -f /dev/nvme0n1
NAME        FSTYPE LABEL       UUID                                 MOUNTPOINT
nvme0n1                                                             
├─nvme0n1p1                                                         
├─nvme0n1p2 vfat               06AB-D710
├─nvme0n1p3 ntfs   WIN11_M2    1EE62C47E62C218F                     
└─nvme0n1p4 ntfs               4836EA0836E9F6BA                     

パーティションテーブルとしては、作業前後で全く変化はない。

Ubuntuパーティションをクローンコピーして、重複UUIDを書き換え

20211010-partition-clone.png

USB起動(ライブDVD)のUbuntuで、GPartedを用いて、既存のSATA SSDのUbuntuパーティション(/dev/sda7)を、NVMe M.2 SSDにクローンコピーする。

クローンコピー直後のパーティションテーブルは次のようになっていて、コピー元(/dev/sda7)・コピー先(/dev/nvme0n1p6)のUUIDが同一値になっている。(パーティションごとコピーしているのだから当然のことだ)

クローンコピー前の状況
ubuntu@ubuntu:~$ sudo lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  vfat   SYSTEM      947F-F17C                            
├─sda2                                                          
├─sda3  ntfs   Windows     786685CD66858C96                     
├─sda4  ntfs               BAC2921EC291DF47                     
├─sda5  ntfs   WinRE_DRV   BC02870B0286CA3A                     
├─sda6  swap               046944a6-e95a-4774-bdea-ed92ac2e72c2 
├─sda7  ext4   ubuntu18.04 a04269a9-79f4-4c67-ad4c-f6d5278612d2 
├─sda8  ext4   ubuntu20.04 55e586a6-358d-4c98-8ef8-7f7d3652201b 
├─sda9  ntfs   TEMP        DE0E157E0E15513F
├─sda10 ntfs   DATA        C61EC4391EC42471                     
├─sda11 ntfs   VM-NTFS     30B4DD69B4DD3258                     
└─sda12 ext4   vm-ext4     3a6a63bb-b5d9-40d0-ba63-682b5e35ab04 

ubuntu@ubuntu:~$ sudo lsblk -f /dev/nvme0n1
NAME        FSTYPE LABEL       UUID                                 MOUNTPOINT
nvme0n1                                                             
├─nvme0n1p1                                                         
├─nvme0n1p2 vfat               06AB-D710
├─nvme0n1p3 ntfs   WIN11_M2    1EE62C47E62C218F                     
├─nvme0n1p4 ntfs               4836EA0836E9F6BA                     
└─nvme0n1p5 swap               8ebfa91c-c173-472d-9989-3feb340b09ef 
クローンコピー後の状況
ubuntu@ubuntu:~$ sudo lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  vfat   SYSTEM      947F-F17C                            
├─sda2                                                          
├─sda3  ntfs   Windows     786685CD66858C96                     
├─sda4  ntfs               BAC2921EC291DF47                     
├─sda5  ntfs   WinRE_DRV   BC02870B0286CA3A                     
├─sda6  swap               046944a6-e95a-4774-bdea-ed92ac2e72c2 
├─sda7  ext4   ubuntu18.04 a04269a9-79f4-4c67-ad4c-f6d5278612d2 
├─sda8  ext4   ubuntu20.04 55e586a6-358d-4c98-8ef8-7f7d3652201b 
├─sda9  ntfs   TEMP        DE0E157E0E15513F
├─sda10 ntfs   DATA        C61EC4391EC42471                     
├─sda11 ntfs   VM-NTFS     30B4DD69B4DD3258                     
└─sda12 ext4   vm-ext4     3a6a63bb-b5d9-40d0-ba63-682b5e35ab04 

ubuntu@ubuntu:~$ sudo lsblk -f /dev/nvme0n1
NAME        FSTYPE LABEL       UUID                                 MOUNTPOINT
nvme0n1                                                             
├─nvme0n1p1                                                         
├─nvme0n1p2 vfat               06AB-D710
├─nvme0n1p3 ntfs   WIN11_M2    1EE62C47E62C218F                     
├─nvme0n1p4 ntfs               4836EA0836E9F6BA                     
├─nvme0n1p5 swap               8ebfa91c-c173-472d-9989-3feb340b09ef
└─nvme0n1p6 ext4   ubuntu18.04 a04269a9-79f4-4c67-ad4c-f6d5278612d2

ドライブの認識は通常UUIDで行われるため、1台のPCに同一のUUIDがあるとエラーとなってしまう。

そのため、コピー先のUbuntuパーティション(/dev/nvme0n1p6)のUUIDをランダム値に変更する。なお次の例では、変更コマンド実行前後に、UUIDを画面表示して確認している。

コマンドラインでの作業
ubuntu@ubuntu:~$ sudo blkid | grep -e /dev/nvme0n1p6
/dev/nvme0n1p6: LABEL="ubuntu18.04" UUID="a04269a9-79f4-4c67-ad4c-f6d5278612d2" TYPE="ext4" PARTUUID="8cbce9a2-979b-4c52-b912-7dd85f449293"

ubuntu@ubuntu:~$ sudo tune2fs /dev/nvme0n1p6 -U random
tune2fs 1.44.1 (24-Mar-2018)
Setting UUID on a checksummed filesystem could take some time.
Proceed anyway (or wait 5 seconds to proceed) ? (y,N) <proceeding>

ubuntu@ubuntu:~$ sudo blkid | grep -e /dev/nvme0n1p6
/dev/nvme0n1p6: LABEL="ubuntu18.04" UUID="89859030-ca1e-4dbf-8d82-0e2ef10e5d6a" TYPE="ext4" PARTUUID="8cbce9a2-979b-4c52-b912-7dd85f449293"

UUIDを変更したことで、MVNe M.2 SSDでブートする場合に問題のあるところを修正する

UEFIブートシーケンスで読み込まれるファイルの順序は、次のようなものだ。

20211010-boot-sequence.png

/EFI/ubuntu/grub.cfgの修正

まず、UEFIパーティションに格納されいてる/EFI/ubuntu/grub.cfgを、クローンコピーした後にUUIDを書き換えたパーティションを正しく指し示すように変更する。

コマンドラインでの作業
ubuntu@ubuntu:~$ mkdir /tmp/nvme0n1p2
ubuntu@ubuntu:~$ sudo mount /dev/nvme0n1p2 /tmp/nvme0n1p2/   ← UEFIパーティションをマウント
ubuntu@ubuntu:~$ sudo ls -la /tmp/nvme0n1p2/EFI/ubuntu
合計 3521
drwxr-xr-x 3 root root    1024 10月  8 23:11 .
drwxr-xr-x 5 root root    1024 10月  8 23:11 ..
-rwxr-xr-x 1 root root     108 10月  8 14:23 BOOTX64.CSV
drwxr-xr-x 2 root root    1024 10月  8 23:11 fw
-rwxr-xr-x 1 root root   75992 10月  8 23:11 fwupx64.efi
-rwxr-xr-x 1 root root     117 10月  8 14:23 grub.cfg   ← このファイルを修正
-rwxr-xr-x 1 root root 1709952 10月  8 14:23 grubx64.efi
-rwxr-xr-x 1 root root  856232 10月  8 14:23 mmx64.efi
-rwxr-xr-x 1 root root  955656 10月  8 14:23 shimx64.efi
ubuntu@ubuntu:~$ sudo vi /tmp/nvme0n1p2/EFI/ubuntu/grub.cfg
... 以下、エディタでUUID修正入力
/tmp/nvme0n1p2/EFI/ubuntu/grub.cfg の修正後
search.fs_uuid 89859030-ca1e-4dbf-8d82-0e2ef10e5d6a root 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

/boot/grub/grub.cfgの修正

次に、Ubuntuパーティション内の/boot/grub/grub.cfgを修正する。1度だけ起動すればよく、通常起動以外のメニューは一切修正せず放置して良い。(ちゃんと起動すれば、grub-updateを実行することで、全て正しい内容に書き換えられるため)

コマンドラインでの作業
ubuntu@ubuntu:~$ mkdir /tmp/nvme0n1p6
ubuntu@ubuntu:~$ sudo mount /dev/nvme0n1p6 /tmp/nvme0n1p6/   ← Ubuntuパーティションをマウント

以下、修正後の内容

/tmp/nvme0n1p6/boot/grub/grub.cfg
〜 60行目くらいまで省略 〜

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root  89859030-ca1e-4dbf-8d82-0e2ef10e5d6a
else
  search --no-floppy --fs-uuid --set=root 89859030-ca1e-4dbf-8d82-0e2ef10e5d6a
fi
    font="/usr/share/grub/unicode.pf2"
fi

〜 100行目くらいまで省略 〜
### BEGIN /etc/grub.d/10_linux ###

menuentry 'Ubuntu 18.04' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-89859030-ca1e-4dbf-8d82-0e2ef10e5d6a' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_gpt
	insmod ext2
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root  89859030-ca1e-4dbf-8d82-0e2ef10e5d6a
	else
	  search --no-floppy --fs-uuid --set=root 89859030-ca1e-4dbf-8d82-0e2ef10e5d6a
	fi
        linux	/boot/vmlinuz-5.4.0-87-generic root=UUID=89859030-ca1e-4dbf-8d82-0e2ef10e5d6a ro  quiet splash pci=nomsi usbcore.autosuspend=-1 libata.force=noncq snd_hda_intel.dmic_detect=0 $vt_handoff
	initrd	/boot/initrd.img-5.4.0-87-generic
}

この例で示したパターン以外に、「ドライブ番号・パーティション番号」の記述があればそれも修正する。ドライブ番号は、今回作業したPCではSATAディスクがhd0, NVMe M.2ディスクがhd1と認識される。(ブート時にgrub2メニューが表示されたのち、コマンドラインに入り、ls を実行すればドライブ番号・パーティション番号が表示されるので参考にすると良い)

/tmp/nvme0n1p6/boot/grub/grub.cfg 内のスクリプト例
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt6 --hint-efi=hd1,gpt6 --hint-baremetal=ahci1,gpt6  a04269a9-79f4-4c67-ad4c-f6d5278612d2

/etc/fstabの修正

Linuxカーネルがルートパーティションを再マウントする時に用いる /etc/fstab も修正する

/tmp/nvme0n1p6/etc/fstab
# / was on /dev/sda6 during installation
UUID=89859030-ca1e-4dbf-8d82-0e2ef10e5d6a    /   ext4    noatime,errors=remount-ro 0    1

NVMe M.2 SSDのUbuntuのupdate-grubから、SATA SSDのUbuntuを除外する

/dev/sda7のUbuntu 18.04と、/dev/sda8のUbuntu 20.04を対象外とする場合の設定は次のようになる

/tmp/nvme0n1p6/etc/default/grub
〜 末尾に追加 〜
# List of space-separated FS UUIDs of filesystems to be ignored from os-prober output
# https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html
GRUB_OS_PROBER_SKIP_LIST="a04269a9-79f4-4c67-ad4c-f6d5278612d2@/dev/sda7 55e586a6-358d-4c98-8ef8-7f7d3652201b@/dev/sda8"

NVMe M.2 SSDのUbuntuを起動し、grub2の設定をアップデートする

ここまでの設定に間違いがなければ、NVMe M.2 SSDのUbuntuが起動するはず。起動後、/boot/grub/grub.cfgを再構築する

NVMe M.2 SSDのUbuntuで起動し、そのコマンドラインでの作業
~$ update-grub