-->

2011-03-31

revdep-rebuildでエラーのままファイルを消したのでコンパイル自体ができない例

システムの更新に失敗した例です。

(1) revdep-rebuild --library 'libmpfr.so.1'に失敗しているが、
rm '/usr/lib64/libmpfr.so.1'を行うと、その後インストールできなくなる。

バイナリパッケージをemergeでインストールできるので、1個前のバージョンを
再インストールして、/usr/lib64/libmpfr.so.1がある状態に戻す。
$ sudo PORTAGE_BINHOST=http://tinderbox.dev.gentoo.org/default-linux/amd64/ emerge -avgK --oneshot =dev-libs/mpfr-2.4.2_p3

(2) eselect pythonでバージョンを変更していないが、
emerge --depclean -av で消した場合にemergeなどが動作しなくなる。

emergeが動作しないのでバイナリパッケージのpython2.6を手動でダウンロードしてインストールする。
$ wget http://tinderbox.dev.gentoo.org/default-linux/amd64/dev-lang/python-2.6.6-r2.tbz2
$ tar xvjf python-2.6.6-r2.tbz2
$ cp -pri usr/ /

(3) crossdevでi686-pc-linux-gnu用のインストールをすると、
/usr/libexec/gcc/i686-pc-linux-gnu/ld: crt1.o: No such file: No such file or directoryで失敗する。

新しいcrossdevを使用する。
$ sudo ACCEPT_KEYWORDS="~amd64" emerge --oneshot -av =sys-devel/crossdev-20110310
$ sudo crossdev -t i686-pc-linux-gnu --binutils 2.20.1-r1 --gcc 4.4.5 --kernel 2.6.36.1 --libc 2.11.3



以下は詳細。
更新前のバージョンのバイナリをインストールする。
$ sudo PORTAGE_BINHOST=http://tinderbox.dev.gentoo.org/default-linux/amd64/ emerge -avgK --oneshot =dev-libs/mpfr-2.4.2_p3

cpuごとにURLを変更する。この場合x86だと下記のようなエラーになる。
- sys-devel/gcc-4.4.5 (masked by: CHOST: i686-pc-linux-gnu)
- dev-libs/mpfr-2.4.2_p3 (masked by: ~amd64 keyword, CHOST: i686-pc-linux-gnu)

cpuごとのディレクトリの一覧が見える。
http://tinderbox.dev.gentoo.org/default-linux/

再度実行する。
$ sudo revdep-rebuild --library 'libmpfr.so.1'
# これは成功時に実行する。
# rm '/usr/lib64/libmpfr.so.1'

エラーの内容。
$ sudo revdep-rebuild --library 'libmpfr.so.1'
...
emerge: there are no ebuilds to satisfy "cross-powerpc-unknown-linux-gnu/gcc:powerpc-unknown-linux-gnu-4.3".

emerge: searching for similar names...
emerge: Maybe you meant any of these: dev-ruby/osmlib-base, dev-ruby/kirbybase, dev-ruby/snmplib?
 *
 * revdep-rebuild failed to emerge all packages.

黒箱用のコンパイラが古いままだった。古いので使う場合は再度入れるはずなので消す。
$ grep gcc /etc/portage/package.mask
>cross-powerpc-unknown-linux-gnu/gcc-4.3.4
#>cross-i686-pc-linux-gnu/gcc-4.4.3-r2
>=cross-i686-pc-linux-gnu/gcc-4.4.4
$ grep cross-powerpc-unknown-linux-gnu /var/lib/portage/world
cross-powerpc-unknown-linux-gnu/binutils
cross-powerpc-unknown-linux-gnu/gcc
cross-powerpc-unknown-linux-gnu/glibc
cross-powerpc-unknown-linux-gnu/linux-headers
$ sudo emerge -Cav cross-powerpc-unknown-linux-gnu/binutils cross-powerpc-unknown-linux-gnu/gcc cross-powerpc-unknown-linux-gnu/glibc cross-powerpc-unknown-linux-gnu/linux-headers

まずバイナリインストールの古いバージョンを手動で更新してからrevdep-rebuildする。
$ sudo emerge --oneshot -avt =dev-libs/mpfr-3.0.0_p3
$ sudo revdep-rebuild --library 'libmpfr.so.1'

lddなどで確認する。その後消す。
$ ldd /usr/libexec/gcc/x86_64-pc-linux-gnu/4.4.5/cc1
        linux-vdso.so.1 =>  (0x00007fff8c7e2000)
        libmpfr.so.1 => /usr/lib/libmpfr.so.1 (0x00007fa81fc9e000)
        libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007fa81fa45000)
        libc.so.6 => /lib/libc.so.6 (0x00007fa81f6eb000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa81feed000)
$ ldd /usr/libexec/gcc/x86_64-pc-linux-gnu/4.4.5/cc1
        linux-vdso.so.1 =>  (0x00007fff56fff000)
        libmpfr.so.4 => /usr/lib64/libmpfr.so.4 (0x00007f7092c8e000)
        libgmp.so.3 => /usr/lib64/libgmp.so.3 (0x00007f7092a35000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f70926da000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f7092ee2000)
$ sudo rm '/usr/lib64/libmpfr.so.1'

カーネル更新する。
$ cd /usr/src/
$ sudo rm -i linux
$ sudo ln -s linux-2.6.36-gentoo-r8 linux
$ sudo genkernel --kernel-config=/etc/kernels/kernel-config-x86_64-2.6.36-gentoo-r5 all

/usr/share/genkernel/arch/x86_64/modules_loadはソフトを更新すると初期化するので、
たぶんコマンドで指定できるような気がする。

ブートローダーの再インストール。
$ grub
device (hd0) /dev/sda
root (hd0,0)
setup (hd0)
device (hd0) /dev/sdb
root (hd0,0)
setup (hd0)
quit

depclean実行後にpython関連が動かなくなった。
$ sudo emerge --depclean -av

python-updaterが失敗しているっぽい。(eselectで変更していないのが原因)
手動でバイナリパッケージを再インストールする。
$ wget http://tinderbox.dev.gentoo.org/default-linux/amd64/dev-lang/python-2.6.6-r2.tbz2
$ tar xvjf python-2.6.6-r2.tbz2
$ cp -pri usr/ /

一応入れなおす。
$ sudo emerge --oneshot -avt =dev-lang/python-2.6.6-r2
上書きの警告が出る。
 ...
 * This package will overwrite one or more files that may belong to other
 ...

2.7に変更する。
$ eselect python list
$ sudo eselect python set --python2 2
$ sudo python-updater ${options}
 * Starting Python Updater...
 * Main active version of Python:  2.7  <= たぶんここが2.6だった。
 * Active version of Python 2:     2.7  <= たぶんここが2.6だった。
 * Active version of Python 3:     3.1
 *   Adding to list: app-admin/pessulus:0
 ...
 大量に続く。
 ...
>>> Emerging (1 of 78) app-emulation/emul-linux-x86-baselibs-20110129

trampは本体にあるので消す。
$ sudo emerge -Cav app-emacs/tramp
$ equery files emacs | grep tramp | wc -l
25

確認して2.6を消す。
$ sudo emerge --depclean -av -p
$ eselect python list
$ sudo emerge --depclean -av

普通の更新コマンドを最初から。
$ sudo emerge --update --deep --newuse --verbose --tree --with-bdeps=y --ask world
$ sudo emerge --depclean -av
$ sudo revdep-rebuild
 ...
 *  !!! /usr/lib64/python2.6/lib-dynload/_bsddb.so not owned by any package is broken !!!
 *   /usr/lib64/python2.6/lib-dynload/_bsddb.so -> (none)
 ...

確認して消す。
$ equery belongs /usr/lib64/python2.6/lib-dynload/_bsddb.so
[ Searching for file(s) /usr/lib64/python2.6/lib-dynload/_bsddb.so in *... ]
$ equery belongs /usr/bin/less
[ Searching for file(s) /usr/bin/less in *... ]
sys-apps/less-436 (/usr/bin/less)

2.6のディレクトリは?
$ equery belongs /usr/lib64/python2.6
[ Searching for file(s) /usr/lib64/python2.6 in *... ]
sys-libs/tdb-1.2.1 (/usr/lib64/python2.6)

再インストール。
$ sudo emerge --oneshot -avt =sys-libs/tdb-1.2.1

消えた。
$ equery belongs /usr/lib64/python2.6
[ Searching for file(s) /usr/lib64/python2.6 in *... ]

flashの更新をした。
http://labs.adobe.com/downloads/flashplayer10_square.html
http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p3_64bit_linux_111710.tar.gz
$ ll ~/.mozilla/plugins/
合計 0
lrwxrwxrwx 1 usui usui 36 2010-11-02 00:26:13 libflashplayer.so -> /home/usui/plugins/libflashplayer.so
usui@amdgentoo ~ $ ll ~/plugins/
合計 10360
-rw-r--r-- 1 usui usui 10606256 2010-11-17 09:10:13 libflashplayer.so

消した。
$ sudo rm -i /usr/lib64/python2.6/lib-dynload/_bsddb.so
$ sudo revdep-rebuild -i

消した。なぜかroot権限では無いのでとりあえずsudo無しで消したら消えたのでびっくりした。
$ equery belongs /usr/lib64/python2.6/
[ Searching for file(s) /usr/lib64/python2.6 in *... ]
$ ll /usr/lib64/python2.6/
合計 28
drwxr-xr-x 3 usui usui  4096 2011-03-27 17:04:24 bsddb/
drwxr-xr-x 2 usui usui  4096 2011-03-28 06:23:43 lib-dynload/
drwxr-xr-x 2 usui usui 20480 2011-03-28 05:42:48 test/
$ rm -rf /usr/lib64/python2.6/

消した。
$ ll /usr/lib64/ | grep usui
drwx------  3 usui usui     4096 2011-03-28 06:00:38 mozilla/
$ equery belongs /usr/lib64/mozilla/
[ Searching for file(s) /usr/lib64/mozilla in *... ]
$ rm -rf /usr/lib64/mozilla/

/usr/lib64/python2.6/のディレクトリがrootではなくなっていた、の関連で、
ディレクトリが一部rootではなくなっていた。操作したユーザーになっていた。
$ find /usr/ -user 1000 | grep -v /usr/local/
$ sudo chown root.root /usr
$ sudo chown root.root /usr/share/
$ equery belongs /usr/share/mozilla
$ sudo rm -rfi /usr/share/mozilla
$ sudo chown root.root /usr/share/doc
$ sudo chown root.root /usr/share/man
$ sudo chown root.root /usr/share/man/man1
$ sudo chown root.root /usr/bin
$ sudo chown root.root /usr/lib64
$ sudo chown root.root /usr/include/

他もおかしそうなので全部再インストールした。
# emerge -eav system
# emerge -eav world

crossdevが失敗する。
* Emerging cross-glibc-headers ...
 * glibc failed :(
 * If you file a bug, please attach the following logfiles:
 * /var/log/portage/cross-i686-pc-linux-gnu-info.log
 * /var/log/portage/cross-i686-pc-linux-gnu-glibc-headers.log

/var/log/portage/cross-i686-pc-linux-gnu-glibc.log によればエラーはcrt1.oが無い。
/usr/libexec/gcc/i686-pc-linux-gnu/ld: crt1.o: No such file: No such file or directory

使用するバージョンを下げても関係なかったので少し新しいcrossdevを使用すると成功した。
$ sudo ACCEPT_KEYWORDS="~amd64" emerge --oneshot -av =sys-devel/crossdev-20110310
$ sudo crossdev -t i686-pc-linux-gnu --binutils 2.20.1-r1 --gcc 4.4.5 --kernel 2.6.36.1 --libc 2.11.3

自動で変わる。/etc/portage/package.mask
>cross-i686-pc-linux-gnu/binutils-2.20.1-r1
>cross-i686-pc-linux-gnu/gcc-4.4.5
>cross-i686-pc-linux-gnu/linux-headers-2.6.36.1
>cross-i686-pc-linux-gnu/glibc-2.11.3

使う側を書き換え。/etc/portage/package.mask
>sys-devel/binutils-2.20.1-r1
>sys-devel/gcc-4.4.5
>sys-kernel/linux-headers-2.6.36.1
>sys-libs/glibc-2.11.3
同じバージョンにする前にdistccをoffにしたほうが安全。同じバージョンにした後に有効にする。