apt-get 工作原理
因为每个人都可以编译、制作deb包、并随意发布到网上,这就很容易造成混乱,鱼龙混杂、质量得不到保证,甚至有些包还有可能是一个病毒软件。因此Ubuntu系统采用一个软件仓库来管理这些deb软件包,把这些包放到一个官方的网站服务器上,类似于苹果系统的APP store,用户使用apt命令安装软件时,只能到这个服务器上下载软件。考虑到全球各个地方的网络环境差异,往往会在全球各地同时配置几个镜像服务器,这样全球各地的Ubuntu用户都可以根据网络状况到最合适的服务器上去下载和安装deb软件包了。这些服务器我们也称为软件源 (repository) 或者简称为“源”。
这些服务器的网络地址保存在/etc/apt/source.list文件中。文件内容如下所示:
deb http://us.archive.ubuntu.com/ubuntu/xenial universe
当我们使用apt install安装软件时,apt工具就会根据这个source.list文件中的网络地址,选择最合适的服务器去下载软件包。
一般Ubuntu默认的软件源是Ubuntu官方网站,打开上面的网址,你会发现上面存有很多软件包的信息。
对于国内用户来说,访问国外的网站速度可能会慢很多、甚至无法访问。国内高校和互联网公司其实也有很多服务器提供下载,大家百度搜索一下:阿里云软件源、中科大软件源,一般都会搜索到很多服务器地址,可以选择其中几个,添加到/etc/apt/source.list文件中,以后使用apt-get安装软件时,就可以直接从国内的服务器上直接下载deb包了,速度会快很多。如我的Ubuntu16.04,修改后的source.list文件如下:
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
修改好/etc/apt/source.list文件后,你还需要使用$ apt-get update命令更新一下。这个命令的作用访问 /etc/apt/source.list 文件中的每一个服务器,读取可以支持下载安装的软件列表,并保存到本地电脑中(/var/lib/apt/lists)。这个列表就像饭店里的菜单一样,要按照菜单去点菜,直接使用apt install xxx 就可以直接安装软件了。如果你要安装的软件如果不在软件列表中,很可能就安装失败。
软件列表的另一个作用是可以帮助你软件更新,因为服务器上的软件版本也会不断更新,你本地已经安装的软件如果跟软件列表中的软件版本不一致,它可能就会提示你软件需要更新,就像我们PC中的软件管家一样,它会提示你,你的电脑中有多少个软件可以更新。
当然,你也可以使用apt list命令去查看具体需要更新的软件包:
接下来,如果你想更新这些已经安装的软件,就可以通过$ apt-get upgrade命令来完成。这个命令会将本地已经安装的软件与刚刚使用update命令下载到本地的软件列表进行对比,如果发现版本不一致,就会重新安装最新的版本。如果你的系统需要更新的软件包太多,这个可能需要一定的时间,耐心等待就可以了,升级成功后,一般会有提示信息,你升级了多少个软件包…
使用apt安装软件的另一个好处是可以自动处理依赖关系。比如你想安装一个B,需要依赖A,那么你安装B的同时,B所依赖的A软件包也会自动安装上了。在/var/lib/dpkg/available文件中,有详细的软件包信息,包括软件版本、软件依赖的包等。包括在视频教程《使用QEMU搭建嵌入式U-boot+Linux+NFS开发环境》中,很多学员反馈说,为什么我的环境跟视频中的不一样?这是因为每个Ubuntu版本不同、安装的软件不同,安装的库、头文件也不一样,大家在编译的时候如果遇到一些无法识别的命令、缺少一些头文件,直接安装对应的工具和库就可以了,随着你的Ubuntu系统安装的一些依赖库、工具越来越多,以后再编译其它软件时,一般都可以顺利编译了,因为很多依赖的库文件、头文件、工具、命令等都安装得差不多了。
对于一个新手。在使用apt-get安装软件时,经常遇到的问题很多,比如权限不够,使用sudo、或切换到root安装可以解决这个问题。无法获取软件包,网络访问不了,可以在/etc/apt/source.list文件中添加国内的一些镜像服务器地址(软件源)。还有一个经常遇到的问题是:
E: 无法获得锁 ``/var/cache/apt/archives/lock
直接删除这个文件就可以了,对应的还有 /var/lib/dpkg/lock文件,顺便也删除掉,一般就可以解决问题。在安装的过程中,如果遇到其它问题,建议先到百度里搜一搜,你遇到的问题、踩到的坑,前面可能已经有无数人遇到过了,看看它们是怎么解决的,一般都可以解决问题。
最后,当你安装的软件在服务器中确实没有时,这就需要你手动下载源码、编译安装了,一般在Linux系统中,可以直接下载GNU工程开源代码,然后直接通过三步走,就可以直接编译和安装了:
$ ./configure
$ make
$ make install