1. 准备
操作系统: CentOS7
安装rpm制作工具
1
2sudo yum install -y rpmdevtools
准备:
- 可执行程序:
main
- systemd配置:
myrpm.service
程序和配置文件见参考附录
2. 打包
可以选择其中一种方式打包:
- 默认打包:适合快速入门。
- 自定义打包:适合灵活配置参数。
以制作Systemd服务安装包为例演示打包过程。
2.1 默认打包
2.1.1 初始化
使用构建命令创建打包过程中的目录
1
2rpmdev-setuptree
命名执行成功后会在当前用户/home/用户名
目录下创建rpmbuild
目录
这里就不对这些目录进行详细介绍了,如果想要了解详细请看 这里
我们将上一步准备好的可执行程序main
和systemd配置文件myrpm.service
放入到生成的BUILD
目录中,如下
2.1.2 编写构建指令文件
我们在SPECS
下创建一个名为myrpm.specs
的文件
1
2touch ~/rpmbuild/SPECS/myrpm.specs
编辑该文件输入下面内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32Name: myrpm Version: 1.0.0 Release: 1%{?dist} Summary: Test rpm build License: free Requires: glibc >= 2.17 %description my rpm package test %install mkdir -p ${RPM_BUILD_ROOT}/usr/local/myrpm/ mkdir -p ${RPM_BUILD_ROOT}/usr/lib/systemd/system/ cp -f main ${RPM_BUILD_ROOT}/usr/local/myrpm/main cp -f myrpm.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/myrpm.service # 安装完成后执行 %post systemctl daemon-reload # 卸载时执行 %postun rm -rf /usr/local/myrpm/main rm -rf /usr/lib/systemd/system/myrpm.service systemctl daemon-reload # 规定那些文件必须放入安装程序中,如果没有就报错 %files %defattr(-,root,root) /usr/local/myrpm/main /usr/lib/systemd/system/myrpm.service
文件开始的一系列定义如
Name
之类配置我就不详细介绍,根据自己的程序需要调整相应的内容就行。
其他内容根据需要请见 3. 构建文件解析章节
2.1.3 打包
打包过程使用
1
2rpmbuild -bb SPECS/myrpm.specs
一会后打包就完成了
打包完成后目录结构如下
安装包生成于RPMS
目录下。
2.2 自定义打包
2.2.1 自定义工作目录
rpmdev-setuptree
工具默认将在当前用户目录下的创建rpmbuild
目录,这种方式不够灵活。
下面介绍一种可以自定义任意目录为rpmbuild
目录的方式。
例如需要指定/www/rpmbuild
作为打包目录,由于没有了rpmdev-setuptree
,我们需要手动创建rpmbuild内部的目录结构
1
2
3mkdir /www/rpmbuild cd /www/rpmbuild
构建目录结构:
1
2
3
4
5
6
7
8
9cd /www/rpmbuild mkdir BUILD mkdir BUILDROOT mkdir RPMS mkdir SOURCES mkdir SPECS mkdir SRPMS
打包和SPEC文件流程和之前的描述的一致,在打包命令上有些不同。
1
2rpmbuild -bb --define "_topdir /www/rpmbuild" SPECS/myrpm.specs
需要额外定义一个名为_topdir
变量,通过该变量指定打包目录位置。
2.2.2 自定义架构
对于需要打包成不同平台的情况,还可以追加--target
参数:
x86架构64位:
1
2rpmbuild -bb SPECS/myrpm.specs --target amd64
x86架构32位:
1
2rpmbuild -bb SPECS/myrpm.specs --target i386
ARM架构64位:
1
2rpmbuild -bb SPECS/myrpm.specs --target aarch64
2.3 测试
安装
1
2sudo rpm -ivh RPMS/x86_64/myrpm-1.0.0-1.el7.x86_64.rpm
启动服务
1
2sudo systemctl start myrpm
查看日志打印
1
2journalctl -f -u myrpm
关闭服务
1
2sudo systemctl stop myrpm
卸载软件
1
2sudo rpm -evh myrpm
卸载后我们在通过ls命令查看一下我们之前创建的位置,可以发现目录和文件已经删除。
3. 构建文件解析
安装阶段
安装阶段就是%install
之后执行的脚本,主要工作就是创建目录,然后把相应的文件放到指定目录中去。
1
2
3mkdir -p ${RPM_BUILD_ROOT}/usr/local/myrpm/ mkdir -p ${RPM_BUILD_ROOT}/usr/lib/systemd/system/
- 首先创建安装目录,通过
${RPM_BUILD_ROOT} + 绝对路径
来表示我们希望安装到的操作系统内位置
例如:
${RPM_BUILD_ROOT}/usr/local/myrpm/
表示安装后的操作系统的/usr/local/myrpm/
路径。
- 接下来就是把我们准备的文件从
BUILD
目录拷贝到刚才创建的相应目录中去
1
2
3cp -f main ${RPM_BUILD_ROOT}/usr/local/myrpm/main cp -f myrpm.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/myrpm.service
在打包安装过程中打包程序会自动切换目录到
BUILD
所以我们直接使用相对路径进行文件的复制。
如cp -f main ....
就表示从BUILD/main
安装完成阶段
安装完成阶段也就是执行%post
后面的脚本。
由于是systemd服务的安装,在我们把文件复制到指定位置之后需要调用systemd的命令重新加载服务。
1
2systemctl daemon-reload
所以这里只有一行,就是用于重新加载服务。
卸载
卸载阶段就是当我们执行rpm -e
命令时候,执行%postun
后的脚本。
这里我就把我们前面创建的目录和配置文件删除,然后重新加载下Systemd服务
1
2
3
4rm -rf /usr/local/myrpm/main rm -rf /usr/lib/systemd/system/myrpm.service systemctl daemon-reload
打包文件检查
在打包之前对文件再进行一次检查,也就是$files
,如果列表中的文件没有在安装路径中找到那么就会报错。
我们这里只有两个文件要复制,所以填入了两个文件的绝对路径
1
2
3/usr/local/myrpm/main /usr/lib/systemd/system/myrpm.service
加入我们把myrpm.service删除,并且注释掉cp命令,然后在构建那么就会失败
自定义打包后的文件名
也可以定义环境变量来自定义打包后的文件名,例如
1
2
3
4... %define _rpmfilename %%{NAME}.%%{VERSION}.el7.%%{ARCH}.rpm ....
上述的%%{NAME}
是引用上下文中的环境变量也就是 .specs
文件中定义的Name
属性。
RPM的默认值为
1
2%%{ARCH}/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
4. 附录
可执行程序
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package main import ( "log" "os" "os/signal" "time" ) func main() { c := make(chan os.Signal) signal.Notify(c) tick := time.Tick(time.Second) for { select { case <-tick: log.Println("") case s := <-c: log.Printf("程序关闭 Signal [%v]", s) return } } }
编译,得到main
1
2go build main.go
Systemd服务配置
myrpm.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[Unit] Description=my rpm services After=network.target [Service] WorkingDirectory=/usr/local/myrpm ExecStart=/usr/local/myrpm/main Type=simple PIDFile=/usr/local/myrpm/myrpm.pid Restart=always RestartSec=5 [Install] WantedBy=default.target
5. 参考文献
- [1]. rpmbuild制作rpm 包 . 双斜杠少年 . https://blog.csdn.net/u012373815/article/details/73257754
- [2]. go-应用-打包-rpm-发布 . 点点滴滴 . http://www.tang-lei.com/2019/09/05/go-%E5%BA%94%E7%94%A8-%E6%89%93%E5%8C%85-rpm-%E5%8F%91%E5%B8%83/
- [3]. golang 使用 rpm 包交付部署 . 鼎铭 . 2018-04-02 . https://studygolang.com/articles/12731
最后
以上就是威武小懒猪最近收集整理的关于Centos RPM安装包制作的全部内容,更多相关Centos内容请搜索靠谱客的其他文章。
发表评论 取消回复