`
seawavecau
  • 浏览: 748514 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

学习使用apt

阅读更多
对于APT系统来说有许多的前后端程序可以使得我们很容易的得到可以获得的安装包和已经安装的安装包列表,同时还可以得到一些诸如一个安装包所在的部分,他的优先级及其描述等等一些信息.
但是在这里我们的目的是要学习如何使用纯粹的APT.所以我们如何查找到我们要安装的软件包的名字呢?
对于这个任务我们有许多的办法.我们要从apt-cache开始.这个程序是APT系统用来维护他的数据库的.我们要简单的看一些实际的程序.

获得安装包名
例如,所如我们要怀念一下Atari 2600的日子.我们可以使用APT安装一个Atari模拟器,然后下载一些游戏.我们可以这样的来做:
# apt-cache search atari //atari是文件名
aranym - Atari Running on Any Machine
atari-fdisk-cross - Partition editor for Atari (running on non-Atari)
stella - Atari 2600 Emulator for SDL & X windows
xmess-x - X binaries for the Multi Emulator Super System
这样我们就可以查到许多与我们所希望的安装包相关的软件包,同时附有一些简要的说明.如果要得以某一个安装包更为详细的说明信息,我们可以用下面的命令:
# apt-cache show stella //stella是文件名

在这里我们要注意到在这个列中第一个可以获得安装的软件包而第二个是我们已经安装的安装包.要得到关于某一个软件包的一般信息,我们可以用下面的命令:
# apt-cache showpkg penguin-command
Package: penguin-command
Versions:
1.6.10-1(/var/lib/apt/lists/10.1.10.8_mirror_debian_dists_testing_main_binary-i386_Packages)(/var/lib/apt/lists/10.1.10.8_mirror_debian_dists_unstable_main_binary-i386_Packages)
1.6.7-2(/var/lib/apt/lists/10.1.10.8_mirror_debian_dists_stable_main_binary-i386_Packages)

Reverse Depends:
Dependencies:
1.6.10-1 - libc6 (2 2.3.2.ds1-4) libsdl-image1.2 (2 1.2.3) libsdl-mixer1.2 (2 1.2.5) libsdl1.2debian (4 1.2.7+1.2.8)
1.6.7-2 - libc6 (2 2.3.1-1) libjpeg62 (0 (null)) libpng12-0 (0 (null)) libsdl-mixer1.2 (2 1.2.4-3) libsdl1.2debian (4 1.2.3) zlib1g (2 1:1.1.4)
Provides:
1.6.10-1 -
1.6.7-2 -
Reverse Provides:
而如果我们只是希望找出这个软件包的依赖关系,我们可以用下面的命令:
# apt-cache depends penguin-command
penguin-command
依赖: libc6
依赖: libsdl-image1.2
依赖: libsdl-mixer1.2
依赖: libsdl1.2debian
总之,我们可以有一系列的方法可以查找出我们要安装的软件包的名字.

使用dpkg查找软件包名
定位一个软件包名字的一个方法就是要知道可以在这个软件包中找到的一个重要文件的名字.例如要查找一个提供常规的”.h”文件以供编译用的软件包,我们可以运行下面的命令:
$ dpkg -S stdio.h
libc6-dev: /usr/include/bits/stdio.h
perl: /usr/lib/perl/5.8.7/CORE/nostdio.h
libglib2.0-dev: /usr/include/glib-2.0/glib/gstdio.h
libc6-dev: /usr/include/stdio.h
或是用下面命令:
$ dpkg -S /usr/include/stdio.h
libc6-dev: /usr/include/stdio.h
要查找一些在我们的系统上已经安装了软件包,这样的查找方法是相当有用的.例如,如果我们要清除我们的硬件驱动,我们可以用下面的命令:
# dpkg -l | grep mozilla
ii flashplayer-mozilla 7.0.25-0.1 Macromedia Flash Player
ii mozilla-browser 1.7.12-1 The Mozilla Internet application suite - cor
ii mozilla-psm 1.7.12-1 The Mozilla Internet application suite - Per
使用这个命令会存在一个”打断(break)”软件包名字的问题.在上面的例子中,软件包的全名是mozilla-browser.要修正这个问题,我们可以用下面的方法来使用COLUMNS环境变量:
$ COLUMNS=132 dpkg -l | grep mozilla
ii flashplayer-mozilla 7.0.25-0.1 Macromedia Flash Player
ii mozilla-browser 1.7.12-1 The Mozilla Internet application suite - core and browser
ii mozilla-psm 1.7.12-1 The Mozilla Internet application suite - Personal Security Manager (PS
或是用下面的方法:
$ apt-cache search ”Mozilla Web Browser”
mozilla - The Mozilla Internet application suite - meta package
mozilla-chatzilla - Mozilla Web Browser - irc client
mozilla-mailnews - The Mozilla Internet application suite - mail and news support
mozilla-psm - The Mozilla Internet application suite - Personal Security Manager (PSM)
flashplayer-mozilla - Macromedia Flash Player

如何安装所需的软件包
假设我们正在编译一个程序,但是突然出现一个错误,因为他需要一个我们所没有的.h文件.而这时auto-apt程序可以解决我们的问题.如果我们需要一个软件包,他就会询问我们安装这个软件包,停止相关的进程并会在软件包安装后继续执行.
我们所需要做只是运行下面的命令:
# auto-apt run command
在这里command就是我们要执行的也许会需要一些我们并没有的文件的命令.例如:
# auto-apt run ./configure
然后他会询问安装一些必需的软件包并会自动调用apt-get程序.如果我们正在运行X,就会使用一个图形界面而不是默认的文本界面.
auto-apt会保持一个有效顺序更新所需的数据库.这是由命令auto-apt update,auto-apt updatedb,auto-apt update-local来完成的.
5.4 如何查找一个文件属于哪一个软件包
如果我们要安装一个软件包而我们使用apt-cache并不能查找到搜索时用到的名字,但是我们却知道程序自己的名字,或是其他的一些属于这个安装包的文件名字,这时我们可以使用apt-file来查找这个软件包的名字.命令格式如下:
# apt-file search filename
他的工作方式与dpkg -S相类似,但是前者也会显示出一些我们并没有安装的而却包含这个文件的软件包.他可以用来查找哪些软件包包含我们在编译程序时丢失的文件,当然这样的问题我们也可以用auto-apt来解决.
我们可以用下面的命令来列出一个软件包中的内容:
# apt-file list packagename
apt-file保持一个含有包文件的数据库,这与auto-apt相类似,但是前者需要更新(up-to-date).我们可以用下面的命令来完成:
# apt-file update
在默认的情况下,apt-file会使用auto-apt的数据库.
5.5 如何保持一个软件包的更改信息
每一个软件包都会在他的文档安装目录(/usr/share/doc/packagename)安装一个名为changelog.Debian.gz的文件,在这个文件中包含有这个软件包自上一版本以来所做的更改.我们可以使用zless的帮助来阅读这些更新日志.但是在我们进行了一次完整的系统更新以后,要查找每一个软件包的更新日志并不是一件很容易的事情.
一个名为apt-listchanges的程序可以自动完成这样的任务.但是我们要保证我们的系统已经安装了这个软件包.在这个软件包的安装过程中,Debconf会对他进行配置.一些问题依赖于我们设置的Debconf所使用的优先级而并不会显示.依据我们所希望的来回答这些问题.
第一个问题是询问我们apt-listchanges如何显示更新.我们可以要他们发信给我们,这对于自动更新是一个不错的选择,或者是我们可以要他们在如less的一类的分页器中进行显示,这样我们就可以在继续更新以前进行检查.如果我们并不希望 apt-listchanges在更新时自动运行我们可以回答none.
在安装了apt-listchanges以后,一旦apt有软件包下载(或是从CD得到或是磁盘),他就会在我们安将这些软件包之前显示更新列表.

使用源码包
下载源码包
在自由软件包的世界中学习源码或是修正错误源码是一件很平常的事情.要这样做,我们就要下载程序的源码.APT系统提供了一个很简单的方法可以获得发行版本中的程序源码,包括要创建程序.deb包的所有文件.
Debian源码另一个常见的用法就是从不稳定发行版中修正一个新版本的程序以适应稳定版.编译一个相对稳定版本的软件包将会创建一些与当前版本中可获得的软件包相匹配依赖关系的deb包.
要完成这样的工作,在我们的/etc/apt/sources.list文件中的deb-src实体要指向不稳定版本.他也应被允许(但是并不推荐这样).
要下载一个源码包,我们可以用下面的命令:
$ apt-get source packagename
这会下载三个文件:a.orig.tar.gz,a.dsc,a.diff.gz.如果是下载专门的Debian软件包,在上面的三个文件中最后一个通常并不会下载,而第一个文件中也通常并没有orig的名字.
.dsc文件中由dpkg-source用来将源码包解压到packagename-version目录下的.在每一个下载的软件包中有一个debian目录,其中含用创建.deb包所需的文件.
如果我们希望在软件包下载后自动创建这个软件包,我们可以在命令行中加入-b选项,如下面的命令:
$ apt-get -b source packagename
如果我们并没有在下载后立即创建.deb包,我们可以在以后运行下面的命令来创建:
$ dpkg-buildpackage -rfakeroot -uc -b
这个命令要在为下载源码所创建的目录中运行.
要安装上面的命令所创建的安装包,我们要直接使用包管理器.如下面的命令:
# dpkg -i file.deb
在apt-get的source方法与他的其他的方法之间也存在一些区别.source方法可以为普通的用户所使用而并不需要专门的root密码.下载的文件所存放的目录就是我们调用apt-get source package命令所在的目录.

编译源码包所需要的包
在通常的情况下,为了编译一个源码包需要专门的头文件和共享库.所有的源码包在他们的控制文件中都存在一个名”Build-Depends”的区域来表明为了从源码编译这个包所需要的额外的包.
APT有一个很简单的方法来下载这些包.我们只需要运行apt-get build-dep package,在这里package是我们要创建的包名.例如:
# apt-get build-dep gmc
这样将会安装的软件包就是我们要正确的编译gmc包所需要的软件包.在这里有一点要注意的就是这个命令并不会查找我们要编译程序的源码,所以我们需要运行单独的apt-get source来得到我们所需的源码.
如果我们所希望的只是检查要创建指定的包所需要的包,有许多的apt-cache show可以满足我们这样的要求.在这个命令的显示信息中,Build-Depends部分就会列出所需要的软件包.如:
# apt-cache showsrc package

如何处理错误
7.1 常规错误
错误总是会发生的,其中的许多是由于用户没有注意而造成的.下面我们会列出一些最常出现的一些错误以及一些解决办法.
如果我们试着运行apt-get install package时会出现类似于下面的错误信息:
Reading Package Lists...Done
Building Dependency Tree...Done
W: Couldn''t stat source package list ''http://people.debian.org unstable/ Package''
W: you may want to run apt-get update to correct these missing files
E: Couldn''t find package penguineyes
这是因为在你上次更改/etc/apt/source.list文件后我们忘记了运行apt-get update命令.
如果错误如下:
E: Could not open lock file /var/lib/dpkg/lock - open (13 Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/),are you root?
如果我们在试着运行任何的apt-get方法而不是source方法,我们不具有root权限,也就是说,我们正在以普通用户在运行这些命令.
如果我们在同一时间运行了两次apt-get命令或是我们在试着运行apt-get的同时dpkg进程处于激活,也会出现类似的信息.可以与其他同时运行的唯一的方法就是source方法.
如果一个安装进程在中间被打断而我们发现再也不可能安装或是移除这个安装包,我们可以试着运行下面的两个命令:
# apt-get -f install
# dpkg --configure -a
然后再试一下.上面的两个命令比较起来似乎第二个更必须一些.这对于使用''unstable''的用户来说是很重要的一课.
如果我们在运行apt-get update时出现”Eynamic MMap ran out of room”,我们可以在我们的/etc/apt/apt.conf中加入下面的一句:
APT::Cache-Limit 10000000;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics