简介
APT(AdvancedPackageTool)是linux的Debian发行版早已一些以Debian为基础的发行版(Ubuntu等)下,做软件包管理的一个工具,其中包括deselect和apt-get两个工具,她们都可以提供下载、安装、更新、删除软件包的功能。
安装包的过程分为下载和安装两个部份,当包下载完成后,dpkg将会接管来完成安装任务。
为何要apt-getupdate
这儿要提及的是APT源,大致可以理解为一个数据库,上面记录了大大小小各类软件包的下载地址,APT安装完成后,有一个默认的源,也就是官方源,在ubuntu系统下,可以看见那些源的地址都是等等。APT会选择把这个默认源中记录的各个软件包的索引缓存在本地,之后每次执行apt-getinstall时就会读取本地记录的内容找寻对应包的下载地址。而且时间一久,有的软件包可能换地址了,更新链接等等,此时就须要apt-getupdate从“源”获取最新的数据来更新本地的缓存。
因为APT官方提供的源在美国,国外访问会比较慢,所以好多人选择使用国外镜像,所谓镜像就是在国外的某个服务器上拷贝了一份和官方源完全相同的内容,阿里和中科大等等都有APT的国外镜像,这种镜像大概每5—10分钟都会和官方的源进行一次同步,因而实时性还是可以保证的。apt源的配置文件是/etc/apt/sources.list,每次执行apt-getupdate时,APT就会读取这个文件中的源的地址,并更新本地软件包索引的内容,用编辑器打开后直接更改即可(withsudo)。网上到处可搜apt源的国外镜像,例如:
怎么搜索软件包
首先你必须晓得自己想要的是哪些,APT可以提供模糊查询,比如:
sudo apt-cache search mysql
就可以查询到好多大大小小好多关键字或则简介中包含“mysql”的包。
怎么查看本机早已安装的包
dpkg -l | grep mysql
其中dpkg-l是显示本机所有安装的软件包(其实,她们并不一定全部是通过apt-get安装),然后通过管线可以筛选出富含mysql关键字的软件包
更进一步,还可以通过诸如dpkg-smysql-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不会那么蠢,既然说了是“多余”linux操作系统教程,就只有在任何包都不依赖的情况下才能被删掉)。
这儿还要提一下install的-d和-y选项
sudoapt-getinstall-dpackage1package2package3等等,你可能希望,只有那些软件包全部才能正确下载时才开始安装,否则就中止,-d选项的意思就是指下载而不安装,当最后下载结束,你确认所有包都早已下载是,再重新执行一次命令(不含-d),就可以全部安装了。
-y就是yeslinux软件,在软件包安装过程中,可能须要和用户交互,比如寻问你“是否确定安装啊”,“是否把哪些日志置于那个目录啊”等等,大部份情况下缺省的配置都是OK的,除非你有特殊的需求,-y会促使这种提示在安装时不再提示而默认使用缺省的配置。诸如
sudo apt-get install -y package1
apt-getcheck与apt-get-finstall
sudoapt-getcheck拿来检测错误的依赖,下边是一个反例:
# 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不负责依赖检测和冲突检测。在安装某个包时linux purge命令,这个包的依赖同时被安装,并且依赖安装失败了,而此时包早已安装完了
至于解决办法,提示中早已给出,使用sudoapt-get-finstall(-f是--fix-broken的简写)。其实这条指令并不能保证一定就能成功解决冲突,通常来说假如错误由第二个诱因造成,都可以解决,而且假如由第一个诱因为此,则可能修补失败。
upgrade与dist-upgrade
按照官方的解释,apt-getupgrade命令会企图把package升级到最新的版本,而且前提是此过程中没有任何的其他包会被删掉或则下载安装。即假如包A的旧版本升级后,A所依赖的包也和原先不同(包括版本不同)了,upgrade将会舍弃更新A。
apt-getdist-upgrade则会智能的解决这个问题linux purge命令,它会升级A,并以最小的代价解决新的依赖的问题。即A的依赖也会因而被更新或则下载等等。
apt与apt-get
Ubuntu16.04后推出的apt命令算是apt-get,apt-config和apt-cache的简化版,这儿有一篇文章介绍了她们之间的关系Linux中apt与apt-get命令的区别与解释
参考资料
APT官方文档: