< Pacman (简体中文)

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

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

翻译状态:本文是 Pacman/Tips and tricks翻译。上次翻译日期:2019-11-22。如果英文版本有所更改,则您可以帮助同步翻译。

维护

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

查询软件包

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

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

显示所有软件包及其大小

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

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

获取大小

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

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

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

  • 安装 expac 并运行 .
  • -c 参数执行 .

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

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

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

$ 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 > non-db.txt

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

删除孤立软件包

递归删除孤立软件包:

# pacman -Qtdq | pacman -Rns -

如果没有孤立软件包,将显示错误 . 这个是正常的,因为 没有收到任何参数.

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

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

# 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

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

从 Arch 的 core 镜像安装软件包

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

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

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

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

然后同步:

# pacman -Syu

自建本地仓库

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

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

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

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

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

$ repo-add /path/to/repo.db.tar.gz /path/to/packagetoadd-1.0-1-i686.pkg.tar.xz

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

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

在网络上共享pacman缓存

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

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

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

要分享软件包数据,使用同样方法共享即可。修改以开机自动挂载。

避免过度清理缓存

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

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

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 以确认安装

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

从已有安装修复 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

性能

加快下载速度

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

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

# pacman -Syu

使用 Powerpill

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

使用wget

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

要使用 ,首先使用安装它,然后修改并在其中的区段将下面内容去掉注释:

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

除了将参数放在里,你也可以直接修改配置文件(全局文件是,各个用户的文件是)。

使用aria2

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

安装

通过安装。

配置

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

参数细节

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

使用其它程序

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

  • :
  • :
  • :

工具

  • Lostfiles Script that identifies files not owned by any package.
https://github.com/graysky2/lostfiles || lostfiles
  • repoctl Tool to help manage local repositories.
https://github.com/cassava/repoctl || repoctlAUR

图形前端

  • GNOME PackageKit GTK 3 package manager using PackageKit written in C.
https://freedesktop.org/software/PackageKit/ || gnome-packagekit
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.