Mac信者のHackintosh修行

惑星で一番美しいOSが1台でも多くのマシンで動くことを目指します。

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

f:id:siroanko:20180710170425p:plain

昨夜、おそらく最後の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をマウントするためのシェルスクリプトを紹介しました。

siroanko.hatenablog.com

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

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

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

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

siroanko.hatenablog.com

この方式は、ログインするときに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/Library/LaunchAgents/
  • /System/Library/LaunchDaemons/
  • /Library/LaunchAgents/
  • /Library/LaunchDaemons/
  • ~/Library/LaunchAgents/

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

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

  • LaunchDaemonsフォルダに設定ファイルを置くプログラムは、サーバや常駐プログラムのようなデーモンであり、これはroot権限で機能します。
  • LaunchAgentsフォルダに設定ファイルを置くプログラムは、ログインしたユーザごとに、ユーザの権限で起動されます。/Library/LaunchAgents/には、全ユーザ共通で起動したいプログラムを、~/Library/LaunchAgents/には、特定ユーザのみで動作するプログラムの情報を書きます。
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.hatenablog.siroanko.ESPbackup</string>

        <key>Program</key>

        <string> /Users/siroanko/Documents/Hackintosh/backup_scripts/ESPBackupZ97A.command

        </string>

        <key>RunAtLoad</key>

        <true/>

</dict>

</plist>

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

  • Labelはこのプログラムを特定するための名前です。名前の作り方は全く自由ですが、他のファイルの例を見ると、開発者のURLを逆に書くことで、特定が簡単になる工夫をしているようです。 それに倣って、このブログのURLに機能名を加えて命名しました。
  • Programキーは、プログラムの場所です。ここはフルパスで書いておきます。起動時にはパスが張られていない可能性がありますので、エラーを引き起こさないために全部書いて置くのが良いです。
  • RunAtLoadは、Launchdがこのプログラムをロードしたときに実行するかどうかを決めます。

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

$ cd /Library/LaunchDaemons/

$ sudo vi com.hatenablog.siroanko.plist

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

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

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

#!/bin/sh

ESPUUID=00000000-0000-0000-0000-000000000000

BACKUP=/Users/siroanko/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の内容

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

  • /Library/LaunchDaemons/
  • /Library/LaunchAgents/
  • ~/Library/LaunchAgents/

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