Live OSを使用したゼロフォーマット

# はじめに
個人で使用しているPCでは、色々とソフトをインストールして使用感を試してみることが多いこともあり、気づいたら大量の使わないソフトが溜まっていたりします。

そのため、不要なソフトが溜まってきたり、重くなってきたと感じたときにOSのクリーンインストールを行っているのですが、その際に実行するコマンドをよく忘れるのでまとめておこうと思います。

尚、今回実行するコマンドは全てroot権限で実施する必要があるので、`sudo`等でroot権限で実行するようにしてください。

# 準備するもの
操作PCが起動しているとフォーマットできないので、DVDやUSBから起動する**Linux Live OS**を準備します。

OSはお好きなもので良いですが、Ubuntu等であれば、インストーラー起動時にディスクにインストールするか、ディスクインストールせずに使用するかが選択できるため、**Live OS**用のイメージを探す手間が省けるかと思います。

お好きな**Live OS**をダウンロードしたら、DVDやUSBに書き込みます。

私はUSBに書き込んで使うことが多いので、以下のソフトを使用してUSBに書き込んで使用しています。

- [Rufus](https://forest.watch.impress.co.jp/library/software/rufus/)

# Live OS起動
先ほど作成したDVD、USBを接続してLive OSを起動します。

起動順によってはLive OSが起動してこないので、`BIOS`設定からDVD、USBからの起動を優先するように変更します。

# デバイス名確認
**Live OS**が起動してきたら、ターミナルを起動して、フォーマットするディスクを確認します。

```shell:フォーマットするディスクの確認
fdisk -l
```

`/dev/sd[x]`や`/dev/nvme[x]n[x]`のようなデバイスが表示されるため、フォーマットを行うデバイス名を控えておきます。

# shredを使用したフォーマット
使用した**Live OS**に`shred`コマンドが存在するようであればこちらで実施したほうが良いかと思います。

`shred`コマンドはディスクの中身を完全削除するためのコマンドで、**HDD**にも**SSD**にも対応しています。

完全削除を目的としているため、デフォルトではランダムな値を3回書き込むことで復元できないようにしていますがオプションを付与することでゼロ書き込みを行うことができます。

`shred`コマンドのオプションは以下。

|オプション|説明|
|:--|:--|
|-v|詳細情報の表示|
|-n [回数]|ランダム書き込みの回数|
|-z|ゼロ書き込みの実行|

```shell:shredコマンドを使用したゼロフォーマット（/dev/sdaをフォーマットする場合）
shred -v -n 0 -z /dev/sda
```

今回はディスクの廃棄ではなく、再利用を想定しているため、ランダム書き込みの回数を0にしてゼロ書き込みを実行することでゼロ書き込みだけ行うようにしています。

# ddを使用したフォーマット
**Live OS`**に`shred`コマンドが存在しない場合は`dd`コマンドでゼロフォーマットします。

`dd`コマンドであれば**Linux系OS**であれば入っていないことは無く汎用的に使うことができるので、フォーマット目的以外でも覚えておくと良いです。

|オプション|説明|
|:--|:--|
|if=|入力ファイル|
|of=|出力ファイル|
|bs=|ブロックサイズ|
|count=|繰り返し回数|

```shell:ddコマンドを使用したゼロフォーマット（/dev/sdaをフォーマット、ブロックサイズ32MBの場合）
dd if=/dev/zero of=/dev/sda bs=32M
```

`/dev/zero`は**null文字（0x00）**を読み出すことができるデバイスで、出力ファイルでフォーマット対象のディスクデバイスを指定することで、全て0で埋め尽くしたフォーマットが行えます。

尚、`/dev/urandom`を入力ファイルで指定することで、ランダムな値を書き込むこともできます。

## ddコマンド実行時の進捗表示
`dd`コマンドを実行した場合、処理が終了するまで結果が表示されないため、長い処理を行う場合、どの程度まで処理が進んでいるかが分かりません。

但し、別のウィンドウから`USR1`シグナルを送信することで進捗確認ができるので、どの程度フォーマットが進んでいるか確認するのに覚えておくと便利です。

```shell:ddの進捗確認（ddコマンド実行のウィンドウとは別のウィンドウで実施）
pkill -USR1 dd
```

```shell:進捗表示例
77+0 レコード入力
77+0 レコード出力
10334765056 bytes (10 GB, 9.6 GiB) copied, 29.3437 s, 352 MB/s
```

## ddコマンド実行時の最適なブロックサイズ

`dd`コマンドを実行する際の最適なブロックサイズは、[ディスクのキャッシュ容量に合わせる](https://wiki.archlinux.jp/index.php/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3#.E3.83.87.E3.82.A3.E3.82.B9.E3.82.AF.E3.82.A4.E3.83.A1.E3.83.BC.E3.82.B8.E3.81.AE.E4.BD.9C.E6.88.90)と良いそうなので、ディスクのキャッシュ容量が分かれば、ブロックサイズにキャッシュ容量と同様の値を指定すれば良いかと思います。

もしディスクのキャッシュ容量が分からなければ、事前に以下の様なシェルで効率が良いブロックサイズを確認しておくと、`dd`コマンドでフォーマットする際に早く完了できます。

- [How to determine the best byte size for the dd command](https://serverfault.com/questions/147935/how-to-determine-the-best-byte-size-for-the-dd-command/148121#148121)

以下は上記サイトのシェルを基に少し手直しし、大きなサイズのブロックサイズでテストするようにしたシェルになります。

フォーマットしたい対象のディスクをマウントしているパスに合わせて`TESTPATH`変数のパスを変更してご使用ください。

```shell:best_size_check.sh
#!/bin/bash
TESTPATH="/var/tmp"

echo "creating a file to work with"
dd if=/dev/zero of=${TESTPATH}/infile count=1175000

for bs in 1M 2M 4M 8M 16M 32M 64M 128M 256M 512M
do
        echo "Testing block size  = ${bs}"
        dd if=${TESTPATH}/infile of=${TESTPATH}/outfile bs=${bs}
        echo ""
done
rm ${TESTPATH}/infile ${TESTPATH}/outfile
```