热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

在Debian中打造属于自己的deb包

文章标题:在Debian中打造属于自己的deb包。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  问题:如果你要在Debian系统中发布一款软件或者一个包,该如何做呢?如果你的项目中有各种二进制包,该如何维护呢?如果你自己做了一款小小的实用软件,该如何与朋友分享呢?。
  
  案例:假如我从网上下载了eclipse-SDK-3.1-linux-gtk.tar.gz压缩文件,我想把他安装到/opt/eclipse目录下,且菜单Apps——>Programming中有Eclipse菜单项。并且在命令终端中输入eclipse中可以运行Eclipse程序,而且还要象其他的软件包一样,可以方便的进行安装(install )和卸载(remove)。
  
  如果你还不知道如何做,请跟我来,我将告诉你解决方案。
  
  熟悉Debian(Linux的发行版之一)的用户,应该对他的包管理机制记忆犹新。便捷的包管理机制是Debian易用的一个主要特性。Debian包管理机制可分为两个层面:对软件包文件操作以及对包中文件的操作。apt和dselect完成前者,dpkg完成后者。
  
  接下来,我们将借助Debian的包管理机制,打造属于自己的deb包。
  
  首先,介绍其目录结构(为了便于理解,借用Windows下的截图)
  

  
图一 目录结构

  
  其中,eclipse文件夹表示待发布的软件,也是我们的工作目录。 DEBIAN文件夹下包含control和md5sums等文本文件。opt目录表示待发布的包将要安装(放置)的地方。usr/bin/目录提供了运行该程序命令的脚本。usr/lib/menu目录提供了将Eclipse加入菜单的脚本。
  
  DEBIAN必须大写,且必须为该名。根据不同的情况,该目录将包含不同的文件,其中control和md5sums文件是最小(基本)要求。如果待发布包在安装和卸载,需要运行某些命令或脚本进行初始化和配置时,则会包含下列文件:
  
  preinst
  
  在Debian包文件解包之前,将会运行该脚本。许多preinst脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。
  
  postinst
  
  该脚本的主要任务是完成安装包时的配置工作。通常,postinst脚本等待用户输入,或提醒用户,如果他接受当前默认值,要记得软件包安装完后返回重新配置。许多postinst脚本负责执行有关命令为新安装或升级的软件重启服务。
  
  prerm
  
  该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。
  
  postrm
  
  该脚本负责修改软件包链接或文件关联,或删除由它创建的文件
  
  因为本案例需要将Eclipse加入到菜单中,所以应该包含postinst and postrm这两个文件。
  
  control文件内容如下:
  
  Package: eclipse
  
  Version: 3.1
  
  Section: utils
  
  Priority: optional
  
  Architecture: i386
  
  Depends: libc6 (>= 2.3.2.ds1-4),jdk
  
  Installed-Size: 14062
  
  Maintainer: xxxxxx
  
  Description:Develop tools
  
  md5sums是基于md5sum命令生成的文件。
  
  因为在安装本包时,只需要更新菜单项,所以postinst脚本只需要包含update-menus命令,卸载时也是同样的操作。其postinst脚本内容为:
  
  程序清单一
  
  #!/bin/sh
  
  # filename :postinst/postrm
  
  if test -x /usr/bin/update-menus; then
  
  update-menus
  
  fi
  
  postrm脚本内容跟postinst内容相同。如果你还要做其他的操作,则可以在这两个文件中加入其他内容。
  
  /opt/eclipse/目录就是待发布(安装)的软件目录。对于本例只需要在/opt目录下执行该操作:$ tar xzvf eclipse-SDK-3.1-linux-gtk.tar.gz.
  
  要在命令终端中输入eclipse,也能运行Eclipse.通常有三种解决方案:
  
  1)   把/opt/eclipse/加入到PATH变量中。
  
  2)   在/usr/bin目录建立一个指向/opt/eclipse/eclipse的链接
  
  3)   在/usr/bin目录下新建一个脚本,在脚本中运行该程序
  
  综合考虑,第一种方案不可行。第二种方案比较好,但失败了。因为eclipse在运行时,需要starup.jar文件,并且是相对路径下的starup.jar文件,当你在其他任何路径下运行eclipse时,都将会失败。只有采用第三种方案,建立一个脚本。只需要在该脚本中写入:exec /opt/eclipse/eclipse.
  
  程序清单二:
  
  #!/bin/sh
  
  # filename :eclipse
  
  exec /opt/eclipse/eclipse
  
  接下来,解决最后一个问题,如何把eclipse加入到Apps——>Programming的菜单中去?基本上每一个Debian系统的应用程序都会有一个菜单配置文件,用以定义该程序的菜单项名称、位置和命令行选项等参数。该配置文件一般位于/usr/lib/menus、/etc/menu或~/.menu目录下。
  
  我们新建一个文件eclipse ,程序安装后,将置于/usr/lib/menu/路径下
  
  该eclipse配置文件格式示例如下:
  
  ?package(eclipse):            #定义软件包名
  
  needs="X11"                #定义该菜单项需在X11环境中使用
  
  section="Apps/Programming"    #定义菜单项的路径位置
  
  title="Eclipse"                #定义菜单项的标题
  
  command="/usr/bin/eclipse"     #定义命令和选项
  
  hints="Eclipse"               #定义一些提示信息
  
  icon="/opt/eclipse/icon.xpm"     #定义菜单项的图标
  
  目录结构框架介绍完毕后,就开始打地基,准备文件吧,需要准备的文件有:
  
  1) control(必须要)
  
  2) eclipse.sh(用于终端,因为与菜单的eclispe重名,所有加了。sh后缀)
  
  3) eclipse.menu (用于菜单)
  
  4) eclipse-SDK-3.1-linux-gtk.tar.gz (下载的eclipse包)
  
  5) postinst (用于安装和卸载时调用的脚本)
  
  将上述所有文件放置一目录中,并在该目录下新建mkeclipse脚本,主要用于完成上面的工作,其内容如下:
  
  #!/bin/sh
  
  ROOT=$PWD
  
  ECLIPSE=$ROOT/eclipse-SDK-3.1-linux-gtk.tar.gz
  
  COnTROL=$ROOT/control
  
  POST=$ROOT/postinst
  
  BINECP=$ROOT/eclipse.sh
  
  MENUS=$ROOT/eclipse.menu
  
  if [ -w "$ROOT" ];then
  
  mkdir eclipse
  
  cd eclipse
  
  mkdir DEBIAN opt usr usr/bin usr/lib usr/lib/menu
  
  cd opt
  
  if [ -e "$ECLIPSE" ];then
  
  tar xzvf $ECLIPSE
  
  fi
  
  cd ……
  
  if [ -e "$CONTROL" ];then
  
  cp $CONTROL DEBIAN/
  
  fi
  
  if [ -e "$POST" ];then
  
  cp $POST DEBIAN/postrm
  
  fi
  
  if [ -e "$BINECP" ];then
  
  cp $BINECP usr/bin/eclipse
  
  fi
  
  if [ -e "$MENUS" ];then
  
  cp $MENUS usr/lib/menu/eclipse
  
  fi
  
  rm -f DEBIAN/md5sums
  
  find opt usr -type f -exec md5sum {} ;>>DEBIAN/md5sums
  
  fi
  
  现在已经万事俱备,只欠东风。那现在就草船借东风??借Debian的dpkg包这股东风,来成就我们的事业吧。
  
  制作deb包,在当前ROOT目录运行如下命令:$dpkg -b eclipse eclipse_3.1_i386.deb
  
  也可以在mkeclipse脚本的最后一个fi前加入
  
  cd $ROOT
  
  dpkg -b eclipse eclipse_3.1_i386.deb
  
  来完成该功能。
  
  好,现在就开始我们的心动之旅吧。
  
  首先安装deb包:dpkg -i eclipse_3.1_i386.deb 下面打印的消息是不是非常熟悉。
  
  进入图形界面,发现Apps——>Programming中已经有了Eclipse菜单项,请鼓足勇气单击一下吧,Eclipse IDE已经跃然出现在你的桌面上(当然你的jdk环境已经配置好了)。
  
  接下来,试着卸载一下:apt-get remove eclipse.Eclipse已经从菜单中消失了,/opt/eclipse目录也已经不复存在。
  
  现在觉得是不是很方便?当你看完本文的时候,你是否对文章开始提出的问题已经豁然开朗。其实这样做的目的就是简化劳动,同一个项目组的人在做重复的工作,比如安装eclipse,要在/usr/bin下建立文件,又要在/usr/lib/menu中建立文件,还要拷贝一些eclipse文件,不知道在拷贝的过程中是否会遗漏一些文件等等。或者你的系统出于某种原因要重装,以前的工作又的重新来一遍,很费时。如果你做成了一个deb包,以上的问题和疑虑就迎刃而解。
推荐阅读
  • 安卓及谷歌官网不容易上,在此整理好下载地址,这样就可以直接用迅雷下载了。Eclipse最新Mars版Eclipse(暂时还没被墙)Mac版:http:www.eclipse.org ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 如何查看电脑系统版本_腾讯云服务器系统版本怎么看?Windows和Centos版本怎么选?...
    腾讯云服务器系统版本怎么看?想要知道自己的腾讯云服务器系统版本是哪个,可以登录云服务器后台管理系统查看,或者使用命令行查询,如果不会操作& ... [详细]
  • 主流操作系统简介
    主流操作系统简介子墨居士操作系统理论定义为管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。操作系统是计算机系统的关键组成部分࿰ ... [详细]
  • 下载地址http:www.kbengine.org这货不错安装在Linux上安装(CentosDebianUbuntuetc.)服务端,请在终端输入:pythonkbenginek ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
  • 与.Net大师Jeffrey Richter面对面交流——TUP对话大师系列活动回顾(多图配详细文字)...
    与.Net大师JeffreyRichter面对面交流——TUP对话大师系列活动回顾(多图配文字)上周末很有幸参加了CSDN举行的TUP活动, ... [详细]
author-avatar
wjdd8888
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有