Pacman/Tips and tricks (简体中文)
相关文章
修饰和便利
彩色输出
pacman 4.1.0 开始支持彩色输出,只需要在/etc/pacman.conf
中取消 Color 行前面的注释即可使用。
快捷方式
使用命令别名简化常用pacman命令,方便使用和记忆。
配置 shell
下面是个范例,将其加入shell配置文件即,同时适用于Bash和Zsh:
# Pacman 别名示例 alias pacupg='sudo pacman -Syu' # 同步软件仓库信息然后升级系统 alias pacin='sudo pacman -S' # 从软件仓库安装软件包 alias pacins='sudo pacman -U' # 从本地文件安装软件包 alias pacre='sudo pacman -R' # 删除软件包,保留配置和依赖 alias pacrem='sudo pacman -Rns' # 彻底删除软件包,清除配置,删除无用依赖 alias pacrep='pacman -Si' # 显示软件仓库中某软件包的信息 alias pacreps='pacman -Ss' # 在软件仓库搜索软件包 alias pacloc='pacman -Qi' # 显示本地数据库中某软件包的信息 alias paclocs='pacman -Qs' # 在本地数据库搜索软件包
# 更多示例 alias pacupd='sudo pacman -Sy && sudo abs' # 同步软件仓库信息并更新abs alias pacinsd='sudo pacman -S --asdeps' # 将某软件包作为其它软件包的依赖安装 alias pacmir='sudo pacman -Syy' # 强制刷新软件仓库信息
用法
就像使用普通命令一样使用这些别名即可。例如,要同步软件仓库信息然后升级系统:
$ pacupg
从软件仓库安装软件包:
$ pacin <软件包1> <软件包2> <软件包3>
安装软件包文件:
$ pacins /path/to/<软件包路径>
彻底删除软件包:
$ pacrem <软件包>
在软件仓库搜索软件包:
$ pacreps <关键字>
显示软件仓库中某软件包的信息(比如:占用空间,依赖关系):
$ pacrep <keywords>
注解
上面提供的只是一个例子。按照上面的格式,可以自己编写命令别名,比如:
alias pacrem='sudo pacman -Rns' alias pacout='sudo pacman -Rns'
上面的例子中,pacrem
和pacout
代表同样的命令:sudo pacman -Rns
。你可以使用自己喜欢的名称代替这些命令。
巧用 Bash 语法
下面应用Bash技巧,实现复杂的pacman功能。
- 安装多个名称部分相同的软件包(而非安装整个软件包组),以kde为例:
pacman -S kde-{applets,theme,tools}
- 也可以嵌套使用:
pacman -S kde-{ui-kde,kdeartwork}
- 使用
-s
搜索时会匹配软件包描述,从而导致很多不需要的结果。限制只匹配软件包名称:
pacman -Ss '^vim-'
- pacman的
-q
操作会输出所有本地软件包名称。利用该输出、以及简单的shell技巧,重新安装所有名称包含“compiz”的软件包:
pacman -S $(pacman -Qq | grep compiz)
维护
保持系统干净,遵循 Arch 之道。
显示所有软件包及其大小
将所有软件包按占用空间大小排序输出:
查找不属于任何软件包的文件
建议定期检查 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 -Rs $(pacman -Qtdq)
下面命令可以插入 $HOME/.bashrc
并在找到孤立软件包时进行删除:
orphans() { if [[ ! -n $(pacman -Qdt) ]]; then echo no orphans to remove else sudo pacman -Rs $(pacman -Qdtq) fi }
删除base软件包组以外的所有软件包
以下命令会保留base软件包组、删除其他所有软件包:
# pacman -Rs $(comm -23 <(pacman -Qeq|sort) <((for i in $(pacman -Qqg base); do pactree -ul $i; done)|sort -u|cut -d ' ' -f 1))
来源:这个帖子
注记:
-
comm
命令需要已排序的输入,否则会得到诸如“comm: file 1 is not in sorted order”之类的错误信息。 -
pactree
是生成软件包依赖树的工具,输出如下:
$ pactree -lu logrotate
logrotate popt glibc linux-api-headers tzdata dcron cron bash readline ncurses gzip
为了避免“dcron cron”(前者是软件包名,后者是该软件包提供的软件包名)这样的内容导致错误,用到了cut -d ' ' -f 1
——只保留软件包名称。
仅显示正式安装的软件包
pacman -Qq |grep -Fv -f <(pacman -Qqm)
安装和修复
几种获取和修复软件包的方法。
从 CD/DVD/ISO 安装软件包
- 先挂载 CD (如果需要,替换cdrom为dvd或其他介质):
# 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
本地仓库建立后,添加仓库到pacman.conf
。db.tar.gz
文件的名字就是仓库的名字,路径格式是file://...或FTP地址ftp://localhost/path/to/directory。
欢迎到非官方用户软件仓库,分享你的仓库。
在网络上共享pacman缓存
要在多机间共享软件包,使用任何网络协议共享/var/cache/pacman/
目录即可。本节介绍如何使用shfs或sshfs,在局域网内的多机间分享软件包及相关库文件目录。注意,网络间共享可能速度缓慢,取决于所选文件系统等因素。
首先,在服务器安装任意网络文件系统:sshfs,shfs,ftpfs,smbfs或nfs。
然后,挂载服务器的/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 -Qeq | pacman -S - # pacman -Qdq | pacman -S --asdeps -
如果安装了外来软件包,使用上面的命令会出错。下面的命令先生成所有软件包列表,再用pacman -Qmq
剔除外来软件包,即重新安装所有仓库中可以找到的软件包,同时保留依赖安装、手动安装标志:
# comm -23 <(pacman -Qeq) <(pacman -Qmq) | pacman -S - # comm -23 <(pacman -Qdq) <(pacman -Qmq) | pacman -S --asdeps -
从已有安装修复 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将所有软件包的信息放在一一对应的许多小文件中。通过改善数据库访问速度,可以减少花在数据库相关任务上的时间,比如:寻找软件包、检索软件包依赖性。
最安全最简单的方法是以root身份运行
# pacman-optimize
上述命令试图将所有小文件放在磁盘上同一个物理区域,以减少磁头移动。这种方法很安全,但不一定有效。其效果取决于你的文件系统、磁盘使用率、和磁盘碎片程度。另一种更激进的方式是在优化数据库之前首先删除 cache 中所有未安装以及不使用的仓库中的包:
# pacman -Sc && pacman-optimize
加快下载速度
可以通过各种下载工具而不是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 -c --passive-ftp -c %u
除了将wget
参数放在/etc/pacman.conf
里,你也可以直接修改wget
配置文件(全局文件是/etc/wgetrc
,各个用户的文件是$HOME/.wgetrc
)。
使用aria2
aria2是一个具有断点续传和分块下载功能的轻量级下载软件,支持HTTP/HTTPS/FTP协议。aria2可以多线程通过HTTP/HTTPS和FTP协议连接镜像服务器,显著提高下载速度。
安装
通过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