ubuntu18 apt离线源制作
需求说明
项目需要自动安装ubuntu系统,且全程无网络,需要定制apt离线源,且所有依赖项都要下载下来,包括依赖的依赖,需要递归下载所有离线包。通过三四天查找资料及n次测试,最终实现目标,特此记录操作过程。
环境说明
操作系统:ubuntu-18.04.5-server-amd64.iso
网络:无
系统预装软件:openssh-server、vim,方便安装完成后通过xshell访问编辑
失败的尝试
通过百度、bing搜到的下述相关方法全部不行,基本都是抄来抄去的内容,只能下载到部分依赖而无法将依赖的依赖也下载下来。
失败一
sudo apt-get install -d <packages> # 该命令会下载安装包到/var/cache/apt/archives,且不会安装
但是,此方法仅用于当前系统中没有该包及其依赖时才有效,如果通过安装其他包时已经安装了某个依赖,这个方法就不会下载那个依赖项。(因此该方法大概率会漏项,即便是在新的系统上操作也是极大可能漏项的,因为操作系统安装过程中已经安装了一些包)
失败二
sudo apt download $(apt-rdepends vim | grep -v "^ ")
apt-rdepends
需要单独安装,该命令会递归下载所有需要的包。但是会报错如下:
E: Can't select candidate version from package debconf-2.0 as it has no candidate
注意其中的debconf-2.0
不是固定的,根据要安装的包的不同,会出现不同的错误。
单独的解决方案如下:
sudo apt-get download $(apt-rdepends vim | grep -v "^ " | sed 's/debconf-2.0/debconf/g')
但是要下载很多包,不太可能去看每个包都按上述操作进行,工作量太大,因此放弃该方案
失败三
for i in $(apt-cache depends python | grep -E 'Depends|Recommends|Suggests' | cut -d ':' -f 2,3 | sed -e s/'<'/''/ -e s/'>'/''/); do sudo apt-get download $i 2>>errors.txt; done
该方案与apt-rdepends
雷同,尝试过后发现依旧丢了很多包未能下载
失败四
aptitude --download-only install <your_package_here>
aptitude
命令需要单独安装,依照该方案下载后依旧是缺少包
以上失败过程,均在最后使用时出现错误,多数错误均提示如下内容:
The following packages have unmet dependencies:
gstreamer1.0-plugins-good : Depends: libcairo-gobject2 (>= 1.10.0) but it is not going to be installed
其中依赖包可以是各种包,最后依据提示一个个安装,最后发现有些包是不存在于下载的离线源内的。
特说明:可能会由于各种原因,在缺少依赖包的情况下在某些机器上依然能够安装成功,这不能说明离线源是完整的,只能说可能由于其他原因恰好有依赖包。本人是经过了n次安装,多次在测试环境时能够安装成功,然后到了真实环境下立刻就失败了,过程很坎坷。
最后的成功
吐槽通过百度搜索的内容都是垃圾
使用google搜索关键词apt download package and dependencies
终于找到了可以用的
创建一个目录如下:
mkdir -p /opt/offline-packages/archives
cd /opt/offline-packages/archives
执行如下命令会将vim的递归依赖都下载到/opt/offline-packages/archives
目录内:
sudo apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances vim | grep "^\w" | sort -u)
注:vim后可跟多个包,同时下载
本次测试的包下载后会发现很多同一个包以_amd64
和_i386
做后缀,说明将两个平台的包都下载下来了。
在使用dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
建立依赖关系时会出现很多类似如下警告:
dpkg-scanpackages: warning: package libtextwrap1 (filename ./archives/libtextwrap1_0.1-14.1_i386.deb) is repeat; ignored that one and using data from ./archives/libtextwrap1_0.1-14.1_amd64.deb!
且最后会看到建立依赖的包数量是少于实际的包数量的
通过上述警告可以看到忽略了amd64
后缀的包,而这个包恰好是需要的包,在首次操作时,没有解决该警告,导致最后使用离线源时出现大量奇怪的错误,归根到底,基本都是缺少依赖项的问题。提示的依赖或许存在于离线源中,但是依赖的依赖一直找下去一定会发现有些依赖是不存在的
建立依赖的命令
cd /opt/offline-packages
sudo dpkg-scanpackages -m . /dev/null | gzip -9c > Packages.gz
cp Packages.gz ./archives
带上-m
,会将所有包全部建立依赖关系到 Packages.gz
中,如此会有重复,但无需剔除重复的包
最后打包供其他服务器使用
tar -zcvf offline-apt-packages.tar.gz offline-packages
离线源应用
将上边打包的离线包发送到目标机器上,解压
sudo tar -zxvf offline-apt-packages.tar.gz -C /opt
# 写入本地源,如有需要,提取备份原有源
echo "deb file:///opt/offline-apt-packages archives/"| sudo tee /etc/apt/sources.list
更新源
sudo apt-get update
之后即可安装软件了
参考链接
https://ostechnix.com/download-recursive-dependencies-of-a-package-in-ubuntu/
https://ostechnix.com/download-packages-dependencies-locally-ubuntu/
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=886257
https://www.jianshu.com/p/40198d60c74e