Pacman

pacman是arch linux的主要包管理工具。它包含了简单的二进制包格式和易于使用的编译体系。通过和主服务器同步pacman可以保持系统的软件包更新,其服务器/客户对模式允许用户下载和安装软件包以及所有依赖软件包。

pacman简明使用

备注

pacman 的 -S 参数表示 --sync 同步软件包,软件包将直接从远程仓库安装到本地主机,包括所有运行着软件包的依赖包。

  • 安装软件包:

    pacman -S package_name1 package_name2 ...
    
  • 使用正则方式安装一系列软件包:

    pacman -S $(pacman -Ssq package_regex)
    
  • 如果有多个软件包位于不同仓库,例如extra仓库和testing仓库,则在软件包前加上仓库定义:

    pacman -S extra/package_name
    
  • 支持简单的名字模式:

    pacman -S plasma-{desktop,mediacenter,nm}
    
  • 甚至支持多级扩展:

    pacman -S plasma-{workspace{,-wallpapers}<Plug>PeepOpena}
    
  • 一些软件包支持整组安装,例如gnome:

    pacman -S gnome
    

要检查这个组中包含的软件包:

pacman -Sg gnome
  • 忽略依赖强制安装:

    pacman -Sd package_name
    
  • Arch Linux的软件包是 tar.stz 格式,可以下载以后本地安装:

    pacman -U --noconfirm edk2-armvirt-202208-3-any.pkg.tar.zst
    
  • 删除单一软件包,但是保留已经安装的这个软件包的依赖:

    pacman -R package_name
    
  • 删除软件包并且删除所有没有被其他软件包所使用的该软件包的依赖:

    pacman -Rs package_name
    
  • 删除软件包,该软件包被其他软件包所使用,但是不删除依赖软件包:

    pacman -Rdd package_name
    

警告

上述命令会打破系统完整,所以需要避免

  • 升级整个系统所有软件包:

升级整个arch linux系统
pacman -Syu
  • 清理缓存:

    pacman -Sc
    
  • 查询系统中安装的某个程序属于哪个软件包提供(这里举例查询netstat命令):

    pacmsn -Qo /usr/bin/netstat
    
  • 查询系统某个软件包包含的文件:

    pacman -Ql package_name
    

激活仓库,安装指定版本及锁定版本

默认情况下, testingcommunity-testing 仓库没有激活,这个配置位于 /etc/pacman.conf 。例如,在 部署ARM架构Kubernetes 在加入Arch Linux节点时,为了能够安装 community-testing 仓库最新版本的Kubernetes 1.22.0 ,配置如下:

[community-testing]
Include = /etc/pacman.d/mirrorlist
  • 然后执行仓库数据库同步:

    pacman -Sy
    
  • 安装指定版本:

    pacman -S kubelet=1.22.0-1 kubeadm=1.22.0-1 kubectl=1.22.0-1
    
  • 由于Kubernetes软件升级涉及到管控和工作节点升级,需要精心的手工操作,所以必须锁定软件版本不能滚动升级。锁定软件版本也是编辑 /etc/pacman.conf 将需要忽略升级到软件包配置如下:

    IgnorePkg   = kubelet kubeadm kubectl
    
  • 再次修订 /etc/pacman.confcommunity-testing 仓库注释掉,避免其他软件版本升级到测试版本。

国内仓库配置

  • /etc/pacman.conf 最后添加两行:

    [archlinuxcn]
    Server = https://mirrirs.tuna.tsinghua.edu.cn/archlinuxcn/$arch
    
  • 使用 paman -Sy 同步源

  • 然后导入GPG key:

    pacman -S archlinuxcn-keyring
    

break dependency

执行 pacman -Syu 时候遇到报错:

looking for conflicting packages...
error: failed to prepare transaction (could not satisfy dependencies)
:: installing xorgproto (2019.2-2) breaks dependency 'xf86miscproto' required by libxxf86misc

参考 xorgproto issues.. 处理:

pacman -Rdd libxxf86misc && pacman -Syu

signature error

执行 pacman -Syu 出现报错:

error: pacman: signature from "Levente Polyak (anthraxx) <levente@leventepolyak.net>" is unknown trust
:: File /var/cache/pacman/pkg/pacman-5.2.1-4-x86_64.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).

上述问题参考 pacman/Package signingSignature is unknown trust [SOLVED] 原因是系统长时间没有更新,本地使用的key已经过期,需要重新刷新:

pacman-key --refresh-keys

conflicting files

执行 pacman -Syu 提示报错:

error: failed to commit transaction (conflicting files)
nss: /usr/lib/p11-kit-trust.so exists in filesystem
Errors occurred, no packages were upgraded.

这个问题参考 archlinux - pacman"Failed to commit transaction (conflicting files)" error 解决方法:

pacman -Qo /usr/lib/p11-kit-trust.so

检查看看是否有软件包包含这个文件:

error: No package owns /usr/lib/p11-kit-trust.so

然后将这个文件重命名:

sudo mv /usr/lib/p11-kit-trust.so /usr/lib/p11-kit-trust.so.bak

参考