protonブログ

日々の記録やデバッグメモ

デュアルブートを分離して別々のディスクに分けた話

初めに

今まで240GBのSSDをだいたい半分に分けてWindows10とUbuntu18.04のデュアルブートをしていたのですが、いよいよ容量が足りなくなってきたので増設をすることにしました。 新しいSSDも半分に分けてそれぞれ拡張するというのはなんか微妙なので、新しいSSDUbuntuを移動させてそれぞれのパーティションを広げることにしました。 既に1つのディスクにデュアルブートしている状態から2つのディスクにOSを分ける記事は探しても良いものが見つからなかったため、メモとして残しておきます。

[注意] あまり賢くないやり方になります、自分は最終的にBoot Repairを使用しているためBIOSの起動オプションやGRUBの選択肢が無駄に増えたりしました。これから作業する人は、一度最後まで目を通して目的にあった適切な方法を行って下さい。誰か間違えや修正点等発見したら教えてくれると嬉しいです。

新しいSSD

PCのM.2スロットが1つ空いていたので、1TBのP1 CT1000P1SSD8JPをTSUKUMO本店の29周年セールで税込み8778円だったのを購入しました。TSUKUMOのセールは初めてだったのですが、別に昼頃に行っても問題なく買えてよかったです。

2年前は1TBのSSDSATAでも3万以上していてとても選択肢には入らないものだったのですが、最近はとても安くてHDD無しの構成ができるのも当然ですね。

f:id:proton_1602:20191213170745p:plain:w300
P1 CT1000P1SSD8JP

環境&要求

before

  • 240GBのSSD
    • EFI領域等
    • 約120GBのWindows10領域
    • 約120GBのUbuntu18.04領域

after

  • 240GBのSSD
    • EFI領域等
    • 約240GBのWindows10領域
  • 1TBのSSD
    • EFI領域
    • 約1TBのUbuntu18.04領域

要求

やり方

今回は新しいSSDUbuntuを移動させ、GRUB2を新たにインストールします。UbuntuUbuntu自身を操作すると何かしら問題があるらしいので、UbuntuのライブUSBを使います。(ブータブルUSBの方が適切かもしれない)

SSD接続

電源を切って、M.2スロットなりSATAなりでSSDを接続します。

LiveUSB作成と起動

UbuntuのLiveUSBを作ります。WindowsからであればUbuntuのLive USBをつくるUbuntuからであればUbuntuのLive USBメモリスティックをつくる。等適当に参考にして作って下さい。
私はUbuntu18.04の日本語Remixから作成しました。

作成できたら、BIOSからUEFIでUSBを選択してインストールしないで起動します。BIOS起動ではこの後の操作が出来ないので注意して下さい。セキュアブート等に関する設定は、既にデュアルブート出来ているならば終わっているはずなので割愛します。(デュアルモニターにしていたせいで起動後暗闇が表示され続けていて、何度も作り直したりしました。理由はわかりませんがモニターは一枚だけつなぎましょう。)

Gpartedでパーティション操作

UbuntuのGParted (パーティショニングツール)を使って、新しいSSDの初め100MB程のEFIパーティションを作ります。ファイルシステムFAT32、フラグはboot, espです。

次に、EFIパーティションの後ろに古いSSDからUbuntuパーティションをコピーします。

ubuntu領域へchroot

Gpartedで新しいSSDへコピーされたUbuntuパーティションchrootします。ここでは/dev/nvme0n1p2です。

$ sudo -s
# mkdir /chroot
# mount /dev/nvme0n1p2 /chroot
# mount --bind /dev /chroot/dev
# mount --bind /dev/pts /chroot/dev/pts
# mount --bind /proc /chroot/proc
# mount --bind /sys /chroot/sys
# mount --bind /run /chroot/run
# chroot /chroot

新しく確保したEFIパーティションもマウントします。ここでは/dev/nvme0n1p1です。

# mount /dev/nvme0n1p1 /boot/efi

GRUB2のインストール

EFIパーティションにブートプログラムのGRUB2をインストールします。

# grub-install --target=x86_64-efi --efi-directory=/boot/efi/ --bootloader-id=grub

UEFIで起動していないと、ここでインストールができません。操作が前後していて必要か分からないですが、grubが入っていない等と表示された場合はsudo apt install grub-efiをして下さい。

UUIDの確認とfstab更新

パーティション等には、個別のUUIDという識別子が存在しますが、Gpartedでコピーしたパーティションは全く同じUUIDを持ちます。そこで、新しいGNOME端末を開いて

$ sudo tune2fs -U time /dev/nvme0n1p2

で、新しいSSDUbuntuパーティションのUUIDを更新します。次の操作で必要なので、古いEFI, Ubuntuパーティションである/dev/nvme1n1p2, /dev/nvme1n1p6と新しいEFI, Ubuntuパーティションである/dev/nvme0n1p1, /dev/nvme0n1p2のUUIDをそれぞれ確認します。(sudoをつけないとtune2fsで更新したUUIDが反映サれなかったりするのでつけましょう)

$ sudo blkid /dev/nvme1n1p2
$ sudo blkid /dev/nvme1n1p6
$ sudo blkid /dev/nvme0n1p1
$ sudo blkid /dev/nvme0n1p2

chrootしていた端末に戻って/etc/fstabを編集します。

# vim /etc/fstab

古いEFI, UbuntuパーティションのUUIDがあるはずなので、それぞれ新しい方に書き換えます。

# ubdate-grub
# grep -w menuentry /boot/grub/grub.cfg

で、新しくインストールしたGRUBが起動した時に表示される選択肢一覧が表示されます。新しいUUIDのUbuntuが含まれていることを確認して下さい。(この時点では、Windowsと新旧両方のUUIDが異なるUbuntuが表示されるはずです。)

起動

再起動してBIOSから新しいSSD上のUbuntuUEFIで起動する選択肢かgrubと書かれた選択肢が出ているはずなので、どちらかを選択して起動します。ここで、先程確認したWindowsと新旧両方のUbuntuの選択肢が表示されているはずです。されていた場合は、そのままGpartedなりで古いUbuntuを消して、WindowsUbuntuの領域を広げれば作業終了です。

私は、この時点で何故か古いGRUBが起動し選択肢に新しいUbuntuは存在しませんでした。

問題

USBのUbuntuや古いUbuntuから色々と確認した所、新しいSSDを選択しても何故か古いSSD上のGRUBが起動してしまっている状態になりました。

古いSSDを物理的に外してから新しいSSDを選択した所、黒い画面に

GNU GRUB version 2.02
Minimal BASH-like line editing is supported.
For the first word,TAB lists possible command completions. 
Anywhere else TAB lists possible device or file completions
grub>

と表示されてしまったため、GRUBが正しくインストールされていない?ようです。

対処

色々と試してみましたが、最終的には古いSSDを抜いた状態でLiveUSBのUbuntuからboot-repairを用いて修復しました。

$ sudo add-apt-repository ppa:yannubuntu/boot-repair
$ sudo apt update
$ sudo apt install -y boot-repair
$ sudo boot-repair

この結果、BIOSから起動する選択肢やらGRUBの選択肢に余計なものが増えましたが、普段は別に気にならないハズなのでそこまで問題はないでしょう...

削除と拡張

無事起動できるようになったら、旧Ubuntuを削除してWindowsと新Ubuntuパーティションを適当に広げます。このままでは、起動しない旧Ubuntuの選択肢が残るので

$ grub-update

をしておきましょう。grep -w menuentry /boot/grub/grub.cfgでも確認できますが、旧Ubuntuの選択肢が無くなるはずです。

考察のようなもの

今回の現象の原因

EFIパーティションが複数あると言うのは通常の状態ではないため、恐らく古いSSDEFIパーティションが存在する状態で、新しいGRUBをインストールしたため正しく新しいSSDEFIパーティションにインストールされなかったと思われる。これは、新しいSSDの方が起動優先順位が高ければ問題は生じないと思われるが、2つのM.2スロットの起動順位はなぜか頻繁に入れ替わるため、偶然古いSSDの方が先に見られてしまったと考えられる。

物理的に抜き差しするのは最小限に抑えたいが、やはりUbuntuをコピーして古いSSDを抜いた後にGRUBをインストールするべきなのかもしれない。

別の対処法

今回は、新しいSSDEFIパーティションを用意してそこに入れたGRUBから起動をしようとしていたが、既にある古いSSDEFIパーティションGRUBから起動する方法もあると思う。

新しいSSDUbuntuをコピーしてUUIDを変更した後、古いSSDubuntuEFIパーティションにマウントしてgrub-updateをかければ新しいUbuntuも選択肢に入るので、その後古いUbuntuを消せば良い。

ただし、この方法はGRUBを完全にEFIパーティションにインストールしていない方法(通常はUbuntuにも何かファイルが置かれていたはず)では、古いUbuntuを消した時に動作しなくなる可能性があるため、実行しなかった。実際どうなのかは良く分からない。

Windowsを移す場合

今回は、Ubuntuを新しいSSDへ移行したがWindowsの場合は良く分からないパーティションが存在するため、一度全て新しいSSDにコピーした上で新しいSSDから古いSSDUbuntuを移すという形にしたほうが安全な気がする。Windows、分からない。

感想

スプラのプレイ動画を保存するようになってから、急に容量が足りなくなったため、SSDを増設したついでにOSも分けようと思って実行したが思ったよりも大変だった。Ubuntuの起動やGRUBの仕組みについてある程度理解していると困ったときにも対処しやすいはずですが、私はよく分かっていなかったのでかなり苦労しました。

デュアルブートをしていて、更に分けようとする人は余りいないと思いますが、参考になれば嬉しいです。もっと賢い方法があると思うので誰か教えて下さい。