222. ArchLinux 包管理

Pacman

准备

在 archlinux 上安装的软件都通过 Pacman 来进行管理。

为了使用 Pacman 额外的命令需要先使用 extra 或 aur 安装 pacman-contrib

安装 pacman-contrib

  • 方法 1

    1
    sudo pacman -S pacman-contrib
  • 方法 2

    1
    yay -S pacman-contrib-git

可以把 Pacman 理解为一个软件管理器(软件管家?),可以进行软件的安装、删除、查询等

用法

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

备注

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

安装

  • 在线搜索

    1
    sudo pacman -Ss <key-word> # 在同步数据库中搜索包,包括包的名称和描述
  • 本地搜索

    1
    2
    sudo pacman -Qs <key-word> # 模糊匹配
    sudo pacman -Q <package-name> # 精确匹配
  • 安装软件包:

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

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

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

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

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

    1
    sudo pacman -S gnome
  • 要检查这个组中包含的软件包:

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

    1
    sudo pacman -Sd package_name
  • 安装本地软件包

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

    1
    sudo pacman -U --noconfirm edk2-armvirt-202208-3-any.pkg.tar.zst

升级

  • 更新AUR 软件包数据库

    1
    sudo pacman -Syy
  • 升级系统

    更新 AUR 软件包数据库并升级所有已安装的软件包(包括内核,小心风滚草😈️)

    1
    sudo pacman -Syu # 升级系统。 -y:标记刷新、-yy:标记强制刷新、-u:标记升级动作(一般使用 -Syu 即可)

    其中:

    • -S 表示 sync (同步)
    • -y 表示从服务器下载新的软件包数据库
    • -yy 表示强制更新软件包数据库
    • -u 表示 upgrade (升级)

删除

  • 删除单一软件包,但是保留已经安装的这个软件包的依赖:

    1
    sudo pacman -R package_name # 删除软件包,保留其全部已经安装的依赖关系
  • 删除软件包并且删除所有没有被其他软件包所使用的该软件包的依赖:

    1
    sudo pacman -Rs package_name
    1
    sudo pacman -Rns package_name # 删除软件包,及其所有没有被其他已安装软件包使用的依赖包

    其中:

    • -R 表示 Remove(移除)
    • -c(cascade)删除软件包及所有依赖于此的软件包
    • -n 表示 nosave(删除配置文件)
    • -s 删除不需要的依赖关系
    • -u 表示 unneeded

    详见: man 文档

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

    1
    sudo pacman -Rdd package_name
  • 删除孤立的安装包

    1
    sudo pacman -Rns $(pacman -Qtdq) # 如上文所述,删除孤立软件包(常用)
  • 删除当前未安装的所有缓存包和未使用的同步数据库

    1
    sudo pacman -Sc # 删除当前未安装的所有缓存包和未使用的同步数据库(可选)
  • 清理无用软件包和缓存

    1
    sudo pacman -Scc # 从缓存中删除所有文件,这是最激进的方法,不会在缓存文件夹中留下任何内容(一般不使用)
  • 删除已安装和未安装包的所有缓存版本

    1
    paccache -r # 删除已安装和未安装包的所有缓存版本,但最近 3 个版本除外

查询

  • 检查安装包

    1
    pacman -Qi package_name # 检查已安装包的相关信息。-Q:查询本地软件包数据库
  • 找出孤立包

    1
    pacman -Qdt # 找出孤立包。-d:标记依赖包、-t:标记不需要的包、-dt:合并标记孤立包
  • 删除孤立包

    1
    sudo pacman -Rns $(pacman -Qtdq) # 删除孤立包
  • 更新命令查询文件列表数据库

    1
    sudo pacman -Fy # 更新命令查询文件列表数据库
  • 查询命令属于哪个包

    1
    pacman -F some_command # 当不知道某个命令属于哪个包时,用来在远程软件包中查询某个命令属于哪个包(即使没有安装)
  • 查询包依赖

    1
    pactree package_name # 查看一个包的依赖树

警告

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

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

    升级整个arch linux系统

    1
    sudo pacman -Syu
  • 清理缓存:

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

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

    1
    sudo pacman -Ql package_name

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

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

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

    1
    sudo pacman -Sy
  • 安装指定版本:

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

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

国内仓库配置

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

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

  • 然后导入GPG key:

    1
    sudo pacman -S archlinuxcn-keyring

break dependency

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

1
2
3
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.. 处理:

1
sudo pacman -Rdd libxxf86misc && pacman -Syu

signature error

执行 pacman -Syu 出现报错:

1
2
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 signing 和 [Signature is unknown trust SOLVED] 原因是系统长时间没有更新,本地使用的key已经过期,需要重新刷新:

1
pacman-key --refresh-keys

conflicting files

执行 pacman -Syu 提示报错:

1
2
3
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 解决方法:

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

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

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

然后将这个文件重命名:

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

并行下载

从 pacman 6.0 开始支持平行下载功能,但是默认没有启用,修改配置 /etc/pacman.conf 如下(实际只要取消注释#就可以,默认并发下载数量是5):

修订 /etc/pacman.conf 设置并行下载

1
ParallelDownloads = 5

参考

Arch Linux AUR

用法

  • 安装

    yay 的用法和 Pacman 是基本一样的。有额外几条常用命令:

    1
    2
    3
    4
    sudo yay # 等同于 yay -Syu
    sudo yay package_name # 等同于 yay -Ss package_name && yay -S package_name
    sudo yay -Ps # 打印系统统计信息
    sudo yay -Yc # 清理不需要的依赖
  • 删除

    清理 yay 缓存
    如果使用了 yay 来安装 AUR 中的软件包的话,可以选择清理 yay 的缓存目录:

    1
    rm -rf ~/.cache/yay

QAs

Pacman error : partition /boot too full

  • 方法1: 删除回滚备份

    删除 /boot/initramfs-linux-fallback, 但是这会导致不能回滚.

    为解决不能回滚的问题, 你可以将 /boot/initramfs-linux-fallback 文件移动到其他位置, 但是该操作是否还能回滚目前并没有测试过.

  • 方法2: 增加引导分区的大小

    增加 /boot 的大小, 推荐为 200MB. 你可以使用 GParted 在改变其大小.

参考