pkgを1.3.7にアップグレードすると、インストール済み全パッケージの再インストールが求められる。
この回避方法について示す。
そもそも、なんでそんな事になっているかというと。
端的に言って、パッケージシステムでのshared libraryの扱いに難があったため、1.3.7でキッチリ修正したのだと。
その影響で、何も知らずにパッケージをアップグレードしようとすると、「shared libraryに変更があったため」と全パッケージを再インストールしようとしてしまう。
もちろん、別に全部再インストールしたって問題ないわけだが、帯域も時間も電気ももったいないので、再インストールを必要最低限に止める方法が公儀から発表された次第である。
詳細は以下をご覧あれ。
http://lists.freebsd.org/pipermail/freebsd-ports-announce/2014-August/000086.html
手順1.なにはともあれpkgを1.3.7に
2014/8/28現在である。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo pkg update Updating repository catalogue Fetching meta.txz: 100% of 944 B Fetching digests.txz: 100% of 2 MB Fetching packagesite.txz: 100% of 5 MB Removing expired entries: 100% Adding new entries: 100% Incremental update completed, 23466 packages processed: 23297 packages updated, 133 removed and 76 added. $ pkg version -vRL=|grep pkg pkg-1.3.6 < needs updating (remote has 1.3.7) |
キター。
さっそくpkgをアップグレードする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
$ sudo pkg upgrade pkg パスワード: Updating repository catalogue Fetching meta.txz: 100% of 944 B Fetching digests.txz: 100% of 2 MB Fetching packagesite.txz: 100% of 5 MB Incremental update completed, 23466 packages processed: 0 packages updated, 0 removed and 0 added. New version of pkg detected; it needs to be installed first. The following 1 packages will be affected (of 0 checked): Installed packages to be UPGRADED: pkg: 1.3.6 -> 1.3.7 The process will require 9 KB more space 2 MB to be downloaded Proceed with this action [y/N]:y Fetching pkg-1.3.7.txz: 100% of 2 MB Checking integrity... done (0 conflicting) [1/1] Upgrading pkg from 1.3.6 to 1.3.7: 100% Updating repository catalogue Fetching meta.txz: 100% of 944 B Fetching digests.txz: 100% of 2 MB Fetching packagesite.txz: 100% of 5 MB Incremental update completed, 23466 packages processed: 0 packages updated, 0 removed and 0 added. Checking integrity... done (0 conflicting) Your packages are up to date $ |
オゲ。
手順2.レポジトリカタログの強制更新とパッケージ解析
pkgをアップグレードした瞬間にレポジトリカタログの更新も走っている。
したがって、もう一回pkg updateする必要はないのだが、念のため手順に沿ってもう一回やる。
1 2 3 4 5 6 7 8 9 |
$ sudo pkg update -f Updating FreeBSD repository catalogue... Fetching meta.txz: 100% 944 B 0.9k/s 00:01 Fetching digests.txz: 100% 2 MB 291.4k/s 00:07 Fetching packagesite.txz: 100% 5 MB 294.8k/s 00:18 Processing new repository entries: 100% FreeBSD repository update completed. 23466 packages processed: 0 updated, 0 removed and 23466 added. $ |
当たり前だがアップデートも削除もなし。
次。
手順によるとpkg check -Baせよと。
これは何かというと、下記の通りインストール済みshared librariesを解析するものだそうな。
つまりこの解析の結果、全ファイル再インストールという事態を避けられるわけですな?
以下、-B, -aのオプション説明をmanから抜粋。
1 2 3 4 5 |
pkg check -B or pkg check --shlibs is used to reanalyse shared libraries of installed packages. -a, --all Process all packages. |
実行…するが、ひょっとすると時間がかかるかも。
仮想マシン、かつ750個くらいパッケージがある状態で1時間近くかかった。
しかし実マシン(hp microserver)、120個くらいで2分。
パッケージの数、装置スペックによって前後するだろうが覚悟のこと。
改めて実行。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo pkg check -Ba Checking all packages: 37% pkg: fstat() failed for(/usr/local/include/cdio++/enum.hpp): No such file or directory pkg: fstat() failed for(/usr/local/include/cdio++/mmc.hpp): No such file or directory pkg: fstat() failed for(/usr/local/include/cdio++/read.hpp): No such file or directory pkg: fstat() failed for(/usr/local/include/cdio/udf_file.h): No such file or directory pkg: fstat() failed for(/usr/local/lib/libcdio++.so): No such file or directory pkg: fstat() failed for(/usr/local/lib/libcdio.so): No such file or directory pkg: fstat() failed for(/usr/local/lib/libiso9660++.so): No such file or directory pkg: fstat() failed for(/usr/local/lib/libiso9660.so): No such file or directory pkg: fstat() failed for(/usr/local/lib/libudf.so): No such file or directory Checking all packages: 100% $ |
あとは通常通りpkg upgradeでよい。
理不尽な再インストールを求められることもありません。