简介
APT(Advanced Package Tool)是linux的Debian发行版已经一些以Debian为基础的发行版(Ubuntu等)下,做软件包管理的一个工具,其中包括deselect和apt-get两个工具,他们都可以提供下载、安装、更新、删除软件包的功能。
安装包的过程分为下载和安装两个部分,当包下载完成后,dpkg将会接管来完成安装任务。
为什么要apt-get update
这里要提到的是APT源,大致可以理解为一个数据库,里面记录了大大小小各种软件包的下载地址,APT安装完成后,有一个默认的源,也就是官方源,在ubuntu系统下,可以看到这些源的地址都是ubuntu.com等等。APT会选择把这个默认源中记录的各个软件包的索引缓存在本地,以后每次执行apt-get install时都会读取本地记录的内容寻找对应包的下载地址。但是时间一久,有的软件包可能换地址了,更新链接等等,此时就需要apt-get update从“源”获取最新的数据来更新本地的缓存。
由于APT官方提供的源在国外,国内访问会比较慢,所以很多人选择使用国内镜像,所谓镜像就是在国内的某个服务器上拷贝了一份和官方源完全相同的内容,阿里和中科大等等都有APT的国内镜像,这些镜像大约每5—10分钟就会和官方的源进行一次同步,因此实时性还是可以保证的。apt源的配置文件是/etc/apt/sources.list
,每次执行apt-get update
时,APT都会读取这个文件中的源的地址,并更新本地软件包索引的内容,用编辑器打开后直接修改即可(with sudo)。网上四处可搜apt源的国内镜像,比如:http://www.cnblogs.com/dtiove/p/5917263.html
如何搜索软件包
首先你必须知道自己想要的是什么,APT可以提供模糊查询,例如:
sudo apt-cache search mysql
就可以查询到很多大大小小很多关键字或者简介中包含“mysql”的包。
如何查看本机已经安装的包
dpkg -l | grep mysql
其中dpkg -l是显示本机所有安装的软件包(当然,他们并不一定全部是通过apt-get安装),之后通过管道可以筛选出含有mysql关键字的软件包
更进一步,还可以通过例如dpkg -s mysql-server-5.7
来查看某个具体的信息,包括该软件包的简介、依赖信息、大小、MD5值等等。
软件包的安装、更新和卸载
sudo apt-get install package1
sudo apt-get remove package1
sudo apt-get upgrade package1
sudo apt-get purge package1
sudo apt-get autoremove
以上前四条命令分别是安装、卸载、升级、卸载一个软件包的命令,其中purge和remove的区别是,remove仅仅删除软件包本身,purge还会删除相应的配置文件。
autoremove是告诉apt自动删除多余的、冲突的包等等,例如在安装package1时,可以还自动安装了package1依赖的其他包,但是在package1删除时这些包并不会自动删除,此时就需要通过autoremove来删除这些多余的包(你可能想问,如果package2和package1有着相同的依赖,虽然package1不存在了,但是package2还是会用到这些依赖,放心,APT不会这么蠢,既然说了是“多余”,就只有在任何包都不依赖的情况下才会被删除)。
这里还要提一下install的-d和-y选项
sudo apt-get install -d package1 package2 package3
等等,你可能希望,只有这些软件包全部能够正确下载时才开始安装,否则就终止,-d
选项的意思就是指下载而不安装,当最后下载结束,你确认所有包都已经下载是,再重新执行一次命令(不含-d
),就可以全部安装了。
-y就是yes,在软件包安装过程中,可能需要和用户交互,例如询问你“是否确定安装啊”,“是否把什么日志放在哪个目录啊”等等,大部分情况下缺省的配置都是OK的,除非你有特殊的需求,-y会使得这些提示在安装时不再提示而默认使用缺省的配置。例如
sudo apt-get install -y package1
apt-get check与apt-get -f install
sudo apt-get check
用来检查错误的依赖,下面是一个例子:
# apt-get check
Reading Package Lists... Done
Building Dependency Tree... Done
You might want to run 'apt --fix-broken install' to correct these.
Sorry, but the following packages have unmet dependencies:
9fonts: Depends: xlib6g but it is not installed
uucp: Depends: mailx but it is not installed
blast: Depends: xlib6g (>= 3.3-5) but it is not installed
adduser: Depends: perl-base but it is not installed
aumix: Depends: libgpmg1 but it is not installed
debiandoc-sgml: Depends: sgml-base but it is not installed
bash-builtins: Depends: bash (>= 2.01) but 2.0-3 is installed
cthugha: Depends: svgalibg1 but it is not installed
Depends: xlib6g (>= 3.3-5) but it is not installed
libreadlineg2: Conflicts:libreadline2 (<< 2.1-2.1)
在这个例子中出现的问题比较多,都是依赖没有安装或是存在相互冲突的包。产生这些问题的原因一般有两种:
- 通过dpkg对包进行升级,但是dpkg不负责依赖检查和冲突检查。
- 在安装某个包时,这个包的依赖同时被安装,但是依赖安装失败了,而此时包已经安装完了
至于解决办法,提示中已经给出,使用sudo apt-get -f install
(-f是--fix-broken的缩写)。当然这条指令并不能保证一定能够成功解决冲突,一般来说如果错误由第二个原因引起,都可以解决,但是如果由第一个原因因此,则可能修复失败。
upgrade与dist-upgrade
根据官方的解释,apt-get upgrade命令会试图把package升级到最新的版本,但是前提是此过程中没有任何的其他包会被删除或者下载安装。即如果包A的旧版本升级后,A所依赖的包也和原来不同(包括版本不同)了,upgrade将会放弃更新A。
apt-get dist-upgrade则会智能的解决这个问题,它会升级A,并以最小的代价解决新的依赖的问题。即A的依赖也会因此被更新或者下载等等。
apt与apt-get
Ubuntu16.04后推出的apt命令算是apt-get,apt-config和apt-cache的简化版,这里有一篇文章介绍了他们之间的关系 Linux中apt与apt-get命令的区别与解释
参考资料
APT官方文档:https://www.debian.org/doc/manuals/apt-guide/index.en.html