【全网独家】手把手教你制作一个Ubuntu Deb 安装包

Ubuntu Deb 安装包

加班到9点多了,今天本来准备整理一下Linux常用命令,没有时间了。目前还没有回家。就发一篇昨天整理的一个deb打包的教程,网上搜了很多,都是讲解命令的,没有一个比较完整的教程。如果你公司用到了deb打包,可以仔细阅读一下,如果你没有接触过deb打包,那可以简单了解一下,毕竟技多不压身

本文主要参考博文:

  • Debconf程序员的教程 :http://www.fifi.org/doc/debconf-doc/tutorial.html#AEN113
  • Debian 的包管理系统 : https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.zh-cn.html

【全网独家】手把手教你制作一个Ubuntu Deb 安装包_第1张图片

一、什么是Deb包

DEB是Debian软件包格式的文件扩展名,跟Debian的命名一样,DEB也是因Debra Murdock而得名,她是Debian创始人Ian Murdock的太太。

deb包在Linux操作系统中类似于windows中的软件包(exe),几乎不需要什么复杂的编译即可通过鼠标点击安装使用。

二、Ubuntu dpkg命令

dpkg命令是Debian Linux系统用来安装、删除、构建和管理Debian的软件包的实用工具。

如已有deb安装包(例如:object.deb) dpkg命令常用格式如下:

命令 说明
sudo dpkg -I object.deb 查看object.deb软件包的详细信息,包括软件名称、版本以及大小等(其中-I等价于–info)
sudo dpkg -c object.deb 查看object.deb软件包中包含的文件结构(其中-c等价于–contents)
sudo dpkg -i object.deb 安装object.deb软件包(其中-i等价于–install)
sudo dpkg -l object 查看object软件包的信息(软件名称可通过dpkg -I命令查看,其中-l等价于–list)
sudo dpkg -L object 查看object软件包安装的所有文件(软件名称可通过dpkg -I命令查看,其中-L等价于–listfiles)
sudo dpkg -s object 查看object软件包的详细信息(软件名称可通过dpkg -I命令查看,其中-s等价于–status)
sudo dpkg -r object 卸载object软件包(软件名称可通过dpkg -I命令查看,其中-r等价于–remove)
sudo dpkg -P object 移除object (不保留配置)

注:dpkg命令无法自动解决依赖关系。如果安装的deb包存在依赖包,则应避免使用此命令,或者按照依赖关系顺序安装依赖包。

更多命令详情可阅读 :

  • dpkg命令的用法 : https://www.cnblogs.com/TankXiao/p/3332457.html
  • Dpkg : https://blog.csdn.net/guojin08/article/details/17399535

三、手把手教你制作一个Deb包

deb是 Debian Linux 的软件包格式,打包最关键的是在DEBIAN 目录下创建一个 control 文件。

1、软件检查

deb 包打包前要确定所需要打包的运行文件及其依赖库,否则deb包安装后运行可能会出现问题。

2、deb打包案例过程

案例说明:

将一个qst_test.war包放入tomcat中,打包成deb包!并运行发布启动服务。

打包环境在192.168.0.110

服务安装后的路径为 :  /learn/qst_test/apache-tomcat-8.5.23 。

发布成功注册为系统服务运行,服务名称:**qst-tomcat-demo**。

服务的web的访问地址:  http://Ip:9088/qst_test/ ,如安装192.168.0.70 服务器!
http://192.168.0.70:9088/qst_test/ ,界面显示Hello Qst!(可配置)!

注: 要运行tomcat 首先要安装JDK jdk的安装及不讲解了!
2.1、创建演示demo目录

在110环境打包的目录在创建本次演示的demo deb目录。

# 进入打包目录
cd /home/learn_dabao/deb_1.0/installdeb/
# mkdir -p :递归创建目录
sudo mkdir -p qst_apache_tomcat_deb/qst_apache_tomcat/learn/qst_test/
# 拷贝一个tomcat安装包
sudo cp /home/learn/apache-tomcat-8.5.23.tar.gz .
# 解压 tomcat
sudo tar -zxvf apache-tomcat-8.5.23.tar.gz
# 上传 war包到,进入 tomcat webapp下,并进行解压,然后上传 qst_test.war
cd apache-tomcat-8.5.23/webapps
sudo mv /home/learn/qst_test.war .
sudo unzip qst_test.war
sudo rm -f qst_test.war

2.2、创建DEBIAN 目录

在 上面创建 qst_apache_tomcat 目录下,创建DEBIAN 目录 并创建 preinst, postinst, prerm, 和 postrm文件等,如下:

# 进入 qst_apache_tomcat  目录
cd /home/learn_dabao/deb_1.0/installdeb/qst_apache_tomcat_deb/qst_apache_tomcat
# 创建 DEBIAN 
sudo mkdir DEBIAN 
sudo touch control conffiles md5sums config preinst preinst postinst prerm postrm templates
# 赋予可以执行权限
udo chmod 755 control conffiles md5sums config preinst preinst postinst prerm postrm templates

##----------------------------------------##
control : 用了记录软件标识,版本号,平台,依赖信息等数据
conffiles : 当软件包升级的时候,你将会被询问是否要保留你的旧配置文件。
md5sums : md5校验

preinst : Debian软件包(".deb")解压前执行的脚本, 为正在被升级的包停止相关服务,直到升级或安装完成.(成功后执行 'postinst' 脚本).
postinst : 在解包后运行的脚本,主要完成软件包(".deb")安装完成后所需的配置工作. 通常, postinst 脚本要求用户输入, 和/或警告用户如果接受默认值, 应该记得按要求返回重新配置这个软件. 一个软件包安装或升级完成后。
config : 启动配置 
templates : 定制模板
prerm : 卸载时,在删除文件之前运行的脚本(停止一个软件包的相关进程, 要卸载软件包的相关文件前执行。)
postrm : 在删除文件之后运行的脚本(修改相关文件或连接, 和/或卸载软件包所创建的文件) 

##----------------------------------------##
其中 preinst, postinst, prerm, 和 postrm 脚本,是软件包安装前后自动运行的可执行脚本. 统称为控制文件, 是 Deian 软件包的"控制"部分.

**注:**DEBIAN 目录中的这些脚本文件,可以阅读 Debian 的包管理系统

2.3、control脚本文件

·control,字段介绍 : 6.4 Debian 的控制文件是什么?

Package: qst-tomcat-demo
Version: 1.0.0
Architecture: amd64
Maintainer: [email protected]
Installed-Size: 
Pre-Depends: 
Depends: 
Recommends: 
Conflicts: 
Replaces: 
Provides: 
Section: 
Priority: extra
Description: test deb package 
字段 描述
包名(Packahe) 包名(Packahe)字段给出软件包的名称, 这是软件包工具用以识别这个包的名称, 通常(单不是必须)和这个 Debian 软件包的名称的第一个字符串相似.
版本(Version) 版本(Version)字段给出上游开发者的版本号和修正版本号,详见为什么 Debian 软件包名字这么长?, 第 6.3 节.
平台(Architecture) 平台(Architecture)字段指定这个二进制包的编译硬件平台.
依赖(Depends) 依赖(Depends)字段给出所依赖的包的列表.
安装大小(Installed-Size) 安装大小(Installed-Size)字段说明安装这个包所需磁盘空间, 用于安装前端显示是否有足够的空间安装此程序…
类别(Section) 类别(Section)行给出此包在Debian FTP上的存储位置,上存储此包的目录名(详见Debian 的 FTP 上有哪些目录?, 第 5.1 节).
优先级(Priority) 优先级(Priority), 对应安装来说的重要程度, 象 dselect 和 console-apt 一类的半智能软件可以据此对软件安装分类,详见 包的优先级?, 第 6.7 节.
维护者(Maintainer) 维护者(Maintainer)字段给出当前维护此包负责人的电子信箱…
描述(Description) 描述(Description)字段此软件包的简要说明
2.4 conffiles 和 md5sums 脚本文件

配置文件(Conffiles)是一个配置文件列表(通常在 /etc 下), 软件升级时不会被覆盖, 以确保所含文件的本地配置不会被破坏, 使得可以在系统运行状态下升级.

md5sums 不知道怎么弄!没去研究!

这两个没有特殊情况,可以不配内容。

2.5 config 脚本文件

config ,启动配置 The Config Script 【非必须配置】

config 里面的 配置。确定应该询问问题的顺序以及应该显示给用户的消息,找出在提出问题和显示消息之前要做的测试,然后开始编写debian / config文件来询问和显示它们。问题名称通常对应于模板文件(templates)中模板的名称

注意:这些问题由单独的配置脚本提出,而不是由postinst提出,因此可以在安装包之前配置包,也可以在安装包后重新配置包。不要让你的postinst使用debconf来提问。

下面例子为安装的时候,自定义首页欢迎语内容!

**注:**可以使用/usr/share/debconf/confmodule,里面许多shell函数。每个shell函数对应于协议中的命令(小写,并且“db_”前缀为其名称)。可以将参数传递给它并在$RET变量中返回结果。

#!/bin/sh

set -e
# Source debconf library.
. /usr/share/debconf/confmodule


if [ "$1" = "configure" ] && [ -z "$2" ];
then
        set -e
               db_input high qst/tomcat-test || true
                db_go
        set +e
fi

 db_stop

再次强调:问题名称通常对应于模板文件中模板的名称。qst/tomcat-test

2.6、templates脚本文件

templates 模板, The Templates file【非必须配置】,和config 结合使用。

Template: qst/tomcat-test
Type: string
Default: Hello Qst
Description: 欢迎语修改
2.7、 preinst 脚本文件

解压前执行的脚本,验证服务是否在运行或者其他的一些业务功能。

#!/bin/sh
set -e

# Automatically added by dh_installudev
if [ -f "/etc/init.d/qst-tomcat-demo" ]; then
	echo "qst-tomcat-demo had been installed. Please use \\033[41;30m'sudo dpkg -P qst-tomcat-demo'\\033[0m command to uninstall first."
	exit 1
fi
# End automatically added section

exit 0

注: /etc/init.d/qst-tomcat-demo 后面会说明如何创建!

2.8、postinst脚本文件

在解包后运行的脚本,如需要弹框,就是这里面做的操作,db_get qst/tomcat-test ,qst/tomcat-test为config中配置的。

#!/bin/sh
# postinst script for #PACKAGE#
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        *  `configure' 
#        *  `abort-upgrade' 
#        *  `abort-remove' `in-favour' 
#          
#        *  `abort-remove'
#        *  `abort-deconfigure' `in-favour'
#            `removing'
#           
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

index_file="/learn/qst_test/apache-tomcat-8.5.23/webapps/qst_test/index.jsp"
set -e
. /usr/share/debconf/confmodule
case "${1}" in
	configure)
                db_get qst/tomcat-test
                HELLO_W="${RET:-Hello Qst}"

                db_stop
		if [ -f "$index_file" ]; then
			echo ${HELLO_W} > $index_file
		fi


	;;

	abort-upgrade|abort-remove|abort-deconfigure)

	;;

	*)
		echo "postinst called with unknown argument \`${1}'" >&2
		exit 1
	;;
esac

if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ]; then
	if [ -x "/etc/init.d/qst-tomcat-demo" ]; then
		update-rc.d qst-tomcat-demo defaults >/dev/null
	fi
	if [ -x "/etc/init.d/qst-tomcat-demo" ]; then
		invoke-rc.d qst-tomcat-demo start || true
	fi
fi

exit 0

注:添加到Shell的参数个数

  • $0 Shell本身的文件名
  • - 1 ~ 1~ 1n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

update-rc.d命令 说明

此命令用于安装或移除System-V风格的初始化脚本连接。脚本是存放在 /etc/init.d/目录下的,当然可以在此目录创建连接文件连接到存放在其他地方的脚本文件。

用法

update-rc.d [-n] [-f] name remove 用于移除脚本。
update-rc.d [-n] name default [NN | SS KK],NN表示执行序号(0-99),SS表示启动时的执行序号,KK表示结束时的执行序号,SS、KK主要用于在脚本之间的执行顺序上有依赖关系的情况下。

例如:A启动后B才能启动,B关闭后A才关闭

update-rc.d A defaults 80 20
update-rc.d B defaults 90 10

脚本解释:

update-rc.d qst-tomcat-demo defaults 添加启动项!因为是测试demo,没有依赖,所以不填序号。

invoke-rc.d qst-tomcat-demo start,service qst-tomcat-demo start与invoke-rc.d qst-tomcat-demo start有相同的作用(启动qst-tomcat-demo服务,相应的停止服务的命令为invoke-rc.d qst-tomcat-demo stop)

2.9、prerm 脚本文件

卸载时,在删除文件之前运行的脚本!这里停止对应的服务!

#! /bin/sh
# prerm script for #PACKAGE#
#
# see: dh_installdeb(1)

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

# Automatically added by dh_installinit
# End automatically added section

if [ -x "/etc/init.d/qst-tomcat-demo" ]; then
	systemctl kill qst-tomcat-demo || true
	invoke-rc.d qst-tomcat-demo stop || true
fi

exit 0

2.10、postrm 脚本文件

服务停止后,删除服务对应的文件数据。

/learn/qst_test/apache-tomcat-8.5.23

#!/bin/sh
# postrm script for #PACKAGE#
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        *  `remove'
#        *  `purge'
#        *  `upgrade' 
#        *  `failed-upgrade' 
#        *  `abort-install'
#        *  `abort-install' 
#        *  `abort-upgrade' 
#        *  `disappear' 
#          
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

if [ -d "/learn/qst_test/apache-tomcat-8.5.23" ]; then
	rm -rf "/learn/qst_test/apache-tomcat-8.5.23"
fi

if [ "$1" = "purge" ] ; then
	update-rc.d qst-tomcat-demo remove >/dev/null
fi


# In case this system is running systemd, we make systemd reload the unit files
# to pick up changes.
if [ -d /run/systemd/system ] ; then
	systemctl --system daemon-reload >/dev/null || true
fi

# Automatically added by dh_installdebconf
if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then
        . /usr/share/debconf/confmodule
        db_purge
fi
# End automatically added section


exit 0

3、添加启动服务

在 /etc/init.d/添加qst-tomcat-demo ,在qst_apache_tomcat 目录下面创建 etc/init.d 目录!并创建qst-tomcat-demo 文件

# 进入目录
cd /home/learn_dabao/deb_1.0/installdeb/qst_apache_tomcat_deb/qst_apache_tomcat
# 创建目录
sudo mkdir -p etc/init.d
# 创建文件
cd  etc/init.d/
sudo touch qst-tomcat-demo 
# 添加可执行权限
sudo chmod 755 qst-tomcat-demo 

qst-tomcat-demo 就是服务的名称,脚本信息如下:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          qst-tomcat-demo 
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5 
# Default-Stop:      0 1 6
# Short-Description: qst-tomcat-demo  Server
# Description:       qst-tomcat-demo  Server
### END INIT INFO

do_start()
{
	echo "start qst-tomcat-demo ..."
	sh /learn/qst_test/apache-tomcat-8.5.23/bin/startup.sh & 

	return 0
}

do_stop()
{
	echo "stop qst-tomcat-demo ..."
    sh /learn/qst_test/apache-tomcat-8.5.23/bin/stop.sh
    
	return 0
}

case "$1" in
	start)
		do_start
		;;
	stop)
		do_stop
		;;
	restart)
		do_stop
		do_start
		;;
esac

exit 0

4、打包deb脚本

在这个目录qst_apache_tomcat_deb 下面创建打包脚本! run.sh 内容如下。

#!/bin/sh

version=1.0.0

module_name="qst_apache_tomcat"

out_deb="objext-${module_name}_8.5.23_${version}_amd64_ubuntu16.04.deb"

echo -e "#!/bin/sh\n\ndir=\`cd \$(dirname \$0) && pwd\`\n\ndpkg -i \${dir}/${out_deb}" > objext-${module_name}_install.sh
echo "dpkg --purge qst-tomcat-demo" > objext-${module_name}_uninstall.sh

sed -i "s/Version:.*/Version: ${version}/" ${module_name}/DEBIAN/control

dpkg-deb -b ${module_name} ${out_deb}

四、安装、卸载及验证

1、在110环境上执行run.sh ,然后生成:

objext-qst_apache_tomcat_8.5.23_1.0.0_amd64_ubuntu16.04.deb
objext-qst_apache_tomcat_install.sh
objext-qst_apache_tomcat_uninstall.sh

2、拷贝安装和脚本到 70服务器,

3、执行对应的脚本进行安装!

安装后服务安装到 /learn/qst_test/apache-tomcat-8.5.23目录下。

访问http://192.168.0.70:9088/qst_test/访问首页。成功!(欢迎语可自定义)

【全网独家】手把手教你制作一个Ubuntu Deb 安装包_第2张图片

4、行对应的脚本进行卸载!查看服务器访问不了,并且 对应的安装目录删除。

五、脚本执行流程说明

整个过程每个脚本执行的情况和各脚本功能说明,如下图:
【全网独家】手把手教你制作一个Ubuntu Deb 安装包_第3张图片

我自己的体会 : 眼过千遍不如手过一遍!

本篇教程的安装包已经上传到百度网盘:
百度网盘:https://pan.baidu.com/s/17X5vrhlkzpW9aW9W31BNXQ
密码:x2de


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!



不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页 : http://blog.csdn.net/u010648555

愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人

© 每天都在变得更好的阿飞云

你可能感兴趣的:(Linux学习)