systemd入门, dpkg打包

相关介绍:
systemd介绍:
https://www.cnblogs.com/cangqinglang/p/13716497.html
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

linux下自定义系统服务(创建自己的systemd服务)
https://www.jianshu.com/p/ec1798345787
https://baijiahao.baidu.com/s?id=1678224207380645384&wfr=spider&for=pc

需求:升级linux服务器主程序。

解决方案:
  1. 使用DEBIAN的部署方案,用dpkg工具安装部署systemd服务。
  2. 使用systemd的方案启动监视脚本是否有升级任务,若有用dpkg工具升级。

实现过程:
deb文件打包
1. 根据项目架构创建目录MyServer文件夹,下面创建Makefile文件和MyServer目录
注:1) Makefile文件是集成到项目的Makefile系统,实现把MyServer下的文件拷贝到out/target目录打包
  2) MyServer目录下包含DEBIAN目录以及xxx.service和xxx.sh; 其中xxx.service文件是需要在linux目标机上启动的服务脚本,xxx.sh为服务脚本调用的功能脚本。

/*************************start****************************/
MyServer/Makefile文件:
.PHONY: all clean install

all:
echo "Nothing to do!"

clean:
echo "Nothing to do!"

install:
cp MyServer/* $(INSTALL_DIR) -arf//INSTALL_DIR 为环境变量,表示某个路径

/*************************end****************************/


/*************************start****************************/
xxx.service文件:
# my upgrade service.

[Unit]
Description=my upgrade service script

[Service]
Type=simple
ExecStart=/usr/MyServer/script/upgrade.sh

[Install]
WantedBy=multi-user.target

/*************************end****************************/

systemd配置文件主要项目说明:
控制单元[Unit]:记录unit文件的通用信息
Description:单元的描述,内容可以任意书写

服务[Service]:记录service的信息
ExecStart:服务启动时执行的命令,通常是服务的主体。若服务类型不是oneshot,
那么它只接受一个命令,参数不限制。如果是多个命令用分号隔开。

Restart:定义服务何种情况下重启。

Type:service的种类,simple(默认):启动的程序是主体程序,这个程序退出那么
一切都退出;forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork()
函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程;oneshot:
就是启动,完成,没进程。

安装[Install]:安装信息
WantedBy:任何情况下,服务被启用。
WantedBy =multi-user.target,多用户环境下启用

以上是最简单systemd编写
详细参考:https://www.cnblogs.com/cangqinglang/p/13716497.html


xxx.service文件安装到目标机后可执行的操作:
systemctl start xxx.service //启动服务
systemctl stop xxx.service //停止服务
systemctl status xxx.service //查看服务的状态
安装一个新的服务一版系统提示重启daemon:
systemctl daemon-reload

2. 用dpkg制作deb包

首先了解一下deb包的文件结构:
deb 软件包里面的结构:它具有DEBIAN和软件具体安装目录(如etc, usr, opt,tmp等)。

在DEBIAN目录中起码具有control文件,其次还可能具有postinst(postinstallation)、postrm(postremove)、preinst(preinstallation)、prerm(preremove)、copyright(版权)、changlog (修订记录)和conffiles等。

control: 这个文件主要描述软件包的名称(Package),版本(Version)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。

同时为了能将软件包进行充分的管理,可能还具有以下字段:
Section: 这个字段申明软件的类别,常见的有`utils’, `net’, `mail’, `text’, `x11′ 等;

Priority: 这个字段申明软件对于系统的重要程度,如`required’, `standard’, `optional’,`extra’ 等;

Essential: 这个字段申明是否是系统最基本的软件包(选项为yes/no),如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载(除非进行强制性的卸载)

Architecture:申明软件包结构,如基于`i386′, ‘amd64’,`m68k’, `sparc’, `alpha’, `powerpc’ 等;

Source: 软件包的源代码名称;

Depends: 软件所依赖的其他软件包和库文件。如果是依赖多个软件包和库文件,彼此之间采用逗号隔开;

Pre-Depends: 软件安装前必须安装、配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求;

Recommends: 这个字段表明推荐的安装的其他软件包和库文件;

Suggests: 建议安装的其他软件包和库文件。

preinst:在Deb包文件解包之前,将会运行该脚本。许多“preinst”脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。

postinst:该脚本的主要任务是完成安装包时的配置工作。许多“postinst”脚本负责执行有关命令为新安装或升级的软件重启服务。
prerm:该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。

postrm:该脚本负责修改软件包链接或文件关联,或删除由它创建的文件。

control文件内容,例如:
Package: soft (程序名称)
Version: 1.0.1 (版本)
Section: utils (程序类别)
Architecture: iphoneos-arm (程序格式)
Installed-Size: 512 (大小)
Maintainer: your <your_email@gmail.com> (打包人和联系方式)
Description: soft package (程序说明)
(此处必须空一行再结束)
注:此文件也可以先在电脑上编辑(使用文本编辑就可以,完成后去掉.txt),再传到打包目录里。

postinst文件内容( 软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限:chmod +x postinst):
#!/bin/sh
echo "my deb" > /root/mydeb.log

postrm文件内容( 软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限:chmod +x postrm):
#!/bin/sh
rm -rf /root/mydeb.log

给mydeb目录打包:
# dpkg -b mydeb mydeb-1.deb # 第一个参数为将要打包的目录名,
# 第二个参数为生成包的名称。

安装deb包:
# dpkg -i mydeb-1.deb # 将initrd-vstools.img复制到/boot目录下后,执行postinst,
# postinst脚本在/root目录下生成一个含有"my deb"字符的mydeb.log文件

卸载deb包:
# dpkg -r my-deb # 这里要卸载的包名为control文件Package字段所定义的 my-deb 。
# 将/boot目录下initrd-vstools.img删除后,执行posrm,
# postrm脚本将/root目录下的mydeb.log文件删除

查看deb包是否安装:
# dpkg -s my-deb # 这里要卸载的包名为control文件Package字段所定义的程序名称

查看deb包文件内容:
# dpkg -c mydeb-1.deb

查看当前目录某个deb包的信息:
# dpkg --info mydeb-1.deb

解压deb包中所要安装的文件
# dpkg -x mydeb-1.deb mydeb-1

# 第一个参数为所要解压的deb包,这里为 mydeb-1.deb
# 第二个参数为将deb包解压到指定的目录,这里为 mydeb-1

解压deb包中DEBIAN目录下的文件(至少包含control文件)
# dpkg -e mydeb-1.deb mydeb-1/DEBIAN

# 第一个参数为所要解压的deb包,这里为 mydeb-1.deb
# 第二个参数为将deb包解压到指定的目录,这里为 mydeb-1/DEBIAN

详细参考:https://blog.csdn.net/ermuzhi/article/details/7817801


遇到的问题:
1. Syntax error: "(" unexpected
  解决方法:https://blog.csdn.net/appleyuchi/article/details/93334552
  兼容性问题,因为linux将sh默认指向了dash,而不是bash
  root权限执行 dpkg-reconfigure dash 选择no

2. shell 脚本必须以#!/bin/sh 为首行才能让bash工具解析

3. dpkg -b <dir> <deb name>
  打包时的目录在安装时会按照打包的目录去释放。例如在/home/os/ 下有个test/eg/1.txt 的目录文件,那么在/home/os/下执行sudo dpkg -b test t.deb时会生成t.deb包。在别的目标机上执行sudo dpkg -i t.deb命令安装时会把1.txt 放在目标机的/home/os/test/eg/下。

原文地址:https://www.cnblogs.com/liangzige/p/15357031.html