先日、Raspberry Pi Zero WをUSBメモリにする記事を書いた。
これにより、Raspberry Pi Zero WはUSBメモリとして振る舞うことができる。で、このUSBメモリに書き込まれた内容を利用するために、Raspberry Pi Zero W側から参照する必要がある。参照するために、マウントしたい。
このあたりの考察。
この考察はあくまでも僕の憶測である。ちゃんとコードを読んだわけではないし、ちゃんと実験しているわけでもない。
結論から言えば、マウントするのはリスクがある。
先日の記事では、イメージファイルを使用編とパーティションを使用編の二つのやり方を書いている。
どちらのパターンでも、マウント自体は可能である。(実験済み)
ただ、マウントしたとして、その内容を読み込む際に問題が発生することが避けられないと思われる。
僕の想像するg_mass_storageを使用している最中にマウントしたときの状況が上の図である。
exFAT Driverは自分がデバイスを占有していると思っている。
一方、exfat fuseも自分がデバイスを占有していると思っている。
他人がデバイスを更新するなんて想像していない。
ということで、同時に書き込みが発生したり、書き込んでいる最中に読み込みが発生したりすると、予測不能の事態になると予想される。
というのは、一般的にこの手のドライバはメモリ上に一旦内容を保持してからデバイスに転送する、逆に一旦メモリ上の内容を保持したものはデバイスと内容が一致していることを想定する、という動作が一般的だからだ。
USBメモリを取り外すという作業がWindowsで必要なのはこの手の動作に依存するからだ。USBメモリをいきなり引っこ抜くと壊れるのはこれが理由である。ただ最近のWindowsの動作ってUSBメモリをいきなり引っこ抜いてもあんまり壊れないところを見ると、このあたり、できるだけ即座に書き込むようになってきている気がする。
ということで、ベストな答えは、
- 同時使用をしない
- USBメモリを外してから(すなわちg_mass_storageがデバイスを使用しなくなってから)Raspberry Pi Zero W側でマウントし、利用する。
- USBメモリとして使う際は、Raspberry Pi Zero W側のマウントをはずす。
- または、両者読み込み専用で利用する
である。
100歩譲って、
- 同時使用をしない
- USBメモリ側から書き込む場合は、Raspberry Pi Zero W側を読み込み専用にする
- Raspberry Pi Zero W側から書き込む場合は、USBメモリ側は読み込み専用にする
である。
では、一方から書き込んだ場合、読み込み専用側では、どのタイミングで書き込まれた内容がみえるのか。という疑問が出る。
この疑問ですら答えは不定である。ドライバの実装方法による。
読み込み専用側では、自分がデバイスを占有していると思っているので、一旦メモリに保持した内容はずっと更新されないことが多い。なので、書き込まれた内容がいつまでたっても見えない。
さらっと実験した結果、
Raspberry Pi Zero W側ではマウントした瞬間の状況が見える
ということは確定である。ただマウントされた状態でUSBメモリ側から書き込みがされた内容が見えるかどうかは、不定。FAT32のときは見えるけど、exFATだと見えない。ただ、これも、アンマウントして再度マウントしなおすと最新に更新されるっぽい。
Windows側ではUSBが接続された瞬間の状況がみえる
ということも確定しそう。ただつなぎっぱなしでRaspberry Pi Zero W側から書き込みしても、(FAT32、exFATかかわらず)Windows側からは見えない。USBをはずして、再度接続しなおせば見える。
考えれば当たり前のことなんだけど、考えるまでは、都合よく見える気がしてたんだよね。世の中そんなに甘くないわ。
SDカードのWiFi機能付きのやつってこのへんどーしてるんだろう。デジカメで使われるから、書き込みは確定なのかも。