• dpkg制作deb包


    本文参考

    https://www.cnblogs.com/Genesis-007/p/5219960.html

    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:建议安装的其他软件包和库文件。
    control文件完整示例:
    Package: mysoftware
    Version: 2022-03-29
    Section: free
    Priority: optional
    Depends: libssl.0.0.so, libstdc++2.10-glibc2.2
    Suggests: Openssl
    Architecture: amd64
    Installed-Size: 66666
    Maintainer: Liuym
    Provides: mysoftware
    Description: just for test
                        (此处必须空一行再结束)
    
    • postinst文件:包含了软件在进行正常目录文件拷贝到系统后,所需要执行的配置工作。
    • prerm文件:软件卸载前需要执行的脚本。
    • postrm文件:软件卸载后需要执行的脚本。

    制作deb包过程:

    1. 制作如下目录及文件

    所有目录及文件:

    mydeb
    
    |----DEBIAN
    
           |-------control
    
           |-------postinst
    
           |-------postrm
    
    |----boot
    
           |----- mysoftware
    

    在任意目录下创建如上所示的目录及文件

    提示:这里演示的安装软件为空即运行之后会boot目录下创建一个文件夹mysoftware但是文件夹内没有内容

    $ mkdir -p /home/mydeb                         # 在该目录下存放生成deb包的文件以及目录
    $ mkdir -p /home/mydeb/DEBIAN                  #目录名必须大写
    $ mkdir -p /home/mydeb/boot                    # 将文件安装到/boot目录下
    $ touch /home/mydeb/DEBIAN/contro    l         # 必须要有该文件
    $ touch /home/mydeb/DEBIAN/postinst            # 软件安装完后,执行该Shell脚本
    $ touch /home/mydeb/DEBIAN/postrm              # 软件卸载后,执行该Shell脚本
    $ touch /home/mydeb/boot/mysoftware            # 所谓的“软件”程序,这里就只是一个空文件
    

    control文件内容:

    提示:以下中文为备注信息,实际文件不能包含这个备注信息

    Package: mysoftware       (软件名称,中间不能有空格)
    Version: 1                (软件版本)
    Section: free             (软件类别)
    Prioritt: optional        (软件对于系统的重要性)
    Architecture: amd64       (软件所支持的平台架构)
    Maintainer: xxx <>        (打包人和联系方式)
    Description: mydeb        (对软件的描述)
              (此处必须空一行再结束)
    

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

    # !/bin/sh
    echo "my deb" >/home/mydeb.log
    

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

    # !/bin/sh
    rm -rf /home/mydeb.log
    
    1. 完成第一步的制作目录及文件后可以给做好的mydeb目录进行打包成.deb包
    $ dpkg -b mydeb mydeb.deb #第一个参数为将要打包的目录名,
                              #第二个参数为生成包的名称
    

    现在完成了deb包的制作。

    安装deb包:

    $ dpkg -i mydeb.deb      # 将imysoftware复制到/boot目录下后,执行postinst
                             # postinst脚本在/home目录下生成一个含有"mysoftware"字符的mydeb.log文件
    

    卸载deb包:

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

    查看deb包是否安装:

    $ dpkg -s   mysoftware      # 这里要卸载的包名为control文件Package字段所定义的 mysoftware
    

    查看deb包文件内容:

    $ dpkg   -c   mydeb.deb
    

    查看当前目录某个deb包的信息:

    $ dpkg --info mydeb.deb
    

    输出如下

    root@liuym-virtual-machine:/home# dpkg -c mydeb.deb
    drwxr-xr-x root/root         0 2022-03-23 10:50 ./
    drwxr-xr-x root/root         0 2022-03-23 13:42 ./boot/
    -rw-r--r-- root/root         0 2022-03-23 13:42 ./boot/mysoftware
    

    解压deb包中所要安装的文件

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

    解压deb包中DEBIAN目录下的文件(至少包含control文件)

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

    打包一个实际的应用

    下面演示打包一个使用python编写的脚本
    查看目录结构

    root@liuym-virtual-machine:/home/liuym/桌面# tree file_decode_all
    file_decode_all
    ├── DEBIAN
    │   ├── control
    │   └── postinst
    ├── readme.md
    └── usr
        ├── local
        │   └── bin
        │       ├── background.png
        │       └── file-decode.py
        └── share
            └── applications
                └── file-decode.desktop
    

    文件内容如下,控制文件

    root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/DEBIAN/control
    Package: file-decode
    Version: 1.0.0
    Architecture: all
    Essential: no
    Section: utils
    Priority: optional
    Maintainer: Liuym
    Description: file utf decode gbk
    

    解压后运行的脚本文件

    root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/DEBIAN/postinst
    #!/bin/bash
    chown root:root /usr/local/bin/file-decode.py
    chmod 755 /usr/local/bin/file-decode.py
    

    图片文件 background.png是脚本需要的一个图片
    Python脚本文件

    root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/usr/local/bin/file-decode.py
    #!/usr/bin/python3
    import tkinter as tk
    from tkinter import messagebox
    from tkinter import ttk
    from tkinter import filedialog
    import configparser, os, time
    #from PIL import ImageTk, Image
    
    class Login(object):
    
        def __init__(self):
            # 创建主窗口,用于容纳其它组件
    
            self.root = tk.Tk()
            # 给主窗口设置标题内容
            self.root.title("csv文件转码(utf转gbk)")
    
            self.root.geometry('800x800')
            # 运行代码时记得添加一个gif图片文件,不然是会出错的
            self.canvas = tk.Canvas(self.root, height=500, width=600)  # 创建画布
            self.image_file = tk.PhotoImage(file="/usr/local/bin/background.png")  # 加载图片文件
            self.image = self.canvas.create_image(0, 0, anchor='nw', image=self.image_file)  # 将图片置于画布上
            self.canvas.pack(side='top')  # 放置画布(为上端)
    
            # 创建一个`Button`名为`选择文件 `
            self.label_select = tk.Button(self.root, text='选择文件', command=self.upload_file)
            # 创建一个`Button`名为`转码`
            self.label_change = tk.Button(self.root, text='转码', command=self.decode_file)
            self.label_entry = tk.Entry(self.root, width='40')
            self.label_out = tk.Text(self.root, width='40', height='5' )
            self.label_show = tk.Label(self.root, text='转码输出路径')
        def upload_file(self):
            self.selectFile = tk.filedialog.askopenfilename()
            self.label_entry.insert(0, self.selectFile)
    
        def decode_file(self):
            #print(self.selectFile)
            now_time = time.strftime("%Y%m%d%H%M%S")
            #print(now_time)
            user_desktop = os.path.join(os.environ['HOME'], 'Desktop')
            csv_name= os.path.basename(self.selectFile)
            #os.system('ls -l "' + self.selectFile + '"')
            #os.system("ls -l %s" %(self.selectFile))
            param1 = '%s/%s_%s' %(user_desktop,now_time,csv_name)
            param2 = '>%s/%s_%s' %(user_desktop,now_time,csv_name)
            os.system('iconv -f utf8 -t gb2312 -c %s %s' %(self.selectFile, param2))
    
            self.label_out.insert("insert", "文件转码完成\n")
            self.label_out.insert("insert", param1)
            tk.messagebox.showinfo('提示', '文件转码完成,请在桌面查看转码后的文件')
            #self.size = os.path.getsize(self.selectFile)
            #print(self.size)
    
        # 完成布局
        def gui_arrang(self):
            self.label_select.place(x=10, y=520)
            self.label_change.place(x=620, y=520)
            self.label_entry.place(x=150, y=520)
            self.label_show.place(x=10,y=580)
            self.label_out.place(x=150, y=580)
    
    def main():
        # 初始化对象
        app = Login()
        # 进行布局
        app.gui_arrang()
        # 主程序执行
        tk.mainloop()
    
    
    if __name__ == '__main__':
        main()
    

    file-decode.Desktop文件

    root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/usr/share/applications/file-decode.desktop
    [Desktop Entry]
    Version=1.0
    Encoding=UTF-8
    Name=utf转码gbk工具
    comment=utf转码gbk工具
    Exec=/usr/local/bin/file-decode.py
    Icon=deepin-terminal
    Type=Application
    Categories=Application;
    

    打包

    dpkg -b file_decode_all/ file_decode-1.0.0.deb
    dpkg-deb: 正在 'file_decode-1.0.0.deb' 中构建软件包 'file-decode'。
    

    参数解析

    dpkg -b # 打包
    file_decode_all/ # 需要打包的文件夹
    file_decode-1.0.0.deb # 自定义打包后的deb文件
    

    使用打包后deb安装

    dpkg -i file_decode-1.0.0.deb
    

    查看安装后的文件位置

    root@liuym-virtual-machine:/home/liuym/桌面# ls /usr/local/bin/
    background.png  file-decode.py
    root@liuym-virtual-machine:/home/liuym/桌面# ll /usr/share/applications/file-decode.desktop
    -rw-rw-r-- 1 liuym liuym 191 2月  28 16:34 /usr/share/applications/file-decode.desktop
    

    使用安装后的程序

    file-decode.py
    

    卸载

    dpkg -r file-decode # 注意这里卸载的名称需要和control里面的Package字段一致
    
  • 相关阅读:
    [PY3]——内置数据结构(2)——元组及其常用操作
    [PY3]——内置数据结构(1)——列表及其常用操作
    [PY3]——基本语法
    session和cookie介绍以及session简单应用
    php中获取当前系统时间、时间戳
    ajax之XML简介
    Ajax练习题
    ajax语法
    JQUERY选中问题
    JSON
  • 原文地址:https://www.cnblogs.com/minseo/p/16074459.html
Copyright © 2020-2023  润新知