首先得纠正一个核心概念:在主流公有云(阿里云、腾讯云、华为云、AWS 等)上,你无法像操作本地物理机那样,“手动”从 ISO 镜像文件开始安装 Ubuntu 系统。
为什么?因为云计算的底层架构是虚拟化技术(KVM, Xen, Hyper-V 等)。你的“服务器”本质上是一个运行在宿主机上的虚拟机实例。云厂商通过 API 和 Hypervisor 管理这些实例的生命周期。当你点击“创建实例”时,云厂商已经帮你完成了最耗时的硬件抽象层适配和网络初始化工作,并直接挂载了一个预配置好的根文件系统(Rootfs)。
如果你坚持要“非镜像方式”重装或安装,通常只有以下几种合法且可行的路径,但它们的本质都不是传统意义上的“从光盘引导安装”:
路径一:使用“自定义镜像”或“自定义镜像导入”(最接近手动安装)
这是唯一能实现“自己准备系统环境”的方式,但不是从零开始编译内核和驱动,而是基于一个已存在的系统进行封装。
-
本地/私有环境准备:
- 在一台本地虚拟机(如 VMware/VirtualBox)或裸金属服务器上,手动安装好 Ubuntu(可以是任意版本,甚至定制过内核模块、预装软件)。
- 确保系统支持 UEFI 或 Legacy BIOS(取决于你要导入的云格式)。
- 卸载所有云厂商特定的XX程序(如
cloud-init,除非你希望在新实例中重新触发它)、SSH 密钥对、MAC 地址绑定信息等。 - 清理日志、临时文件。
-
导出为镜像:
- 将虚拟磁盘文件(如
.qcow2,.vmdk,.raw)转换为云厂商支持的格式(通常是qcow2或raw)。 - 使用云厂商提供的工具(如阿里云的
aliyun-ossutil+ 镜像导入服务,腾讯云的QEMU转换工具)将镜像上传到对象存储(OSS/COS),然后通过控制台或 CLI 发起“镜像导入”任务。
- 将虚拟磁盘文件(如
-
从自定义镜像创建实例:
- 导入成功后,你会得到一个“自定义镜像”。
- 使用该镜像创建新实例。此时,你得到的就是你“手动”构建的系统环境。
⚠️ 注意:这种方式依然依赖云厂商的虚拟化环境,只是替换了操作系统内容。它不能解决“没有初始引导加载器”的问题,因为镜像本身必须包含完整的
/boot分区和引导记录。
路径二:使用 cloud-init + 用户数据(User Data)进行自动化部署
这不是“安装系统”,而是“初始化系统”。适用于你已经有一个基础 Ubuntu 镜像实例,想快速变成另一个特定配置的系统。
-
创建实例时:
- 选择一个标准的 Ubuntu 官方镜像。
- 在“高级选项”或“用户数据”字段中,写入 YAML 格式的脚本。
-
示例 User Data 脚本:
#cloud-config hostname: my-custom-server users: - name: admin sudo: ALL=(ALL) NOPASSWD:ALL ssh_authorized_keys: - ssh-rsa AAAAB3... your-public-key packages: - nginx - docker.io runcmd: - systemctl enable nginx - apt-get update && apt-get upgrade -y - echo "Custom setup complete" > /var/log/setup.log -
效果:
- 实例启动后,
cloud-init会自动执行这些命令,修改主机名、添加用户、安装软件包。 - 这比手动 SSH 进去敲命令更可靠,尤其适合大规模部署。
- 实例启动后,
路径三:通过网络引导(PXE/iPXE)—— 仅限部分云平台或自建私有云
公有云不支持! 阿里云、腾讯云等不允许普通用户开启 PXE 网络引导,这是出于安全和隔离考虑。
但在以下场景可能可行:
- 自建私有云(OpenStack/Kubernetes):你可以搭建自己的 PXE 服务器,让新创建的 VM 通过网络加载内核和 initrd,然后从 HTTP/NFS 服务器下载 rootfs 并完成安装。
- 某些支持“裸金属服务器”(Bare Metal)的云平台:部分云厂商提供物理机租赁服务,这类机器允许你通过 BMC/IPMI 接口远程挂载 ISO 并进行传统安装。但这不属于“云服务器(ECS/CVM)”范畴,而是物理机租赁。
❌ 常见误区澄清
| 误区 | 真相 |
|---|---|
| “我可以用 USB 启动盘插入云服务器” | 云服务器没有物理 USB 接口,也无法外接设备。 |
| “我可以把 ISO 文件传到服务器里,然后用 GRUB 引导” | 不行。虚拟机启动时由 Hypervisor 控制引导流程,Guest OS 内部无法改变这一过程。ISO 只能作为“第二块硬盘”挂载,不能作为引导源。 |
| “我可以 SSH 进去后删除整个系统重装” | 可以删除文件,但不能“重装”。你无法在不重启的情况下重建内核、引导加载器和根文件系统结构。最终仍需通过上述“自定义镜像”或“重置系统”功能完成。 |
✅ 推荐做法总结
-
如果你只是想换系统版本:
→ 直接使用云控制台中的 “更换操作系统” 功能。选择 Ubuntu 20.04/22.04/24.04 等官方镜像,一键完成。这是最安全、最高效的方式。 -
如果你有特殊定制需求(预装软件、特定内核模块):
→ 采用 路径一:自定义镜像导入。
步骤:本地装好 → 清理冗余 → 转换格式 → 导入云镜像服务 → 从镜像创建实例。 -
如果你需要批量部署相同环境:
→ 采用 路径二:cloud-init 用户数据。
基础镜像 + 自动化脚本 = 标准化交付。
附加建议:如何验证系统是否“干净”?
无论哪种方式,安装完成后建议执行以下检查:
# 1. 检查内核版本
uname -r
# 2. 检查 cloud-init 状态(应正常运行)
cloud-init status --wait
# 3. 检查网络配置(确保 DHCP 正确获取 IP)
ip addr show
# 4. 检查是否有残留的旧 SSH 密钥
cat ~/.ssh/authorized_keys
# 5. 清理历史命令(可选)
history -c && rm ~/.bash_history
记住:在云上,“手动安装”不是一个正确的思维模型。正确的思维是 “镜像化 + 自动化初始化”。云厂商的设计哲学就是消除重复性手工操作,提升资源利用率。遵循这个范式,才能高效、稳定地使用云服务。
云技术博客