macOS で外付けディスクを常時マウントする
ailia SDK は Windows Mac iOS Android Linux といった様々な環境に対応する クロスプラットフォーム対応高速 CNN 推論エンジンです。
AVX や NEON といった各環境で利用可能な SIMD 命令に対応したり、GPGPU の性能を最大限引き出すため cuDNN や Metal の他に Vulkan などにも対応することで各環境での高速推論を実現しております。
— — — — —
株式会社アクセルでは、独自の機械学習推論エンジンである AILIA の開発に Jenkins CI を活用しています。
AILIA は、数多くのデバイスや OS をサポートしています。そのため、それぞれの環境で自動的にビルド・テストを行う CI は、製品の品質を保つために非常に重要なものとなっています。
しかし、macOS のバージョンごとに Mac の PC を用意するのは予算的にも厳しいものがあります。そのため、アクセルではそこそこハイスペックな Mac mini (2018) に VMware Fusion を導入して一部環境は仮想マシンの中でテストなどを行っています。
ここで問題になるのがホストマシンのディスク容量です。仮想マシンには数十 GB の容量が必要になり、内臓ディスクだけではそろそろ厳しくなってきました。
そんな訳で、USB 接続の外付け SSD を導入したわけですが、ここで問題が発生しました。
再起動するとなぜか外付け SSD がマウントされないのです。
これを解決した時のお話です。
結論
まず最初に結論を述べてしまうと、以下の行を /etc/fstab に書き足すだけで解決しました。
UUID=9217FB66-E6D7–48DF-3359–123EB31B3B4A /opt/mnt/work apfs rw,auto,owners,nobrowse,noexec,nosuid
ターミナルから表示してみてこのように1行だけ表示されればOKです。
ここで挙げている UUID は例示用にランダムに生成したものですが、実際には対象のディスクを示す UUID を書きます。マウントポイントも環境に合わせて。ポイントはオプションのフィールドに、autoと書くところだけです。
本題はこれで終わるのですが、これで終わってしまっては面白くないので、ここから先は macOS の自動マウントについて調べてみた内容を少し解説してみます。
macOS のディスク自動マウントの仕組み
macOS の起動時、/System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist に書かれている情報に従って、launchd が diskarbitrationd を起動します。このデーモンは、OS からの通知を受け取ることにより、必要に応じてディスクのマウントを行います。
man diskarbitrationd にも書いてある通り、その動作は通常の UNIX と同様に存在している /etc/fstab で制御できるとのことです。そんなわけで man fstab を読んだのですが、残念ながらオプションの一覧のようなものは書いてありませんでした。
仕方なく diskarbitrationd のソースコードを読むと、どうやら以下のルールで動いているようです。
- ディスクを認識した時に、そのディスクのプロパティを見ることで「リムーバブルディスク」か否か、「内蔵ディスク」か否か、をそれぞれ判定する
- /etc/fstab にそのディスクを示すレコードが存在した場合、auto オプションがあればマウントを行い、noauto オプションがあればマウントは行わない
- auto も noauto も存在しない場合は、システム設定によりマウントするか否かを決める
最初のプロパティについては、diskutil コマンドで実際に見ることができます。
$ diskutil info disk3s1 | grep -e Location -e Removable
Device Location: External
Removable Media: Fixed
この結果を見ると、どうやら disk3s1 は外付けディスクであり、リムーバブルディスクではないことがわかります。
2番目のルールは、要するに「システムデフォルトよりも fstab に書かれた auto/noauto の記述を優先する」という意味合いで理解した方がいいのかも知れません。上述の結論にある方法だとここで判定が確定します。
さて、最後にシステムデフォルトについてです。ソースコードによると、どうやら /Library/Preferences/SystemConfiguration/com.apple.DiskArbitration.diskarbitrationd.plist に書いてあるようです。plist ファイルの設定は defaults コマンドで編集できるので、次のコマンドで書き換えることができます。
$ sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.DiskArbitration.diskarbitrationd.plist DAMountDeferExternal -bool false
DAMountDeferExternal が外付けディスクの自動マウントを「無効化」するプロパティです。つまり、false にすると自動マウントするのでお間違いなきよう。設定が存在しなければ true とみなされます。他にリムーバブルディスクのためのパラメータとして DAMountDeferRemovable もあります。
システムデフォルトのさらにデフォルト値
ソースコードを読むと、DAMountDeferExternal が設定されていない場合のデフォルト値もあるようです。
$ sudo defaults write /Library/Preferences/SystemConfiguration/autodiskmount.plist AutomountDisksWithoutUserLogin -bool true
この設定を行うと、DAMountDeferExternal = false, DAMountDeferRemovable = false, DAMountTrustExternal = true がデフォルト値として扱われます。つまり、外付けディスクもリムーバブルディスクも自動マウントを行います。
最後の Trust は説明していませんでしたが、通常、外付けディスクを自動マウントする場合は「noowner,nosuid,nodev」をつけてマウントします。これは、外付けディスクなどですと、データとして誰が何を仕込んでいるかわからないので、念のためですね。
ここで DAMountTrustExternal が true になっていると、外付けディスクは「信用できる」ディスクとして、つまり mount のオプションとして上記のオプションがつかない設定となります。
なお、これらはあくまでデフォルト値の扱いになっていて、さらに個別で DAMountDeferExternal = true とすると、そちらが優先されます。
さて、では一方このデフォルト設定を無効化するには、設定値を falseとすればいいのかというと、実はそうではなく。
$ sudo defaults write /Library/Preferences/SystemConfiguration/autodiskmount.plist AutomountDisksWithoutUserLogin -bool false
とすると、DAMountDeferExternal = false, DAMountDeferRemovable = true, DAMountTrustExternal = true がデフォルト値として扱われます。
リムーバブルディスクの場合に自動マウントしなくなるだけで、外付けディスクの自動マウントは有効なまま(false のまま)ですね。完全に元の状態に戻したいときはこちらです。
$ sudo defaults delete /Library/Preferences/SystemConfiguration/autodiskmount.plist AutomountDisksWithoutUserLogin
ソースを読めば理解はできる仕様なのですが、なんとなく納得できない仕様ですね。あまりこちらの設定を使う有用性は思いつかないです。
fstab かシステム設定か
plist を編集してあげると、どのパラメータを使用しても /Volumes/DISK_LABEL みたいな名前でマウントされます。この場合、勝手にディスクラベルを使ってマウントポイントとなるディレクトリの作成も併せてやってくれますので、これはこれで便利そうです。
一方で、影響範囲が OS のシステム全体というのはある意味恐怖です。うっかり事故を防ぐためには、fstab に UUID でマッチングするのが安心感はある気がします。その代わりに、こちらの場合は最初からマウントポイントとなるディレクトリを作成しておかないとエラーになります。
今回の用途みたいに、常時稼働させていつも同じディスクを接続しているだけであれば、後者の方がいいような気もします。