• 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/下。

  • 相关阅读:
    时隔 4 年!ElasticJob 3.0.0 发布,王者归来。。
    Git 代码防丢指南,再也不怕丢失代码了!
    排查线上问题必须掌握的 6 个 Linux 命令!
    Leaflet添加图片图层:ImageOverlay
    js图片数据流
    arcgis查找与要素相交的内容 by 空间连接查询
    Leaflet添加图片图层:使用Axios请求arcgis server rest api的exportmap,获取图片并进行显示
    esri-leaflet: unique value renderer唯一值渲染-dynamiclayers参数
    arcgis server缓存切片
    城市给排水法律法规
  • 原文地址:https://www.cnblogs.com/liangzige/p/15357031.html
Copyright © 2020-2023  润新知