(毎度のことですが)私はまだ El Capitan をインストールしてません(2015/10/22に El Capitan v10.11.1 Update が出ましたしヒトバシラーの時期も過ぎた気配なので、そろそろ入れても安心かも)。
Homebrew 周辺に関するメモ書きです。
El Capitan を入れる前に OS X 10.11 El Capitanにアップデートするさいの注意点まとめ。 も一読されることをお勧めします。
SIP/rootlessの影響
米国時間 2015/9/30 から提供され始めた OS X 10.11/El Capitan では、新しいセキュリティである System Integrity Protection (SIP、別名 rootless)が動作しています。 SIP/rootless に関しては、末尾に解説記事などの参考リンクを列挙しておきます。簡単に言えば、 SIP/rootless の管理範囲内には特殊なフラグ(EA (Extend Attribute)、ls
では-l@
で存在が確認出来る)が立っており、それにより動作の許可/制限が行われるようです。
このため、SIP/rootless の管理範囲内である /System
, /bin
, /sbin
, /usr
だとユーザは ( sudo
したとしても)作業することが出来ないようです。
Homebrew が使う /usr/local
以下はいちおう SIP/rootless の管理範囲外なのですが、 /usr
で新規ディレクトリが作れないので、 El Capitan では通常のログイン状況からだと /usr/local
ディレクトリを作ることが出来なくなっています(csrutil
コマンドで SIP/rootless を外しておくことも出来るが、セキュリティ的に好ましくない)。
推奨方法:El Capitanへアップグレードする前にHomebrewを入れてしまう
If you don't already have homebrew installed, do that first, so you don't have to deal with SIP issues.
既に Homebrew をインストールしている環境から El Capitan へのアップグレードを行う場合、
と同じ状況が生じる(OSのインストーラが /usr/local
内のファイルなどを一旦退避させて、その後にまた /usr/local
へ戻すので、時間が掛かってしまう)と考えられます。
この対応策としては /usr/local
ディレクトリ以下を 整頓/縮小しておくほうが好ましい と思われます。ただし /usr/local
ディレクトリ丸ごとの移動は止めたほうが良いです (理由は別記しています)。
El Capitanインストール後にパーミッションの設定を行う
以下、homebrew/El_Capitan_and_Homebrew.md を引用・私訳します。
パーミッションに問題がある場合には以下の手順で修正を行います。
/usr/local
がある場合$ sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local
上記コマンドを実行して /usr/local
の所有権を適切にしてから Homebrew をインストールすればいいようです。
/usr/local
がない場合
- Reboot into Recovery mode (Hold Cmd+R on boot) & access the Terminal.
(リカバリモード(⌘+R を押しながら起動)で起動し、ターミナルを立ち上げる)- In that terminal run:
csrutil disable
(ターミナルでcsrutil disable
を実行)- Reboot back into OS X
(通常起動する)- Open your Terminal application and execute:
(ターミナルで以下のコマンドを実行)$ sudo mkdir /usr/local && sudo chflags norestricted /usr/local && sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local
- Reboot back into Recovery Mode & access the Terminal again.
(またリカバリモードで起動し、ターミナルを立ち上げる)- In that terminal execute:
csrutil enable
(ターミナルでcsrutil enable
を実行)- Reboot back into OS X & you'll be able to write to
/usr/local
& install Homebrew.
(通常起動させれば書き込み可能な/usr/local
が出来ているので Homebrew をインストール)
csrutil
コマンドについては下に解説へのリンクを張りました。
2015/10/6追記:
- System file permissions are automatically protected, and updated, during Software Updates.
(システムファイルのパーミッションは、ソフトウェアアップデート実行中に自動的に保護されアップデートされる。)
との記載があります。つまり、 Homebrew を /usr/local
で使うならば、ソフトウェアアップデートを行う度に以下のパーミッション設定を行わないといけない 可能性があります。
(2015/10/6追記ここまで)
【注意】/usr/local
ディレクトリは通常のログイン状況からだと作れない
OS X 10.11 El Capitan、/usr/local/ は最初から存在するけど、間違って消しちゃうと二度と作れなくなる疑惑( ˘ω˘)
— watson (@watson1978) 2015, 9月 15
@hsbt こんな感じらしいです。疑惑が確信に変わった(´д`) pic.twitter.com/vUH48XmUDf
— watson (@watson1978) 2015, 9月 15
Yosemite のアップグレード時間を短縮するための hack でやっていたような /usr/local を退避して~というのを何も考えずにやると大いに事故る確率が高いという結果となった。
ということで /usr/local
ディレクトリ丸ごとの移動は止めたほうが良いです。
もちろん El Capitan でも上に引用して示したように、リカバリモードで csrutil
コマンドを使えば /usr/local
ディレクトリを作る設定にできるのですが…何度も再起動しなきゃいけないですし、面倒ですよね。
大事なことなので何度でも繰り返します。 /usr/local
ディレクトリは消さないようにしましょう。
csrutil
解説リンク
Appleは開発者向けにこのRootlessを操作するコマンド
csrutil
を提供しています。
:
csrutil
コマンドのclear
,disable
,enabled
オプションはリカバリーモードしか使用できない
SIP/rootless参考リンク
- System Integrity Protection - Wikipedia, the free encyclopedia
- OS X 10.11 El Capitanのシステム保護機能のためSuperDuperやCarbon Copy Clonerなどのアプリが起動ディスクのバックアップを作成できなくなる状態へ。
- OS X 10.11 El Capitanにアップデート: やったこととか気になってることとか
末尾ながら
みなさまの Homebrew のインストールがトラブル無く終わりますよう、強く願っております。
書き終えてから
同様の目的でもっと読みやすい記事を見付けました(汗)
おまけ: /usr/local
以外に Homebrew をインストールする
「/usr/local
じゃなく他のディレクトリへインストールしておけば rootless も関係ないんじゃね?」というコメントを多数頂きましたので、そのやり方も書いておきます。
なお、 Homebrew 作者は現状、 /usr/local
以外へのインストールを推奨していません。
また、以下の方法で何らかの問題が生じても、当方は責任を負いません。
基本的にはインストールしたいディレクトリの直上で git clone git://github.com/homebrew/homebrew.git
すれば homebrew
ディレクトリを作ってインストールしてくれます。
もちろんパスはちゃんと通しましょう。ただし、
/sw
と/opt/local
はそれぞれ Fink と MacPorts が使うディレクトリなので避けましょう。
参考リンク
Homebrew のインストール先は、デフォルトでは
/usr/local
になっています。
インストール先を/opt/homebrew
にするには、以下のようにします。
(以下略)
別ディレクトリにインストールする具体例1
には以下のコマンド例が記載されています。
mkdir homebrew && curl -L https://github.com/Homebrew/homebrew/tarball/master | tar xz --strip 1 -C homebrew
このコマンドでは、いま居るディレクトリの直下に homebrew
ディレクトリを作り、そこに Homebrew をインストールします。
もちろん homebrew/bin
へパスを通しておく必要があります。
別ディレクトリにインストールする具体例2
Linuxbrew でのインストール先は ~/.linuxbrew
です。これに倣ってホームディレクトリ以下の ~/.brew
にインストールしたいならば、上記具体例1を真似て
cd && mkdir .brew && curl -L https://github.com/Homebrew/homebrew/tarball/master | tar xz --strip 1 -C .brew
とすれば良いでしょう。もちろん git がインストール済みならば
cd && git clone git://github.com/homebrew/homebrew.git .brew
でもいけるようです。
そして ~/.brew/bin
へパスを通しましょう。
いま使っている brew コマンドのインストール先がどこか分からなくなったら
brew --prefix
でインストール先を教えてくれます。