「アクセス権の修復」が消えた理由

macOSから「アクセス権の修復」が消えた。以前ディスクユーティリティから実行できたこの機能は、旧MacOS(OS 9以前)から存在する「Disk First Aid」の流れをくむもので、システム領域上のファイルアクセス権をあるべき状態に戻すことができた。

そのしくみは単純で、/var/db/receiptsディレクトリに保存されたレシートファイル(*.pkgのインストール後に保存される)と照合し、インストール時点のアクセス権に戻すというものだ。だからOSに標準装備されていないファイルなど、レシートファイルが存在しないファイル/ディレクトリは対象外だ。

「アクセス権の修復」がディスクユーティリティから消えたのはEl Capitanのとき。それは、ルートレスモードこと「System Integrity Protection」が導入され、ユーザが意図的にセキュリティを緩めないかぎり、システム領域の書き換えが不可能になったためだ。書き換えられないのだからアクセス権変更もありえず、よって関連機能は不要という理屈だろう。

ただし、El Capitanでは/usr/libexecディレクトリの「repair_packages」コマンド(/usr/libexec/repair_packages)を実行することで、ディスクユーティリティの「アクセス権の修復」に相当する機能を利用できた。Sierraでは"経過措置"をとる必要なしと判断されたのか、このコマンドは消えてしまい、もはやシステム標準の機能としてアクセス権を修復することはできなくなった。

Sierraでは「repair_packages」コマンドが消え、Terminalからアクセス権を修復することすらできなくなった

現在ディスクユーティリティに残る「First Aid」は、ストレージの検証および障がいの早期発見を狙う機能だ。実行すると起動ボリュームがロックされ、HFS Plusに対応する検査/修復プログラム(/sbin/fsck_hfs)が実行される。前述したとおり、Sierraのディスクユーティリティにアクセス権を修復する機能はないが、ストレージに致命的な問題が生じるときには"前ぶれ"があるものなので、定期的に実行することをお勧めしたい。

ディスクユーティリティに「First Aid」は残るが、fsck_hfsによるストレージの検査/修復しか行えない

それでもアクセス権を修復したい場合には

以上の経緯によりmacOSから姿を消した「アクセス権の修復」だが、必要とされる場面が完全に消失したとはいえない。

たとえば、System Integrity Protectionを無効化した状態でMacを利用しているとき。リカバリーモードでMacを起動し、Terminalから「csrutil disable」を実行すると、デフォルトでは制限されているシステム領域を変更できるようになるが、それは同時にアクセス権が変わる可能性も意味する。つまり、System Integrity Protectionを有効にしている場合には、アクセス権を修復しなければならない場面も出てくるというわけだ。

とはいえApple純正のアクセス権修復ツールはもはや存在しないため、サードパーティー製品に頼るしかない。幸い、「RepairPermissions V3」というフリーウェアが存在するため、それを利用してみよう。

上記URLからダウンロードしたZIPファイルを解凍すると、「RepairPermissions」という名前のバイナリファイル(コマンド本体)が生成されるので、これを管理者権限で実行する。本来は/usr/local/binなどパスの通ったディレクトリへコピーすべきだが、インストールするほどではない場合はカレントディレクトリを意味する「./」を添えればOK。最後の「/」はルートディレクトリを意味し、コマンドの作業対象すなわちアクセス修復権のサーチ対象をファイルシステムの先頭にしている。

なお、最初はSystem Integrity Protectionが有効な状態(「csrutil status」を実行して「enable」が表示される)で実行したほうがいい。そうすれば、システム領域が書き換えられることはないので、このようなある意味危険なコマンドでも安全に利用できる。

$ csrutil status
System Integrity Protection status: enabled.
$ sudo ./RepairPermissions /

「RepairPermissions」を実行しているところ。System Integrity Protectionが有効な状態で実行しているので、システム領域が書き換えられる危険性はない

これで、カレントディレクトリに「RepairPermissionsResults-20170125_103733.txt」などというログファイルが生成されるので、lessなどのページャを利用し内容をチェックしてみよう。意外なほどエラーが検出されるはずだ(筆者がしばらくSIPを無効化した状態で利用していたせいかもしれないが)。

実際にアクセス権を修正する場合は、Macをリカバリーモードで再起動し、「csrutil disable」を実行しもう一度再起動したうえで、前述のコマンドを実行しよう。もちろん、作業はAt your own riskで臨んでほしい。

「RepairPermissions」で生成されたログ。筆者の環境では、意外なほどエラーが検出された