MacBookでMicroSDカードにRaspbianを書き込むまでの道のり

# はじめに

MicroSDカードが余っていたのでRaspberryPi Zero WH買ったのですが、
いつもMicroSDに書き込むまでの道のりを忘れてググっているので道標として投稿することにしました。

MacBookでとかタイトルにありますが、多分Mac全般に通用すると思います。

# 書き込むまでの道のり

## 公式からzipファイルをダウンロードする

https://www.raspberrypi.org/downloads/raspbian/
からダウンロードすればオッケー:thumbsup:

とりあえず`Lite`の方を落とします。`curl -OL https://downloads.raspberrypi.org/raspbian_lite_latest`とか、名前をつけたければ`curl -o raspbian.zip -L https://downloads.raspberrypi.org/raspbian_lite_latest`などでもおそらく大丈夫。

デスクトップ版がいい場合は[国内ミラー](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/)とかいうのがあるんでそちらから落としたほうが早いかも。

ダウンロードしたら念の為ハッシュ値の確認を行います。
今回ダウンロードしたのはStretchというバージョンのようです。

```terminal:
> openssl sha256 2018-11-13-raspbian-stretch-lite.zip
SHA256(2018-11-13-raspbian-stretch-lite.zip)= 47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d
```

`openssl`入っていない場合は以下のコマンドでも確認できるようです。

```terminal:
> shasum -a 256 2018-11-13-raspbian-stretch-lite.zip
47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d  2018-11-13-raspbian-stretch-lite.zip
```

どっちがいいかは好みの問題でしょうね。
ホームページに記述されているハッシュ値と値が違った場合はダウンロードし直しましょう。
同じなら解凍します。

```terminal:
> unzip 2018-11-13-raspbian-stretch-lite.zip
Archive:  2018-11-13-raspbian-stretch-lite.zip
  inflating: 2018-11-13-raspbian-stretch-lite.img
```

## SDカードをフォーマット

**(注)新品のMicroSDカードをお持ちで、容量が32GB以下ならばここの手順は不要と思われます。**
**32GBを超えている場合はRaspberryPiでサポートしていないexFAT形式の可能性があるため、その場合はこの手順が必要になります。**

MicroSDカードをお手持ちのMacbookに挿し込み、ターミナルを開きます。
その後、**`diskutil list`**と入力し、MicroSDカードが認識されているか確認します。

```terminal:
> diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         121.1 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +121.1 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            98.7 GB    disk1s1
   2:                APFS Volume Preboot                 46.7 MB    disk1s2
   3:                APFS Volume Recovery                512.4 MB   disk1s3
   4:                APFS Volume VM                      3.2 GB     disk1s4

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *63.9 GB    disk2
   1:             Windows_FAT_32 BE340262                524.3 MB   disk2s1
   2:                 Linux_Swap                         536.9 MB   disk2s2
   3:                      Linux                         2.1 GB     disk2s3
```

**`/dev/disk2`**が該当のディスクの模様。
見て思い出したのですが、すでにLinuxイメージを書き込んだことがあるMicroSDのようですね。

次に**`diskutil eraseDisk`**でMicroSDカードをフォーマットします。
**RaspberryPiのブートローダーはFATファイルシステムのみをサポートしている**とのことなので`FAT32`でフォーマットします。

```terminal:
> diskutil eraseDisk FAT32 RASPBIAN /dev/disk2
Started erase on disk2
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk2s2 as MS-DOS (FAT32) with name RASPBIAN
512 bytes per physical sector
/dev/rdisk2s2: 124334400 sectors in 1942725 FAT32 clusters (32768 bytes/cluster)
bps=512 spc=64 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=124364800 bspf=15178 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk2
```

## ddrescueを使い、MicroSDカードに書き込む

ここで普通は`dd`コマンドで書き込むのですが、今まで使っていて、

- 進捗の確認がしづらい
- エラーからの復帰がきつい

などいろいろ感じることがありまして、単純に`dd`コマンドよりも使いやすい**`ddrescue`**をここで使うことにします。
入っていない場合は`brew install ddrescue`などで入れてしまいましょう。

まず、書き込む前にアンマウントする必要があるので`diskutil unmountDisk`コマンドを使い、アンマウントしてしまいます。

```terminal:
> diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```

その後、`ddrescue`を使い、MicroSDカードにイメージを書き込みます。

```terminal:
> sudo ddrescue -f -v -r1 2018-11-13-raspbian-stretch-lite.img /dev/disk2 rescue.log
```

ここのオプションですが、
**`-f, --force`**は強制上書きで、**`-v, --varbose`**は詳細表示、**`-r, --retry-passes`**はリトライ回数指定です。
[こちら](https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html#Invoking-ddrescue)に詳細な説明ありますが、 まあだいたい上のやつを知っておけばいいと思います。
最後の`rescue.log`はログファイルとなります。

```terminal:
> sudo ddrescue -f -v -r1 2018-11-13-raspbian-stretch-lite.img /dev/disk2 rescue.log
GNU ddrescue 1.23
About to copy 1866 MBytes from '2018-11-13-raspbian-stretch-lite.img' to '/dev/disk2'
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 sectors       Initial skip size: 128 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
     ipos:    1866 MB, non-trimmed:        0 B,  current rate:    393 kB/s
     opos:    1866 MB, non-scraped:        0 B,  average rate:    587 kB/s
non-tried:        0 B,  bad-sector:        0 B,    error rate:       0 B/s
  rescued:    1866 MB,   bad areas:        0,        run time:     52m 56s
pct rescued:  100.00%, read errors:        0,  remaining time:         n/a
                              time since last successful read:         n/a
Finished
```

入力後しばらくして上のようにFinishedと出力されれば書き込み終了です。
終了が確認できたら、`diskutil eject /dev/disk2`などしてMicroSDカードを取り出して終わりです。

おつかれさまでした。:white_flower:


# さいごに

書いている途中で気づいたのだが、公式に[すでに似たようなことやっているのページがあった](https://www.raspberrypi.org/documentation/installation/)。

のですが、そっちでは`dd`を使っているのでまあ投稿する意味あるだろうと思い投稿することにしました。
公式ページのリンクも含めた備忘録と思ってもらって構いません。