Fedora Server定制化封装ISO(3)-定制RPM包

在之前的章节,已经将ISO重新封装的方法和使用kickstart自动化安装的过程讲完,现在要在操作系统中加入已经写好的程序,让它能够在系统安装过程中进行自动化安装,并在操作系统起来之后能够自动运行。

我们需要以下几个步骤:

  1. 创建rpm封装环境
  2. 构建可执行程序
  3. 使用service将我们的程序封装,并设置在系统启动时运行
  4. 构建rpm文件

创建RPM封装环境

  • 安装构建所需要的包管理工具
# dnf install fedora-packager
  • 创建构建目录
# rpmdev-setuptree 

会构建一个rpmbuild的目录

# ls rpmbuild
BUILD  RPMS  SOURCES  SPECS  SRPMS

至此,构建环境已经完成

准备可执行文件

这里准备一个简单的helloworld的shell程序作为示例

[root@localhost ~]# cat helloworld 
#!/bin/bash
echo "Hello world!"
ping baidu.com -c 100 >> /tmp/pingtest

这个程序在开始的时候打印helloworld,然后ping百度100次写入到/tmp/pingtest中

将其增加可执行权限

[root@localhost ~]# chmod +x helloworld

撰写service文件

具体如何书写service文档,请参考官方文档,这里仅写一个示例service文件:

[root@localhost ~]# cat helloworld.service 
[Unit]
Description=HelloWorld Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/helloworld
Restart=always
KillMode=process
[Install]
WantedBy=multi-user.target

这里有几个需要解释的地方

  1. After:是指service在系统启动过程中的顺序,这里写的是network.target说明是在网络起来之后这个服务就可以起来了。它主要来控制启动顺序,比如还有一个程序是helloworld2,我们想让helloworld先运行起来,然后helloworld2再起来,那在helloworld2的service文件中,After可以写成helloworld.service
  2. ExecStart:程序运行时执行的命令,可以用分号;将多个命令组合
  3. ExecStop:示例中没有写,这里可以写service停止时需要掉用的命令,例如存储service停止时,要将本地的盘卸载这种后续命令。
  4. Restart:重启策略,当程序终止时,是否需要重启,always是指无论什么情况,只要是程序终止了,就重新启动。对应到我们的helloworld程序,在ping 100次之后,程序会默认退出,但是这里因为有always,所以会重新启动起来,重新输出helloworld,再继续ping,无限重复。

构建RPM包

首先梳理一下我们构建的rpm需求

  1. service文件需要放置在/etc/systemd/system/目录下
  2. helloworld可执行文件我们要放置在/usr/bin/目录下
  3. 将etc和usr两个目录打包成一个tar文件
  4. 在SPEC文件中定义安装过程

为了方便之后的构建和操作,先创建一个rpm构建的文件夹helloworld

[root@localhost ~]# mkdir helloworld-build

在文件夹下创建对应的目录

# mkdir -p helloworld-build/etc/systemd/system
# mkdir -p helloworld-build/usr/bin

然后将两个文件放置到对应的目录下

# mv helloworld helloworld-build/usr/bin/
# mv helloworld.service helloworld-build/etc/systemd/system

先进入构建目录,然后将etc和usr两个文件夹打包

# cd helloworld-build/
# tar zcvf helloworld usr etc
usr/
usr/bin/
usr/bin/helloworld
etc/
etc/systemd/
etc/systemd/system/
etc/systemd/system/helloworld.service
# ls
etc  helloworld  usr

生成的helloworld移植到rpm的构建目录BUILD和SOURCES文件夹

# cp helloworld ~/rpmbuild/BUILD/
# cp helloworld ~/rpmbuild/SOURCES/

接下来编写RPM的SPEC文件

# cd rpmbuild/SPECS
# cat helloworld.spec

Summary: HelloWorld RPM Test
Name: helloworld
Version: 1.0
Release: 1
License: GPLv2
Group: Extensions/Chinese
Source: helloworld
Packager: ShanHaiYuTing
%description
This package is used to test rpm build.
%changelog
%prep
%setup -c
#%build
%install
mkdir -p $RPM_BUILD_ROOT/usr/local/bin
cp $RPM_BUILD_DIR/helloworld $RPM_BUILD_ROOT/usr/local/bin/helloworld
install -m 755 $RPM_BUILD_DIR/helloworld $RPM_BUILD_ROOT/usr/local/bin/helloworld
%files
/usr/local/bin/helloworld
%post
mv /usr/local/bin/helloworld /root/helloworld.tar.gz
cd /root
tar xzvf helloworld.tar.gz
cp -r usr /
cp -r etc /
cd /root
rm -rf usr etc
rm -rf helloworld.tar.gz

这是是个十分随意的SPEC,大家可以依照fedora-project的rpm构建指南撰写。

接下来我们根据SPEC文件创建rpm包:

# rpmbuild -bb helloworld.spec 

打包完成后的rpm文件存储在~/rpmbuild/RPMS/x86_64/helloworld-1.0-1.x86_64.rpm

至此,RPM构建完成

安装:

# yum install ~/rpmbuild/RPMS/x86_64/helloworld-1.0-1.x86_64.rpm

开启helloworld service

# systemctl start helloworld

查看ping文件:

# tail -f /tmp/pingtest

成果获取返回更新,说明包是安装正常的

卸载:

# yum remove helloworld

下一章我们讨论如何将rpm加入到ISO中,并在系统安装过程中自动安装。

 

About the author

liuyuhang

View all posts

7 Comments

  • I wanted to thank you for this great write-up, I definitely loved every little bit of it. I ave bookmarked your web site to look at the latest stuff you post. Maurene Harp Fitton

  • Smart rich stretch viscose green yellow poly- blend fabric spaghetti straps figure-skimming fit. Silk knot cufflinks stylish quirky braces polka-dot print metal clips adjustable straps glossy metallic finish pretty. Lind Hazel Lincoln

  • Way cool! Some very valid points! I appreciate you writing this article plus the rest of the website is really good. Jacinda Ross Risa

  • Hi! I simply would like to give you a big thumbs up for your excellent information you have right here on this post. I will be coming back to your web site for more soon. Stella Frasco Wallace

发表评论

电子邮件地址不会被公开。 必填项已用*标注