2013年11月25日

[Homebrew] ClamXav導入後"brew update"がエラーになる

前記事に書いたとおり、MBA13のアンチウィルスソフトの入れ換え作業でClamXavをインストールした。この作業自体は特に問題なくできたんだけど、今日日課のHomebrewのアップデートを実行したら、下のようなエラーが出力された。
% brew update
error: unable to unlink old 'SUPPORTERS.md' (Permission denied)
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

こんな警告はいままで一度も見たことがない。最初はこの問題の原因が判らなかっただけど、色々調べていくうちに、どうやら昨日インストールしたClamXavが悪さをしていることが判った。
  • ClamXavは、/usr/localのパーミッションとオーナー情報を書き換えてしまう。

ClamXavの導入に伴ってClam AntiVirus(ClamAV)エンジンをインストールしたが、ClamAVエンジン関連のファイルは/usr/local/clamXavというディレクトリに格納される。このディレクリトはClamAVエンジンのインストーラが作成しているようだが、この際に上の操作が実行されているようだ。

ClamXavのインストール後に「brew doctor」コマンドを実行すると、下のような警告メッセージが表示された。
% brew doctor
Warning: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.

You should probably change the ownership and permissions of /usr/local
back to your user account.

ClamXavのインストール後に/usr/localのパーミッションとオーナー情報を確認すると、下のように変更されていた。
% ls -l /usr
total 8
drwxr-xr-x 8 root wheel 272 1 15 2011 X11
lrwxr-xr-x 1 root wheel 3 1 15 2011 X11R6 -> X11
drwxr-xr-x 1081 root wheel 36754 11 11 15:26 bin
drwxr-xr-x 4 root wheel 136 7 14 2011 etc
drwxr-xr-x 270 root wheel 9180 6 5 22:07 include
drwxr-xr-x 381 root wheel 12954 11 16 14:46 lib
drwxr-xr-x 109 root wheel 3706 11 11 15:26 libexec
drwxrwxr-x 7 root admin 238 7 28 2011 llvm-gcc-4.2
drwxr-xr-x 20 yuhri wheel 680 11 24 12:24 local
drwxr-xr-x 237 root wheel 8058 11 11 15:26 sbin
drwxr-xr-x 77 root wheel 2618 11 11 15:26 share
drwxr-xr-x 4 root wheel 136 1 15 2011 standalone

別のMacにインストール済みのHomebrewを確認したら、/usr/localのパーミッションは「drwxrwxr-x」、オーナー情報は「root:admin」になっていた。そこで、以下のコマンドを実行して元の状態に戻した。
% sudo chown root:admin /usr/local
% sudo chmod g+rwx /usr/local
% ls -l /usr
total 8
drwxr-xr-x 8 root wheel 272 1 15 2011 X11
lrwxr-xr-x 1 root wheel 3 1 15 2011 X11R6 -> X11
drwxr-xr-x 1081 root wheel 36754 11 11 15:26 bin
drwxr-xr-x 4 root wheel 136 7 14 2011 etc
drwxr-xr-x 270 root wheel 9180 6 5 22:07 include
drwxr-xr-x 381 root wheel 12954 11 16 14:46 lib
drwxr-xr-x 109 root wheel 3706 11 11 15:26 libexec
drwxrwxr-x 7 root admin 238 7 28 2011 llvm-gcc-4.2
drwxrwxr-x 20 root admin 680 11 24 12:24 local
drwxr-xr-x 237 root wheel 8058 11 11 15:26 sbin
drwxr-xr-x 77 root wheel 2618 11 11 15:26 share
drwxr-xr-x 4 root wheel 136 1 15 2011 standalone

この状態で「brew doctor」を実行したら、警告メッセージは表示されなくなった。

じつは、上記の原因に辿り着いたのは色々と試行錯誤した後だった。この問題が起きたときに「brew update」の警告メッセージをキーワードにしてググったら、最初は参考ページAがヒットした。そこで、このページに載っていたコマンドをそのまま実行してみた。
% sudo chown -R `whoami` /usr/local
% cd /usr/local
% git stash
Saved working directory and index state WIP on master: 8c95d23 mariadb: fix build with clang when boost is present
HEAD is now at 8c95d23 mariadb: fix build with clang when boost is present
% git reset --hard
HEAD is now at 8c95d23 mariadb: fix build with clang when boost is present

これで解決するだろうと期待して再度「brew update」を実行してみたが、残念ながら、同コマンドの警告メッセージが下のように変わっただけだった。
% brew update
error: The following untracked working tree files would be overwritten by merge:
Library/Aliases/git-tig
Library/Contributions/cmd/brew-bundle.rb
Library/ENV/4.3/ant
Library/ENV/4.3/g++-4.3
Library/ENV/4.3/g++-4.4
Library/ENV/4.3/g++-4.5
Library/ENV/4.3/g++-4.6
Library/ENV/4.3/g++-4.7
Library/ENV/4.3/g++-4.8
Library/ENV/4.3/g++-4.9
Library/ENV/4.3/gcc-4.3
Library/ENV/4.3/gcc-4.4
Library/ENV/4.3/gcc-4.5
Library/ENV/4.3/gcc-4.6
Library/ENV/4.3/gcc-4.7
Library/ENV/4.3/gcc-4.8
Library/ENV/4.3/gcc-4.9
Library/Formula/afio.rb
Library/Formula/amtterm.rb
Library/Formula/apib.rb
Library/Formula/batik.rb
Library/Formula/cattle.rb
Library/Formula/clens.rb
Library/Formula/cliclick.rb
Library/Formula/clipsafe.rb
Library/Formula/cookiecutter.rb
Library/Formula/cppi.rb
Library/Formula/curaengine.rb
Library/Formula/cvs.rb
Library/Formula/dnsperf.rb
Library/Formula/dynamodb-local.rb
Library/Formula/echoprint-codegen.rb
Library/Formula/ekhtml.rb
Library/Formula/evas.rb
Library/Formula/flac123.rb
Library/Formula/flawfinder.rb
Library/Formula/fsv.rb
Library/Formula/fuseki.rb
Library/Formula/geoipupdate.rb
Library/Formula/gnu-apl.rb
Library/Formula/gtksourceview3.rb
Library/Formula/gtksourceviewmm.rb
Library/Formula/gtksourceviewmm3.rb
Library/Formula/h2.rb
Library/Formula/hexchat.rb
Library/Formula/hidapi.rb
Library/Formula/influxdb.rb
Library/Formula/jena.rb
Library/Formula/jvmtop.rb
Library/Formula/lensfun.rb
Library/Formula/libbson.rb
Library/Formula/libestr.rb
Library/Formula/libfaketime.rb
Library/Formula/liblwgeom.rb
Library/Formula/libmaxminddb.rb
Library/Formula/libmongoclient.rb
Library/Formula/lsyncd.rb
Library/Formula/mahout.rb
Library/Formula/masscan.rb
Library/Formula/pssh.rb
Library/Formula/py3cairo.rb
Library/Formula/pygobject3.rb
Library/Formula/rats.rb
Library/Formula/rcs.rb
Library/Formula/saltstack.rb
Library/Formula/screenresolution.rb
Library/Formula/smartsim.rb
Library/Formula/snapraid.rb
Library/Formula/submarine.rb
Library/Formula/tag.rb
Library/Formula/tcc.rb
Library/Formula/tcptunnel.rb
Library/Formula/tegh.rb
Library/Formula/tracebox.rb
Library/Formula/transmission-remote-gtk.rb
Library/Formula/virtualpg.rb
Library/Formula/vncsnapshot.rb
Library/Formula/vramsteg.rb
Library/Formula/x11vnc.rb
Library/Formula/xsane.rb
Library/Formula/zbackup.rb
Library/Formula/zsh-history-substring-search.rb
Library/Homebrew/cmd/leaves.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

上の「error: Your local changes to the following files would be overwritten by merge:」というメッセージは、「git checkout」でいずれかのフォーミュラの旧バージョンの定義ファイルを取得している状態にときに表示されるものだが、Homebrewのインストール後に、上のファイルはいずれもいじっていない。なぜこんな警告が出力されるのか理由が判らなかった。

そこで、改めてこの問題についてググって調べたら、今度は参考ページBを見つけた。このページの内容を読んで、ClamXavをインストールした際に/usr/localのパーミションとオーナー情報を書き換えられてしまっていることに気がついた。上の一連の操作をやらないで、最初に/usr/localのパーミションとオーナー情報を元に戻しておき、その上で「brew update」は実行すれば、この問題はすんなりと解決できたんじゃないかということに思い至った。

brew update」で上のような警告メッセージが表示された理由は、一連のgitコマンドによって、フォーミュラ管理情報とフォーミュラ定義ファイルとの間に矛盾が生じているからじゃないかと推測される。この矛盾状態を復旧しないと「brew update」コマンドは通らないと思われるが、それでは一体どうやって復旧すれば良いんだろうとしばし悩んでしまった。悩んでいても仕方ないので、まずは、/usr/localのパーティションとオーナー情報をClamXavをインストールする前の状態に戻した。
% sudo chown root:admin /usr/local
% sudo chmod g+rwx /usr/local

そして、しばらくやっていないことを思い出しながら「brew docotor」を実行してみた。すると、下のような警告メッセージが表示された。
% brew docotor
Warning: You have uncommitted modifications to Homebrew
If this a surprise to you, then you should stash these modifications.
Stashing returns Homebrew to a pristine state but can be undone
should you later need to do so for some reason.
cd /usr/local/Library && git stash && git clean -d -f

うーん、このメッセージの意味は良く解らん。まぁ悩むよりやってみるのが吉かなぁ。取りあえず、上のコマンドを実行してみた。
% cd /usr/local/Library && git stash && git clean -d -f
No local changes to save
Removing Aliases/git-tig
Removing Contributions/cmd/brew-bundle.rb
Removing ENV/4.3/ant
Removing ENV/4.3/g++-4.3
Removing ENV/4.3/g++-4.4
Removing ENV/4.3/g++-4.5
Removing ENV/4.3/g++-4.6
Removing ENV/4.3/g++-4.7
Removing ENV/4.3/g++-4.8
Removing ENV/4.3/g++-4.9
Removing ENV/4.3/gcc-4.3
Removing ENV/4.3/gcc-4.4
Removing ENV/4.3/gcc-4.5
Removing ENV/4.3/gcc-4.6
Removing ENV/4.3/gcc-4.7
Removing ENV/4.3/gcc-4.8
Removing ENV/4.3/gcc-4.9
Removing Formula/afio.rb
Removing Formula/amtterm.rb
Removing Formula/apib.rb
Removing Formula/batik.rb
Removing Formula/cattle.rb
Removing Formula/clens.rb
Removing Formula/cliclick.rb
Removing Formula/clipsafe.rb
Removing Formula/cookiecutter.rb
Removing Formula/cppi.rb
Removing Formula/curaengine.rb
Removing Formula/cvs.rb
Removing Formula/dnsperf.rb
Removing Formula/dynamodb-local.rb
Removing Formula/echoprint-codegen.rb
Removing Formula/ekhtml.rb
Removing Formula/evas.rb
Removing Formula/flac123.rb
Removing Formula/flawfinder.rb
Removing Formula/fsv.rb
Removing Formula/fuseki.rb
Removing Formula/geoipupdate.rb
Removing Formula/gnu-apl.rb
Removing Formula/gtksourceview3.rb
Removing Formula/gtksourceviewmm.rb
Removing Formula/gtksourceviewmm3.rb
Removing Formula/h2.rb
Removing Formula/hexchat.rb
Removing Formula/hidapi.rb
Removing Formula/influxdb.rb
Removing Formula/jena.rb
Removing Formula/jvmtop.rb
Removing Formula/lensfun.rb
Removing Formula/libbson.rb
Removing Formula/libestr.rb
Removing Formula/libfaketime.rb
Removing Formula/liblwgeom.rb
Removing Formula/libmaxminddb.rb
Removing Formula/libmongoclient.rb
Removing Formula/lsyncd.rb
Removing Formula/mahout.rb
Removing Formula/masscan.rb
Removing Formula/pssh.rb
Removing Formula/py3cairo.rb
Removing Formula/pygobject3.rb
Removing Formula/rats.rb
Removing Formula/rcs.rb
Removing Formula/saltstack.rb
Removing Formula/screenresolution.rb
Removing Formula/smartsim.rb
Removing Formula/snapraid.rb
Removing Formula/submarine.rb
Removing Formula/tag.rb
Removing Formula/tcc.rb
Removing Formula/tcptunnel.rb
Removing Formula/tegh.rb
Removing Formula/tracebox.rb
Removing Formula/transmission-remote-gtk.rb
Removing Formula/virtualpg.rb
Removing Formula/vncsnapshot.rb
Removing Formula/vramsteg.rb
Removing Formula/x11vnc.rb
Removing Formula/xsane.rb
Removing Formula/zbackup.rb
Removing Formula/zsh-history-substring-search.rb
Removing Homebrew/cmd/leaves.rb

おお、先の「brew update」の警告メッセージで示されたファイルを消してくれているみたいだ。これで復旧できたかもと思いながら、ここで再度「brew update」コマンドを実行した。そうしたら、期待したとおり、今度は上手くいった。

Homebrewで問題が起きたら、一番最初に「brew doctor」コマンドを実行すべきなんだ。そうすれば、大抵の場合問題の解決につながるヒントが得られる。いやー、Homebrewの復旧ができて本当に良かった。一時はHomebrew環境の再構築をやらないとダメなのかと焦ってしまった。今回得た教訓。いままでやったことのない事を実行するときは、その前に丹念な下調べを必ずやるべし。

【参考ページ】

  1. homebrew - brew update したら「error: unable to unlink old 'XXXXXXX' (Permission denied)」 - Qiita [キータ]
  2. Homebrew and ClamXav – I am Yihang
タグ:Homebrew ClamXav
posted by とみやん at 13:31| Comment(0) | TrackBack(0) | 開発・プログラミング > Mac
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/81353606

この記事へのトラックバック