Slackware Linux技术内幕之包管理机制

出自大连开源软件公共开发服务平台

目录

Slackware Linux技术内幕之包管理机制

来自:slack.linuxsir.org

Slackware标准包管理

简介

  包管理机制是Slackware区别于其他Linux 发行版的重要的甚至是本质的区别。Slackware的包管理机制简单、灵活、高效、安全,用户透明性大,可定制程度高。因为Slackware的标准包管理工具皆为Shell脚本,这样,你可用简单而又方便的对其进行修改、移植。但是也存在一些不足之处,比如没有灵活的网络安装模式等。本文对 Slackware的包管理进行全面详细的介绍。

基本架构

  所使用的文件及目录:

    * /bin/installpkg:用于安装Slackware包
    * /sbin/removepg:用于删除Slackware包
    * /sbin/explodepkg:用于解压Slackware包
    * /sbin/upgradepkg:用于更新Slackware包
    * /sbin/makepkg:用于制做Slackware包
    * /sbin/pkgtool:用于安装|删除|查看Slackware包
    * /bin/tar-1.13:用于安装、解压等
    * /bin/dialog:用于生成基于文本的图形界面
    * install-packages:Slackware CD下使用的shell脚本
    * tagfile:用于说明包的安装优先级别
    * /var/log/packages:保存已安装的Slackware包的基本信息
    * /var/log/scripts:保存已安装的Slackware包的安装脚本
    * /var/log/removed_packages:保存已删除的Slackware包的基本信息
    * /var/log/removed_scripts:保存已删除的Slackware包的安装脚本

命令使用说明

explodepkg---解压

  它主要用来对Slackware的tgz包进行维护,只是简单的解压.tgz包,并不运行解压目录下的install或/var/log/setup目录下的安装脚本。explodepkg解压tgz包,然后通过对其中的文件进行修改、升级,最后再用 makepkg制做Slackware可用的tgz包。explodepkg也可以 对多个tgz 包逐个进行解压,格式如下:

#explodepkg package1.tgz package2.tgz ...

  提示:explodepkg实际上用的是tar进行解压,运行explodepkg和运行tar xzvf package1.tgz效果完全一样!

  警告:explodepkg(实际上所有的那些工具包括installpkg|removepkg等)所用的tar版本不得>1.13(默认使用1.13),否则不稳定。查看/bin目录,可以发现里面同时有tar-1.13和tar-1.14.

installpkg---安装

  使用Slackware,你免不了用用到它。installpkg提供了丰富的参数,使得包的安装简单、灵活、安全而又 快捷。下面是常用参数简介:

    * -warn:在标准输出上显示出将安装哪些包,哪些包将会被覆盖,强烈建议使用该选项!
    * -root:自定义安装目录而不采用默认的目录。在制做LiveCD时你也许少不了要使用该项。
    * -menu:使用该项后会跳出一个文本图形,让你选择安装/不安装/退出。一般用于其他程序调用installpkg进行安装的情况,当然你喜欢图形界面,也可以试试.
    * -tagfile:指定安装使用的tagfile文件,该文件用于说明包的安装属性(自动|建议|可选|忽略).

  其他的参数请man installpkg.

  使用实例:

<pre>
#installpkg package.tgz
#installpkg -warn package.tgz
#installpkg -warn -install package.tgz
#installpkg -menu -root /usr/local package1.tgz package2.tgz
#installpkg -menu -root /usr/local -tagfile/b]./tagfile package1.tgz package2.tgz
</pre>

removepkg --删除

  removepkg提供多种格式让你可用非常轻松的删除已经安装的Slackware包,删除过程会完整的显示哪些包已被删除。你可用指定该包的全名、基本名,例如:已经安装了一个名为test-1.0-i386-1.tgz 的包,那么可用如下格式进行删除:

#removepkg test-1.0-i386-1.tgz
#removepkg test-1.0-i386-1
#removepkg test.tgz
#removepkg test

  提示:

  1. 你可用通过查看/var/log/packages来得知你已经安装了哪些Slackware包。

  2. removepkg删除前会进行包的依赖性检查(这就是为什么运行该命令一段时间后你才能看到deleting的输出信息),并且只删除那些没有依赖关系的包。可见其安全性!

  3. removepkg删除软件包后会将/var/log/packages下的相应项移至/var/log/removed_packages.而将安装脚本从/var/log/scripts移至/var/log/removed_packages

  4. removepkg也提供一些可选参数,请man removepkg.

upgradepkg --更新

  upgradepkg将一个老的Slackware .tgz包升级到一个新的版本。它将新版本的软件包安装到系统上,并且删除那些在新版本中没有的老版本的文件。

  1. 如果新老版本的软件包名字一样(比如都为package.tgz)。那么我们只要如下操作,就可完成包的更新:

      #upgradepkg package.tgz

  2. 通常新老版本的Slackware包名字是不一样的,比如一个是package1.pkg(老),一个是package2.tgz(新),那么,操作为:

      #upgradepkg package1.tgz%package2.tgz

  注意:

   %前后不能有空格!

  进行更新前,请备份相应的配置文件(比如/etc下)。如果要强行安装新的配置文件,请手动删除老配置文件。

  提示:

  如果要指定在某目录下(比如/mnt)进行更新而不是默认的/,那么操作如下:

      ROOT=/mnt upgradepkg package.tgz

  一些参数提供额外的功能,使更新更灵活方便。具体请man 8 upgradepkg.

makepkg --制作

  1)为什么要制作Slackware包?

  我认为:

  并非所有的软件都有Slackware支持的tgz包供使用,自己制作可以方便下次使用也可提供给别人使用。

  使用Slackware包(而不是源代码)方式进行安装,可以方便以后对之进行维护(删除|更新等)。

  2)制作方法:

  这里为以制做cce的Slackware包为例,说明makepkg的使用方法。

  1. 首先制作一个临时目录,以便将所有要制做成软件包的文件放于此目录。假设为works,则建立目录:

 
      # mkdir /works

  2. 接着解压cce-0.51.tar.gz:

 
      # tar zxvf cce-0.51.tar.gz

  3. 进入解压目录,进行configure,注意configure的参数应该指定安装目录为/works,如下:

 
      # cd cce-0.51
      # ./configure --prefix=/works

  4. 接下来,进行make,make install:

 
      # make && make install

  5. 现在/works目录即为cce的主要程序以及其他文档的存放点。我们进入该目录,然后makepkg:

 
      # cd /works; makepkg cce.tgz

  makepkg会将/works目录下的所有文件以tar和GNUzip工具打包压缩成Slackware可用的.tgz包。如果在此过程中遇到符号链接的问题,makepkg会制做一个建立这些文件链接的脚本(script),并询问你是否将这些脚本写入install/doinst.sh文件中,并将该目录下的链接文件删除。我们一般选择yes,让makepkg自动处理那些链接问题。这样就会生成一个doinst.sh文件(存放该文件的 install目录也会建立),其内容简单,就是建立这些链接的脚本(或者说命令)。当我们使用installpkg进行安装时,便可使用 doinst.sh建立那些符号链接。

  接下来,makepkg会询问是否将所有文件的权限设置为755 (rwxr-xr-x)并将所有者设为root.root.基于安全考虑也应选yes.

  现在makepkg就开始进行包的制作了,一会儿就好了。现在你就可以使用installpkg安装/works目录下的cce.tgz了。当然现在我们可以删除/works目录:

 
      # rm -rf /works

  包制作已经完成,如果你又想往里面加入其他文件,或者对其中的文件进行修改,那么可以使用explodepkg对包进行解压,增加|修改后,重复以上步骤,直到你满意为止!

  注意:

  makepkg制作软件包只适合于使用autoconf automake 这些自动配制工具规则的软件。

  如果想将编译好的文件复制到指定目录,便于制作tgz包,可以在make install 后加上DESTDIR=/YOUR_DIR 或 ROOT=/YOUR_DIR 或 prefix=/YOUR_DIR ( 推荐率由前往后) 。(由hupeng923提供)

  最好不在./configure的时候加 --prefix=/YOUR_DIR (想安装到此目录除外)。因为在 ./confiure 后加了--prefix=/work 后,编译出的二进制文件可能会保留指向/work的链接,打包成tgz让别人安装后,二进制文件可能还会搜索/work的路径。我自己做过这样的实验。(由hupeng923提供)

  软件包的描述文件--slack-desc的制作

  这是一个附加(或者非必须)部分,makepkg不会为你建立一个slack-desc文件,为了制作一个标准的Slackware包,我建议大家在制作Slackware时制作此文件!slack-desc也位于install目录下,该文件要遵循一定的格式,否则不会被显示!

  "#"开始的行为注释。行长度不得超过表尺的右边界,共11行,哪怕你的描述没有那么多,要要保证有11行,当然这可用空行补上。如下源文件:

 
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
 
       |-----handy-ruler--------------------------------------------------------------|
kdebase: kdebase (KDE base package)
kdebase:
kdebase: Core applications for the K Desktop Environment. Included are: kdm
kdebase: (replacement for xdm), kwin (window manager), konqueror (filemanager,
kdebase: web browser, ftp client), konsole (xterm replacement), kicker
kdebase: (application starter and desktop pager), kaudio (audio server),
kdebase: kdehelp (viewer for kde help files, info and man pages), kthememgr
kdebase: (system for managing alternate theme packages) plus other KDE
kdebase: components like kcheckpass, kikbd, kscreensaver, kcontrol, kfind,
kdebase: kfontmanager, kmenuedit, and kappfinder.
kdebase:

pkgtool--工具集

  简介:pkgtool可以让你在交互式的图形界面下进行包的安装|删除,以及查看已安装的包。当然,通过它我们还可以进行一些基本的系统配置(比如鼠标|时区|Lilo|服务等)。

  工作机理:

 
    * Current:调用/sbin/installpkg安装当前目录下的Slackware支持包。
    * Other:调用/sbin/installpkg安装指定目录下的Slackware支持包。
    * Remove:扫描/var/log/packages目录,返回已安装包的清单。选定欲删除的包后,调用 / sbin/removepkg进行删除。
    * View:扫描/var/log/packages目录,返回已安装包的基本包名(除去.tgz剩下的部分)清单。
    * Floppy:调用/sbin/installpkg安装指定软驱设备上的Slackware包。
    * Setup:使用/var/log/setup目录下的setup.*文件(比如setup.05.fontconfig)进行基本的系统配置。你可以删除此目录下的文件使Setup中设置项也相应删除。反之,也可以加入自己的setup.文件!

Slackware包管理机制的问题

  1. 安装时包的依赖性管理差,默认缺少依赖性包也会安装上Slackware包。

  2. 没有网络安装模式,只能从本地安装Slackware包。

  3. 如果采用的是源代码方式安装软件包,那么标准包管理机制对这些包的管理维护似乎显得束手无策。

  相应的解决办法得依靠外来得Slackware包管理工具。

外来Slackware包管理工具

SWARET ---网络安装模式的实现

简介

  swaret可以进行包的安装、升级、重装,下载 Slackware包,补丁、源代码等等。重要的是,swaret支持依赖性检查,能很好的跟踪、解决依赖包的丢失问题。swaret使用多个Slackware Linux镜像站通过http/ftp/rsync或者本地软件库进行包的安装。swaret还有i18n支持.

安装

  你可以从网上下载swaret的slackware(. tgz)包进行安装。推荐从 http://www.linuxpackages.net 下载。最新版本(2004-7-04)为swaret-1.6.2-noarch-1.tgz:

#installpkg swaret-1.6.2-noarch-1.tgz

  注意:swaret必须使用到一些工具,比如pkgtool,wget,grep,bc等,如果没有安装,请在运行前安装。

配置

#cp /etc/swaret.conf.new /etc/swaret.conf

  现在开始编辑/etc/swaret文件:

    * VERSION:设置你所使用的Slackware的版本,主要用来解决包的依赖及其他问题,比如设置为 10.想使用Slackware Current你要设置为
      <pre>
      VERSION=current。
      </pre>
    * LANGUAGE:定义状态以及错误信息的输出使用的语言。很不幸没有中文,不过你自己可以翻译/usr/share/swaret-VERSION/swaret.lang.ENGLISH为swaret.lang.CHINESE,然后将此项设置为CHINESE!
    * ROOT:设置你将要下载的Slackware包的根目录,例如:
      <pre>
      ROOT=ftp://ftp.nluug.nl/pub/os/Linux/distr/slackware/slackware-$VERSION
      </pre>
 
      可以是HTTP/FTP/RSYNC或者本地文件地址。可以设置多个ROOT项。
    * DEP_ROOT:类似ROOT,但是还包括库文件的地址。仅当DEPENDENCY=1时使用。
    * REPOS_ROOT: 定义远程或者本地软件库的地址。
    * RANDOMR:设置为1,让swaret随机选择你指定的多个slackware包镜像站。
    * USEPKGDESC:若为1,匹配Slackware包的描述文件中含有指定关键字的包。
    * EXCLUDE:设置不进行安装|更新的软件包,这里可以使用正则表达式。
    * DEPENDENCY:是否让swaret进行依赖性检查以及处理。1为是,0为否。
    * DSEARCHLIB:是否让swaret在本机上搜索ldconfig找不到而又存在于本机上的库文件。
    * DSEARCHM:是否使用slocate搜索丢失的库文件。
    * MD5CHECK:是否对Slackware包或源代码进行MD5校验。默认为1.
    * GPGCHECK:是否对Slackware包或源代码进行GPG签名检查。
    * DESC:是否在升级|安装过程中显示包的相关信息。
    * CACHE_DIR:下载的软件包放在何处。默认为/var/swaret。
    * LOG:是否将重要信息写入日志文件。
    * LOG_FILE:将swaret所有的操作写入该日志文件。默认为/var/log/swaret。
    * WARNINGS:是否让swaret显示警告信息。
    * INFORMATION:是否让swaret显示信息。
    * NIC:你通过什么网络界面(interface)下载软件包.例如网卡eth0.
    * PROGRESS:指定下载进度所采用的显示格式。
    * TIMEOUT:规定wget 和 rsync的超时时间界限。
    * RETRIES:规定wget 和 rsync的重试次数。
    * PASSIVE_FTP:如果你在防火墙后运行swaret,设置为1。
    * WGET_PROXY:指定wget使用的代理地址,格式为:
      <pre>
      http://proxy.some-domain- name.domain:HTTP_PROXY_PORT
      </pre>
    * RSYNC_PROXY:指定RSYNC使用的代理地址,格式为Host:Port。

使用

  使用举例:

#swaret --upgrade package
#swaret --install package
#swaret --reinstall package
#swaret --remove package
#swaret --get package
#swaret --dep package

slapt-get/slapt-gui

  slapt-gui是slapt-get的一个图形用户界面,这里我只详细介绍slapt-get.

主要特色

  1. 使用标准的Slackware包管理工具(installpkg 等).

  2. 支持网络安装模式,且可指定多个镜像站,还支持断点续传。

  3. 支持使用正则表达式进行搜索。

  4. 方便从一个Slackware发行版升级到另一个。

  5. 方便的解决包的依赖、冲突等问题。

  注意:要求Slackware的版本为9.1或更高。其他要求预先安装的软件参见slapt的README.

下载安装

  可从 http://www.linuxpackages.net 下载,然后安装。

配置

  配置文件为/etc/slapt-getrc,主要设置项为:

  WORKINGDIR:本地工作目录,如/var/slapt-get。

  EXCLUDE:不进行操作的软件。

  SOURCE:下载源。

使用

#slapt-get --install pkg_name

  其他参数及使用方法详见slapt-get的FAQ,或者参阅Debian的apt-get的使用方法。

checkinstall --安装包制作圣手

  注:此节大部分参照struggle兄的文章完成。

简介

  同样的,checkinstall可以将源代码方式提供的安装包(autoconf+automake)制做成Slackware支持的tgz包。但是checkinstall却不局限于制作Slackware包,它同样可以制作rpm和deb包。所以为称之为"圣手"

使用

  我们仍然以上面的安装cce-0.51.tar.gz为例:

  解压,configure,make

      # tar zxvf cce-0.51.tar.gz
      #cd cce-0.51
      #./configure     #注意此处并无prefix参数
      #make

  注意:下面将运行checkinstall,但在运行此命令前你需要在当前目录下创建一个对这个软件包的描述文件description-pak,但你也可以不创建它,推荐你做这一步。

  其格式简单,比如:

      CCE
      CCE lets you display and input Chinese/Japanese/Korean in lots of OS. It works
      in both console
      mode and X Windows(through GGI/SDL library). CCE supports both frame buffer(Linux
      and FreeBSD
      only) and VGA(640x480x16 colors) display. CCE also includes lots of GB/GBK/Big5
      input methods
      like Intelligent Pinyin, Zhuyin, WuBi, CangJie, DaYi, etc.

  另外还可以在当前目录下创建4个特殊的脚本文件preinstall-pak, postinstall-pak, preremove-pak和postremove-pak。

  preinstall-pak在被安装之前执行,postinstall-pak在被安装之后执行,preremove-pak在被删除之前执行,postremove-pak在被删除之后执行。同样,这4个脚本文件不是必须的。

  如果要制作的软件有一些特殊的要求,比如创建一个特殊的用户或者组,这4个脚本就有作用了。然后在当前目录下创建一个doc-pak的目录,这个目录是用来存放软件的相关文档的。比如说README,INSTALL, COPYING, Changelog, TODO, CREDITS等文件。这些文件在安装软件包时将被拷到/usr/doc/“软件包名称”目录下。如果你现在不创建,在生成软件包时将提醒你是否创建这个目录和拷贝相关文件,如果你再选择否,那么制作的软件包将没有文档。      现在开始checkinstall:

      #checkinstall

  如果开始你没有创建doc-pak目录,此时将会提示你是否创建。按y自动创建和拷贝,按n取消。下面checkinstall将创建安装软件包,checkinstall默认安装命令是make install,你得根据你的软件安装说明具体而定,有些软件的安装命令不是make install,而是其他,你则换成

      checkinstall make modules_install
      checkinstall install.sh
      checkinstall setup

  等形式。这样,我们也可以把一些以二进制包发布的软件用checkinstall创建为Slackware的软件包,只要再checkinstall后面加上安装指令作为参数即可。

  下一步checkinstall将会询问创建什么软件包,

      Please choose the packaging method you want to use.
      Slackware [S], RPM [R] or Debian [D]?

  选择s创建slackware的pkg软件包,选r创建redhat的rpm软件包,选d创建debian的deb软件包。我们选择s继续。

      This package will be built according to these values:
      1 - Summary: [ cce-0.51 2 - Name: [ cce ]
      3 - Version: [ 0.51 ]
      4 - Release: [ 1 ]
      5 - License: [ GPL ]
      6 - Group: [ Applications/System ]
      7 - Architecture: [ i386 ]
      8 - Source location: [ cce-0.51
      9 - Alternate source location: [ ]
      Enter a number to change any of them or press ENTER to continue:

  checkinstall给出一个菜单让你选择修改软件包的一些属性,想修改就按对应的数字键,否则回车继续。我们按7修改软件包的系统平台,

      Enter the architecture type:i686
      This package will be built according to these values:
      1 - Summary: [ cce-0.51 ]
      2 - Name: [ cce ]
      3 - Version: [ 0.51 ]
      4 - Release: [ 1 ]
      5 - License: [ GPL ]
      6 - Group: [ Applications/System ]
      7 - Architecture: [ i686 ]
      8 - Source location: [ cce-0.51 ]
      9 - Alternate source location: [ ]
      Enter a number to change any of them or press ENTER to continue:e:

  然后回车继续,checkinstall将会在当前目录生成制作好的pkg软件包并安装它。

  我们的软件包创建到此成功结束。

其他

汉化pkgtool(包括installpkg、removepkg等)工具

  如何使用一个完全中文的pkgtool?很简单!你只要将那些工具里的非命令翻译成中文就行了。如果你的系统已经设置好了中文环境,那么现在就可用在虚拟终端下运行那些你翻译过的工具了,怎么样,中文出来了吧?!如果你的系统还没有中文环境,那么请到网上搜索一下,汉化Slackware的文章满天都是。

  注意:现在你只能在虚拟终端下看到中文,在实际的控制台下还是一片乱码。要能在实际的控制台下也可使用中文的pkgtool,你又必须汉化终端,或者装上某些软件(例如cce、zhocn等)来使之支持中文。我们一般采用后者.而对于安装盘上的汉化,难度稍大。所以汉化,其实很不彻底,似乎也不叫汉化了。

Slackware标准包管理机制的移植

移植到其他Linux发行版

  移植Slackware的标准包管理到其他Linux发行版是一件简单、可行的事情。当下面说明如何将Slackware的包管理移植到其他Linux发行版(在Turbo Linux10上测试成功):

  假设:

  Slackware----/dev/hda10 (/)

  TurboLinux --/dev/hda7 (/)

  具体操作:

  进入Turbo Linux,然后:

#mkdir /mnt/hda10
#mount /dev/hda10 /mnt/hda10
#cp /mnt/hda10/sbin/*pkg /sbin
#cp /mnt/hda10/sbin/pkgtool /sbin
#cp /mnt/hda10/bin/dialog /bin
#cp /mnt/hda10/bin/tar-1.13 /bin

  现在就可以运行installpkg|removepkg...了。

  提示:

  1. /var/log/下的那些目录(比如packages)可以不建立,在运行以上工具时,会自动建立!

  2. 必须将tar-1.13复制过去,否则运行以上工具会出现警告信息,原因前文已述。

  3. dialog 用于生成文本图形界面,也需要复制。

移植到BSD=

  当然!我们也可以将之移植到BSD上,但这样似乎完全没有必要,毕竟BSD的包管理已经十分强大了。作为测试,我简单说明一下。

  具体操作同上,但有些问题需要注意!

  注意点:

  1. 一些程序运行时可能会出现库文件找不到的问题,我们可以结合ldd,ldconfig等工具将Linux下的相应库文件复制到BSD下。如果仅仅是版本的问题,那么可以简单的做个符号链接。

  2. 有些Linux软件,要依赖于/proc文件系统才能运行,我们可以在BSD下运行ln -s /proc /usr/compat/linux/proc.

  3. 涉及到运行平台问题,请安装linux_base进行Linux 模拟。

个人工具