You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

制作离线自定义Ubuntu Server ISO相关技术问询

制作离线自定义Ubuntu Server ISO相关技术问询

问题背景

我正在尝试编写一个脚本,制作可离线安装的自定义Ubuntu Server ISO,需要在官方ISO基础上添加一些额外包(比如samba、ifupdown、tcpdump等)。我注意到Ubuntu ISO的包目录结构和官方仓库是兼容的,所以有两个疑问:

  1. 能否下载某个包及其所有依赖(即使这些依赖已经在本地安装),并放到ISO对应的目录结构中?比如ifupdown在仓库里的路径是pool/main/i/ifupdown/,希望放到本地ISO目录的/iso-disk/pool/main/i/ifupdown/ifupdown_0.8.36+nmu1ubuntu3.1_amd64.deb位置。
  2. 假设已经把包放到正确位置,并在user-data的packages部分添加了包名,cloud-init会安装这些离线包吗?

解答

一、下载带完整依赖的包并放入ISO目录

完全可以实现,这里分享两种实用方法:

方法1:用apt-rdepends+apt-get download批量下载

适合在线环境下提前获取所有依赖包:

  1. 先安装依赖分析工具:
    sudo apt update && sudo apt install -y apt-rdepends
    
  2. 生成目标包的全量依赖列表(去重过滤无关内容):
    # 以ifupdown为例,替换成你需要的包名
    apt-rdepends ifupdown | grep -v "^ " | grep -v "^Depends:" | sort -u > pkg_deps.txt
    # 别忘了把目标包本身也加入列表
    echo "ifupdown" >> pkg_deps.txt
    
  3. 批量下载所有包:
    xargs apt-get download < pkg_deps.txt
    
  4. 匹配ISO目录结构放置包:
    参考官方Ubuntu ISO的pool目录结构,手动创建对应的子目录(比如/iso-disk/pool/main/i/ifupdown/),把下载的ifupdown_*.deb放到对应路径,其他依赖包也要放到各自对应的pool子目录里(比如依赖的libc6要放到pool/main/g/glibc/)。
  5. 更新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工具(更适合离线场景)

如果你的环境本身离线,可以先在在线机器上生成下载清单,再离线获取包:

  1. 在线机器安装工具并生成下载清单:
    sudo apt install apt-offline
    apt-offline set --install-packages ifupdown,samba,tcpdump --output pkg_req.txt
    
  2. 转移清单后下载所有包:
    apt-offline get --input pkg_req.txt --download-dir ./offline_pkgs
    
  3. 后续的目录放置和索引更新步骤和方法1一致。

二、cloud-init是否会安装离线包?

默认情况下,cloud-init的packages字段会从系统配置的在线源拉取包,直接添加包名不会自动使用ISO里的离线包,需要额外配置cloud-init的APT源指向本地ISO:

  1. 在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
    
  2. 额外注意事项:
    • 部分安装环境可能会把ISO挂载到/cdrom而非/media/cdrom,可以根据实际情况调整路径。
    • 配置里的trusted=yes是为了避免安装时出现签名验证错误,因为自定义ISO的包没有官方签名。

备注:内容来源于stack exchange,提问作者rido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 10:29:51