Archlinux构建系统
1 pacman命令
在archlinux中通过pacman来管理软件,全称为package manager
,使用方式如下:
- 更新系统
pacman -Syu
更新整个系统pacman -Sy
同步本地包数据库和远程的仓库pacman -Su
根据本地包数据库更新系统pacman -Syu -ignore 包名
更新系统时不升级制定包
- 安装软件包
pacman -S包名
安装软件包,多个包间用空格分割pacman -Sy 包名
先同步本地数据库,再安装软件包pacman -Sf 包名
强制安装包pacman -Sv 包名
安装包,并打印详细信息pacman -U 包名.pkg.tar.gz
安装本地软件包
- 删除软件包
pacman -R 包名
只删除制定包,不清理依赖包pacman -Rs 包名
删除包并删除依赖项pacman -Rd 包名
删除包时不检查其依赖pacman -Rn 包名
删除包及其配置文件pacman -Rsn 包名
删除包、依赖项及其配置文件
- 查询同步包数据库
pacman -Ss 关键字
在远程包数据库中查询含有关键字的包pacman -Si 包名
查询远程包数据库中该包的详细信息
- 查询本地包数据库
pacman -Q
列出系统中已安装包的包名pacman -Qs 关键字
在本地查询含有关键字的包pacman -Qi 包名
在本地包数据库中查询有关包的详细信息pacman -Ql 包名
查询并列出该包所含文件pacman -Qo /path/file
查询某文件属于何包pacman -Qdt
查询系统中的孤立包pacman -Qet
查询系统中的不被因依赖而安装的包
- 其他用法
pacman -Sw 包名
只下载包,不安装pacman -Sc
清理未安装的包文件(pacman 下载的包文件缓存于 /var/cache/pacman/pkg/ 目录)pacman -Scc
清理所有的缓存文件pacman -Rs $(pacman -Qdtq)
递归删除系统中存在的孤立包
2 pacman原理
pacman的原理是在远程仓库中下载压缩包到本地,再运行pacman -U 包名.pkg.tar.xz
安装。
在运行 pacman -S 包名
时, pacman首先会从/var/lib/pacman/sync/文件夹里的几个数据库中搜索到nginx包对应的所有依赖包, 并递归搜索相应依赖包的所有依赖包,统计出安装 nginx必须要安装的所有包, 再从/var/lib/pacman/local/文件夹里查询这些包是否已经被安装,如果已被安装,则忽略安装此包及其依赖, 接着pacman就会从/etc/pacman.d/mirrorlist文件里选择一个包下载地址, 把这些包下载到/var/cache/pacman/pkg/文件夹里,安装包到系统里, 同时更新 /var/lib/pacman/local/文件夹,用来注册这些新安装的包, 到此安装过程结束。
3 打包
首先我们看看软件包的结构,例如redis-3.2.9-1-x86_64.pkg.tar.xz.
$ tar xvJf redis-3.2.9-1-x86_64.pkg.tar.xz
$ tree redis
redis
├── etc
│ ├── logrotate.d
│ │ └── redis
│ └── redis.conf
└── usr
├── bin
│ ├── redis-benchmark
│ ├── redis-check-aof
│ ├── redis-check-rdb
│ ├── redis-cli
│ ├── redis-sentinel -> redis-server
│ └── redis-server
├── lib
│ └── systemd
│ └── system
│ └── redis.service
└── share
└── licenses
└── redis
└── LICENSE
从目录树里我们可以看到,这就是安装后redis的所有文件, 其中有二进制文件和配置文件(usr/和etc/目录), 并且路径与操作系统中的目录树相对应。 那么redis-3.2.9-1-x86_64.pkg.tar.xz包是如何产生的呢?其实,它是由archlinux的维护人员事先打包构建好后放到mirrorlist供pacman命令下载。而构建这个包,主要是依靠makepkg命令并配置PKGBUILD脚步自动完成下载、解压、编译并打包成archlinux包的。
4 PKGBUILD
为了构建一个archlinux包, 我们只需编写PKGBUILD脚本, 然后运行makepkg命令, 其通过PKGBUILD脚本中参数和指令来自动化下载、解压、编译和打包全过程。
PKGBUILD非常好写,通过shell语法定义一些makepkg命令需要的参数和指令。
我们来看看上一小节中PKGBUILD中定义的参数:
- pkgname:包名
- pkgver:包版本
- pkgrel:包的 release number
- pkgdesc:包的简要概述
- arch:包编译的体系结构
- url:包官方网站 url
- depends:包的依赖包
- makedepends:编译这个包时需要的依赖包
- source:包源码的下载地址
- md5sums:上面 source 参数对应项的 md5sum,用来检测下载包的正确性
- build:编译指令
- package:打包指令
- 更多参数请参考archlinux wiki