制作离线自定义Ubuntu Server ISO相关技术问询
制作离线自定义Ubuntu Server ISO相关技术问询
问题背景
我正在尝试编写一个脚本,制作可离线安装的自定义Ubuntu Server ISO,需要在官方ISO基础上添加一些额外包(比如samba、ifupdown、tcpdump等)。我注意到Ubuntu ISO的包目录结构和官方仓库是兼容的,所以有两个疑问:
- 能否下载某个包及其所有依赖(即使这些依赖已经在本地安装),并放到ISO对应的目录结构中?比如ifupdown在仓库里的路径是
pool/main/i/ifupdown/,希望放到本地ISO目录的/iso-disk/pool/main/i/ifupdown/ifupdown_0.8.36+nmu1ubuntu3.1_amd64.deb位置。 - 假设已经把包放到正确位置,并在user-data的
packages部分添加了包名,cloud-init会安装这些离线包吗?
解答
一、下载带完整依赖的包并放入ISO目录
完全可以实现,这里分享两种实用方法:
方法1:用apt-rdepends+apt-get download批量下载
适合在线环境下提前获取所有依赖包:
- 先安装依赖分析工具:
sudo apt update && sudo apt install -y apt-rdepends - 生成目标包的全量依赖列表(去重过滤无关内容):
# 以ifupdown为例,替换成你需要的包名 apt-rdepends ifupdown | grep -v "^ " | grep -v "^Depends:" | sort -u > pkg_deps.txt # 别忘了把目标包本身也加入列表 echo "ifupdown" >> pkg_deps.txt - 批量下载所有包:
xargs apt-get download < pkg_deps.txt - 匹配ISO目录结构放置包:
参考官方Ubuntu ISO的pool目录结构,手动创建对应的子目录(比如/iso-disk/pool/main/i/ifupdown/),把下载的ifupdown_*.deb放到对应路径,其他依赖包也要放到各自对应的pool子目录里(比如依赖的libc6要放到pool/main/g/glibc/)。 - 更新ISO的包索引:
官方ISO的包信息存在dists/目录下的Packages文件中,需要用dpkg-scanpackages生成新索引替换原文件,这样安装程序才能识别新增的离线包:# 进入ISO根目录 cd /iso-disk # 生成新的Packages索引(替换focal为你的ISO对应Ubuntu版本代号) dpkg-scanpackages pool/ dists/focal/main/binary-amd64/ > dists/focal/main/binary-amd64/Packages # 可选:生成压缩版索引提升加载速度 gzip -k dists/focal/main/binary-amd64/Packages
方法2:用apt-offline工具(更适合离线场景)
如果你的环境本身离线,可以先在在线机器上生成下载清单,再离线获取包:
- 在线机器安装工具并生成下载清单:
sudo apt install apt-offline apt-offline set --install-packages ifupdown,samba,tcpdump --output pkg_req.txt - 转移清单后下载所有包:
apt-offline get --input pkg_req.txt --download-dir ./offline_pkgs - 后续的目录放置和索引更新步骤和方法1一致。
二、cloud-init是否会安装离线包?
默认情况下,cloud-init的packages字段会从系统配置的在线源拉取包,直接添加包名不会自动使用ISO里的离线包,需要额外配置cloud-init的APT源指向本地ISO:
- 在
user-data中添加APT源配置:
安装过程中Ubuntu安装器会把ISO挂载到/media/cdrom路径,所以可以在user-data里指定这个本地源:#cloud-config apt: sources: local-iso-repo: source: "deb [trusted=yes] file:///media/cdrom focal main restricted universe multiverse" # 替换focal为你的ISO对应的Ubuntu版本代号 packages: - samba - ifupdown - tcpdump - 额外注意事项:
- 部分安装环境可能会把ISO挂载到
/cdrom而非/media/cdrom,可以根据实际情况调整路径。 - 配置里的
trusted=yes是为了避免安装时出现签名验证错误,因为自定义ISO的包没有官方签名。
- 部分安装环境可能会把ISO挂载到
备注:内容来源于stack exchange,提问作者rido
相关产品推荐
相关产品推荐

