Mac OS X 10.0 Cheetahから17代目を数える「macOS Big Sur」。同じタイミングでARMアーキテクチャへの移行を開始したこともあり、話題性の部分ではApple SiliconやRosettaに引けを取ってしまうが、システムの深層部分でもいくつか大きな変更が施されている。今回はそのひとつ「ボリューム構造」に目を向けてみよう。
ボリュームの「役割」
Big SurのTerminalで「df」コマンドを実行すると、Catalina以前とはだいぶ様子が異なることに気付くはず。/System/Volumesディレクトリ以下にマウントされているボリュームが多数あり、macOSのマウントポイントは「/Volumes」のはずでは? と思った向きは少なくないはずだ。
/Volumesは、ルート直下に確保されたディレクトリであり、ファイルの保存場所ではなく接続場所(マウントポイント)として活用される。USBメモリが認識されたとき、そのボリューム名が「USBMEM」であれば「/Volumes/USBMEM」、「EXTERNAL」であれば「/Volumes/EXTERNAL」としてファイルシステムに接続され、取り外し(アンマウント)されればそのボリューム名にはアクセスできなくなる。
マウントポイントすなわち/Volumesディレクトリという運用ルールは過去のもので、macOS High Sierra以降変化している。/Volumesのほかに「/System/Volumes」ディレクトリが用意され、内蔵ストレージに設けられた複数のパーティションはここにマウントされることになる。
その背景には、新しいフォーマット形式として採用された「APFS(Apple File System)」の特長がある。APFSでは、設けた複数のパーティションは独立したボリュームとして利用できるだけではなく、それぞれ特定の目的が与えられているのだ。
この動きはCatalinaのときスタートしている。それまで単独のボリューム「Macintish HD」だったものが、「Macintish HD」と「Data」に分割されたのだ。前者はRead-Onlyのシステム領域、後者は書き換え可能なユーザ領域という位置付けだ。
Big Surでは、この用途別にボリュームを分割するスタイルが強化された。「Preboot」はシステム起動用領域、「VM」は仮想メモリ領域、「Update」はシステムアップデート用領域などと、用途の細分化が進められている。Terminalで「df」または「diskutil list」コマンドを実行すれば、それらのボリュームを確認できるだろう。
ルートに読み書き自由なフォルダを作成する
APFSといえば、「Firmlink」も忘れてはならない。Catalinaのとき追加されたこの機能は、WWDCのセッションでBi-directional wormhole in path traversal -- 意訳すると「2つのファイルシステム間のワープトンネル」 -- と紹介されたように、不思議な効能をMacのファイルシステムにもたらす。
まずは、「/usr/share/firmlinks」の内容を確認しよう(cat /usr/share/firmlinks)。このファイルには、アプリを保存しておく「/Applications」、ユーザ別の作業領域を置く「/Users」のほか、システムが使用するキャッシュ領域「/System/Library/Caches」などのディレクトリが列挙されている。
Firmlinkは、「本来は書き込みできないシステムボリューム上のディレクトリをデータボリューム上の書き込み可能なディレクトリにリンクさせる」、または「データボリューム上の書き込み可能なディレクトリに本来は書き込みできないシステムボリューム上のディレクトリをリンクさせる」ためのもの。/usr/share/firmlinksは、その定義ファイルなのだ。
このFirmlinkのしくみを応用すると、あたかもルート直下に存在するフォルダを新規作成できる。Finderではルート直下にフォルダを作成できないし、Terminalで「sudo mkdir ~」とコマンドを実行してもリードオンリーのファイルシステムだと叱られてしまうが、Firmlinkを使えばうまくいく。
試しに、以下のコマンドラインを実行してほしい。順に説明すると、1行目では(管理者権限により)データボリュームのルートに「MyDir」というフォルダを作成し、2行目でそのオーナーをadminグループに属すカレントユーザに設定、3行目で「MyDir」というフォルダ名とパスを「/etc/synthetic.conf」へ書き込んでいる。その後システムを再起動してルートボリュームを表示すると、読み書き自由な「MyDir」フォルダが作成されている、という寸法だ。
なお、/etc/synthetic.confと/usr/share/firmlinksの書式はまったく同じで、各行に「フォルダー名 実体ディレクトリへのパス」を記載するというもの。本稿では入力ミスを防ぐため、echoコマンドを用いて/etc/synthetic.confを作成しており、その際「MyDir」と「System~」の間にタブ(\t)を出力している。ここをタブにしないと設定ファイルとして機能しないため、注意してほしい。
$ sudo mkdir -p /System/Volumes/Data/MyDir
$ sudo chown -R $USER:admin /System/Volumes/Data/MyDir
$ sudo sh -c "echo 'MyDir\tSystem/Volumes/Data/MyDir' > /etc/synthetic.conf"