デバイスのunmountとeject

2016年4月14日

diskutil自体はmacOSのコマンドですが、デバイスのunmountとejectの違いについて確認します。

unmountとejectの違い

RASPBIANのインストールのところでdiskutilのunmountとejectを使い分けています。どちらも似たような単語ですが、どのような違いがあるのでしょう?

Apple Support CommunitiesにEjectとUnmountの違いについての質問スレッドがありました。 ここに非常にシンプルな回答があります。

You unmount a volume, and eject a drive. For optical drives you can unmount the volume but the disk will still remain in the drive.

ボリュームをunmountしてドライブをejectするんだ。光ディスクみたいなリムーバブルメディアをunmountしても、ディスク自体はドライブの中に残っているってことさ。

乱暴に言えばunmountはあくまでOS上でディスクとして扱わないだけでハードウェア的にはつながったままということです。

VFS

ちょっと細かい話をします。

UNIXでは通常、ハードディスクなどをVFS(Virtual File System)というものを介して操作します。ハードディスクとかメモリカードとか、普段はその違いを意識せずに使っていますがモノが違うのだから実際のデータの読み書きで実行している操作も本当は違います。

これを抽象化しているのがVFS。VFSを通して見るとハードディスクもメモリカードも同じに見える。だからアプリケーションプログラムはデータの書き込み先が何なのかを意識する必要なく同じ処理を書くことができます。オブジェクト指向だね。

で、unmountとejectの話。

mountはこのVFSに登録している状態でunmountはVFSから取り外された状態。でもVFSに登録されていないだけでデバイスとしては存在しているので、unmount後もdislutil listでデバイス名が表示されるというわけ。

ddで直接ディスクデータを扱う

今回のようにディスクのデータ(実際にはマイクロSDカードだけど)を直接操作する場合、何かの拍子に他のプログラムがアクセスしないようにVFSから取り外す必要はありますが、データ自体の読み書きはするので物理的な接続は残しておく必要があります。なのでunmountして通常のディスクとして扱えない状態にしています。

これに対し、ejectはいわゆるUSB機器等の取り外しに当たる操作です。だからddの読み書き処理が終わってマイクロSDカードを取り外す際にeject処理をしているわけです。取り外し可能状態になっているのでddでの書き込みはできません。

unixdevice

Posted by Takeru