pacman 支持软件包签名,会为软件包提供额外的安全性。默认配置,SigLevel = Required DatabaseOptional 将启用全局签名验证,但会被每个软件仓库的 SigLevel 行所覆盖。有关软件包签名和签名验证的更多细节,参见 pacman-key


failed to init transaction (unable to lock database)

pacman 在改变软件包数据库前,比如安装软件包时,会创建一个文件锁 /var/lib/pacman/db.lck。这会阻止其他 pacman 实例在同一时间修改软件包数据库。

如果 pacman 在更新数据库时被打断,旧锁可能保留下来。如果确认没有 pacman 实例在运行,那么删掉文件锁:

rm /var/lib/pacman/db.lck
Bash

提示:以 root 身份运行 fuser /var/lib/pacman/db.lck 可以确认是否有其它进程仍在使用它。


signature from xxx is invalid

在执行 pacman -Syu 时出现下面错误:

error: PackageName: signature from "User <email@archlinux.org>" is invalid
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occured, no packages were upgraded.
Bash

同步系统时间

Pacman-key 依赖于系统时间。如果系统时间是错误的,(root 权限) 执行:

ntpd -qg
hwclock -w
Bash

删除报错的包

如果相同的包持续失败,并且您确定 pacman-key 的相关操作是正确的,可以尝试移除软件包 rm /var/cache/pacman/pkg/packagename 或者 清空所有缓存,然后可以重新下载软件包。

重置所有密钥

如果要删除或重置系统,删除 /etc/pacman.d/gnupg 目录,杀死 gpg-agent 进程,并重新运行 pacman-key --init。通过 pacman-key --populate (或 pacman-key --populate archlinuxcn) 重新添加默认密钥。

禁用签名检查

警告:小心使用,禁用签名检查,pacman 会自动安装不信任的软件包。

如果不在意软件包签名,可以完全禁用 PGP 签名检查,编辑 /etc/pacman.conf 并取消注释 [options] 下的如下行:

SigLevel = Never
#LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
Bash

需要同时注释掉单独软件源的 SigLevel 设置,因为他们会覆盖全局设置。


package-name: signature from "packager" is unknown trust

在执行 pacman -Syu 时出现下面错误:

error: package-name: signature from "packager" is unknown trust
Bash

这是因为 package-name 软件包使用的 packager 的密钥不被本地的 pacman-key gpg 数据库信任。可能是密钥在加入密钥链之后失效了,可以通过下面方法解决:

发生这种情况是因为本地 pacman-key gpg 数据库中不存在和/或不信任软件包 package-name 中使用的打包程序密钥。 Pacman 似乎并不总是能够在继续之前检查密钥是否已收到并标记为可信。这也可能是因为密钥自添加到钥匙串以来已过期。

  • 在系统升级之前手动升级 archlinux-keyring 软件包(pacman -Sy archlinux-keyring && pacman -Su),或
  • 使用 pacman-key --refresh-keys 刷新密钥,或
  • 刷新所有密钥,或
  • 在本地手动签署不受信任的密钥(不推荐),或
  • 暂时将 SigLevel 设置为 TrustAll(不推荐)。

后面两个选项将会破坏信任连,所以请谨慎使用。

文章目录