Windows OSのディスクデータをLinux経由でddコマンドで換装

# 記事の概要

Windows OSが入っているHDDをまるごとSSDに移行できたので、本記事に手順を遺します。
この種の作業はおそらく多くの方がやっていて真新しさはないかもしれませんが、自分の頭の整理も兼ねて記事にしたいと思います。

## 読むにあたっての注意点

本記事ではWindows OSが入ったディスクを「Ubuntu Live USB（またはUbuntuそのもの）」を立ち上げて換装（引っ越し）する方法について記載します。なのでLinuxの知識がある程度必要となる点にご注意ください。

# 環境情報

* 移行作業に使うPC
    * Lenovo ThinkPad T430
* 移行対象ディスクの情報OS
    * OS : Windows 10 Pro
    * BIOS or UEFI? : BIOS(legacy) (※) 
* 移行元のHDD
    * [Seagate ATA ST320LT020-9YG14](https://kakaku.com/item/K0000393711/) 容量320GB
* 移行先のSSD
    * [KIOXIA-E XCERIA SATA SSD](https://kakaku.com/item/K0001399072/) 容量960GB
    * 【注意】 本記事の方法だと、移行先ディスクのサイズは移行元ディスクよりも大きい必要あり
:::note warn
※ 「移行対象ディスクがBIOSかUEFIか？」を事前に確認してくことは今後の作業を進める上で非常に重要です。[こちら](https://jp.easeus.com/partition-manager/how-to-know-if-windows-using-uefi-or-legacy.html#:~:text=%E6%96%B9%E6%B3%951.%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%83%85%E5%A0%B1%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B&text=%E3%80%8CMSInfo32%E3%80%8D%E3%81%A8%E5%85%A5%E5%8A%9B%E3%81%97%E3%80%81,UEFI%E3%80%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)の記事等を参考に事前に確認いただくことを強くお勧めします。
:::


# お引越し作業の大枠

まずはどんな作業が必要かをリストアップしてみます。

* (1) Ubuntuを格納したUSBディスクを用意
* (2) UbuntuのUSBディスクと移行先ディスクをPC本体に接続
* (3) Ubuntuを起動
* (4) 移行元ディスクのデータを移行先ディスクに移行（Ubuntu上での作業）
* (5) PC本体のディスクを移行先ディスクに交換し、UbuntuのUSBディスクは外す
* (6) PC本体を起動して、Windowsが起動するか確認する

図で書いてみると、(2),(3)で移行を実施している時の各機器の接続状態は以下のようになります。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/1f857828-bf6f-f970-4aea-24c5f6ce84ae.png">

# 各作業の詳細

## (1) Ubuntuを格納したディスクを用意

引っ越し作業はUbuntu経由で行うため、Ubuntuを格納したディスクを用意します。一番手軽なのはUbuntu Live USBを作る方法で、以下の記事等が参考になると思います。

### Linuxで作る場合
https://kledgeb.blogspot.com/2022/04/ubuntu-2204-64-windowslinuxmacosubuntu.html

### Windowsで作る場合
https://diagnose-fix.com/topic2-003/

:::note info
Ubuntu Live USBからさらに一歩進んで、「USBディスク(USB以外のディスクでもOK)にUbuntuそのものをインストールしたもの」を使うと作業効率が上がります。例えば普段使い慣れている端末からUSBのUbuntuにSSH接続して作業できたりします。
:::

## (2) UbuntuのUSBディスクと移行先ディスクをPC本体に接続

見出しがそのまま作業する内容です。
移行先ディスクをPC本体に外から接続するには「2.5インチのディスクを格納するケース」が必要となることにご注意ください。私は以下で接続しました。

https://www.kuroutoshikou.com/product/detail/gw2-5-kru3.html

## (3) Ubuntuを起動

PC本体を立ち上げて（Windowsではなく）Ubuntuを起動させます。
そのままだとおそらくWindowsが起動してしまうので、PC起動時にBIOSモードに入り起動ディスクを変更する必要があります。起動ディスクを変更する方法は（筆者記事になりますが）以下等が参考になるかと思います。

https://qiita.com/showchan33/items/e423467c50950013cdf8#ubuntu-live-usb%E7%B5%8C%E7%94%B1%E3%81%A7os%E3%82%92%E8%B5%B7%E5%8B%95

## (4) 移行元ディスクのデータを移行先ディスクに移行

起動したUbuntuでの作業を行います。

## デバイス名の確認

まずは、各ディスクがUbuntuからどのようなデバイス名で認識されているのかを`lsblk`コマンドで確認します。
```
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
...
sda      8:0    0 298.1G  0 disk
├─sda1   8:1    0   100M  0 part
├─sda2   8:2    0 297.5G  0 part
└─sda3   8:3    0   508M  0 part
sdb      8:16   0 894.3G  0 disk
...
```
`SIZE`の列のディスク容量の数値から、おそらく以下のように対応していると推測できます。
* /dev/sda : 移行元ディスク（Windowsが入っている）
* /dev/sdb : 移行先ディスク（何も入っていない）

念のため、より詳細に確認してみましょう。

まずは/dev/sdaの確認から。
```
$ sudo parted /dev/sda print
モデル: ATA ST320LT020-9YG14 (scsi)
ディスク /dev/sda: 320GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了   サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  106MB  105MB   primary  ntfs              boot
 2    106MB   320GB  319GB   primary  ntfs
 3    320GB   320GB  533MB   primary  ntfs
```
Windowsのファイルシステムntfsのパーティションが3つあるのがわかります。またパーティションテーブルがmsdosで、MBR(Master Boot Record)で作られているのもわかります。

続いて、/dev/sdbも見てみます。
```
$ sudo parted /dev/sdb print
エラー: /dev/sdb: ディスクラベルが認識できません。
モデル: KIOXIA-E XCERIA SATA SSD (scsi)
ディスク /dev/sdb: 960GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: unknown
ディスクフラグ:
```
今回のケースだと買ったばかりの状態で、パーティションテーブルやパーティションが作られていないのがわかります。
なので**今回は**、/dev/sdaのデータを/dev/sdbに移行すれば問題なさそうです。

:::note warn
あくまで今回のケースが/dev/sdaと/dev/sdbに対応していたわけであり、OSで認識されるデバイス名は環境や状況によって変わってきます。したがって移行前にデバイス名の確認するのが非常に重要です。
:::

## パーティションテーブルにラベルを作成

移行先のディスクのパーティションテーブルにラベルを作成します。移行前ディスクのラベルが`msdos`だったのでそれと同じにします。

```
$ sudo parted /dev/sdb mklabel msdos
```

上記で`msdos`の部分は移行前ディスクのラベルに合わせる必要があるのでご注意ください。最近だと`gpt`になっている場合も多いと思います。

:::note warn
`mklabel`を実行する際に、指定するディスクのデバイス名を間違えないようにご注意ください。既にデータが存在するディスクでこのコマンドを実行するとデータが消えてしまう可能性があります。（調べた感じだと警告が出てくるのでそこで気づくとは思っていますが）
:::

## データの移行

以下のコマンドを実行します。
```
sudo dd if=/dev/sda of=/dev/sdb bs=4M conv=sync,noerror status=progress
```
`if`で「移行元デバイス」、`of`で「移行先デバイス」を指定します。`conv=sync,noerror`はエラーが発生しても処理を中断せずに続行するオプションです。

:::note alert
ddコマンドの使い方を間違えると、大切なディスクデータを消してしまう可能性があるのでご注意ください。特に`if`と`of`で指定するデバイス名が間違っていないか、逆になっていないかは慎重に確認してください！
:::

## `dd`コマンド完了の確認

今回のケースだと最後に以下の行が出力され、移行に77分を要したのがわかります。
```
(ddコマンド実行後)
...
320075726848 bytes (320 GB, 298 GiB) copied, 4634.02 s, 69.1 MB/s
```

## 移行先ディスクのマウント確認

移行したディスクのパーティションにマウントできるかを確認してみます。とりあえずはWindowsのCドライブに相当する`/dev/sdb2`で試してみます。
以下のようにワーニングのようなメッセージが出力されてしまいます。

```
$ sudo mount -t ntfs /dev/sdb2 /path/to/mount
The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
Falling back to read-only mount because the NTFS partition is in an
unsafe state. Please resume and shutdown Windows fully (no hibernation
or fast restarting.)
Could not mount read-write, trying read-only
```

実際に確認できていませんが、「マウントはできているけど中身は見えない」状態になっていると思われます。
このような場合、`ntfsfix`というコマンドで修復ができるようです。一旦アンマウントして試してみましょう。

```
$ sudo umount /path/to/mount
$ sudo ntfsfix /dev/sdb2
Mounting volume... The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
FAILED
Attempting to correct errors...
Processing $MFT and $MFTMirr...
Reading $MFT... OK
Reading $MFTMirr... OK
Comparing $MFTMirr to $MFT... OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition... OK
Going to empty the journal ($LogFile)... OK
Checking the alternate boot sector... OK
NTFS volume version is 3.1.
NTFS partition /dev/sdb2 was processed successfully.
```

改めて`/dev/sdb2`をマウントします。
```
$ sudo mount -t ntfs /dev/sdb2 /path/to/mount
```
何もメッセージが表示されなかったため、うまくいっているようです。念のためマウントしたディレクトリの中身を確認してみましょう。

```
$ ls -l /path/to/mount
合計 11993000
drwxrwxrwx 1 root root           0 12月 11 18:55 '$Recycle.Bin'
drwxrwxrwx 1 root root        4096 12月  3 03:24 '$SysReset'
drwxrwxrwx 1 root root        4096 12月 15 09:54 '$WINDOWS.~BT'
lrwxrwxrwx 2 root root          22 12月  2 10:39 'Documents and Settings' -> /path/to/mount/Users
drwxrwxrwx 1 root root           0 12月 15 06:14  Intel
drwxrwxrwx 1 root root           0 12月  3 02:42  PerfLogs
drwxrwxrwx 1 root root        8192 12月 15 06:29 'Program Files'
drwxrwxrwx 1 root root        4096 12月 15 06:09 'Program Files (x86)'
...
```
大丈夫そうです🙌
確認は終わったのでマウント解除します。
```
$ sudo umount /path/to/mount
```

同じ要領で、残り2つのパーティションにも`ntfsfix`を適用します。
```
$ sudo ntfsfix /dev/sdb1
$ sudo ntfsfix /dev/sdb3
```

もし不安であれば、各パーティションがマウントできるか確認してもいいかもしれません。（ちなみに私はやらなかったです）
データの移行はこれにて完了です。

### 参考記事

https://precure-3dprinter.hatenablog.jp/entry/2018/05/30/Windows%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%9FHDD%E3%81%8CLinux%E3%81%A7%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E8%A9%B1


## (5) PC本体のディスクを移行先ディスクに交換し、UbuntuのUSBディスクは外す

データの移行が完了したディスクをPC本体に取り付けます。取り付け方はPCの機種によって様々と思いますが、今回移行対象のThinkPad T430は以下の動画が参考になりました。

https://youtu.be/2EtLMEZex70

## (6) PC本体を起動して、Windowsが起動するか確認する

ディスクの交換が完了したら、PC本体の電源ボタンを入れて起動してみます。移行が上手く行っていればWindowsのロゴが出てきて起動できるはずです。
ただ筆者のケースだと初回の起動だけはディスクのチェック処理が走り、Windowsログイン画面が出るのに少しだけ時間が掛かりました。新しいディスクになって初めての起動の場合はディスクチェックが走る仕様なのかもしれません。

# 移行完了後にパーティションの利用領域を拡張

ディスクの移行はめでたく完了しましたが、現状だとディスクの後半の領域がフォーマットされていなくて使えない状態です。実際に「ディスクの管理」でみてみると、下のように後半の596GB部分は未割り当てなのがわかります。

![IMG_2981.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/54de44b1-f833-26f5-0a40-88f0e2ffad16.jpeg)

Cドライブを「未割り当て」の領域に拡張したいのですが、間に「Windows RE tools」というパーティションが立ち塞がっていてそれが出来ない状態です。Windows RE toolsパーティションを消せば解決するのですが、消していいのでしょうか...
このパーティションにはWinREというOSが入っているようで、システムに問題が発生した場合に修復したり、システムを工場出荷時の設定に戻したりできるようです。一方で、WinREのパーティションがなくてもWindows自体は動くみたいです。少し迷ったのですが「ディスク領域を拡張したい」気持ちが今回は優ってしまい削除することにしました。

詳細手順は記載しませんが、「ディスクの管理」のUI上でWinREのパーティションを削除してCドライブを拡張して以下のような状態にできました。
![IMG_2982.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/78070028-c026-4bc5-ec88-7644aec93f4c.jpeg)
これで移行したSSDのディスク領域もフルに使えます。

:::note warn
WinREのパーティションを削除する場合は自己責任でお願いいたします。
:::

## [追記] 回復パーティション(=WinRE？)が自動作成される

Windows Updateで最新のバージョンにした後、一週間近く経ってPCを起動したら、ディスク領域の最後に「回復パーティション」が自動で作られていました。[こちら](https://news.mynavi.jp/techplus/article/20210427-1879494/)の手順を参考にして回復モードで起動できることも確認できたので、懸念していた点は解消できていそうです。

![IMG_2994.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/ae48b734-cf6c-9fa4-81ac-0668af6faacd.jpeg)


## WinREに関する参考記事

WinREについて

https://news.mynavi.jp/techplus/article/20210427-1879494/#:~:text=%E3%82%92%E7%B4%B9%E4%BB%8B%E3%81%97%E3%82%88%E3%81%86%E3%80%82-,WinRE%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%81%8C%E6%90%AD%E8%BC%89%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82

WinREを削除する方法

https://www.aomei.jp/articles/delete-recovery-partition-windows-10.html

# おわりに

無事にWindowsを別のディスクに引っ越しできましたが、最後の「WinREのパーティションを消す」というやり方をあまり時間をかけずに選んでしまったのは雑でした。本当に消してよかったのか、もし消すとリスクが高まるのであればWinREを残しつつディスク領域を十分に使える方法はなかったのか、等を考えた方がよかったのかもしれません。