Error opening file /tmp/ct.shutdown, err = Operation not permitted からの回復方法
朝、iMacを立ち上げると、以下のようなエラーが出て、vagrantが動かなくなり、回復に結構手間取りました。
CoreTelephony tracing has failed, you may be out of disk space.
Details 'Error opening file /tmp/ct.shutdown, err = Operation not permitted
ディスクの容量が足りないかもしれません、みたいなことを言われていますが、そこは全然関係ありません。
以下に原因と回復手順を残しておきます。
原因
ネット上の情報では、いくつか原因があるように見受けられましたが、筆者の場合は、
/private/tmp
ディレクトリのパーミションに drwxrwxrwt@ のように、EA(Extended Attriutes)が付与されており、拡張属性の内容が、
com.apple.rootless
だったためです。
なぜ/private/tmp に rootless が付与されたのかはわかりません。
ちなみにEAについては、
http://d.hatena.ne.jp/kanonji/20100912/1284292517
をご覧ください。
EAはMACでファイルに別途付与される拡張情報です。
ここに、El Capitanから、rootlessという属性が追加されたそうです。
http://applech2.com/archives/45140708.html
rootlessの属性は、root権限でもファイル・ディレクトリを編集できないようにする特殊な属性です。
rootlessはセキュリティを高めるための仕組みですが、今回はこの属性が/private/tmp に付与されているため、幾つかのプログラムの起動と、プログラムのインストールに影響が出ました。
/private/tmp ディレクトリにrootlessが付与されてしまっているかどうかは、
xattr /private/tmp
で分かります。
解決方法
基本的には
https://www.reddit.com/r/mac/comments/55s9yg/getting_an_error_message_on_startup_coretelephony/
の手順にのっとります。
簡単に翻訳すると、
この問題は /tmp ディレクトリのパーミションが原因です。
このパーミションを変更しようとしても、通常は変更できません。
システムは、SIPと呼ばれる'System Integrity Protection'によって守られているからです。
パーミションを変更する場合は、先にSIPを無効化する必要があります。
こちらを試してください:
MACをリカバリーモードで起動してください。
MACの再起動時に、Command + R を押しっぱなしにします。アップルのロゴが現れるまで押し続けましょう。
画面上部のメニューのユーティリティからターミナルを起動します。
ターミナル画面で、'csrutil disable'と入力してエンターを押します。
MACを再起動します。
MACの再起動後、コマンドを打ち込みます。 'sudo chmod 1777 /tmp'
もしくは、OnyX 3.1.8 for OS X 10.11 El Capitanをダウンロードして、OnyXを使用してパーミションを変更します。
(筆者はアプリを使用していないので、上のアプリへのリンクは原文を参照してください)
アプリでのパーミションの変更が終わるか、'sudo chmod 1777 /tmp'のコマンドがうまくいったら、MACを再起動します。
パーミションを変更できたら、以下の1〜4のステップを実行して、SIPを有効にしてください。
- 先ほどと同じようにMACの再起動中に Command + Rをアップルのロゴが現れるまで押し続けます。
- ユーティリティからターミナルを開きます。
- ターミナルで 'csrutil enable' と入力して、Enterを押します。
- MACを再起動します。
(補足:/tmp ディレクトリは /private/tmp ディレクトリへのシンボリックリンクです。)
ただし、私の場合は、上記のようにSIPを切っても、/private/tmp の権限を変更できませんでした。
また、以下のようにEAを除去しようとしてみましたがダメでした。
su -
xattr -c /private/tmp
xattr -d com.apple.rootless /private/tmp
(SIPがオフでもrootlessは除去できないのでしょうか。今度時間がある時にちゃんと検証したいです)
最終的には、SIPを無効化した後、一旦 /private/tmp ディレクトリを、以下のように削除後、
su -
rm -r /private/tmp
再度ディレクトリを作成して
mkdir /private/tmp
パーミションを付与しなおすことで直りました。
chmod 1777 /private/tmp
以上、参考になれば幸いです。