分类: LINUX
2010-05-13 18:22:58
由于UNIX的程序设计思想是不重复发明轮子,所以UNIX程序大多都会依赖现有的程序和工具来开发。Linux也继承了UNIX这种优良的传统。这带给我们的好处是开发效率成倍提高,结构灵活,扩展性好。但软件间复杂的依赖关系和冲突关系给软件的安装造成很大的障碍。所以成功的Linux发行版都开发有方便的软件包管理工具,让电脑自动帮我们解决软件包的依赖和冲突。软件包管理工具是区分不同发行版的重要特征之一。如:Debian使用dpkg,RedHat使用rpm,Gentoo使用emerge,Yellow Dog使用yum(Yellow Dog Updater),Arch Linux使用pacman。本章主要介绍Debian的软件包管理工具dpkg和它的一些前端工具,如apt-get,apt-file等。
dpkg是Debian系统的软件包管理工具,它最初于1993年发布,是Debian系统最优秀的特性之一。它通过以下几种关系来标识软件包间的依赖性。分别是:
· depends(依赖),运行A必须先安装B,且有版本的要求,不同版本也会造成依赖问题。
· recommends(推荐),系统推荐的软件包可增强你所安装软件的关健功能。你可安装也可不安装。
· suggests(建议),系统建议的软件包可增强你所安装软件的某些功能,你可安装也可不安装。
· conflicts(冲突),安装了A则B不能正常运行。不要安装有冲突的软件包。
· replaces(替换),软件包A中的软件会被软件包B中的软件移除或覆盖,不要安装该类软件包。
· provides(提供),A软件包已提供B软件包的所有功能。你可安装也可不安装该类软件包。
dpkg软件包是一些以.deb结尾的文件,软件包信息集中存放在/var/lib/dpkg/目录下,其中/var/lib/dpkg/info存放有软件包的管理信息。
debian:/var/lib/dpkg/info# ls zhcon.* -l
-rw-r--r-- 1 root root 32 2006-09-26 20:56 zhcon.conffiles
-rwxr-xr-x 1 root root 104 2006-09-26 20:56 zhcon.config
-rw-r--r-- 1 root root 1755 2006-09-28 08:18 zhcon.list
-rw-r--r-- 1 root root 3147 2006-09-26 20:56 zhcon.md5sums
-rwxr-xr-x 1 root root 233 2006-09-26 20:56 zhcon.postinst
-rwxr-xr-x 1 root root 206 2006-09-26 20:56 zhcon.postrm
-rw-r--r-- 1 root root 906 2006-09-26 20:56 zhcon.templates
...
不同后缀的意义如下:
· .conffiles,文本文件,记录软件包的配置文件列表。
· .list,文本文件,存放软件包的文件列表和安装位置。
· .md5sums,文本文件,记录软件包的md5信息,这些信息用来进行软件包验证。
· .prerm,脚本文件,负责停止与软件包关联的daemon服务,在删除关联软件包之前执行。
· .postrm,脚本文件,负责修改软件包链接或文件关联,或删除由它创建的临时文件。
· .config,脚本文件,是软件包的安装配置脚本。
· .preinst,脚本文件,在解包之前执行,做一些软件包安装前的准备工作。
· .postinst,脚本文件,在解包之后执行,做一些软件包的安装配置工作。
· .templates,文本文件,记录一些软件包的安装提示信息。
上面这些文件不是每个都必须的,根据不同的安装要求由软件包维护者自由设置。下面介绍dpkg工具的具体用法。使用dpkg -h命令可以列出该工具的所有语法:
debian:/var/lib/dpkg/info# dpkg -h
用法:dpkg [<选项> ...] <命令>
命令:
-i|--install <.deb 文件名> ... | -R|--recursive <目录> ...
--unpack <.deb 文件名> ... | -R|--recursive <目录> ...
-A|--record-avail <.deb 文件名> ... | -R|--recursive <目录> ...
--configure <软件包名> ... | -a|--pending
-r|--remove <软件包名> ... | -a|--pending
-P|--purge <软件包名> ... | -a|--pending
--get-selections [<表达式> ...] 把已选中的软件包列表打印到标准输出。
--set-selections 从标准输入里读出要选择的软件。
--clear-selections 取消选中所有不必要的软件包。
--update-avail 文件> 替换现有可安装的软件包信息。
--merge-avail 文件> 把文件中的信息合并到系统中。
--clear-avail 清除现有的软件包信息。
--forget-old-unavail 忘却已被卸载的不可安装的软件包。
-s|--status <软件包名> ... 显示软件包详尽的状态信息。
-p|--print-avail <软件包名> ... 显示可供安装的版本详情。
-L|--listfiles <软件包名> ... 列出所有“属于”该软件包(或多个)的文件。
-l|--list [<表达式> ... 简明地列出软件包的状态。
-S|--search <表达式> ... 搜寻拥有该文件(或多个文件)的包。
-C|--audit 检查搜寻残损的软件包。
--print-architecture 显示 dpkg 体系架构。
--compare-vesions <甲> <关系> <乙> 比较版本号 - 见下。
--force-help 显示本强制选项的帮助信息。
-Dh|--debug=help 显示有关出错调试的帮助信息。
-h|--help 显示本帮助信息。
--version 显示版本信息。
--license | --licence 显示版权和许可证条文。
对归档文件使用 dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|
-x|--extract|-X|--vextract|--fsys-tarfile (输入 dpkg-deb --help)。
供内部使用:dpkg --assert-support-predepends | --predep-package |
--assert-working-epoch | --assert-long-filenames | --assert-multi-conrep。
选项:
--admindir=<目录> 使用 <目录> 而非 /var/lib/dpkg。
--root=<目录> 安装到另一个根文件系统。
--instdir=<目录> 改变安装的根目录的同时保持管理(admin)目录不变。
-O|--selected-only 忽略没有被选中安装或升级的软件包。
-E|--skip-same-version 忽略版本与已安装软件版本相同的软件包。
-G|--refuse-downgrade 忽略版本早于已安装软件版本的的软件包。
-B|--auto-deconfigure 就算会影响其他软件包,也要安装。
--no-debsig 不去试图验证软件包的签名。
--no-act|--dry-run|--simulate
仅仅报告我们要执行的操作 - 但是不执行。
-D|--debug=<八进制数字> 开启调试功能(参见 -Dhelp 或者 --debug=help)。
--status-fd发送状态改变的更新信号到文件描述符 。
--log=<文件名> 把状态的更动和操作信息记录到 <文件名>。
--ignore-depends=<软件包名>,... 忽略关于 <软件包名> 的所有依赖关系。
--force-... 忽视遇到的问题 - 参见 --force-help。
--no-force-...|--refuse-... 当遇到问题时中止运行。
可供--compare-version 使用的比较运算符有:
lt le eq ne ge gt (如果版本号为空,那么就认为它先于任意版本号);
lt-nl le-nl ge-nl gt-nl (如果版本号为空,那么就认为它后于任意版本号);
< << <= = >= >> > (仅仅是为了与主控文件的语法兼容)。
介绍几个常用的命令选项:
· 查询软件包
· debian:~# dpkg -l zhcon
· 期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
· | 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
· |/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
· ||/ 名称 版本 简介
· +++-=====================-=====================-==========================================================
· ii zhcon 0.2.6-3 A Fast Console CJK System Using FrameBuffer
如果我们不知道软件包的具体名称,我们也可使用通配符来查询。
debian:~# dpkg -l zh*
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
|/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
||/ 名称 版本 简介
+++-=====================-=====================-==========================================================
un zh-autoconvert <无> (无相关介绍)
un zh-trans <无> (无相关介绍)
ii zhcon 0.2.6-3 A Fast Console CJK System Using FrameBuffer
· 查看软件包的详细信息
· debian:~# dpkg -s zhcon
· Package: zhcon
· Status: install ok installed
· Priority: optional
· Section: utils
· Installed-Size: 7608
· Maintainer: Yu Guanghui
· Architecture: i386
· Version: 1:0.2.6-3
· Depends: libc6 (>= 2.3.6-6), libgcc1 (>= 1:4.1.1-12), libggi2 (>= 1:2.2.1), libncurses5 (>= 5.4-5), libpth2 (>= 2.0.7), libstdc++6 (>= 4.1.1-12), unicon-imc2, debconf
· Conflicts: unicon-im (<< 3.0.4-9)
· Conffiles:
· /etc/zhcon.conf 91253d7043a0cb35a395b4d73d906762
· /etc/zhcon.conf 91253d7043a0cb35a395b4d73d906762
· Description: A Fast Console CJK System Using FrameBuffer
· Zhcon is a fast Linux Console Chinese System which supports framebuffer
· device.It can display Chinese,Japanese or Korean double byte characters
· on console.
· Features include:
· Full support for Linux FrameBuffer device(from 640x480x8bpp to
· 1024x768x32bpp)
· Multiple language support (GB2312,GBK,BIG5,JIS,KSCM)
· Auto-detect and convert between GB2312 and BIG5 encoding(like hztty)
· Hot key to change language encoding on the fly
· Can use input method from MS Windows 98 Chinese version or UCDOS for
· MS-DOS
· 查看已安装软件包所安装的文件列表。
· debian:~# dpkg -L zhcon
· /.
· /usr
· /usr/bin
· /usr/bin/zhcon
· /usr/sbin
· /usr/share
· /usr/share/man
· ...
·
· /usr/lib
· /usr/lib/zhcon
· /usr/lib/zhcon/input
· /usr/lib/zhcon/input/big5-ary30.mb
· /usr/lib/zhcon/input/big5-cj.mb
· ...
·
· /etc
· /etc/zhcon.conf
还没安装的软件包不能使用该命令列出文件列表。
· 显示.deb软件包的内容,要显示的.deb软件包要在当前目录下。
· debian:~/inst# dpkg -I jabbin_2.0beta2-1_i386.deb
· 新格式的 debian 软件包,格式版本 2.0。
· 大小 2812370 字节:主控包=20219 字节。
· 677 字节, 17 行 control
· 136505 字节, 1316 行 md5sums
· Package: jabbin
· Version: 2.0beta2-1
· Section: net
· Priority: optional
· Architecture: i386
· Depends: libc6 (>= 2.3.6-6), libexpat1 (>= 1.95.8), libgcc1 (>= 1:4.1.0), libqt3-mt (>= 3:3.3.6), libspeex1, libssl0.9.8 (>= 0.9.8b-1), libstdc++6 (>= 4.1.0), libx11-6, libxext6, libxss1, zlib1g (>= 1:1.2.1)
· Installed-Size: 12428
· Maintainer: Andrew Donnellan
· Description: Jabber IM client with VoIP support
· Jabbin is a Jabber instant messaging client based on Psi.
· It has support for the Jingle P2P protocol, which is used
· for Voice over Internet Protocol (VoIP).
· .
· Jabbin is compatible with the VoIP protocol used by Google
· Talk.
· .
· Homepage:
· 显示.deb包中的文件列表,要显示的.deb包要在当前目录下。
· debian:~/inst# dpkg -c jabbin_2.0beta2-1_i386.deb
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/bin/
· -rwxr-xr-x root/root 5904104 2006-08-03 05:25 ./usr/bin/jabbin
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/jabbin/
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/
· -rw-r--r-- root/root 83 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/dir-wcprops
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/wcprops/
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/text-base/
· drwxr-xr-x root/root 0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/props/
· ...
· 安装.deb软件包,要安装的.deb文件要在当前目录下。
· debian:~/inst# dpkg -i jabbin_2.0beta2-1_i386.deb
· (正在读取数据库 ... 系统当前总共安装有 107878 个文件和目录。)
· 正预备替换 jabbin 2.0beta2-1 (使用 jabbin_2.0beta2-1_i386.deb) ...
· 正在解压缩将用于更替的包文件 jabbin ...
· 正在设置 jabbin (2.0beta2-1) ...
· debian:~/inst#
使用该命令安装.deb包并不能自动解决软件包的依赖问题,需用dpkg -I查出该软件包的依赖要求手动解决。所以该方法一般用来安装第三方的.deb软件包。如果需系统自动解决软件包的依赖关系,则要使用apt、tasksel、dselect、aptitude或图形化的syanptic、KPackage等前端工具来安装软件包。
· 删除软件包。
· debian:~/inst# dpkg -r zhcon
· (正在读取数据库 ... 系统当前总共安装有 107878 个文件和目录。)
· 正在删除 zhcon ...
· debian:~/inst#
我们也可用-P选项来删除软件包,它将会清除软件包的相关配置文件。
除了dpkg命令外,系统中还有一些以dpkg开头的命令,用来管理Debian软件包。常用的有:
· dpkg-reconfigure,重新配置软件包。
· dpkg-source, dpkg-gencontrol, dpkg-shlibdeps, dpkg-genchanges, dpkg-buildpackage, dpkg-dista ddfile,dpkg-parsechangelog。这些都是debian源码包的管理工具。
软件包管理是区分不同发行版的一大特征,如RedHat使用RPM软件包来管理软件,Debian使用deb软件包来管理软件。apt是Debian的deb软件包高级管理工具,由一组以apt开头的命令组成,如apt-get、apt-cache和apt-setup等。它的最低底层还是调用dpkg程序来处理软件包的。通过apt-get工具可自动解决软件包的依赖关系,方便软件的安装和升级。它是Debian发行版的最大特色,一定要好好掌握。
要使用好apt-get就要配置好一个名为sources.list的资源列表,资源列表指向Debian系统的软件库,apt-get会从该软件库安装各种软件包。sources.list文件位于/etc/apt目录下,下面是Sarge、Etch和Sid三个版本的写法,你可任选一种,最好不要多版本混用:
#sources.list for Sarge(stable):
deb stable main contrib non-free
deb stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src stable main contrib non-free
#deb-src stable/non-US main contrib non-free
#sources.list for Etch(testing):
deb testing main contrib non-free
deb testing/non-US main contrib non-free
deb http://security.debian.org testing/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src testing main contrib non-free
#deb-src testing/non-US main contrib non-free
#sources.list for Sid(unstable):
deb ftp://ftp.us.debian.org/debian unstable main contrib non-free
deb ftp://non-us.debian.org/debian-non-US unstable/non-US main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src unstable main contrib non-free
#deb-src unstable/non-US main contrib non-free
sources.list文件的内容决定了Debian的版本。安全更新只存在于stable和testing版中,unstable没有安全更新。进入stable的软件都经过严格的依赖测试和安全测试,所以如果你想系统稳定,用于工作,最好使用stable,如果你想使用最新版的软件,就使用testing或unstable。Woody、Sarge和Sid是Debian 3.x三个版本中的代号,我们一般都是以代号来称呼debian不同版本。所有Debian发行版的代号全都取自电影Toy Story,Woody是那个牛仔,Sarge是绿色塑胶军队的领导,Sid是破坏玩具的小孩。
我们也可把Debian的发行光盘做为软件库,直接在光盘上安装软件。这时就要用到apt-cdrom命令。命令格式如下:
debian:~# apt-cdrom --help
apt 0.6.46.4 for linux i386 ,编译于 Dec 4 2006 17:48:23
Usage: apt-cdrom [options] command
apt-cdrom is a tool to add CDROM's to APT's source list. The
CDROM mount point and device information is taken from apt.conf
and /etc/fstab.
Commands:
add - 增加一个CDROM安装源到sources.list列表
ident - 报告CDROM的验证信息
Options:
-h 帮助
-d 指定CDROM挂装点
-r 为一个已经识别的光盘改名
-m 不挂装
-f 快速模式,不检查软件包文件
-a 完整扫描模式
-c=? 指定读取的配置文件
-o=? 设置附加选项
See fstab(5)
· apt-get update
更新软件包信息库。在Debian中,软件包是通过一个数据库来管理的,通过这个数据库中可跟踪你系统中已安装、没有安装和现在可安装的软件包信息。apt-get安装软件包时就是依靠这个数据库来解决软件包间的依赖关系,从而可自动安装相关软件。我们需定期运行该命令,从而保持数据库的信息为最新。
· apt-get install package_name1 package_name2 package_name3 ...
安装软件包。如果软件包需其它软件包支持,apt-get会通过搜索软件包数据库找到这种依赖关系,一起下载相关软件。在一个命令行中可同时安装多个软件包,中间用空格隔开即可。安装的软件包默认会存放在/var/cache/apt/archives目录下,以便以后重新安装。如果已安装的软件包损坏了,你可通过--reinstall选项来重新安装。如:
# apt-get --reinstall install package_name
|
|
在需安装的软件包名后加一个减号会删除软件包,如:apt-get install package_name-。 |
只是下载软件,不解包和安装使用-d选项,如:
# apt-get -d install package_name
使用--dry-run选项可使apt-get在安装软件包前进行测试,如:
# apt-get install package_name --dry-run
Debian软件包的名字和软件名不同,所以在安装前如不知道软件包的名字,可到Debian的官方软件库查询,网址是:。或者用下面介绍的apt-cache search package_name命令来查询。
· apt-get remove package_name1 package_name2 package_name3 ...
删除软件包。如果你想删除没用的软件包,只要使用该命令即可。如果你想把该软件的配置文件也删除,可以用--purge选项,如:
# apt-get --purge remove package_name
|
|
类似地,在删除软件包名后加一个加号会安装软件包,如:apt-get remove package_name+。 |
· apt-get source package_name1 package_name2 package_name3
下载软件包的的源码版本。
· apt-get build-dep package_name
构造软件包的源码的编译环境,为编译软件包下载必须的其它软件包。
· apt-get upgrade package_name1 package_name2 package_name3 ...
软件包升级功能是APT系统这么成功的主要原因。通过该命令,我们就可把软件升级到最版本。在使用该命令前,最好先运行apt-get update命令,以更新软件包数据库。但该方案不是更新系统最好的方法,一些包会因为包依赖问题而保留(kept back)一些旧的软件包。Debian提供了一个更好的升级方案,就是用dis-upgrade。下面一节会详细介绍。
· apt-get dist-upgrade
更新整个Debian系统。可从网络或本地更新整个系统。它会重新安排好包的依赖性。如果有些包由于一些原因实在不能更新,我们可通过以下命令查询原因:
# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade
|
|
用apt-show-versions -u可获得可升级软件包的列表。该命令还有一些有用的选项,可用-h选项查看详细帮助,了解更多功能。 |
· apt-get clean
删除下载了的软件包,当我们通过apt-get安装软件包时,APT会把软件包下载到本地/var/cache/apt/archives/目录。该命令会删除该文件夹内的除锁住外的所有软件包。该文件夹下的文件不可用rm命令删除,一定要使用apt-get命令来删除。
· apt-get autoclean
删除已下载的旧版本的软件包。该命令类似于上面的命令,但它会有选择地删除旧版本的软件包。
· apt-get autoremove
自动移除随其它软件自动安装但又不再有用的软件。
· apt-get dselect-upgrade
通过dselect的“建议”和“推荐”功能更新系统。dselect是Debian中一个功能强大的包管理工具。它可帮助用户选择软件包来安装,其中一个有用功能是它会建议和推荐安装其它相关软件包。我们可在APT中使用它这个功能。
· apt-get check
检查系统中已安装软件包的依赖性。
· apt-get的secret cow powers
· debian:~# apt-get moo
· (__)
· (oo)
· /------\/
· / | ||
· * /\---/\
· ~~ ~~
· ...."Have you mooed today?"...