FAT32Pi: Windows PC と Raspberry Pi でSDカードを共用

# English version of this contents is available [here](https://monitorserviceatelierueda.blogspot.com/2018/09/how-to-make-shareable-sd-card-by.html).

Also My made the Latest (Sep, 2018 version ) image with 4GB boot area ***for 8GB SD Card*** is available on [my Payhip account](https://payhip.com/b/ahwQ) for saving your time.

# 始めに
　Raspberry Pi を使ったソリューションを御紹介させて頂いておりますと ***「その撮影した写真や取得したセンシングデータが入っている SD カード、なんで PC でそのまま読み書きできないの？」*** と苦言を頂くことが度々あります。因に、こういうシチュエーションで言われる ***PCとは Windows PC*** の事のようです
![スクリーンショット 2015-07-03 21.31.27.png](https://qiita-image-store.s3.amazonaws.com/0/46544/36208fa3-6037-d609-dec3-428efc7fcf0e.png "スクリーンショット 2015-07-03 21.31.27.png")


　これまではこういう時にファイルシステムの違いを技術的に説明したり、 Samba や FTP でネットワーク経由で読み書きできると説明したりして御不興を買っていたのですが、鈍い私も ***「理屈はいいからPCで読めるようにして！」*** というリクエストであった事を最近やっと理解しました。
　つきましては ***Windows PC と 共用できる*** Raspbian のSD カード ***FAT32Pi*** なるものを作ってみましたので、その旨こちらにご報告させていただきました次第にございます
　別に大げさな事をしているわけではなく、一言で言ってしまうと単に ***boot パーティションをFAT32にしてデータ保存域と共用にしました***というだけなのでございますが、持ち前の説明の下手さ故、無駄に長文になってしまいました事、謹んでお詫びさせていたします次第にございます

# なにが問題なのか
## 1. 解決しようとする課題
　以下は理屈ですので御興味のない方はこの章を飛ばして頂いても大丈夫です。
　[以前にも書いたのですが](http://qiita.com/UedaTakeyuki/items/4f97240b5fd7fc8a4d0b)、Raspberry Pi の SDカードは基本的にブートローダーが入っている ***FAT*** の領域と、ブートローダーから起動される ***ext4*** の領域の二つ（ブート対象を切り替えられる NOOBSとかは多分もっと沢山）の領域からなっています。これは Raspberry Pi のブートシーケンスが ***BCM2835 (Pi2 だと後継のBCM2836)の内蔵のブートローダーが SD カードの FAT を探してきて、その中の二次ブートローダーを起動する*** をうまく利用していることが理由です

![スクリーンショット 2015-07-03 23.03.25.png](https://qiita-image-store.s3.amazonaws.com/0/46544/1d5c90f6-b7d7-4a4e-1a2f-95639f662895.png "スクリーンショット 2015-07-03 23.03.25.png")

　この Linux のファイルシステム ***ext4*** ですが、Windows PC どころか ***Macでさえ普通には読み書きできず***、別途 ext4 のドライバーのインストールが必要になります。「ドライバをインストールすると読めますよ」と言うと当然ですが嫌がられるので別の方法を考えます
　そこで、SDカード後方の空き領域に、MACでも普通に読み書きできる ***FAT32の領域を作って*** 撮影写真や取得データなど Raspberry Pi の外で共有したいデータはそちらに書くようにするという方法があります。
![スクリーンショット 2015-07-03 23.05.02.png](https://qiita-image-store.s3.amazonaws.com/0/46544/df7e11e6-21d8-e654-c00d-23d2e13bded9.png "スクリーンショット 2015-07-03 23.05.02.png")

Mac はこれでいいのですが 
![スクリーンショット 2015-07-03 23.05.53.png](https://qiita-image-store.s3.amazonaws.com/0/46544/cb4a8940-6b39-34f2-efed-49866c1b828b.png "スクリーンショット 2015-07-03 23.05.53.png")

***Windows*** は [SD Association](https://www.sdcard.org/jp/home/) の "Part 2: File System" のスタンダードに忠実で ***SDカードにはパーティションは一つしかない、かつそれはFATだ*** と信じているようで、 ***SDカードの先頭の FAT 以外を認識しない***というちょっと困った実装になっているようで（7まではそうでした。Windows8や10を触った事がないので8や10ではどうなっているのか実はよく知りません）、 ***追加のFAT領域を認識してくれません***

![スクリーンショット 2015-07-03 23.06.51.png](https://qiita-image-store.s3.amazonaws.com/0/46544/882a9632-150c-f4f1-e00d-cfb571714adb.png "スクリーンショット 2015-07-03 23.06.51.png")

## 2. 課題に関する問題点のまとめ
1. Windows が認識するのは SD カードの先頭の FAT 領域のみ
2. Raspberry Pi の SD カードはブートローダーが入っている FAT の領域と linux の実体がはいっている ext4 の領域からなる

## 3. 課題の解決策
　以上、Windows のSDカードに対する実装が原因なのですが、Raspberry Pi からも Windows からも認識できる領域は先頭の FAT の領域しかないので、Raspberry Pi で作成したデータを Windows からも共用するために ***データの保存フォルダを FAT の領域に用意*** することにしました。
![スクリーンショット 2015-07-03 21.40.41.png](https://qiita-image-store.s3.amazonaws.com/0/46544/17a1de22-4ba8-0d2f-32bb-2fbf977a42a2.png "スクリーンショット 2015-07-03 21.40.41.png")

　Raspbian の先頭の FAT 領域は ***FAT16*** でフォーマットされていてあまり大きくできないので  ***FAT32*** に変換します。また、FAT には権限管理の機能がないため Raspbian の標準のままでは root 以外の書き込みができないので、 ***マウントの方法もかえる*** ことにしました

# 手順
## 1. 概要
gparted 等のパーティションを変更できるツールを使って変更します。

1. まず、ext4 の領域を後ろにずらし、FAT を拡張できる隙間をあけます
2. 開いた空間に FAT の領域を広げます。gparted だと、FAT16 の限界を超えて広げようとするとついでに FAT32 に変更してくれます。便利

## 2. Raspberry Pi で gparted を使う
　普段、PC 等で gparted を特にストレスなしで使われている方は上記の手順を PC でおこなっていただき、後述する /etc/fstab の変更をしていただければそれで完成です
　私はそれがかなりめんどくさく、最近は Raspberry Pi に gparted をインストールして使っています

```bash:インストール
sudo apt-get install gparted
```

もちろん、自分自身のパーティションを unmount して操作することはできませんので、下図のようにSDカードを二枚用意し、もう一枚は USB の外付けカードリーダーをに刺し、この USB 側の SD カードを操作するようにしています


![スクリーンショット 2015-07-03 21.57.18.png](https://qiita-image-store.s3.amazonaws.com/0/46544/d5fd0181-65e2-c7a0-e828-b5c75558a2cd.png "スクリーンショット 2015-07-03 21.57.18.png")

 余談ですが、このように ***USB カードリーダーを使って Raspberry Pi で Rasspberry Pi の SD カードを操作する*** と、 ***間違ってPCのHDDを大変なことにしてしまうリスクがない*** ので、 ***パーティションの設定*** や、 ***バックアップ＆リストア*** でも大変便利です 

## 3. gparted で /boot を FAT32化する詳細手順
以下、Raspberry Pi を使い、FAT32化の対象 SD カードを USB カードリーダーに刺している前提でご説明させていただきます。PC等で作業されている場合はデバイス名等をご自身の環境に読み替えていただければ幸いです

1. メニューから gparted を開きます

![スクリーンショット 2015-07-03 9.41.24.png](https://qiita-image-store.s3.amazonaws.com/0/46544/c1659dae-7008-a033-00f3-2d8ad684f2ff.png "スクリーンショット 2015-07-03 9.41.24.png")

2. [Mac から X11で Raspberry Pi のデスクトップを直接操作している場合](http://qiita.com/UedaTakeyuki/items/7cc0fc6011cb0448c070)、gparted を起動すると lxsession を呼び出したコンソールで root のパスワードをもとめられるかもしれません。その時は認証をしてください

![スクリーンショット 2015-07-03 9.43.21.png](https://qiita-image-store.s3.amazonaws.com/0/46544/0f9c8a5b-388f-9eaa-c589-899b4d278006.png "スクリーンショット 2015-07-03 9.43.21.png")

3. デバイスを選択します。/dev/mmcblk0 は Raspberry Pi を実行している方の SD カード、/dev/sda が USB カードリーダーに刺さっている方の SD カードです。
/dev/sdaを選択します

![スクリーンショット 2015-07-03 9.44.04.png](https://qiita-image-store.s3.amazonaws.com/0/46544/d7e8a0ae-2084-5aea-e5f2-8d067e74cf5d.png "スクリーンショット 2015-07-03 9.44.04.png")

4. ext4 の領域を後ろにずらすため、まず unmount します

![スクリーンショット 2015-07-03 9.44.22.png](https://qiita-image-store.s3.amazonaws.com/0/46544/bf18cb51-eb95-0540-3117-2f2123518170.png "スクリーンショット 2015-07-03 9.44.22.png")

5. unmount したらいろいろ操作できるようになるので今度は Resize/Move を選択して

![スクリーンショット 2015-07-03 9.45.11.png](https://qiita-image-store.s3.amazonaws.com/0/46544/f3393f4f-3098-2459-56e6-74f16d1f1e8e.png "スクリーンショット 2015-07-03 9.45.11.png")

6. こんなメニューがでてくるので

![スクリーンショット 2015-07-03 9.45.46.png](https://qiita-image-store.s3.amazonaws.com/0/46544/fc08e4a1-4838-987b-59ec-ad49304102aa.png "スクリーンショット 2015-07-03 9.45.46.png")

7. 後ろにずらします。ついでなので後々の事を考え size を 4096MB に、少し増やしておきます（後の予定がなければ逆に減らしてもいいですが）

![スクリーンショット 2015-07-03 9.46.36.png](https://qiita-image-store.s3.amazonaws.com/0/46544/3e726802-476f-60e6-15d6-299b0e96c33b.png "スクリーンショット 2015-07-03 9.46.36.png")

8. 「なんか怖い事してるみたいだけど大丈夫？（意訳）」というメッセージがでます。gparted は親切です。でも、今回はわかった上でやっているので OK を押します

![スクリーンショット 2015-07-03 9.46.51.png](https://qiita-image-store.s3.amazonaws.com/0/46544/832a51b0-8b19-0432-a07d-ce7c006dff2a.png "スクリーンショット 2015-07-03 9.46.51.png")

9. 変更を反映させるために緑の→ボタンをクリックします。最期に纏めてでもいいですけど、失敗したときのやり直しの被害が小さいので私は毎回反映させてます。

![スクリーンショット 2015-07-03 9.47.01.png](https://qiita-image-store.s3.amazonaws.com/0/46544/88e7d886-ef07-5e2d-947e-96d39f1a1e5b.png "スクリーンショット 2015-07-03 9.47.01.png")


10.「本当に反映しちゃうの？（いい訳）」と gparted が確認してくれます。本当に親切な UX です。Apply をクリック

![スクリーンショット 2015-07-03 9.47.10.png](https://qiita-image-store.s3.amazonaws.com/0/46544/3d5807e4-7ae7-b164-8830-2b5f672166c7.png "スクリーンショット 2015-07-03 9.47.10.png")

11. 結構時間がかかるので、しばらく待ちます

![スクリーンショット 2015-07-03 9.48.34.png](https://qiita-image-store.s3.amazonaws.com/0/46544/b6f977fb-e333-f86c-2197-30496ed51660.png "スクリーンショット 2015-07-03 9.48.34.png")

12. ext4 を後ろにずらして fat16 を広げる余裕ができました。こちらを選択して unmount してから、Resize/Move を選択します

![スクリーンショット 2015-07-03 9.59.26.png](https://qiita-image-store.s3.amazonaws.com/0/46544/c7bb3325-3ddc-2805-3ae2-7801dc5040c8.png "スクリーンショット 2015-07-03 9.59.26.png")

13. 余らせてもしょうがないので空き領域いっぱいにひろげちゃいます。

![スクリーンショット 2015-07-03 10.00.01.png](https://qiita-image-store.s3.amazonaws.com/0/46544/c159fe79-5c16-2093-fe20-72cb4a5006d9.png "スクリーンショット 2015-07-03 10.00.01.png")

14. FAT の限界を説明してくれた上で、「FAT の限界にきてるんだけどどうする？（名訳）」と聞いてきてくれます。ここは「Ignore」を。ここからの gparted の親切な実装は実に感動的でさえあります

![スクリーンショット 2015-07-03 10.00.47.png](https://qiita-image-store.s3.amazonaws.com/0/46544/db3059a7-b547-2da7-0e26-b7a8e8e78d50.png "スクリーンショット 2015-07-03 10.00.47.png")

15. なななぁんと！「FAT16じゃあれだからFAT32にしちゃう？（手抜き訳）」と聞いてきてくれます。なんというほがらかさ！私もこういうコードを書かなければと思った次第です。OKをクリックします

![スクリーンショット 2015-07-03 10.01.05.png](https://qiita-image-store.s3.amazonaws.com/0/46544/24ff9a45-2d13-424b-69f0-85ac11e6bbfe.png "スクリーンショット 2015-07-03 10.01.05.png")

16. 緑→のボタンをクリックして変更を反映させ、しばらく時間がかかるのですが完成したら close をクリック

![スクリーンショット 2015-07-03 10.01.24.png](https://qiita-image-store.s3.amazonaws.com/0/46544/cbe27784-3633-c449-bd2f-8ea1554f0697.png "スクリーンショット 2015-07-03 10.01.24.png")

17. これで /boot が FAT32 になって広がりました

![スクリーンショット 2015-07-03 10.01.40.png](https://qiita-image-store.s3.amazonaws.com/0/46544/ee6db53b-d913-5efb-107f-9e7a94d7b7cf.png "スクリーンショット 2015-07-03 10.01.40.png")

## 2018.09.26 補足
最近の image ファイルでは boot partition は FAT16 ではなく、最初から FAT32 で用意されていますが、残念なことに gparted には [ailure to move / resize fat32 partitions less than 256 MB in size](https://bugzilla.gnome.org/show_bug.cgi?id=649324) という issue があって、この 44MByte の partition を resize しようとすると fail します
なので、私はまだ FAT16 だった 2016年9月の jessie を拡張してから [Stretch に upgrade](https://qiita.com/mt08/items/278ef51e1d6c1259e098) して使っています



## 4. /boot のマウントオプションの変更
　[以前にも書いた](http://qiita.com/UedaTakeyuki/items/2d57c8c7001e0bbaaef1)のですが FAT にはそもそもユーザ権限というものがないので、下記のように /etc/fstab を変更して一般ユーザへの読み書きの権限を mount 時に与えます

```bash:/etc/fstab
proc            /proc           proc    defaults          0       0
# この行をコメントして下のように変更 
# /dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p1  /boot           vfat    auto,rw,user,users,exec,noatime,uid=1000,gid=1000,umask=000          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
```

## 5. MEDIA フォルダの作成
　これは必須ではないのですが、/boot フォルダ上に boot 関連のファイルとならんで直接ファイルを増やしていくことに少し躊躇しましたので、MEDIA フォルダを作り、こちらに例えば写真なら /boot/MEDIA/photo 以下に、ログデータなら /boot/MEDIA/log 以下にファイルを追加していくようにしました。


#考察
　/boot 領域をデータ保存領域に使うのは少し大胆で、例えば config.txt や cmdline.txt とかを消してしまったりすると（したことがないので詳細はしりませんが）多分起動しなくなったりすると思います。
　なので、他に windows と普通に（ファイルシステムの追加とかなしで）共用できる方法がないかいろいろと考えたのですが現時点でこれぐらいしか思いつかなかった、という少しみっともないご報告でございます
　ただ、ロガーのようにシングルユーザーでかつ出来上がっているプログラムを実行するだけの使い方の場合はそのようなリスクがそもそも小さい事、またそもそもroot に限られた操作とはいえ /boot へのリスクは元々あって、それを頻繁なバックアップ＆リストアで対応している事を鑑みますに、このご紹介させていただきました方法でも実用性はあるものと評価している次第でございます

# futur works
　FAT32 Pi を使って Raspberry Pi を安価な汎用ロガーとして利用することができます、また [Raspberry Pi のバックアップ＆リストアも便利になります](http://qiita.com/UedaTakeyuki/items/4a78c38b3070e8ef57e5)、このあたりの詳細のご説明を futur works とさせていただきたく、よろしくおねがいいたします 

# おまけ
　gparted なんて障りたくないけど FAT32 Pi ってどんなかんじにつかえるのか興味あるぞ、とお考えのクリエイティブな諸兄諸姉にお気軽にお試しいただけますよう、 ***私が８GB SD カード用につくったイメージを[こちら](http://gurnemanz.uedasoft.com/tools/150703/download.php)にご用意いたしました***（1GB 程で、ダウンロードに２時間ほどかかりそうです ^^;;;）
　内容は5月5日版（これを書いている時点での最新版です）の raspbian で、 /boot を FAT32化して、ついでにタイムゾーンとキーボードの設定、ssh の enable, boot into desktop の設定をしたものをイメージ化して圧縮いたしました。gzip -dc されたものを SD に dd してご利用いただければ幸いです

例：

```bash:
# 下記コマンドで、SDカードのデバイス名を確認。間違えたらPCが大変なことになるので要注意。他のUSBでバイスとの辛みもあって、毎回同じデバイス名になるとはかぎりません
diskutil list

# SD を unmount
sudo diskutil unmountDisk /dev/disk（ご自身の環境でのディスク番号）

# ダウンロードフォルダにダウンロードした fat32pi.2015.0703.gz を SD にディスクコピー
gzip -dc ~/Downloads/fat32pi.2015.0703.gz | sudo dd of=/dev/rdisk（ご自身の環境でのディスク番号） bs=1m
```

## 2018.09.26 補足
ダウンロードがやっぱり遅いみたいなので、最近作ったものを[私のPayhipのアカウント](https://payhip.com/b/ahwQ)にもご用意いたしました

## 2023.06.03 補足
そもそもダウンロードして自分で焼くというのがお忙しい日々を過ごされている諸兄諸姉にはご不興でしたようですので boot領域拡張した bullseye の SD カードそのものをそのままご[購入](https://sales005.stores.jp/items/647a982b1886eb0037a396a5)いただけるように対応いたしました  

お気軽にご利用ください、と言えればかっこいいんですが本当にお気軽にご利用されてしまうと私が持たないのでちょっとお気軽にご利用する気にはなれないような価格設定（私の主観ですが）にしてしまっておりまして逆にご不興どころじゃないご不満をお持ちになられるかもしれません
**本当に必要だけど本当に手は動かしたくない** という稀有な方に届けるための施策とご理解いただきご協力を賜ればければ至福の至にございます

## 2023.09.01 補足
時間がない、小さな事まで自分の手を動かしてる暇がない、時間はお金で買うものだ、という高踏かつ高邁な諸兄諸姉のために、**PC との共用領域** を **3GByte** に拡張した 32-BIT Bullseye の SD Card image を [payhip](https://payhip.com/b/zxmOu) にご用意致しました 
お手元の 8GB SD card に Raspberry Pi Imager で焼いてそのまま使えます