macOS で /home を作る方法

技術者っぽいことを書いておこう.

macOS においては一般に /Users/{user} が user のホームディレクトリとして配置され, これは Linux の作法とは異なるものである.

では macOS において /home を配置することができるかと言われると, 部分的に NO である.

というのも macOS においてはネットワーク系のリソースなどを接続する際にそれらを autofs が /home/{name} に mount するためである. 従って macOS においては /home は異なる用途で用いられている.

しかし autofs の挙動は絶対ではない; この挙動は実際無効化することができるし, 以下で述べる設定が優越する.

まずそもそも /home を勝手に作ろうとした動機としては, /Users/{user} の /Users がキモかったためである. そんでもって APAppleFSFilesystem の subvolume を作ろうと思った時に, 名前に迷って結局 "Home" にしたため, /home に mount しようという運びになった.

いや "Home" なら /Home に mount しろよ! と言われても Nix がそうやってるんだからそこはなんか従っておこうかなって ... (?)

では /home を自己流に管理する方法であるが, そのためには第一に macOS が /root をどのように扱っているかを知る必要がある.

Linux に慣れている場合これは直感的ではないが, macOS において /root は単に partition / volume の root, ではなく, boot 時に作られる read-only filesystem として構築される. 従って起動後に任意の directory を /root に配置することはできない; 特権でも, である.

ではどうするのかというと, ここでは synthetic.conf に変更を加える必要がある.

Determine Nix を導入している場合, 少なくとも "nix" のエントリが存在する.

さて synthetic.conf には 2 つの機能がある. 1 つは /root に任意の directory を作成する機能, もう 1 つは任意の path を mount する 機能である. ちなみに "nix" のエントリは後者を使っていない.

では /home を作るためにまず builtin SSD の APFS に "Home" subvolume を作成する. Disk Utility.app を使うより "diskutil apfs" を使った方がいいと思う.

次に synthetic.conf に "home" のエントリを作成する. ここで "Home" subvolume を /home に mount して欲しいため, "home Volumes/Home" と指定する.

ではこれで /home を "Home" subvolume に紐づけることができたので, 次に autofs に \midline{キレる}機能を無効化してもらう 必要がある. これは auto_home, auto_master, autofs.conf を編集することになる.

具体的には autofs.conf が autofs そのものの設定, auto_master がマッピングの根っこ, auto_home は auto_master から参照される子設定である. どっちを編集したかは忘れたが, まあとにかく /home のエントリを無効化すれば良い.

これら (-) synthetic.conf の編集 (-) autofs の設定 を反映させるには再起動をするしかないので, \midline{渋々}再起動する. すると /home が "Home" subvolume に \str{symlink} で紐づけられているはずである.

ただし subvolume 作成時にパスワードによる暗号化を設定した場合, 少なくとも初回起動時にはパスワードの入力を求められるため, これを入力しないと /home にはアクセスできない. KeyChain に永続化してしまうか, 暗号化を設定しないか, 毎回入力するか, のいずれかになる.

さてこれで半月ほど運用していたのだが, 問題があった ... physical path は /Volumes/Home のままなのである. Claude Code や direnv などは physical path を参照するため, project directory は常に /Volumes/Home を指しており, これは, 嬉しくない.

であるからして, 腰を上げて今日処理したのが "Home" subvolume を \str{physical path で} /home に mount する, という設定である. これは寧ろ存外簡単であった.

Linux に慣れている場合, fstab の扱いは知っているはずだが, ともかく, macOS においても fstab が存在する. ただし前述の通り synthetic.conf が /root に関する挙動を定義したりするため, Linux に比べて fstab の用途は限りなく少ない.

今回はエントリを `UUID={uuid} /home apfs rw,nobrowse` として追加した. ここで synthetic.conf のエントリを "home {path}" のまま再起動しても synthetic.conf の方が優越するので設定が反映されない (1 敗) ので忘れずに "home[EOL]" として編集すること.

つまりまとめると設定はこう (-) synthetic.conf で "home[EOL]" エントリを作成し, /home を作成する (-) fstab で "Home" subvolume" を /home に mount する であった.

さてここで先に零していたが, autofs の設定が気がついたら元に戻っており, autofs の auto_home が再有効化されていた (いつの間に?). しかし auto_home は /home が使えない場合, /System/Volumes/Data/home を使うようになっているため, 競合するというより auto_home が fallback し, synthetic.conf + fstab の設定が\str{優越}しているようであった (伏線回収).

そんなこんなで autofs のことは忘れていただいて構わないが, 改めて (-) synthetic.conf (-) fstab の設定により "Home" subvolume を /home に mount することができた.

余談だが, ".DocumentRevisions-V100" ".DS_Store" ".fseventsd" ".Spotlight-V100" ".TemporaryItems" ".Trashes" といった macOS 特有のゴミが /home 即ち "Home" subvolume の root に配置されるため, 気になる場合は直下ではなく subdirectory に作業環境を構築するのが良い.

また何故 "/home/{user}" を用いなかったのかと言われると, いや, おひとり様 macOS で {user} とか切る必要ある? 混乱するのはウチで働いてる LLM だけですけど ... となった次第. わざわざ /home\ul{/{user}}/... と path が冗長になられても別に嬉しくないので.