サイトアイコン Boot macOS

10.13.6でESPをマウントする権限が変更される

更新:古い情報です。こちらの方法が良いと思います。(2018/9/8)

昨夜、おそらく最後のHigh Sierraになる10.13.6が配布されました。すでに配布されているMojave Public Betaを使っていて気づいた変更点が、早々と10.13.6で導入されていました。大したことではないのですが、ESPパーティションをdiskutil mountコマンドでマウントする場合に管理者権限のパスワードが必要になりました。例えば、今までは、disk0s1にあるESPは、diskutil mount /dev/disk0s1 でマウントすることができました。しかし10.13.6で同じコマンドを実行すると、

$ diskutil mount /dev/disk0s1
Volume on disk1s1 failed to mount
If the volume is damaged, try the "readOnly" option

のようにエラーが出てしまいます。readOnlyでマウントしても同様です。

$ sudo diskutil mount /dev/disk0s1

として、この後、パスワードを入力する必要があります。

ESPをマウントするためのシェルスクリプト(改訂版)

以前、ESPをマウントするためのシェルスクリプトを紹介しました。

EFIシステムパーティション(頭文字を並べてESP)には、Cloverブートローダとかconfig.plist…
ESPをマウントするためのシェルスクリプト - Boot macOS

上記で紹介したスクリプトのdiskutil mountの行を、sudoで実行するように以下のように変更する必要があります。

sudo diskutil mount /dev/disk${DRIVE}s1

ESPを自動バックアップする方法(改訂版)

やはり、以前、ESPを自動でバックアップする方法を紹介しました。これも、パスワードが必要になったことで対応する必要があります。

Hackintoshを作る際に、macOSをバニラな状態でインストールすれば、Hackintoshで加える変更…
ESPを自動バックアップする - Boot macOS

この方式は、ログインするときにAutometorで作ったアプリケーションを起動する方法でした。これもパスワードに対応していないので、動かなくなってしまいました。パスワードを求めるように変更するのも良いのですが、いちいち、ログインするごとに、パスワードを入力するのは面倒です。

そこで、macOSが起動した直後に、root権限でESPをバックアップする方法に変更することにしました。Launchd (ローンチデーモン)を使います。

Launchdを使う

以下のサイトなどでLaunchdの説明がされています。

qiita.com

コンピュータが起動したときに特定のプログラムを自動的に実行させる仕組みに、Linuxだとrcスクリプトがあります。大昔のDOSにはautoexec.batというのがありました。また、UNIX系OSでは、ある時間になったら特定のプログラムを自動的に実行させる仕組みにcronがあります。

このような仕組みを実現するために、macOSにはLaunchdがあります。これでrcスクリプトとcronの両方の機能を実現しています。ちなみに、cronはmacOSにも搭載されています。特定日時、時間、時間間隔でプログラムを実行させたい場合には、Launchdの他にcronも使うことができます。

Launchdでは、動かそうとするプログラム1つに対して、設定ファイルを1個用意します。これは、 launchd.plist と呼ばれる各種 XML ファイルです。以下に説明がありました。

ka-zoo.net

launchd.plistは、 以下のいずれかの場所に置きます。

/System以下はmacOSが必要とするサーバなどのプログラムを置く場所であり、触らない方が良いでしょう。そもそもSIPで保護されているので簡単には変更できません。

なので、自作プログラムの設定ファイルを置くとしたら、/LIbrary以下か、もしくは~/Library以下になります。LaunchAgentsとLaunchDaemonsフォルダの違いは次のようです。

launchd.plistを作る

今回のESPバックアッププログラムは、macOSが起動した時点で、root権限で一回だけ起動させたいと考えました。root権限で起動すれば、diskutil mountでのパスワード入力も不要なはずです。ということで、/Library/LaunchDaemons/に設定ファイルを入れることにしました。

そこで、以下のようなXMLファイルを作成して、/Library/LaunchDaemons/に置きます。このディレクトリにはすでに他のplistファイルが置かれているかもしれません。それを参考にしても良いです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
<string>com.bootmacos.ESPbackup</string>
        <key>Program</key>
        <string> /Users/bootmacos/Documents/Hackintosh/backup_scripts/ESPBackupZ97A.command
        </string>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>

このplistにはいくつかのキーを設定できますが、今回は、最小限の3個だけ使いました。

この他、常駐させるかどうかのキーもありますが、デフォルトで常駐しない設定なので、省略しました。この内容を、

$ cd /Library/LaunchDaemons/
$ sudo vi com.bootmacos.ESPbackup.plist

として、/Library/LaunchDaemons/以下に作ります。ファイルの名前も自由なのですが、これも特定しやすいように、URLを逆にして命名するのが一般的のようです。

バックアップスクリプトを用意する

次に、実際にESPのバックアップを行うスクリプトを作成します。保存場所と名前は、上で作成したlaunchd.plistの内容に合わせます。スクリプトの内容は、Automatorで使ったものとほぼ同じです。パーティションUUIDの探し方は、以前の記事をみてください。

#!/bin/sh
ESPUUID=00000000-0000-0000-0000-000000000000
BACKUP=/Users/bootmacos/Documents/Hackintosh/currentConfig/MSIZ97AG7/
diskutil unmount $ESPUUID
diskutil mount $ESPUUID
rsync -av --delete --exclude '.*' /Volumes/EFI/ $BACKUP
diskutil unmount $ESPUUID

最初のdiskutil unmountのコマンドは本来なら不要です。ただ、これが無い状態では、次のdiskutil mountコマンドがtimed outというエラーを表示して、うまく動作しないことがありました。ネット上で調べたら念のためにunmountしておくとエラーが出ないとあり、それを真似ました。快調に動いています。

また、rsyncのパラメータに–excludeを追加しました。ピリオドで始まる隠しデレクトリーは不要なので、バックアップから外しました。

ここでは、root権限で起動するのでsudoをしていません。これでパスワードの入力をすることなく、ESPパーティションをマウントして、バックアップできるようになりました。

完成したら実行可能に設定しておきます。

$ chmod a+x ESPBackupZ97A.command

Launchd.plistの内容

今回、以下のディレクトリを見たところ、意外なファイルが入っていました。

すでに使っていないドライバやアプリに関するplistや、心当たりがあまり無いplistなどです。macOSをクリーンインストールすると、これらのディレクトリは全て空です。なので、何かが入っているとしたら、アプリケーションのインストーラなどにより後から入れられたものです。特に、/Library/LaunchDaemons/はマシンが起動したら必ず起動して、しかもroot権限で動くプログラムです。時々はチェックして、起動するプログラムを把握して、おかしな設定が残っていたら削除するのが良いかと思います。

モバイルバージョンを終了