一. apt软件源
由于apt-get默认的软件源位于国外,如欧洲等,因此默认情况下使用apt安装软件往往下载速度极慢。
在Ubuntu和所有其他基于Debian的发行版中,apt软件存储库在/etc/apt/sources.list文件中或者在/etc/apt/sources.list.d/目录下使用单独文件定义。国内用户通常需要对其进行调整,将软件源修改为国内的服务器,这是一个基本操作,本文不再赘述。
二. apt第三方软件源
apt软件源当然不可能包括完整的软件信息,有时候我们需要使用第三方软件源。例如docker、nvidia显卡驱动等,都属于第三方软件源。
除了手动编辑/etc/apt/sources.list文件,或者在/etc/apt/sources.list.d/目录下使用单独文件增加第三方软件源的信息之外,我们通常使用add-apt-repository命令来管理第三方软件源。
add-apt-repository是Python脚本,用于将APT存储库添加到/etc/apt/sources.list中,或者作为单个文件添加到/etc/apt/sources.list.d目录中。
三. apt第三方软件源下载缓慢的问题
当第三方软件源位于国外等网络情况不理想的地方,而又找不到网络条件好的镜像软件源作为替代时,apt安装软件会变得非常缓慢。
1. 网络代理能解决问题吗?
当第三方软件源网络条件差,甚至其中的软件下载地址被qiang时,首先想到的便是使用网络代理。
配置网络代理:
export http_proxy=http://xx.108.121.xx:9707
export https_proxy=http://xx.108.121.xx:9707
export HTTP_PROXY=http://xx.108.121.xx:9707
export HTTPS_PROXY=http://xx.108.121.xx:9707
然而,配置网络代理后,尽管wget、curl等执行正常,而apt却完全挂掉了。
1.1. Could not handshake: Error in the pull function. [IP: xx.108.121.xx 9707]
以安装nvidia显卡驱动为例:
apt-get install nvidia-driver-545
执行出错:
E: Failed to fetch https://ppa.launchpadcontent.net/graphics-drivers/ppa/ubuntu/pool/main/n/nvidia-graphics-drivers-545/nvidia-driver-545_545.23.06-0ubuntu0%7egpu22.04.3_amd64.deb Could not handshake: Error in the pull function. [IP: xx.108.121.xx 9707]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
1.2. 403 Forbidden [IP: xx.108.121.xx 9707]
已安装nginx为例:
Err:1 http://mirrors.tencentyun.com/ubuntu jammy-updates/main amd64 nginx amd64 1.18.0-6ubuntu14.4
403 Forbidden [IP: xx.108.121.xx 9707]
E: Failed to fetch http://mirrors.tencentyun.com/ubuntu/pool/main/n/nginx/nginx_1.18.0-6ubuntu14.4_amd64.deb 403 Forbidden [IP: xx.108.121.xx 9707]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
总之,使用网络代理之后,apt变成残废了,一会403,一会SSL失败。
2. “离线”安装
此处所谓的离线安装,不是真正的离线安装。在使用apt安装某个软件时,apt下载的可能不是单一的软件包,而是一系列的软件包,而且apt还能协助处理软件依赖、升级替换等一系列麻烦事,因此,我们不希望脱离apt来执行真正的离线安装。
这里apt的“离线”安装是指,我们提前借助其他网络条件,将apt在安装软件时需要的软件包提前下载好,然后放置到apt的软件包缓存目录中。这样,apt在安装软件时就能跳过下载过程,从而避开网络问题。为了实现这一点,需要满足两个条件。
2.1. apt软件包缓存位置
/var/cache/apt/archives是apt-get命令在系统上存储已下载的软件包文件的目录。当您使用apt-get命令下载软件包时,它会将下载的软件包文件存储在这个目录中,以便以后安装或升级使用。您可以使用这些软件包文件来进行离线安装、备份或共享给其他系统。这些软件包文件通常以.deb扩展名结尾。
如果需要清除该目录中的已下载软件包文件,您可以使用以下命令:
apt-get clean
这将从/var/cache/apt/archives目录中删除所有被apt-get命令下载的软件包文件。
2.2. apt软件包的下载地址
使用apt安装软件时,apt会打印一些软件包的下载信息,但这些信息并不完整,我们无法提取到软件包的具体地址。
以安装nginx为例:
# apt-get install nginx
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
libevent-pthreads-2.1-7 libflashrom1 libftdi1-2 libopts25 sntp
Use 'apt autoremove' to remove them.
The following NEW packages will be installed:
nginx
0 upgraded, 1 newly installed, 0 to remove and 40 not upgraded.
Need to get 3,872 B of archives.
After this operation, 50.2 kB of additional disk space will be used.
Get:1 http://mirrors.tencentyun.com/ubuntu jammy-updates/main amd64 nginx amd64 1.18.0-6ubuntu14.4 [3,872 B]
Fetched 3,872 B in 0s (45.9 kB/s)
Selecting previously unselected package nginx.
(Reading database ... 141544 files and directories currently installed.)
Preparing to unpack .../nginx_1.18.0-6ubuntu14.4_amd64.deb ...
Unpacking nginx (1.18.0-6ubuntu14.4) ...
Setting up nginx (1.18.0-6ubuntu14.4) ...
Scanning processes...
Scanning linux images...
在apt的输出内容中我们可以看到nginx软件包的一些网络地址信息,但这并不是软件包的具体下载地址:
Get:1 http://mirrors.tencentyun.com/ubuntu jammy-updates/main amd64 nginx amd64 1.18.0-6ubuntu14.4 [3,872 B]
只有在下载出现某些错误的情况下,apt才会将软件包的下载地址打印出来,而很多时候,我们是没工夫等待apt报错的。例如,apt以每秒1kb的速度下载100mb的文件,等待报错或者下载完成都是很耗时的。
E: Failed to fetch https://ppa.launchpadcontent.net/graphics-drivers/ppa/ubuntu/pool/main/n/nvidia-graphics-drivers-545/libnvidia-compute-545_545.23.06-0ubuntu0%7egpu22.04.3_amd64.deb Connection timed out
当然,这里可以取巧,正如前文所言,网络代理会导致apt执行报错,并且是立即报错,而报错信息中将会包含软件包的实际下载地址,简直机智过人!
这里将通过apt的正常途径来打印软件包下载地址。
2.2.1. 通过apt-get -o Debug::Acquire::http=true命令打印软件包下载地址
apt-get -o Debug::Acquire::http=true这个命令设置了apt-get在执行HTTP下载时显示调试信息。这些调试信息将包括HTTP请求、响应头等。您可以在执行其他apt-get命令时添加此调试选项来查看相应的调试信息。
例如,使用apt-get -o Debug::Acquire::http=true update命令,将显示更新存储库时的HTTP请求和响应的详细信息。您可以根据需要将这个调试选项与其他apt-get命令和选项一起使用来自定义apt-get的行为和查看调试信息。还是以安装nginx为例:
# apt-get -o Debug::Acquire::http=true install nginx
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
libevent-pthreads-2.1-7 libflashrom1 libftdi1-2 libopts25 sntp
Use 'apt autoremove' to remove them.
The following NEW packages will be installed:
nginx
0 upgraded, 1 newly installed, 0 to remove and 40 not upgraded.
Need to get 3,872 B of archives.
After this operation, 50.2 kB of additional disk space will be used.
0% [Working]GET /ubuntu/pool/main/n/nginx/nginx_1.18.0-6ubuntu14.4_amd64.deb HTTP/1.1
Host: mirrors.tencentyun.com
User-Agent: Debian APT-HTTP/1.3 (2.4.10) non-interactive
Answer for: http://mirrors.tencentyun.com/ubuntu/pool/main/n/nginx/nginx_1.18.0-6ubuntu14.4_amd64.deb
HTTP/1.1 200 OK
Server: openresty/1.16.1.1
Date: Tue, 31 Oct 2023 02:34:08 GMT
Content-Type: application/octet-stream
Content-Length: 3872
Connection: keep-alive
Last-Modified: Wed, 28 Jun 2023 08:32:49 GMT
Accept-Ranges: bytes
Get:1 http://mirrors.tencentyun.com/ubuntu jammy-updates/main amd64 nginx amd64 1.18.0-6ubuntu14.4 [3,872 B]
Fetched 3,872 B in 0s (44.6 kB/s)
Selecting previously unselected package nginx.
(Reading database ... 141544 files and directories currently installed.)
Preparing to unpack .../nginx_1.18.0-6ubuntu14.4_amd64.deb ...
Unpacking nginx (1.18.0-6ubuntu14.4) ...
Setting up nginx (1.18.0-6ubuntu14.4) ...
Scanning processes...
Scanning linux images...
通过调试信息就可以看到nginx软件包的下载地址了:
Answer for: http://mirrors.tencentyun.com/ubuntu/pool/main/n/nginx/nginx_1.18.0-6ubuntu14.4_amd64.deb
2.3. apt“离线”安装步骤
至此,针对apt下载缓慢的情况,我们可以通过以下步骤来解决。
a. 借助apt-get -o Debug::Acquire::http=true命令打印软件包下载地址
借助apt-get -o Debug::Acquire::http=true将下载缓慢的软件包的实际下载地址打印出来后,中断apt执行过程。
b. 借助其他网络条件下载软件包
借助其他网络条件,例如位于海外的服务器,去下载需要的软件包。
c. 将下载好的软件包放置到apt软件包缓存目录/var/cache/apt/archives
d. 重复执行以上步骤
重复执行apt-get -o Debug::Acquire::http=true install,如果遇到有下载缓慢的软件包,重复以上步骤,直到所有软件包准备完毕。这时,再次执行apt-get install,apt将能够跳过软件包的下载过程,执行实际的安装操作。