pacman (简体中文)/Tips and tricks (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-preferences-desktop-locale.png本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队Tango-preferences-desktop-locale.png

附注: 英文页面大量内容未同步(在 Talk:Pacman (简体中文)/Tips and tricks (简体中文)# 中讨论)
翻译状态:本文是 Pacman/Tips and tricks翻译。上次翻译日期:2019-11-22。如果英文版本有所更改,则您可以帮助同步翻译。

Pacman 本身也是 bash 程序,所以有些通用优化请参考 Core utilitiesBash.

维护

保持系统干净,遵循 Arch 之道。参考 System maintenance.

查询软件包

要获取已经安装的软件包以及它们的版本:

  • 所有明确安装的软件包: pacman -Qe.
  • 列出 group 软件包组 中的所有软件包: pacman -Sg group
  • 所有明确安装的,存在于数据库而且不是直接或可选依赖的软件包: pacman -Qent.
  • 所有外部软件包 (通常是手动下载安装,或者已经从数据库中删除): pacman -Qm.
  • 所有从数据库中安装的软件包: pacman -Qn.
  • 按正则表达式查询软件包: pacman -Qs regex.
  • 按正则表达式查询软件包,自定义输出格式:expac -s "%-30n %v" regex (需要安装 expac).

显示所有软件包及其大小

将所有软件包按占用空间大小排序输出:

  • 安装 expac 并运行 expac -s "%-30n %m"
  • 用 [community] 中的 pacgraph 加 -c 选项可以生成所有安装的软件包及其大小.

获取大小

用下面命令查看单个软件包的大小:

$ LC_ALL=C pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | sort -h

用下面命令按大小排序安装的软件包及其依赖的大小:

  • 安装 expac 并运行 expac -H M '%m\t%n' | sort -h.
  • -c 参数执行 pacgraph.

查询软件包的下载大小(不加 packages 将查询所有软件包):

$ expac -S -H M '%k\t%n' packages

查询不属于 basebase-devel 的软件包,带大小和描述:

$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <(pacman -Qqg base base-devel | sort)) | sort -n

按日期查询

expac 查询最近安装的 20 个软件包:

$ expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort | tail -n 20

用从 epoch(1970-01-01 UTC) 开始的秒数:

$ expac --timefmt=%s '%l\t%n' | sort -n | tail -n 20

查找不属于任何软件包的文件

建议定期检查 pacman 数据库之外的文件。通常这些文件是第三方程序使用一般方式安装 (例如 ./configure; make; make install)。下面脚本可以找出它们:

pacman-disowned
#!/bin/sh

tmp=${TMPDIR-/tmp}/pacman-disowned-$UID-$$
db=$tmp/db
fs=$tmp/fs

mkdir "$tmp"
trap  'rm -rf "$tmp"' EXIT

pacman -Qlq | sort -u > "$db"

find /bin /etc /lib /sbin /usr \
  ! -name lost+found \
  \( -type d -printf '%p/\n' -o -print \) | sort > "$fs"

comm -23 "$fs" "$db"

要生成列表:

$ pacman-disowned > non-db.txt

注意删除 non-db.txt 中的文件时先仔细确认。有些是配置文件、日志等,不要删除它们。

删除孤立软件包

递归删除孤立软件包:

# pacman -Qtdq | pacman -Rns -

如果没有孤立软件包,将显示错误 error: argument '-' specified with empty stdin. 这个是正常的,因为 pacman -Rns 没有收到任何参数.

注意: -Qt 仅显示真的孤立包,要包含可选依赖,请使用 -Qtt .

删除必须的软件包以外的所有软件包

先将明确安装的软件包改为依赖关系:

# pacman -D --asdeps $(pacman -Qqe)

然后将需要保留的软件包设置为明确安装:

# pacman -D --asexplicit base linux linux-firmware

然后删除所有没有明确安装的软件包.

仅显示正式安装的软件包

pacman -Qq |grep -Fv -f <(pacman -Qqm)

安装和修复

几种获取和修复软件包的方法。

从 CD/DVD/ISO 安装软件包

  • 先挂载 CD (如果需要,替换cdromdvd或其他介质):
# mount /mnt/cdrom
如果使用的是ISO映像,先在 /mnt 建立一个目录:
# mkdir /mnt/iso
然后挂载镜像:
# mount -t iso9660 -o ro,loop /path/to/iso /mnt/iso
  • 配置pacman:
# nano -w /etc/pacman.conf
  • 将如下仓库信息添加到其他软件仓库(如 extra、core)之前,确保优先使用介质中的软件包:
# 使用 cdrom 作为仓库
[custom]
Server = file:///mnt/cdrom/arch/pkg
如果使用其他介质,记得替换 cdrom

修改pacman.conf后,更新软件仓库即可。

从 Arch 的 core 镜像安装软件包

如果暂时无法链接网络(比如要配置无线网络),可以通过Arch的core仓库镜像获取软件包。先挂载之:

# mount -o loop /path/to/arch_core_image/i686/repo-core-i686.sfs /mnt/iso

然后修改pacman.conf[core]段,(临时)替换为镜像挂载的位置:

[core]
#Include = /etc/pacman.d/mirrorlist
Server = file:///mnt/iso

然后同步:

# pacman -Syu

自建本地仓库

pacman 3 引入了一个名为repo-add脚本,用于帮助个人用户生成软件仓库。使用 repo-add --help 查看详细用法。

将所有要加入仓库的软件包放入一个目录,运行如下命令(repo是自建仓库的名称):

$ repo-add /path/to/repo.db.tar.gz /path/to/*.pkg.tar.xz

注意,repo-add生成的数据库文件不一定和软件包放在同一目录,但使用pacman同步时,两者必须放在一起。

向仓库添加新软件包(并移除旧的):

$ repo-add /path/to/repo.db.tar.gz /path/to/packagetoadd-1.0-1-i686.pkg.tar.xz
注意: 使用repo-remove删除软件包。

本地仓库建立后,添加仓库到pacman.confdb.tar.gz文件的名字就是仓库的名字,路径格式是file://...或FTP地址ftp://localhost/path/to/directory

欢迎到非官方用户软件仓库,分享你的仓库。

在网络上共享pacman缓存

提示: 另外一个方案:pacserve

要在多机间共享软件包,使用任何网络协议共享/var/cache/pacman/目录即可。本节介绍如何使用shfs或sshfs,在局域网内的多机间分享软件包及相关库文件目录。注意,网络间共享可能速度缓慢,取决于所选文件系统等因素。

首先,在服务器安装任意网络文件系统:SSHFSshfsftpfssmbfsNFS

提示: 使用sshfs或shfs前,先阅读Using SSH Keys

然后,挂载服务器的/var/cache/pacman/pkg到客户端机器上的/var/cache/pacman/pkg目录即可。

要分享软件包数据,使用同样方法共享/var/lib/pacman/sync/{core,extra,testing,community}即可。修改/etc/fstab以开机自动挂载。

避免过度清理缓存

执行pacman -Sc清理软件包缓存时,会删除所有当前机器上未安装的软件包。由于pacman无法判断软件包是否在其他机器上安装,这会导致移除某些还需要的软件包。

避免的方法是修改清理方式为:删除所有已有新版本的过期软件包。添加以下内容到/etc/pacman.conf[options]段:

CleanMethod = KeepCurrent

备份和恢复已安装软件包

定期备份软件包是个好习惯。万一系统出了大问题,需要重装,就可以利用备份的软件包恢复到原先的系统。

  • 第一步,生成系统上安装的非本地(即从官方仓库获取的)软件包列表:
 $ comm -23 <(pacman -Qeq|sort) <(pacman -Qmq|sort) > pkglist
  • 把生成的pkglist存储在一个安全的地方,比如U盘,或者gist.github.com、evernote、dropbox之类的文本储存网站。
  • 今后重装系统时,把pkglist复制到新系统。
  • 使用如下命令安装所有软件包:
 # pacman -S $(< pkglist)

要是备份的软件包列表包含非官方软件包(从AUR或其他什么地方下载的),就得使用下面这个吓人的命令了,不然pacman会出错:

# pacman -S --needed $(diff <(cat badpkglist|sort) <(diff <(cat badpkglist|sort) <(pacman -Slq|sort)|grep \<|cut -f2 -d' ')|grep \<|cut -f2 -d' ')

解释:

  • pacman -Slq列出所有可以安装的软件包。由于输出是按照来源仓库排序的,需要再调用sort排序。
  • 排序是为diff命令比对列表做准备。
  • 第一个diff返回所有无法安装的软件包;第二个返回所有可以安装的软件包。
  • --needed表示跳过已安装软件包。

可以接着用yaourt恢复从AUR获取的软件包(不推荐):

$ yaourt -S --noconfirm $(diff <(cat badpkglist|sort) <(pacman -Slq|sort) |grep \<|cut -f2 -d' ')

最后,还可以卸载掉新系统上安装的、但之前系统并未安装的软件包。 警告:务必小心使用,仔细查看pacman输出,避免悲剧。

# pacman -Rsu $(diff <(cat badpkglist|sort) <(pacman -Qq|sort) | grep \>|cut -f2 -d' ')

列出所有不属于base或base-devel的已安装软件包

下列命令输出所有不属于base或base-devel软件包组的已安装软件包。这些软件包一般都是用户自己安装的:

comm -23 <(pacman -Qeq|sort) <(pacman -Qgq base base-devel|sort)

重新安装所有软件包

要是你的系统遭到了大规模破坏(比如rm -rf什么的),可以通过pacman重新安装所有软件包来挽救。

如果没有安装来自软件源外的软件包(比如来自AUR的),使用如下命令即可:

# pacman -Qqn | pacman -S -
# pacman -S $(pacman -Qqn) # 如果上面的命令无法输入 y 以确认安装

如果安装了外来软件包,你可以使用 pacman -Qqm 列出它们

从已有安装修复 USB 系统

如果你有一个Arch安装在U盘上,不小心搞坏了(比如,写入U盘时断电了),可以使用主机上的Arch修复U盘上的Arch(假设U盘挂载在/newarch):

# pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman

解压缩软件包

Arch软件包其实就是普通的xz压缩包,解压方法没啥特别的:

$ tar -Jxvf package.tar.xz

性能

加快下载速度

注意: 如果你的包下载速度变得极慢,首先确定你用的是那些(镜像)网站而不是ftp.archlinux.org,因为后者从2007年3月开始限速

可以通过各种下载工具而不是Pacman内置的下载方式,来改善Pacman的下载速度。

不论怎样,在做任何修改前,你必须确定拥有了最新版的Pacman:

# pacman -Syu

使用 Powerpill

Powerpill 是 Pacman 的完整包裹程序,增加了平行下载和分段下载功能,加速下载过程。Pacman 一次只下载一个软件包,完成后才开始下一个下载。 Powerpill 同时下载多个软件包。Powerpill wiki 页面提供了基本的配置和使用方法。

使用wget

对于需要更强大代理支持的用户来说,用wget比用Pacman自己的下载方式更加方便。

要使用 wget,首先使用pacman -S wget安装它,然后修改/etc/pacman.conf并在其中的[options]区段将下面内容去掉注释:

XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u

除了将wget参数放在/etc/pacman.conf里,你也可以直接修改wget配置文件(全局文件是/etc/wgetrc,各个用户的文件是$HOME/.wgetrc)。

使用aria2

aria2是一个具有断点续传和分块下载功能的轻量级下载软件,支持HTTP/HTTPS/FTP协议。aria2可以多线程通过HTTP/HTTPS和FTP协议连接镜像服务器,显著提高下载速度。

注意: 在Pacman的XferCommand使用 aria2c 不会导致并行下载多个包。因为Pacman调用XferCommand时是一次一个包调用的,等待下载完成才会启动下一个。想要并行下载多个包,参见上面的 powerpill-light 部分。

安装

通过pacman -S aria2安装aria2

配置

修改/etc/pacman.conf,在[option]段添加下列一行(如果已存在则修改之):

XferCommand = /usr/bin/aria2c --allow-overwrite=true -c --file-allocation=none --log-level=error -m2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 -t5 -d / -o %o %u

参数细节

/usr/bin/aria2c
aria2主程序的完整路径。
--allow-overwrite=true
如果相应的控制文件不存在则重新下载。(默认值:false)
-c, --continue
如果相应的控制文件存在则继续未完成的下载。
--file-allocation=none
下载开始前预设空间。(默认值: prealloc) 1
--log-level=error
设置错误输出级别。 (默认值: debug)
-m2, --max-tries=2
从每个镜像源下载特定文件的最大尝试次数设为2。 (默认值: 5)
--max-connection-per-server=2
下载每个文件时到每个镜像源的最大连接数设为2。(默认值: 1)
--max-file-not-found=5
如果5次尝试后仍未下载完成1字节则强制停止。(默认值: 0)
--min-split-size=5M
只有当文件大于5MB时才分割下载。 (默认值: 20M)
--no-conf
不加载 aria2.conf 。 (默认值: ~/.aria2/aria2.conf)
--remote-time=true
对远程文件应用时间戳并应用到本地文件。 (默认值: false)
--summary-interval=60
每60s显式一次下载总进度。 (默认值: 60) 2
-t5, --timeout=5
对镜像源的连接建立后5s超时。 (默认值: 60)
-d, --dir
pacman 设定的文件下载目录。
-o, --output
输出的下载文件的文件名
%o
代表 pacman 指定的文件名的变量
%u
代表 pacman 指定的 URL 的变量
其他解释
1 --file-allocation=falloc
对较新的文件系统建议使用,如 ext4(支持extents)、 btrfs 和 xfs 因为它们存储大文件(GB级别)时速度很快。 较老的文件系统如ext3则不要使用falloc,因为prealloc消耗的时间几乎和标准分配相同,同时会锁定aria2进程而停止下载。
2 --summary-interval=0
减少下载总进度的输出并有可能改善性能。日志会按照 log-level 选项的设置继续输出。

使用其它程序

这里还有一些可以和Pacman协同工作的下载软件。下面列举了它们对应的XferCommand命令写法:

  • snarf: XferCommand = /usr/bin/snarf -N %u
  • lftp: XferCommand = /usr/bin/lftp -c pget %u
  • axel: XferCommand = /usr/bin/axel -n 2 -v -a -o %o %u

工具

  • Lostfiles — Script that identifies files not owned by any package.
https://github.com/graysky2/lostfiles || lostfiles
  • PacmaticPacman wrapper to check Arch News before upgrading, avoid partial upgrades, and warn about configuration file changes.
http://kmkeen.com/pacmatic || pacmatic
  • pacutils — Helper library for libalpm based programs.
https://github.com/andrewgregory/pacutils || pacutils
  • pkgfile — Tool that finds what package owns a file.
https://github.com/falconindy/pkgfile || pkgfile
  • pkgtools — Collection of scripts for Arch Linux packages.
https://github.com/Daenyth/pkgtools || pkgtoolsAUR
  • pkgtop — Interactive package manager and resource monitor designed for the GNU/Linux.
https://github.com/orhun/pkgtop || pkgtop-gitAUR
  • Powerpill — Uses parallel and segmented downloading through aria2 and Reflector to try to speed up downloads for pacman.
https://xyne.dev/projects/powerpill/ || powerpillAUR
  • repoctl — Tool to help manage local repositories.
https://github.com/cassava/repoctl || repoctlAUR
  • repose — An Arch Linux repository building tool.
https://github.com/vodik/repose || repose
  • snap-pac — Make pacman automatically use snapper to create pre/post snapshots like openSUSE's YaST.
https://github.com/wesbarnett/snap-pac || snap-pac
  • vrms-arch — A virtual Richard M. Stallman to tell you which non-free packages are installed.
https://github.com/orospakr/vrms-arch || vrms-archAUR

图形前端

警告: PackageKit opens up system permissions by default, and is otherwise not recommended for general usage. See FS#50459 and FS#57943.
  • Apper — Qt 5 application and package manager using PackageKit written in C++. Supports AppStream metadata.
https://userbase.kde.org/Apper || apper
https://userbase.kde.org/Discover || discover
  • GNOME PackageKit — GTK 3 package manager using PackageKit written in C.
https://freedesktop.org/software/PackageKit/ || gnome-packagekit
https://wiki.gnome.org/Apps/Software || gnome-software
  • pcurses — Curses TUI pacman wrapper written in C++.
https://github.com/schuay/pcurses || pcurses
  • tkPacman — Tk pacman wrapper written in Tcl.
https://sourceforge.net/projects/tkpacman || tkpacmanAUR