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パーティションは削除する。
作業前後の状況(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を書き換え
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ブートシーケンスで読み込まれるファイルの順序は、次のようなものだ。
/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