pkgコマンドが何らかの要因で壊れてしまい、pkgコマンド自体の再インストールすらできず詰んでしまったときの対処方法を示す。
お急ぎの方は「蘇生方法」からお読みください。
背景: pkgはベースシステム?package?
pkgコマンドは、ベースシステムに組み込まれていながら、pkgシステムで管理されている。
言い換えると、ベースシステムに含まれているのに追加ソフトウェアとしてのpackagesでもある、というちょっと変わった存在である。
これは、pkgコマンド自体を、OSのバージョンに固定されることなく、更新できるための仕組み。
pkgコマンドが純然たるベースシステムであった場合、pkgコマンドを更新するたびにOSリリースが発生してしまうからである。
だから、皆さんご存知の通り、初めてpkgコマンドを実行すると最新のpkgをダウンロード&インストールするのだが、それは上記のような理由である。
なお、ここでの「ベースシステム」とは、FreeBSD projectがリリースする一式(カーネル+ユーザランド)を指す。packagesはユーザが任意に追加するソフトウェア。
問題: pkgはpackageなのでpkgが壊れると詰む。
よろしい。背景は、わかる。
しかし、問題もあって、すなわち;
pkgコマンドもpkgngで管理しているので、pkgコマンドが壊れてしまった場合、pkgの再インストールができず詰む
ということである。
たとえば、pkgコマンドが依存しているshared objectが無くなったとか、壊れた場合である。
FreeBSDではこういう場合に備えて、/rescueにスタティックリンクされたコマンドが並べられているが、pkgはここにない(9.2-RELEASEで確認)。
どうしたらよいか。
蘇生方法: pkgコマンドをダウンロードして、それでpkgコマンドをインストールせよ。
結論。pkgのpackageにはスタティックリンクされたpkgが含まれているのでそれを使う。
以下、手順。
pkgコマンドのダウンロード
まず、pkg.freebsd.orgからpkgコマンドのpackageをダウンロードする。
OSバージョン、アーキテクチャに合ったpackageを選ぶこと。
9.2 i386なら、以下
http://pkg.freebsd.org/freebsd:9:x86:32/latest/Latest/pkg.txz
10.0 amd64なら、以下
http://pkg.freebsd.org/freebsd:10:x86:64/latest/Latest/pkg.txz
※URLは変わる可能性があるので、都度、確認すること。
pkg.freebsd.orgから辿っていけばよい。
実行例
$ uname -a
FreeBSD ascomoid 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r255898: Fri Sep 27 03:52:52 UTC 2013 root@bake.isc.freebsd.org:/usr/obj/usr/src/sys/GENERIC i386
$ fetch http://pkg.freebsd.org/freebsd:9:x86:32/latest/Latest/pkg.txz
pkg.txz 100% of 1811 kB 53 kBps 00m34s
pkg-staticの取り出し。
以下のようにしてpkg-staticを取り出す。
このpkg-staticがスタティックリンクされたpkg
$ tar xvf ./pkg-1.2.4_1.tgz -s",/.*/,,g" "*/pkg-static"
x pkg-static
pkgのインストール
このpkg-staticを使って、ダウンロード済みのpkg packageをインストールする。
ローカルにダウンロード済みのpackageをインストールする場合には引数にaddを与える。
壊れたpkgが邪魔でインストールできないなら、-fを付けて強制的にインストールする。
$ sudo ./pkg-static add -f ./pkg-1.2.4_1.tgz
Installing pkg-1.2.4_1...pkg-static: package pkg is already installed, forced install
done
If you are upgrading from the old package format, first run:
# pkg2ng
あとは通常通りpkg updateなど。
pkgの設定確認
pkgの設定を一覧したり、どのリポジトリを見ているかを確認するにはpkg -vvとする。
pkgについて、誰かに質問するときには、この出力も必ず付けること。
$ pkg -vv
Version : 1.2.4_1
PACKAGESITE :
PKG_DBDIR : /var/db/pkg
PKG_CACHEDIR : /var/cache/pkg
PORTSDIR : /usr/ports
PUBKEY :
HANDLE_RC_SCRIPTS : no
ASSUME_ALWAYS_YES : no
REPOS_DIR : [
/etc/pkg/,
/usr/local/etc/pkg/repos/,
]
PLIST_KEYWORDS_DIR :
SYSLOG : yes
AUTODEPS : yes
ABI : freebsd:9:x86:32
DEVELOPER_MODE : no
PORTAUDIT_SITE : http://portaudit.FreeBSD.org/auditfile.tbz
VULNXML_SITE : http://www.vuxml.org/freebsd/vuln.xml.bz2
MIRROR_TYPE : SRV
FETCH_RETRY : 3
PKG_PLUGINS_DIR : /usr/local/lib/pkg/
PKG_ENABLE_PLUGINS : yes
PLUGINS : [
]
DEBUG_SCRIPTS : no
PLUGINS_CONF_DIR : /usr/local/etc/pkg/
PERMISSIVE : no
REPO_AUTOUPDATE : yes
NAMESERVER :
EVENT_PIPE :
FETCH_TIMEOUT : 30
UNSET_TIMESTAMP : no
SSH_RESTRICT_DIR :
PKG_SSH_ARGS :
PKG_ENV : {
}
DISABLE_MTREE : no
DEBUG_LEVEL : 0
ALIAS : {
}
Repositories:
FreeBSD: {
url : "pkg+http://pkg.FreeBSD.org/freebsd:9:x86:32/latest",
enabled : yes,
mirror_type : "SRV"
}
pkgの設定ファイルなど。
以下があれば何とかなるはず。
/usr/local/etc/pkg/repos/FreeBSD.conf
FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
enabled: yes
}
以上