(毎度のことですが)私はまだ 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. <br>(またリカバリモードで起動し、ターミナルを立ち上げる)
- In that terminal execute: `csrutil enable` <br>(ターミナルで `csrutil enable` を実行)
- Reboot back into OS X & you'll be able to write to `/usr/local` & install Homebrew. <br>(通常起動させれば書き込み可能な `/usr/local` が出来ているので [Homebrew をインストール](http://brew.sh/))
`csrutil` コマンドについては下に解説へのリンクを張りました。
## 2015/10/6追記:
[OS X v10.11 Release Notes](https://developer.apple.com/library/mac/releasenotes/General/rn-osx-10.11/index.html#//apple_ref/doc/uid/TP40016209) には
>- System file permissions are automatically protected, and updated, during Software Updates.<br>(システムファイルのパーミッションは、ソフトウェアアップデート実行中に自動的に保護されアップデートされる。)
との記載があります。つまり、 **Homebrew を `/usr/local` で使うならば、ソフトウェアアップデートを行う度に以下のパーミッション設定を行わないといけない** 可能性があります。
(2015/10/6追記ここまで)
## 【注意】`/usr/local` ディレクトリは通常のログイン状況からだと作れない
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">OS X 10.11 El Capitan、/usr/local/ は最初から存在するけど、間違って消しちゃうと二度と作れなくなる疑惑( ˘ω˘)</p>— watson (@watson1978) <a href="https://twitter.com/watson1978/status/643791559738023937">2015, 9月 15</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hsbt">@hsbt</a> こんな感じらしいです。疑惑が確信に変わった(´д`) <a href="http://t.co/vUH48XmUDf">pic.twitter.com/vUH48XmUDf</a></p>— watson (@watson1978) <a href="https://twitter.com/watson1978/status/643806139285553152">2015, 9月 15</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
>Yosemite のアップグレード時間を短縮するための hack でやっていたような /usr/local を退避して~というのを何も考えずにやると大いに事故る確率が高いという結果となった。
>- [El Capitan の rootless について, 黒船亭でディナー - HsbtDiary(2015-09-16)](http://www.hsbt.org/diary/20150916.html#p01)
ということで **`/usr/local` ディレクトリ丸ごとの移動は止めたほうが良いです**。
もちろん El Capitan でも上に引用して示したように、リカバリモードで `csrutil` コマンドを使えば `/usr/local` ディレクトリを作る設定にできるのですが…何度も再起動しなきゃいけないですし、面倒ですよね。
大事なことなので何度でも繰り返します。 **`/usr/local` ディレクトリは消さないようにしましょう**。
## `csrutil`解説リンク
> Appleは開発者向けにこのRootlessを操作するコマンド`csrutil`を提供しています。
:
`csrutil`コマンドの`clear`, `disable`, `enabled`オプションはリカバリーモードしか使用できない
>- [OS X 10.11 El Capitanのシステム保護機能「Rootless」を無効にするcsrutilコマンドの使い方。](http://applech2.com/archives/46435268.html)
# SIP/rootless参考リンク
- [System Integrity Protection - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/System_Integrity_Protection)
- [OS X 10.11 El Capitanのシステム保護機能のためSuperDuperやCarbon Copy Clonerなどのアプリが起動ディスクのバックアップを作成できなくなる状態へ。](http://applech2.com/archives/45523389.html)
- [OS X 10.11 El Capitanにアップデート: やったこととか気になってることとか](http://rcmdnk.github.io/blog/2015/10/01/computer-mac/)
# 末尾ながら
みなさまの Homebrew のインストールがトラブル無く終わりますよう、強く願っております。
### 書き終えてから
同様の目的でもっと読みやすい記事を見付けました(汗)
- [MacをOS X 10.11 El Capitanにアップデートし"/usr/local"ディレクトリを消してしまった場合、Homebrewをどの様にインストールすればよいのか?](http://applech2.com/archives/46442082.html)
# おまけ: `/usr/local` 以外に Homebrew をインストールする
「**`/usr/local` じゃなく他のディレクトリへインストールしておけば rootless も関係ないんじゃね?**」というコメントを多数頂きましたので、そのやり方も書いておきます。
なお、 **Homebrew 作者は現状、 `/usr/local` 以外へのインストールを推奨していません**。
また、以下の方法で何らかの問題が生じても、**当方は責任を負いません**。
基本的にはインストールしたいディレクトリの直上で `git clone git://github.com/homebrew/homebrew.git` すれば `homebrew` ディレクトリを作ってインストールしてくれます。
もちろんパスはちゃんと通しましょう。ただし、
> `/sw` と `/opt/local` はそれぞれ Fink と MacPorts が使うディレクトリなので避けましょう。
> - [homebrew/Installation](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md#untar-anywhere)
### 参考リンク
> Homebrew のインストール先は、デフォルトでは `/usr/local` になっています。
インストール先を `/opt/homebrew` にするには、以下のようにします。
(以下略)
>- [Homebrew のインストール先を変更する - Qiita](http://qiita.com/usamik26/items/601f5612bd3f8a21cc41)
## 別ディレクトリにインストールする具体例1
- [homebrew/Installation](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md#untar-anywhere)
には以下のコマンド例が記載されています。
mkdir homebrew && curl -L https://github.com/Homebrew/homebrew/tarball/master | tar xz --strip 1 -C homebrew
このコマンドでは、いま居るディレクトリの直下に `homebrew` ディレクトリを作り、そこに Homebrew をインストールします。
もちろん `homebrew/bin` へパスを通しておく必要があります。
## 別ディレクトリにインストールする具体例2
[Linuxbrew](http://brew.sh/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` でインストール先を教えてくれます。