Ubuntu系统镜像制作与安装全流程:从ISO到定制化批量部署
很多朋友第一次接触 Ubuntu第一反应都是去官网下个 ISO 然后拿 Rufus 写进 U 盘装完就完事了。但真到了要批量部署、给多台机器统一环境、或者做一套离线安装包的时候就会发现“装系统”这件事远没想象中那么简单。我自己前前后后折腾过很多次 Ubuntu 系统镜像的制作和安装从最开始只会用官方 ISO 一步步点下一步到后来用 dd、tar 甚至预配置无人值守安装中间踩了不少坑也总结出了一套相对完整的流程。这篇内容我不想讲太多虚的直接围绕“Ubuntu 系统镜像制作及安装”这个核心把从下载官方镜像、校验、做启动盘、定制自己的预装镜像到安装完成后初始化配置这一整条链路都过一遍。适合刚接触 Ubuntu 的新手也适合已经在用 Ubuntu 但想自己做定制镜像的老手。1. 项目整体设计与思路拆解1.1 先搞清楚你要的到底是哪一种“系统镜像”在动手之前我建议先花两分钟想清楚一件事你说的“Ubuntu 系统镜像”到底是指什么第一种是官方发布的 ISO 安装镜像也就是从 ubuntu.com 下载的那种扩展名是 .iso用来做启动盘、全新安装系统。大部分人的需求都落在这。第二种是你自己定制的镜像比如你已经在一台机器上装好了 Ubuntu配好了各种开发环境、装了 CUDA、配好了 SSH、装好了 Docker然后希望把这套环境复制到其他机器上。这时候你需要的不是官方 ISO而是通过打包、克隆等方式做出来的“自定义镜像”可能是 .iso也可能是一个 .tar.gz甚至是整盘克隆出来的 .img 文件。第三种是云端或者虚拟机里常用的 cloud image这个主要用于服务器场景通过 cloud-init 初始化适合自动化部署。如果你是要用 VMware、VirtualBox 跑虚拟机也可以直接用官方提供的预装镜像能省不少时间。我在实际操作中遇到的很多问题其实都是因为没想清楚自己是哪一种需求。比如有人想在虚拟机里装 Ubuntu结果搞了半天是在物理机上烧录 U 盘有人想批量给实验室电脑统一装系统结果手动一台台装装了一下午最后发现其实做个无人值守安装更省事。所以第一步建议先明确自己的使用场景。如果是个人日常用直接下载官方 LTS 版本最省心如果是给多台机器部署优先考虑定制镜像加自动化安装如果只是想在 Windows 里跑个 Linux 环境体验一下虚拟机镜像反而是最合适的选择。1.2 从“能用”到“好用”镜像制作的整体流程规划以我自己最常用的一条流程为例整体的思路是这样的先在官方渠道拿到最稳定的基础镜像然后通过校验保证文件完整性再用工具做成可启动的安装介质。这一步之后就出现了两个分支如果只是自己用直接安装即可如果需要统一环境我会把一台装好的系统做镜像封装再把封装后的镜像批量部署。这里有一个关键点很多人会忽略那就是系统封装相当于做一个“母盘”和普通安装有很大区别。你在自己电脑上装好的系统里会有当前机器的主机名、SSH host key、udev 网卡规则、临时文件、甚至你个人的 shell 历史记录。如果直接拿这种系统去做镜像分发到其他机器上轻则每台机器主机名一样重则网络配置冲突、SSH 指纹不匹配导致连不上。所以制作可分发镜像前必须做清理和重置操作。整个流程如果用一句话概括就是“先标准化基础再个性化定制”。基础系统保持干净统一个性化配置通过脚本或者 cloud-init 在首次启动时注入这样既保证了环境的一致性又保留了一部分灵活性。2. 官方 ISO 镜像的获取、校验与安装介质制作2.1 下载渠道选择与版本判断Ubuntu 镜像的下载我建议认准两个地方一是 Ubuntu 官网的官方下载页面二是国内高校的开源镜像站比如清华 TUNA、阿里云镜像。官方站点胜在权威稳定但国内访问速度有时候不太理想镜像站速度快同步频率也很高日常使用基本没问题。版本选择上有两个概念必须分清楚普通版本和 LTS 长期支持版本。普通版本的代号是年份加月份比如 24.10支持周期只有 9 个月LTS 版本的代号里带着 LTS 三个字母比如 24.04 LTS支持周期长达 5 年甚至更久。如果你是用来做开发、搭服务器或者日常办公无脑选 LTS 就行图的就是省心不用频繁升级。安装镜像也分了好几种最常见的是“Live Server”和“Desktop”。Desktop 版自带图形化安装界面新手友好Server 版现在虽然也有交互式安装菜单但更多情况下是面向服务器的默认不装桌面环境。如果你是想做“Ubuntu 系统镜像制作及安装”这个主题的定制镜像我强烈建议以 Server 版为基础来做因为桌面版体积大、依赖多、定制起来麻烦服务器版干净简洁后期想加什么都能自己装。2.2 镜像校验这个环节别跳过很多人下载完 ISO 之后就直接写盘从来不做校验。我之前也这样直到有一次从某个第三方网站下载的镜像安装到一半提示“无法安装软件包”排查了半天最后发现是文件损坏。从那以后我再也不跳过校验步骤了。校验的方法很简单Ubuntu 官方提供了对应的校验文件后缀是 .iso.sha256。在 Linux 或者 macOS 系统里打开终端进到 ISO 所在目录运行sha256sum ubuntu-24.04.2-live-server-amd64.isoWindows 系统可以在 PowerShell 里运行Get-FileHash .\ubuntu-24.04.2-live-server-amd64.iso -Algorithm SHA256然后把输出的哈希值和官方的 .sha256 文件里的值做对比。完全一致没问题只要有一位不一样基本就是下载损坏了重新下载吧。我见过的很多安装报错比如引导失败、找不到硬盘、解压包错误将近三成根因都是镜像文件不完整。校验这一步花不了你几秒钟却能在后面省下几个小时建议不要跳过。2.3 启动盘制作与虚拟机安装的差异处理拿到 ISO 之后如果你要在物理机上安装就需要做一个启动 U 盘。这个环节新手最容易犯的错是把 ISO 文件直接复制到 U 盘里。这样做是启动不了的你需要用专门的工具把镜像“写”进 U 盘让它具备引导能力。Windows 平台我用得很顺手的是 Rufus体积小、功能全。打开 Rufus设备选 U 盘引导类型选镜像文件点开始然后它会提示你选择写入模式。U 盘选的如果是 GPT 分区方案适用于 UEFI 启动MBR 分区方案适用于传统 Legacy 启动。现在的新电脑基本都是 UEFIRufus 默认配置就能用不用纠结太多。如果你在 Linux 环境下面更简单的方式是直接用 dd 命令写盘操作之前先确认 U 盘的设备名别把硬盘写没了。sudo dd ifubuntu-24.04.2-live-server-amd64.iso of/dev/sdX bs4M statusprogress如果你是在 VMware 或者 VirtualBox 里面装 Ubuntu没必要做启动盘直接在虚拟机设置里把 ISO 挂载到虚拟光驱开机从光驱启动就行。VMware 创建虚拟机时选择“稍后安装操作系统”然后指定 ISO 路径最方便VirtualBox 则是在“存储”里把 ISO 添加到控制器下的光驱位置。3. 定制专属 Ubuntu 镜像从备份到部署3.1 用 tar 打包最简单也最灵活的系统复制方案如果你只有一台已经配好环境的 Ubuntu想把这台机器的系统原封不动搬到一个新硬盘或者另一台机器上最快的方法就是用 tar 打包。这招特别适合迁移或者备份也是我日常用得最多的方式。操作思路是启动到一个 Live 系统或者直接在当前系统里用 root 权限打包整个根文件系统排除掉几个不需要的目录然后到目标机器上解压再修一下引导。具体的打包命令是这样的sudo tar -cvpzf ubuntu-backup.tar.gz --exclude/proc --exclude/sys --exclude/dev --exclude/run --exclude/tmp --exclude/media --exclude/mnt --exclude/lostfound --exclude/backup.tar.gz /这几个排除目录的原因很简单proc、sys、dev、run 都是系统的虚拟文件系统每次开机都会重新生成打包它们没有意义还容易导致问题tmp、media、mnt 是临时目录不该打进系统包里lostfound 是 EXT4 的恢复目录也是不必要的。恢复的时候先把磁盘分区格式化、挂载到某个目录然后解压进去sudo tar -xvpzf ubuntu-backup.tar.gz -C /mnt之后还需要重新生成引导。用 chroot 切进解压出来的系统重装 GRUBsudo mount --bind /dev /mnt/dev sudo mount --bind /dev/pts /mnt/dev/pts sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt mount /dev/sda1 /boot/efi grub-install /dev/sda update-grub这一步非常关键很多人在恢复的时候忘了修引导导致开机黑屏或者直接进入 GRUB 命令行。其实问题不大就是引导没装好而已。3.2 用 dd 做整盘克隆笨但彻底比 tar 打包更简单粗暴的做法是用 dd 做整盘克隆。这种方法会把源盘的每一个字节都复制到目标盘上包括分区表、引导记录、所有数据可以说是像素级复制。好处是恢复后系统毫无差别直接开机就能进系统坏处是目标盘容量必须大于等于源盘而且如果你把一块装好的盘克隆到其他机器会连同原来的主机名、MAC 地址绑定信息一起复制出现我之前说的“镜像打架”问题需要用命令重新配置网络。dd 的命令很简单但危险系数很高一定要确认好设备名sudo dd if/dev/sda of/dev/sdb bs64K statusprogress这个操作真正把“复制”这件事做到了极致但不建议作为日常定制镜像的方案更适合做数据搬家和整盘备份。如果你想做可分发的镜像建议还是用 tar 打包这样灵活度高很多。3.3 定制预装软件与系统清理让镜像更干净如果你想把装好的系统做成一个标准“母盘”分发给多台机器单纯做备份是不够的最关键的一步是对系统做清理让它回到“待初始化”的状态。要清理的项我列一下删除临时文件和缓存/tmp 下面的文件、忍者的 apt 缓存/var/cache/apt/archives都可以清掉。重置主机名把 /etc/hostname 改成默认值比如 ubuntu。删除 SSH host key机器第一次开机时重新生成否则所有克隆机器的 SSH 指纹都一样。清理 udev 网卡规则/etc/udev/rules.d/70-persistent-net.rules 这种文件记录了当前机器的网卡 MAC分发出去会导致网络接口名混乱。删除用户历史记录当前用户 home 目录下的 .bash_history。我第一次做定制镜像的时候就是忘了清理 SSH host key 和主机名结果一批机器装完密码登录没问题但 SSH 工具一直提示 host key 不一致排查了好久才发现是这个原因。3.4 用 cloud-init 实现无人值守和批量部署当你要面对一批机器、数量比较多的时候纯手工安装已经不够了。这时候有两种自动化路线一种是基于 ISO 的自动应答安装用 autoinst 或 preseed 方式另一种就是现在服务器领域更常见的 cloud-init。cloud-init 原本是给云主机用的但它同样可以跑在物理机和虚拟机上。思路就是你的镜像里预装好了 cloud-init 服务首次开机时它会去读取一个配置文件里面写了要创建的用户、要写入的 SSH 公钥、要安装的软件包或者要执行的脚本。我自己的做法是在定制镜像前写好一个 user-data 文件内容大概是这样的#cloud-config hostname: node01 users: - name: dev sudo: ALL(ALL) NOPASSWD:ALL shell: /bin/bash ssh_authorized_keys: - ssh-rsa AAAAB3... packages: - docker.io - git - curl runcmd: - systemctl enable docker - echo export PATH$PATH:/opt/bin /etc/profile然后用 cloud-localds 工具把这个配置写成一个种子镜像虚拟机或物理机启动时加载它系统就会自动完成初始化。这样同一份定制镜像加上不同的 user-data就能在一批机器上批量部署出不同的配置效率和手工安装完全不是一个量级。4. 镜像安装实操从引导到初始化的完整路径4.1 全新安装的完整步骤拆解无论是官方 ISO 还是你自己做出来的定制镜像安装流程的核心逻辑是一样的。这里我以物理机安装 Ubuntu Server 24.04 LTS 为例拆一下完整路径。启动 U 盘插上开机按 F12 或者 Del 选择从 U 盘启动。进入 GRUB 界面之后选第一项“Install Ubuntu Server”。第一步会让你选语言这一步选 English 就好后面装完了可以再改 locale选别的语言后面处理中文字符集反而容易踩坑。接下来会提示你配置网卡。这里要特别说一句默认安装是用 DHCP 自动获取 IP 的如果你是给服务器做固定 IP建议先在路由器上把 MAC 地址和 IP 做绑定或者直接在这里手动设置。DHCP 分配出来的 IP 一旦变化后面 SSH 连接、软件源的访问都要跟着改。分区这块是新手容易发懵的地方。Ubuntu 安装器给了你几个选项使用整块磁盘、使用整块磁盘并设置 LVM、手动分区。LVM 这个东西相当于把多块物理磁盘合并成一个逻辑卷组在里面再划分逻辑分区好处是以后可以动态扩容。如果你只是单块盘容量不大直接选“使用整块磁盘”就行简单可靠。安装过程中会让你创建一个初始用户和密码。这里注意默认勾选了“Require my password to log in as root”其实可以取消后面需要 root 权限时用 sudo 就够了没必要直接开 root 登录。4.2 安装后的必要初始化SSH、软件源、显卡驱动装完系统第一件事我建议是确认网络通不通、SSH 能不能连。因为后头很多操作都要远程执行先把通道打通最省心。ip a ping -c 4 mirrors.ubuntu.com sudo apt update sudo apt install openssh-server -y sudo systemctl enable --now ssh然后就是换软件源。国内服务器直接用官方源的话apt update 能卡到怀疑人生。我一般会替换成清华源或者中科大源方法是编辑 /etc/apt/sources.list.d/ubuntu.sources把 URL 里的 archive.ubuntu.com 或者 ports.ubuntu.com 改成 mirrors.tuna.tsinghua.edu.cn然后重新 apt update 就好。另外很多人在 Ubuntu 上装 NVIDIA 显卡驱动也是一道坎。新手建议不要自己去官网下 .run 文件手动装很容易装完黑屏。走 apt 源安装是最稳妥的ubuntu-drivers devices sudo apt install nvidia-driver-550装完重启用 nvidia-smi 验证。如果你要先确认系统架构再找对应的驱动可以用 uname -m 看x86_64 对应 amd64 架构ARM 设备则是 aarch64选驱动和软件包的时候一定要把架构对上否则装不上。4.3 中文输入法、Docker 等常用环境配置如果你是装完系统当主力开发机用中文输入法和 Docker 基本是跑不掉的。Ubuntu 24.04 自带的中文输入法框架是 IBus配置路径在“设置 - 键盘 - 输入源”里添加汉语Intelligent Pinyin。如果找不到先确认系统有没有安装 ibus-libpinyin没有就执行 apt install ibus-libpinyin。装完再用 im-config 把输入法框架切到 ibus重启一下就好了。有些朋友习惯用搜狗输入法Ubuntu 下也能装但注意搜狗的 Linux 版是基于 fcitx 的你得先去安装 fcitx 框架再装搜狗输入法的 deb 包装。装完之后把输入法框架环境变量改成 fcitx不然调不出来。我在 X11 下面折腾过几次经验是 Ubunu 桌面西捷版本越新fcitx 越容易出问题所以图省心的话还是优先系统自带的 IBus 拼音靠谱。Docker 的安装方式官方推荐先配置 Docker Apt 源然后安装 docker-cesudo apt install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io如果你的机器是内网隔离环境没法访问外网的 Docker 源那就只能离线部署。提前在一台能上外网的机器上拉好需要的镜像然后导出来docker save -o my-image.tar my-image:latest把 tar 文件拷到目标机器上再 docker load 导入docker load -i my-image.tar这个方法也非常实用离线环境下部署 Docker 容器基本就是这么干的。5. 常见问题与排查技巧实录5.1 安装过程中的常见故障Ubuntu 安装看着简单实际上出错的点不少。我把见过的高频问题整理成了一张速查表问题现象可能原因处理方法安装启动后黑屏只有两个小图标显卡驱动不兼容进入桌面环境失败在 GRUB 界面按 e 编辑启动参数在 quiet splash 后加上 nomodeset启动后再装显卡驱动U 盘启动提示无法找到启动设备U 盘写入方式不对或分区方案不匹配用 Rufus 重写检查分区方案是 GPT 还是 MBR与 BIOS 模式对应安装到一半报“无法将 GRUB 安装到 /dev/sda”EFI 分区格式有问题或引导目标不正确检查磁盘分区表类型是否设为 GPTEFI 分区是否格式化为 FAT32进入系统后网络无法连接网卡固件未包含在安装镜像中用网线先临时连接apt update apt install firmware-b43-installer 之类的固件包重启后直接进 Windows没有 GRUB 引导选择BIOS 启动顺序或安全启动设置问题进入 BIOS 把 UEFI 启动顺序调整或关闭 Secure Boot5.2 Ubuntu SSH 无法连接与系统网络故障排查很多装了 Ubuntu Server 的朋友第一反应是用 Xshell 或者 MobaXterm 远程连上去结果发现根本连不上。这种情况我先让你用三步定位先用 ping 测网络连通性。ping 不通检查网线、IP 地址、网关设置ping 得通但 SSH 连不上检查 SSH 服务有没有启动SSH 服务启动正常但仍连不上检查防火墙。systemctl status sshd sudo systemctl enable --now ssh sudo ufw status如果你装了 ufw 并且没有放行 SSH 端口默认策略会把你挡在门外sudo ufw allow OpenSSH sudo ufw enable很多人在“System has not been booted with systemd as init system”这个报错上卡过多见于容器环境里。问题就是容器没有用 systemd 作为 1 号进程systemctl 命令自然没法用。解决方法是启动容器时加特权参数并挂载 cgroup或者换个思路用 service 命令代替。5.3 系统工具链与输入法相关的典型问题在 Ubuntu 上装 GCC 失败十有八九是软件源没更新。一个新装的系统直接 apt install 容易出现依赖找不到的错误先执行 sudo apt update再 apt install build-essential基本就解决了。环境变量配置错了导致连 ls 都提示找不到命令这是最惊悚的问题是 PATH 被覆盖了。这种不要慌直接用绝对路径调用命令/usr/bin/sudo /usr/bin/vi /etc/environment把 PATH 还原成系统默认值重启终端就好。这个经验我在配 CMake 和 Miniconda 的时候踩过好几次真是让人印象深刻。还有一个高频问题是在 Ubuntu 上装微信。原生微信没有 Linux 桌面版大家普遍用新版微信4.0的Linux原生版直接从官网拿到 deb 包安装。方法虽然简单但依赖库偶尔会缺装不上就 apt install -f 补一下依赖。有个坑是 Ubuntu 24.04 默认使用 Wayland有些微信渲染会花屏登录时在启动器里选择使用 X11 运行能缓解兼容问题。6. 稳定部署的心得与进阶思路做 Ubuntu 系统镜像这件事本质上不是在“做安装包”而是在“做环境标准化”这一点我摸索了很久才想明白。你花时间去定制镜像、清理系统、写自动化脚本最终得到的好处是每一台机器拿到手就是可用的不用再花一两天去配环境、踩新坑。我实际使用中发现把定制镜像配合 cloud-init 一起用是最理想的组合。镜像保持基础纯净所有的个性化东西全部放到 user-data 里换一个配置就能适配新的用途。比如同一个基础镜像加上不同的 user-data可以同时用于开发机、编译服务器、容器宿主机三种角色维护成本低很多。最后分享一个小技巧如果你要做的镜像将来要在多种硬件上安装做定制系统的时候尽量不要针对当前机器做太特定的优化比如绑定某款网卡驱动、设置某一段固定内存参数除非你确认所有目标机器型号一致。不同硬件之间保留通用性比追求单台性能更重要。镜像这件事掌握了原理之后难度就不大了。最关键的是动手之前先想清楚自己要在哪一层做定制然后在镜像的通用性和个性之间找一个平衡点。下次遇到需要重复装多台机器的时候记得先停下来想一想要不要做一套自己的 Ubuntu 系统镜像很可能比你想象中节省更多时间。