Parted を使ってディスクを初期化する


## まとめ

msdos 形式でパーティション作成 (R-Car M3 等)

    $ sudo parted /dev/sdc mklabel msdos
    $ sudo parted /dev/sdc mkpart primary 0% 100%

gpt でパーティション作成 (今時の方法)
    
    $ sudo parted /dev/sdc mklabel gpt
    $ sudo parted /dev/sdc mkpart hoge 0% 100%

フォーマット

    $ sudo mkfs.ext4 /dev/sdc1

## 解説

今まで fdisk で何となく生きてこれたがちゃんと parted について調べた。やりたいことは単純で、SD カードを初期化して全部 ext4 にしたい。

まず、SD カードデバイスの確認には私は lsblk を使っている。この例だとたまたま３つのパーティションが出来ているが、これを全部消して ext4 全部にしたい。

    $ lsblk
    NAME                        MAJ:MIN RM   SIZE RO TYPE   MOUNTPOINT
    sdc                           8:32   1    15G  0 disk   
    ├─sdc2                        8:34   1   1.5G  0 part   
    ├─sdc3                        8:35   1    44M  0 part   
    └─sdc1                        8:33   1  23.3M  0 part   

parted にはコマンドラインから操作する command line と一旦 parted の中に入って操作する interactive の２つのモードがあるが、ここでは command line だけを使う。たとえば、

    parted /dev/sdc print

で /dev/sdc にある SD カードのパーティションを表示する。command line でもかなり色んな質問をして来るが、無視したい場合は --script オプションで質問を無視する事も出来る。

```
$ sudo parted /dev/sdc print
Warning: Not all of the space available to /dev/sdc appears to be used, you can fix the GPT to use all of the space (an extra
28113994 blocks) or continue with the current setting? 
Fix/Ignore? I                                                             
Model: TS-RDF5 SD Transcend (scsi)
Disk /dev/sdc: 16.1GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name     Flags
 1      1049kB  25.4MB  24.4MB  fat16           primary  legacy_boot
 2      26.2MB  1648MB  1622MB  ext4            primary
 3      1648MB  1694MB  46.1MB  linux-swap(v1)  primary
```

パーティションテーブルを作り直すには mklabel を使う。

    mklabel label-type

label-type としては古い msdos と新しい gpt がある。

```
$ sudo parted /dev/sdc mklabel gpt
Warning: The existing disk label on /dev/sdc will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Y
Information: You may need to update /etc/fstab.
```

パーティションの作成には mkpart を使う。

    mkpart [part-type fs-type name] start end

mklabel で msdos を指定すると part-type (primary | extended) が必須になる。mklabel で gpt を指定すると name が必須となる。start と end の単位として [セクタやバイト数など色々使える](https://www.gnu.org/software/parted/manual/parted.html#unit)。ただ、% 以外を使うと `The resulting partition is not properly aligned for best performance.` という警告が出る事があって使いづらい。

ディスク全域を使うには以下のようにする。gpt の場合 name が必須らしいので適当に hoge と入れた。ここで fs-type の指定も出来るが、フォーマットは後で行うので省略して良い。

```
$ sudo parted /dev/sdc mkpart hoge 0% 100%
Information: You may need to update /etc/fstab.
```

パーティションをフォーマット

```
$ sudo mkfs.ext4 /dev/sdc1
```

出来上がり。

ちなみに

    sudo parted -s /dev/sdc mklabel msdos mkpart primary 0% 100%

のように続けて一行でコマンドを書けるらしいが、これで作った SD は妙なエラーが出て実機で動かなかった。(要調査)

参考

* [Parted User’s Manual](https://www.gnu.org/software/parted/manual/parted.html)
* [GNU Parted: Solving the dreaded "The resulting partition is not properly aligned for best performance"](https://blog.hqcodeshop.fi/archives/273-GNU-Parted-Solving-the-dreaded-The-resulting-partition-is-not-properly-aligned-for-best-performance.html)
* [2TB以上のHDDをCentOSにマウントする方法](https://qiita.com/kubor/items/0a30c03a70a10c099df5)