RPM常用命令及打包
rpm常用命令
rpm -e xxx # 删除指定软件包
rpm -e --nodeps xxx # 删除指定软件包(不含依赖,强制删除)
rpm -ql xxx # 查看指定软件包的安装内容
rpm -qpR xxx.rpm # 查看rpm包的依赖
dnf install xxx # 安装软件包
dnf remove xxx # 卸载软件包,同时删除依赖包
dnf info xxx # 查看指定软件包详情
dnf info --available xxx # 查看 指定软件包 是否有升级包(可用包,不含已安装)
dnf info --showduplicates xxx # 查看 指定软件包 的所有包(已安装和可用包)
查看当前环境所有宏定义
rpmbuild --showrc
使用 rpm
命令的 --eval
选项可以查看宏的值。例如,要查看 %{_sourcedir}
的值,可以运行:
rpm --eval '%{_sourcedir}'
查看rpm包中的内容:
rpm2cpio xxxx.noarch.rpm | cpio -t
rpm构建打包
RPM 打包指南:https://rpm-packaging-guide.github.io/
1. 安装依赖
安装创建rpm包需要的工具:
dnf install -y rpm-build rpmdevtools rpmlint
2. 创建RPM构建目录
rpmdev-setuptree
# 这将在你的主目录下创建 rpmbuild 目录,其中包含以下子目录:
# BUILD # 编译过程中源代码解压到的目录,不需要我们放任何东西
# BUILDROOT # 在编译制作过程中会生成的目录,目录中的所有文件即为打成rpm包中的内容
# RPMS # 制作完成以后存放rpm包的目录
# SOURCES # 原材料存放目录(源代码,配置文件等存放的目录)
# SPECS # 放.spec文件的目录
# SRPMS # src格式的rpm包存放路径
3. 编写spec文件
.spec
文件示例:
Name: hello-world
Version: 1
Release: 1
Summary: Most simple RPM package
License: FIXME
%description
This is my first RPM package, which does nothing.
%prep
# we have no source, so nothing here
%build
cat > hello-world.sh <<EOF
#!/usr/bin/bash
echo Hello world
EOF
%install
mkdir -p %{buildroot}/usr/bin/
install -m 755 hello-world.sh %{buildroot}/usr/bin/hello-world.sh
%files
%defattr(-,root,root,0755) # 定义文件相关权限(,属主,属组,权限)
/usr/bin/hello-world.sh
%changelog
# let's skip this for now
检查spec文件:
dnf builddep ~/rpmbuild/SPECS/lico-scheduler.spec
spec文件编写注意事项:
1. 指令使用 <tag_name>: <value> 方式,例如:
Name: nginx # tag_name不区分大小写,value区分大小写
2. 用户自定义宏语法: %define key value
使用宏方法:%{key} 或者 %key # 大括号可以省略
3. "#" 号开头的都是注释,注释中不能使用 "%" 号,如果想使用 "%" 号需要使用两个 "%%" 号来表示,否则可能引起误识别(比如注释这是%prep阶段)
$1 表示已安装包的版本数
action | count |
---|---|
install the first time | 1 |
upgrade | 2 or higher |
remove the last version of package | 0 |
例:
%prep
if [ $1 == 1 ]; then
/usr/sbin/useradd -c "test"
fi
4. 构建软件包
方法一:使用spce文件构建软件包:
rpmbuild -bb ~/rpmbuild/SPECS/xxx.spec
# -ba 同时生成rpm二进制包和源码包
# -bb 制作二进制格式rpm包
# -bs 制作源码格式rpm包
# -bp 执行完 %prep 阶段就停止
# -bc 执行完 %build 阶段就停止
# -bi 执行完 %install 阶段就停止
# -bl 检测哪些文件在BUILDROOT路径安装生成了,但在制作rpm包的files阶段没有包含进去
# 指定 _sourcedir路径
rpmbuild -ba ~/test_7.1.0/rpmbuild/SPECS/lico-scheduler.spec --define '_sourcedir /root/test_7.1.0/rpmbuild/SOURCES'
如果一切顺利,生成的 RPM 包将位于 ~/rpmbuild/RPMS/
目录中。
方法二:使用 .src.rpm
构建rpm包 (别人用 -bs
构建出来的源码格式rpm包进行构建)
rpmbuild --rebuild xxx.src.rpm
FPM
感兴趣可以了解一下,当时打包时见有此种方法,故记录,并未实践!
fpm:https://github.com/jordansissel/fpm
fpm 的目标是使构建诸如 rpm、debs、OSX 包等包变得简单快捷。
fpm是ruby写的,因此系统环境需要ruby,且ruby版本号大于1.8.5。
安装ruby模块
yum -yinstall ruby rubygems ruby-devel# 添加阿里云的
gem sources -a http://mirrors.aliyun.com/rubygems
移除原生的Ruby仓库:
gem sources --remove http://rubygems.org/
安装fpm
gem install fpm -v 1.3.3
指定安装fpm 1.3.3版本的软件,fpm这个工具升级挺频繁,而且在每次升级后会出现各种各样的问题。但是老版本的fpm工具能够满足我们的需求,因此就用这个版本了。