Diskをマルっとコピーする

# これは何？
何も考えずにマルっとディスクをコピーしたい、そんなときの解決策の1つです。

# 概要
ここでは`dd`コマンドを使います。ディスクのIDは`fdisk`を使います。

## 手順のまとめ
1. コピー元のディスクのIDを取得
2. `dd`でコピー

## 準備
- 自由にいじれてLinuxを起動できる端末（作業端末）
- Linuxの何らかのディストリビューション（Ubuntuをよく使います）
- `sudo`できるアカウント、または`root`権限
- コピー元のディスク
- コピー元と同等のストレージ（物理単体、もしくはコピーできるだけの空き容量）

## 作業手順
ここでの説明は **コピー元のディスクと同一の別のディスク（コピー先）にコピーをする** というシナリオです。  
また、作業端末は以下の構成であることを想定する。
- コピー元： `/dev/sdc`
- コピー先： `/dev/sdb`
- Linuxがインストールされたディスク：`/dev/sda`

### コピー元ディスクの調査
誤ってコピー元に書き出してしまわないようにIDを確実にメモります。   

※ もし対象のディスクのFormatがNTFSでエラーが起こった場合は [How to fix Ubuntu unable to mount NTFS partition](https://gist.github.com/geraldvillorente/0355d660fa58f6351a45) を参照してください。  

**注意** ： 以下の作業例では`/dev/sdb`としてIDの確認をしています。しかし、次の作業の **コピー先ディスクを接続する** を実行するとコピー元は`/dev/sdc`へとマッピングが変わります。これはマザーボードの接続方法とのハードウェアの認識方法に依存する為に変わっていますので、必ずIDを確認することで、`/dev/sd[a-z]{1}`とディスクとのマッピングの変化に対応してください。

1. 作業端末のOSをシャットダウンして、電源を切る
2. コピー元のディスクを作業端末に接続し、作業端末のOSをLinuxで起動する
3. 以下の`fdisk`コマンドでIDを確認する

```bash
$ sudo fdisk /dev/sdb
   Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sdc: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C075xxxx-BE81-42EE-xxxx-6A4052113065

Device     Start        End    Sectors   Size Type
/dev/sdc1   2048 1953523711 1953521664 931.5G Microsoft basic data

Command (m for help): q
```

### コピー先ディスクを接続する

1. 作業端末のOSをシャットダウンして、電源を切る
2. コピー先のディスクを作業端末に接続する（コピー元のディスクを作業端末に接続した状態で）
3. `fdisk`コマンドでIDを確認すると同時にコピー元、コピー先がLinux上でどのディレクトリにマップされているか確認をする


！！！！ **コピー元ディスクの調査**の注意に書いた通り、 `/dev/sdb` を確認すると先程のIDと異なったIDが表示されました。よって、このディスクはコピー元ではなく、コピー先のディスクであることが分かります。必ず作業前に確認するようにしてください。間違えるとコピー元を全て削除してしまいます。

```bash
$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 0A88yyyy-A88E-433D-yyyy-ABCD18FB7FBB

Device     Start        End    Sectors   Size Type
/dev/sdb1   2048 1953523711 1953521664 931.5G Microsoft basic data

Command (m for help): q   
```

`/dev/sdc`を確認するとコピー元であることが分かります。

```bash
$ sudo fdisk /dev/sdc
   Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sdc: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C075xxxx-BE81-42EE-xxxx-6A4052113065

Device     Start        End    Sectors   Size Type
/dev/sdc1   2048 1953523711 1953521664 931.5G Microsoft basic data

Command (m for help): q
```

### コピー元からコピー先へコピーを実行する
`status=progress`のオプションをつけることで今どの辺りであるのか、以下のような表示が得られます。

```bash
$ sudo dd if=/dev/sdc of=/dev/sdb bs=1024k status=progress
79691776 bytes (80 MB, 76 MiB) Copied, 1 s, 78.2 MB/s
```

以下のように表示が出てカーソルが戻ってきたらコピー完了です🎉

```bash
$ sudo dd if=/dev/sdc of=/dev/sdb bs=1024k status=progress
999964016640 bytes (1.0 TB, 931 GiB) copied, 2139 s, 467 MB/s
953869+1 records in
953869+1 records out
1000204886016 bytes (1.0 TB, 932 GiB) copied, 2144.92 s, 466 MB/s
```

## コピー時間
1Tのディスクのコピーで30〜40分くらいでコピーの作業完了でした。（2019/11/20）

# 注意
`dd`でのコピー元とコピー先の指定は`/dev/sd[a-z]{1}`で行いますが、この指定はマザーボードの接続方法とLinuxのハードウェアの認識方法に依存します。コピー元とコピー先の指定はディスクのIDを確認した上で指定するようにしてください。


# Reference
- [Using DD for disk cloning - Server Fault](https://serverfault.com/questions/4906/using-dd-for-disk-cloning)
- [Linux dd Command Show Progress Copy Bar With Status - nixCraft](https://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/)
- [How to fix Ubuntu unable to mount NTFS partition](https://gist.github.com/geraldvillorente/0355d660fa58f6351a45)