2015年8月3日月曜日

Debian unstable (sid)やexperimentalと上手く付き合う方法

はじめに

数日前の更新で、libstdc++6がlibboost-date-time1.55.0とconflictして、それにdependしているlibreoffice-coreがuninstall対象になり、それにdependしているLibreOffice (LO)全体が連鎖的にuninstallされる……という状態に陥った。

Unstableやexperimentalで遊んでいる (desktop目的に常用している)人ならばしょっちゅう遭遇するであろう実に微笑ましい光景である。

丁度LibreOffice 5がexperimentalに入ったみたいなので試してみたいと思ったのだが、それ以前にLO4.xシリーズもこの不具合でuninstallされるのは頂けないので、workaroundでごまかしてみる。

Debian package systemに関する基礎知識

apt-getやaptitudeを用いたpackage管理の仕組みで知るべきことは多くない。

1. それぞれのpackageはdependency (依存関係)を書いたcontrol fileを含む
2. package systemはcontrol fileの内容を見てdependencyを知る

原因と対策

* libreoffice-coreがlibboost-date-time1.55.0にdependしている
* libboost-date-time1.55.0はlibstdc++6により"breaks"に指定されている

つまり、libstdc++6のbreaks指定を削除すればlibboost-date-time1.55.0がuninstallされず、従ってlibreoffice-coreがuninstallされることも、芋蔓式にLO全体がuninstallされることもない。

Debianのpakage managementの仕組み及び原因と対策を踏まえると、次の2つの方法が考えられる。

1. libstdc++6の"Breaks"指定を変更した新しいオレオレpackageを作ってinstall
2. libboost-date-time1.55.0のversionをごまかす (動作するか未確認)

今回は1.の方法を採用した。

workaroundの実態

1. /var/cache/apt/archives/以下からbinary packageを入手し/tmp/以下へcopy
2. dpkg-deb -x <PKG>で中身を展開する。こちらは今回これ以上手を付けない
3. dpkg-deb --controlでcontrol fileがDEBIAN/以下に展開される
4. DEBIAN/controlを適当なtext editorで編集する (今回の場合、Breaks:の行からlibboost-date-time1.55.0を削除し、packageのversionを1上げておく)
5. dpkg -b <DIR> <package.deb>でpackageを作成し、それをinstallする

Unstableやexperimentalとの付き合い方 (まとめ)

* 必要がなければ手を出さない
* そのうち解決されるので気長に待つ or bug reportを出して対策してもらう
* workaroundで一時的にごまかす、凌ぐ

最後に、aptitudeのように強力なdependency解決手段を提供してくれるtoolと仲良くなると幸せになるに違いない。