テクニカルプア

備忘録と若干の補足

/libが/usr/libへのシンボリックリンクになったことへの対応

 去る7月14日、Arch Linuxより以下のようなアナウンスがあった。

"All Arch Linux packages have had their files in the /lib directory moved to /usr/lib and now /lib is a symlink to usr/lib. "

http://www.archlinux.org/news/the-lib-directory-becomes-a-symlink/ より引用)

 実は私自身がこの事実を知ったのは一昨日(7月19日)なのだが。まあそれはともかく、試しにpacman -Syuをするとglibcあたりがエラーを吐いてアップデートできない。じゃあアナウンスにあるワークアラウンド通りにやろうとしてもエラーを吐き続ける。

 というわけで以下は私の環境における上記の仕様変更に対する対応である。環境やエラー出力などを控えるのを忘れてしまったのでマニュアルとしての価値はない。

 まずアナウンス通り以下を実行。

# pacman -Syu --ignore glibc
# pacman -Su

 アナウンスによれば"the simplest case"ではこれで全て完了するらしい。だが私の環境では以下のエラーが出力された。

error: failed to commit transaction (conflicting files)
glibc: /lib exists in filesystem
Errors occurred, no packages were upgraded.

 次にDeveloperWiki:usrlib(https://wiki.archlinux.org/index.php/DeveloperWiki:usrlib)を参照することにした。"Issue 2: The final "pacman -Su" still has conflicts in /lib"の"Packages that own files in /lib"の項目により、以下を実行。

grep '^lib/' /var/lib/pacman/local/*/files

 例によってエラーは失念したが、"/var/lib/pacman/local/glibc-2.15-7/files:"のような文字列が先頭についたエラーがぞろぞろ出てくるはずである。前述の"failed to commit~"というエラーは/lib以下にglibcと関係のないファイルが存在する場合出力されるエラーらしく、上のコマンドによって出力されるファイルの一覧はglibcに関係のないファイルとのこと。ArchWikiにはuninstallだのreinstallだのとあったが、pacmanに関係するファイルなんじゃないかとか思い悩もうとしたところで、see the next sectionの一文を見つけ、次の"Unpackaged files"の項を読むことにした。

 ここでも記事に倣って以下を実行する。

$ find /lib -exec pacman -Qo -- {} +

 ここでもまたボトボトといろんな文字列が出てくるが、その中でも"error: No package owns /lib/modules/3.1.9-2-ARCH/modules.*"(ArchWikiからの引用。実際には3.X.X-X-ARCHのXがカーネルの旧バージョンを指し示していた。私の環境では3.2.6-1-ARCHや3.2.6-2-ARCHであった)という文字列が出てくる。このNo package owns~というのは/lib以下(/lib/modules)に存在するがもうどこにも関係のないファイルであることを意味しており、つまりいらないファイルなのである。これは/usr/libへ移す必要があるので、以下を実行する。

# mv /lib/modules /usr/lib/modules/.

 これをやったあとに再びfindを走らせると、今度はglibcがownするファイルのみであるようなエラーがずらっと表示されるはずである。こうなったら準備完了である。以下を実行する。

# pacman -Su

 エラーも吐かれずに終わったら、以下を実行して/libが実際に/usr/libへのシンボリックリンクになっていることが確認できるはずである。

$ ls -l /
..
lrwxrwxrwx   1 root root     7 Jul  7 19:09 lib -> usr/lib
..

 参考