Freebsd10.2安装包升级pkg引起环境破坏的解决

前言

freebsd10.2环境在安装一个新软件包的时候提示升级pkg到1.10.1,然后点击了升级,然后整个pkg环境就无法使用了

记录

升级完了软件包以后第一个错误提示

FreeBSD: /usr/local/lib/libpkg.so.3: Undefined symbol “utimensat”

这个是因为这个库是在freebsd的10.3当中才有的库,而我的环境是10.2的环境

网上有一个解决办法

更新源

1
2
3
4
5
# cat /usr/local/etc/pkg/repos/FreeBSD.conf
FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/release_2",
enabled: yes
}

检查当前版本

1
2
# pkg --version
1.10.1

更新缓存

1
# pkg update

卸载

1
# pkg delete -f pkg

重新安装

1
2
# pkg install -y pkg
# pkg2ng

检查版本

1
2
# pkg --version
1.5.4

这个在我的环境下没有生效

还有一个办法

有个pkg-static命令可以使用,,然后/var/cache/pkg里边缓存的包。执行命令:

1
# pkg-static install -f /var/cache/pkg/pkg-1.5.4.txz

这个在我的环境下报错

1
2
3
root@mkiso:/usr/ports/ports-mgmt/pkg # pkg info sqlite3
pkg: warning: database version 34 is newer than libpkg(3) version 33, but still compatible
pkg: sqlite error while executing INSERT OR ROLLBACK INTO pkg_search(id, name, origin) VALUES (?1, ?2 || '-' || ?3, ?4); in file pkgdb.c:1544: no such table: pkg_search

这个在网上看到有很多人出现了

最终解决的办法

在邮件列表里面看到一个解决办法,我是用的这个办法解决了的

1
#pkg shell

进入交互模式,执行下面的操作

1
2
CREATE VIRTUAL TABLE pkg_search USING fts4(id, name, origin);
pragma user_version=33;

执行完了以后pkg 环境可用了

避免这个问题

锁定本机的pkg版本

1
pkg lock pkg

如果需要手动找包就是这个路径

1
http://pkg.freebsd.org/FreeBSD:10:amd64/

我的机器最终版本是

1
2
#pkg -v
1.8.7

参考资料

freebsd pkg升级问题报错
FreeBSD: /usr/local/lib/libpkg.so.3: Undefined symbol “utimensat”
升级pkg失败, 安装低版本pkg失败
pkg database issue: database version 34 is newer than libpkg(3) version 33 ?

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-05-24