离线(Air-gaped)Ubuntu 20.04仓库更新问题求助
离线(Air-gaped)Ubuntu 20.04仓库更新问题求助
Hey Travis,作为刚上手离线环境的Linux管理员,踩这个坑真的太正常了——光手动下载.deb包和依赖确实行不通,因为离线仓库需要的不只是包文件,还有一套完整的仓库索引文件(比如Packages、Release这类),才能让客户端机器识别到可用的更新。我来给你梳理两种靠谱的解决方案,你可以根据自己的需求选:
方法一:用apt-mirror同步完整仓库(适合长期维护内部repo)
这种方法是在联网机器上完整同步Ubuntu官方源的指定内容,然后迁移到你的内部repo服务器,适合需要给多台离线机器提供更新的场景:
- 在一台联网的Ubuntu 20.04机器上安装apt-mirror工具:
sudo apt update && sudo apt install apt-mirror -y - 编辑
/etc/apt/mirror.list配置文件,只同步你需要的组件和版本(比如20.04的focal版本,main、universe这些常用库):set base_path /var/spool/apt-mirror set mirror_path $base_path/mirror set skel_path $base_path/skel set var_path $base_path/var set cleanscript $var_path/clean.sh set defaultarch amd64 # 你的机器架构,如果是32位改i386 set postmirror_script $var_path/postmirror.sh set run_postmirror 0 set nthreads 10 # 同步线程数,根据网络调整 # 同步Ubuntu核心源、更新源、安全源 deb http://archive.ubuntu.com/ubuntu focal main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu focal-updates main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu focal-security main restricted universe multiverse # 如果需要backports源可以加上下面这行 # deb http://archive.ubuntu.com/ubuntu focal-backports main restricted universe multiverse - 开始同步仓库:
这个过程会自动下载所有指定的.deb包和对应的索引文件,首次同步可能耗时较长,之后增量同步会快很多。sudo apt-mirror - 同步完成后,把
/var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu整个目录打包:sudo tar -czf ubuntu-repo-focal.tar.gz /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu - 通过U盘/移动硬盘等离线方式把压缩包传到你的内部repo服务器,解压到web服务目录(比如用Apache的话,解压到
/var/www/html/ubuntu):sudo mkdir -p /var/www/html/ubuntu sudo tar -xzf ubuntu-repo-focal.tar.gz -C /var/www/html/ubuntu --strip-components=5 - 在内部repo服务器上重新生成仓库索引(确保客户端能识别):
cd /var/www/html/ubuntu sudo apt-ftparchive packages . > Packages sudo gzip -c Packages > Packages.gz sudo apt-ftparchive release . > Release - 最后在所有离线客户端的
/etc/apt/sources.list里替换成你的内部repo地址:sudo sed -i 's|http://archive.ubuntu.com/ubuntu|http://你的repo服务器IP/ubuntu|g' /etc/apt/sources.list
方法二:用apt-offline按需下载更新(适合只给特定机器更新的场景)
如果不需要维护完整仓库,只是给单台或少量机器更新,可以用apt-offline工具精准下载所需的包:
- 在离线机器上生成更新请求文件:
这个文件会记录当前机器需要的所有更新包和依赖关系。sudo apt-offline set /tmp/update-request.sig --upgrade - 把
update-request.sig传到联网机器上,下载对应包的压缩包:sudo apt-offline get /tmp/update-request.sig --bundle /tmp/update-bundle.zip - 把
update-bundle.zip传回离线机器,执行安装:
如果要把这些包加到内部repo,只需要把zip里的.deb文件放到repo的对应目录,然后重新执行方法一里的生成索引步骤就行。sudo apt-offline install /tmp/update-bundle.zip
为什么你之前的方法失败?
你只下载.deb包和依赖没成功,核心原因是缺少仓库索引文件。Ubuntu的apt客户端是通过Packages、Release这些文件来获取包的版本信息、依赖关系的,光有.deb文件的话,内部repo服务器没法告诉客户端“这些包是可用的更新”,自然就识别不了。
一些小提示
- 如果内部repo用HTTP服务,记得安装Apache或Nginx,确保离线机器能访问到repo目录:
sudo apt install apache2 -y - 定期更新内部repo时,重复apt-mirror的同步、打包、迁移、重新生成索引步骤即可,它会自动增量更新,不用每次重新下载全部内容。
- 如果需要第三方软件源(比如Docker、Nginx),可以在mirror.list里添加对应的源地址,同步方法和官方源一致。
备注:内容来源于stack exchange,提问作者Travis Madsen
相关产品推荐
相关产品推荐

