Ubuntu+windowsデュアルブートのシステムディスク引っ越し奮闘記

こんにちは、サウスブリッジです。
今回はUbuntuとWindowsのデュアルブート環境でシステムディスクの引っ越しをしようと思ったら思いの外ハマり、 **情報収集が面倒くさかった** ので備忘録を書いてみます。
<sub> ~~いやぁ、システムディスクが溢れるとDocker動かないんですね…~~ </sub>
# 用意するもの

- 換装先SSD
- UbuntuインストールUSBメモリ
- Windowsインストールディスク等コマンドプロンプトを使えそうな外部ディスク
- 十分な時間　<sub>寝しなに始めるなよ…朝になるぞ…！</sub>

# システムディスクを引っ越し
溢れたのが128GBのSSDだったので、コイツを新しく買ってきた2TBのSSDに換装する計画でいきます。
<sub>旧SSDは…文鎮かな…</sub>
<sub>3D NAND技術の火力マジ半端ないっすね。価格が爆安になってます。</sub>

まずはシステムの電源を切った状態で **(※重要)** 、新SSDを仮接続します。ケーブルその他の準備、接続が面倒くさかったので、とりあえず光学ドライブあたりを生贄に捧げておきました。<sub> ~~蓋は開けっ放しでいいんじゃないかなぁ…~~ </sub>
そしてUbuntuのインストールUSBメモリを刺しておきます。(コイツから起動して操作します。)

準備が整ったらシステムの電源を入れ、BIOSに入ります。UbuntuインストールUSBメモリからブートする設定にして立ち上げましょう。
Ubuntu試用版が起動したら、ディスク認識先の当たりをつけましょう。

```terminal:terminal
$ sudo fdisk -l
```
パーティションがバサバサ切ってあったり起動フラグが立ってたりするディスクが旧システムディスク、fat32かNTFSあたりでノッペリ一枚岩のパーティションができてるのが換装先ディスクです。 **間違ってデータ用ディスクを吹き飛ばさないよう注意して確認しましょう。** 不安な場合はGpartedあたりでディスク利用率等を見ながら確認したほうがいいかもです。(私はデータディスクもパーティション切ってたので幸い見分けが付きました。)
ディスク認識の当たりが付いたら早速システムディスクからデータを吸い上げていきます。何も考えずにddすればパーティション構造ごと引っ越しできちゃいます。下記の記事を参考にしながらコマンドを叩きます。
[dd コマンドによるディスクバックアップ・リストアメモ | アプ研](https://www.upken.jp/kb/dd-backup-restore.html)

```terminal:terminal
$ sudo dd if=/dev/sda of=/dev/sdc bs=4096 conv=sync
```
`/dev/sda`が旧システムディスク、`/dev/sdc`が引っ越し先SSDの設定でいきます。バッファサイズ(`bs=4096`)を設定しておくと途中でコケたときの面倒がなくて良いです。特にエラーがないディスクだったので`noerror`はいいかな…
この操作はSSD→SATA→SATA→SSDなので **メチャクチャ早いです** 。すぐ終わります。<sub>薄い本読み始めて気づいたら終わってたくらいに早いです。</sub>
サクッと終わったらパーティションを広くしていきましょう
# パーティション操作とブートローダの設定
無事にデータの吸出しが終わったらパーティションを広げていきましょう。Superキーの検索からGpartedを起動します。引っ越し先のディスクを選択してパーティションを一つずつ右クリック→移動・サイズ変更で動かしていきます。( **※パーティションテーブルの作成は必要ありません** )
後ろのパーティションから、

1. パーティション後のサイズを0にセット
2. 新しいパーティションサイズを設定

と動かしていくとスムーズかと思います。すべてのパーティションの設定が終わったら変更を適用しておきましょう。 **メッチャ手に汗かくタイミング** ですが大丈夫、旧SSDにデータは残ってます。勇気を持ってブッ放しましょう。
SSDだけあってそれなりに早く終わります。<sub>やはり薄い本は読み終わりません…</sub>操作が終わって問題が無さそうであれば **Linuxのシステムパーティションにbootフラグを立てましょう** 。Gpartedは開けておいたほうがいいかもです。

パーティションの組み立てが終わったら、今度は新SSDからブートできるよう設定していきます。以下の記事を参考にしながら進めていきます。
[Linuxの起動ディスクのお引越 | blog.monophile.net](https://blog.monophile.net/posts/20160714_linux_migration.html)
新SSDのパーティションに潜り込み、ブート関連のデータをイジれるようにします。

```terminal:terminal
$ sudo mkdir /mnt/sdc1
$ sudo mount /dev/sdc1 /mnt/sdc1
$ sudo mount --bind /dev /mnt/sdc1/dev
$ sudo mount --bind /proc /mnt/sdc1/proc
$ sudo mount --bind /sys /mnt/sdc1/sys
$ sudo chroot /mnt/sdc1
(chroot)#
```
以降は`exit`するまで新SSDファイルシステム内での操作となります。また、プロンプトが示すように全て`sudo`無しでroot権限での操作となります。

まずは`/etc/fstab`のパーティションUUID書き換え、起動後にファイルシステムをマウントできるようにします。
ここで残念なお知らせが2つあります。編集に **geditを使うことができません** 。`vi`でチマチマいじりましょう。
また、 **クリップボードを使用できません** 。Gpartedや`fdisk -l`からコピペができない環境になります。どうしましょう…私は気合でチマチマ打ち込みました…(※良い子はマネしない)
Gpartedでパーティションを右クリック→情報…からパーティションのUUIDを確認できます。コレをfstabに転記していきます。
LinuxシステムパーティションとLinux swapを書き換えて、 **眼ガン開きでチェック** したら編集完了です。保存してエディタを閉じ、ストレッチとツボ押しをしておきましょう。

続いてブートローダgrubをインストールします。これが無いとファイルシステムを見つけてもらえません。

```terminal:terminal
(chroot)# grub-install /dev/sdc
(chroot)# update-grub
```
デュアルブートのWindowsはこのタイミングでは見つけてもらえませんが、ひとまずこのまま行きます。

最後にinitramfsを更新します。コレを書き換えないと新パーティションからファイルシステムを展開できません。

```terminal:terminal
(chroot)# update-initramfs -u
```
これで **とりあえず** 起動はするハズです。terminalを`exit`で抜け、モロモロを閉じてシステムの電源を切りましょう。
ここでハード側をイジっておきます。旧SSDを外して新SSDに換装しておきます。また暫定で引っこ抜いた光学ディスクの配線を元に戻しておきましょう。ここからは **蓋を閉じておいたほうがいいです** 。グラボあたりが熱暴走するリスクがあります。またUbuntuインストールディスクもこのタイミングで引き抜いておきましょう。

ハード側がなんとかなったらシステムの電源を入れ、BIOSに入ります。起動順を設定してブートさせましょう。 **なんかパッとしないながら** 起動するはずです。暫定の環境でinitramfsを書き換えた影響で、グラフィックドライバその他が読み込まれなくなります。
ドライバをインストールする操作をした後、再度initramfsとgrubを書き換えましょう。コマンドは上記と同じですが、毎回`sudo`を忘れないようにしましょう。このタイミングでWindowsを認識してくれるハズです。
ここで再起動をかけ、Ubuntuがいつもどおりの起動をキメてくれたらUbuntu側の引っ越しは完了です。
**闘いはここからだ。**
# Windowsのブート修正
続いてWindows側のブートローダを修正していきます。そう、ヤツはパーティション内に **自前のブートローダを用意しやがります** 。コイツを別途書き換え操作しなければなりません。<sub>うわ面倒くせぇ…</sub>
クヨクヨしていても仕方がないので書き換えに行きます。ここからは以下の記事を参考にしながら進めていきます。
[システムパーティションの削除後にWindowsは起動できない－修復 | MiniTool](https://jp.minitool.com/amp/partition-disk/fix-unbootable-windows.html)
光学ディスクにWindowsインストールディスクを入れて再起動しましょう。なんとブート順の設定をイジらなくても勝手に光学ディスクからブートしようとしてくるようです。<sub>ｽ…ｽｹﾞｪ…</sub>
画面の指示をたどりながらとにかくコマンドプロンプトを目指します。コマンドプロンプトを起動できたら以下のように操作します。

```command-promot:command-prompt
c:\>diskpart
>list disk
(ここに認識されているディスクの番号とそのサイズが表示されます。)
(サイズからシステムディスクの当たりをつけて選択します。)
>select disk 0(システムディスクが0番の場合)
>list partition
(選択したディスク内のパーティションの番号とそのサイズ、フラグ、ラベル、ファイルシステムの種類が表示されます。)
>select partition 2(Windowsのパーティションが2番の場合)
>active
>exit
c:\>bootrec /fixmbr(これはもしかしたらいらないかも…)
c:\>bootrec /fixboot
c:\>bootrec /rebuildBCD
(ここでWindowsシステムの探索が始まります。)
(「このインストールをブート一覧に追加しますか？」と聞かれるのでyesと答えます。)
c:\>exit
```
これでシステムを再起動し、BIOSに入ってブート順を直してからシステムを起動します。
私はこの工程で`bootrec /fixmbr`をしたのでせっかくインストールしたgrubが **見事に吹き飛びました** 。Ubuntuインストールディスクを刺して再度grubをインストールし直しました。<sub>ﾄﾎﾎ…</sub>
パーティションをいじった後、Linuxのブート修正の前にWindowsのブート修正をする手順のほうがスムーズかもしれません。<sub>面目ねぇ…</sub> 

さて、気になるWindowsのライセンス認証の在否ですが、最近のWindowsは相当大胆な変更をしない限り認証は吹き飛ばないようです。仮に吹き飛んでしまってもMicrosoftアカウントに紐つけておけば面倒事にはならないようですね。<sub>強くなったもんだ…</sub>

Windowsの起動が確認できたら、grubを再設定し<sub> ~~(この工程はもはやいらないかもしれませんねっ)~~ </sub>、Ubuntuを起動し、`sudo update-grub`を通しておきましょう。これでgrub起動メニューにWindowsを追加できます。

-----
さて、これでUbuntuとWindowsがそれぞれ正常に起動すれば引っ越しは終了です。 **お疲れ様でした！**
<sub>あれ、ひどく時間がかかった工程が残ってねぇな…俺がハマりまくって時間つぶしてただけか…ﾄﾎﾎ…</sub>