Mac
OSX
homebrew
elcapitan

HomebrewはEl Capitanへアップグレードする前に入れておく

More than 3 years have passed since last update.

(毎度のことですが)私はまだ 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追記:

OS X v10.11 Release Notes には



  • System file permissions are automatically protected, and updated, during Software Updates.
    (システムファイルのパーミッションは、ソフトウェアアップデート実行中に自動的に保護されアップデートされる。)


との記載があります。つまり、 Homebrew を /usr/local で使うならば、ソフトウェアアップデートを行う度に以下のパーミッション設定を行わないといけない 可能性があります。

(2015/10/6追記ここまで)


【注意】/usr/local ディレクトリは通常のログイン状況からだと作れない


Yosemite のアップグレード時間を短縮するための hack でやっていたような /usr/local を退避して~というのを何も考えずにやると大いに事故る確率が高いという結果となった。


ということで /usr/local ディレクトリ丸ごとの移動は止めたほうが良いです

もちろん El Capitan でも上に引用して示したように、リカバリモードで csrutil コマンドを使えば /usr/local ディレクトリを作る設定にできるのですが…何度も再起動しなきゃいけないですし、面倒ですよね。

大事なことなので何度でも繰り返します。 /usr/local ディレクトリは消さないようにしましょう


csrutil解説リンク


Appleは開発者向けにこのRootlessを操作するコマンドcsrutilを提供しています。

 :

csrutilコマンドのclear, disable, enabledオプションはリカバリーモードしか使用できない



SIP/rootless参考リンク


末尾ながら

みなさまの 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 でインストール先を教えてくれます。