Mac
Windows
RaspberryPi
raspbian

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


English version of this contents is available here.

Also My made the Latest (Sep, 2018 version ) image with 4GB boot area for 8GB SD Card is available on my Payhip account for saving your time.


始めに

 Raspberry Pi を使ったソリューションを御紹介させて頂いておりますと 「その撮影した写真や取得したセンシングデータが入っている SD カード、なんで PC でそのまま読み書きできないの?」と苦言を頂くことが度々あります。因に、こういうシチュエーションで言われる PCとは Windows PC の事のようです

スクリーンショット 2015-07-03 21.31.27.png

 これまではこういう時にファイルシステムの違いを技術的に説明したり、 Samba や FTP でネットワーク経由で読み書きできると説明したりして御不興を買っていたのですが、鈍い私も 「理屈はいいからPCで読めるようにして!」というリクエストであった事を最近やっと理解しました。

 つきましては Windows PC と 共用できる Raspbian のSD カード FAT32Pi なるものを作ってみましたので、その旨こちらにご報告させていただきました次第にございます

 別に大げさな事をしているわけではなく、一言で言ってしまうと単に boot パーティションをFAT32にしてデータ保存域と共用にしましたというだけなのでございますが、持ち前の説明の下手さ故、無駄に長文になってしまいました事、謹んでお詫びさせていたします次第にございます


なにが問題なのか


1. 解決しようとする課題

 以下は理屈ですので御興味のない方はこの章を飛ばして頂いても大丈夫です。

 以前にも書いたのですが、Raspberry Pi の SDカードは基本的にブートローダーが入っている FAT の領域と、ブートローダーから起動される ext4 の領域の二つ(ブート対象を切り替えられる NOOBSとかは多分もっと沢山)の領域からなっています。これは Raspberry Pi のブートシーケンスが BCM2835 (Pi2 だと後継のBCM2836)の内蔵のブートローダーが SD カードの FAT を探してきて、その中の二次ブートローダーを起動する をうまく利用していることが理由です

スクリーンショット 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

Mac はこれでいいのですが

スクリーンショット 2015-07-03 23.05.53.png

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

スクリーンショット 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

 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 をインストールして使っています


インストール

sudo apt-get install gparted


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

スクリーンショット 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



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

スクリーンショット 2015-07-03 9.43.21.png


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

スクリーンショット 2015-07-03 9.44.04.png


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

スクリーンショット 2015-07-03 9.44.22.png


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

スクリーンショット 2015-07-03 9.45.11.png


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

スクリーンショット 2015-07-03 9.45.46.png


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

スクリーンショット 2015-07-03 9.46.36.png


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

スクリーンショット 2015-07-03 9.46.51.png


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

スクリーンショット 2015-07-03 9.47.01.png

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

スクリーンショット 2015-07-03 9.47.10.png


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

スクリーンショット 2015-07-03 9.48.34.png


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

スクリーンショット 2015-07-03 9.59.26.png


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

スクリーンショット 2015-07-03 10.00.01.png


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

スクリーンショット 2015-07-03 10.00.47.png


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

スクリーンショット 2015-07-03 10.01.05.png


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

スクリーンショット 2015-07-03 10.01.24.png


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

スクリーンショット 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 という issue があって、この 44MByte の partition を resize しようとすると fail します

なので、私はまだ FAT16 だった 2016年9月の jessie を拡張してから Stretch に upgrade して使っています


4. /boot のマウントオプションの変更

 以前にも書いたのですが FAT にはそもそもユーザ権限というものがないので、下記のように /etc/fstab を変更して一般ユーザへの読み書きの権限を mount 時に与えます


/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 のバックアップ&リストアも便利になります、このあたりの詳細のご説明を futur works とさせていただきたく、よろしくおねがいいたします


おまけ

 gparted なんて障りたくないけど FAT32 Pi ってどんなかんじにつかえるのか興味あるぞ、とお考えのクリエイティブな諸兄諸姉にお気軽にお試しいただけますよう、 私が8GB SD カード用につくったイメージをこちらにご用意いたしました(1GB 程で、ダウンロードに2時間ほどかかりそうです ^^;;;)

 内容は5月5日版(これを書いている時点での最新版です)の raspbian で、 /boot を FAT32化して、ついでにタイムゾーンとキーボードの設定、ssh の enable, boot into desktop の設定をしたものをイメージ化して圧縮いたしました。gzip -dc されたものを SD に dd してご利用いただければ幸いです

例:

# 下記コマンドで、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のアカウントにもご用意いたしました