在云服务器中手动安装 Ubuntu 系统(非镜像方式),本质上是一个具有挑战性、通常不推荐且多数主流云平台(如阿里云、腾讯云、AWS、Azure、华为云)不支持的操作。原因如下:
✅ 云服务器的典型交付模式是基于预构建镜像(Image)的快速部署,底层使用虚拟化技术(KVM/QEMU、Xen、Hyper-V)或裸金属,其启动流程由云平台控制(如通过 iPXE、cloud-init、UEFI Secure Boot 链式加载),用户无法直接访问 BIOS/UEFI 设置、无法挂载 ISO、无法进入传统安装界面(如 Ubuntu Live Installer)。
⚠️ 但如果你有特殊需求(例如:定制内核、完全离线环境、合规审计要求、或在自建私有云/KVM 环境中管理云服务器),且你拥有宿主机/物理服务器的 root 权限和完整虚拟化控制权(如在 OpenStack、Proxmox VE、或自建 KVM 环境中),那么可以实现“类云服务器”的手动安装。下面分两种场景详细说明:
✅ 场景一:你在 自建 KVM/OpenStack/Proxmox 私有云环境 中(有完全控制权)
这是唯一真正可行的“手动安装”场景。
步骤概览:
-
准备 Ubuntu Server 安装介质
- 下载官方 netboot ISO 或 mini.iso(最小网络安装镜像)
🔗 https://cdimage.ubuntu.com/ubuntu-server/jammy/daily-live/current/
(以 Ubuntu 22.04 LTS 为例,推荐ubuntu-22.04-live-server-amd64.iso)
- 下载官方 netboot ISO 或 mini.iso(最小网络安装镜像)
-
创建虚拟机(不分配磁盘,仅挂载 ISO)
# 示例:使用 virt-install 创建 VM(无磁盘,仅光驱) virt-install --name ubuntu-manual --ram 2048 --vcpus 2 --disk none --cdrom /path/to/ubuntu-22.04-live-server-amd64.iso --os-variant ubuntu22.04 --graphics vnc,listen=0.0.0.0 --network network=default --noautoconsole -
VNC 连接并手动安装
- 使用
virt-viewer或 VNC 客户端连接(如remote-viewer vnc://localhost:5900) - 启动后进入 Ubuntu Live Server 安装向导(text-based installer)
- 手动分区(如
/,/boot,swap, LVM, 加密等) - 配置网络、用户、SSH、时区等
- 关键:勾选 “Install OpenSSH server” 并启用 “Install third-party software”(含驱动/firmware)
- 使用
-
安装完成后清理
- 安装完毕重启前,务必弹出 ISO(在 virt-manager 中右键光驱 → “Eject”;或用命令):
virsh change-media ubuntu-manual hda --eject --config - 重启进入新系统。
- 安装完毕重启前,务必弹出 ISO(在 virt-manager 中右键光驱 → “Eject”;或用命令):
-
(可选)启用 cloud-init(适配云环境)
即使手动安装,也建议保留 cloud-init 支持以便后续云平台集成(如元数据服务、SSH 密钥注入):sudo apt update && sudo apt install -y cloud-init sudo cloud-init clean --logs sudo reboot✅ 验证:
sudo cloud-init status应为done;ls /var/lib/cloud/instances/应有实例ID目录。
❌ 场景二:在公有云(阿里云/AWS/腾讯云等)上强行“手动安装”
技术上几乎不可行,且违反平台规范,原因包括:
| 限制项 | 说明 |
|---|---|
| 无 ISO 挂载能力 | 控制台不提供挂载本地 ISO 或自定义光驱选项 |
| 无 VNC/图形控制台 | 仅提供串口(Serial Console)或受限 Web terminal,无法运行图形/文本安装器 |
| 启动固件锁定 | UEFI/BIOS 由云厂商控制,禁止修改启动顺序或加载外部 bootloader |
| 磁盘为只读镜像层 | 实例磁盘是快照克隆,底层为 qcow2/raw 镜像,无法从 ISO 引导覆盖安装 |
| 安全策略阻止 | 如 AWS 的 Nitro、阿里云的神龙架构均禁用客户自定义引导 |
⚠️ 尝试绕过(如 iPXE + 自定义内核)需满足:
- 平台明确支持 iPXE(仅少数企业级裸金属服务如 AWS EC2 Bare Metal、阿里云神龙裸金属支持)
- 你拥有物理网络控制权(如接入自定义 DHCP/PXE 服务器)
- 极高运维成本,且失去所有云原生特性(自动伸缩、监控、快照、弹性IP绑定等)
➡️ 结论:在公有云上,请始终使用官方 Ubuntu 镜像。如需定制:
- ✅ 方法1:基于官方镜像启动 →
apt upgrade+ 部署脚本 +cloud-init配置 - ✅ 方法2:使用 Packer 构建自定义 AMI/镜像(packer.io)
- ✅ 方法3:使用 Ansible/Chef/Puppet 在实例启动后自动化配置
✅ 替代方案:用 debootstrap 在已有 Linux 系统中“手动构建” Ubuntu 根文件系统(高级用途)
适用于容器、chroot、或嵌入式/离线环境,不适用于云服务器重装系统,但体现“纯手动”思想:
# 前提:当前系统为 Debian/Ubuntu,已安装 debootstrap
sudo apt install debootstrap
# 创建目标目录
sudo mkdir /mnt/ubuntu-jammy
# 手动安装基础系统(amd64)
sudo debootstrap --arch amd64 jammy /mnt/ubuntu-jammy http://archive.ubuntu.com/ubuntu/
# 挂载必要虚拟文件系统
sudo mount --bind /dev /mnt/ubuntu-jammy/dev
sudo mount --bind /proc /mnt/ubuntu-jammy/proc
sudo mount --bind /sys /mnt/ubuntu-jammy/sys
# chroot 配置
sudo chroot /mnt/ubuntu-jammy /bin/bash
# 在 chroot 中:
# apt update && apt install linux-image-generic grub-pc ssh openssh-server
# dpkg-reconfigure grub-pc # 指定 /dev/vda
# exit
# 卸载
sudo umount -R /mnt/ubuntu-jammy/{dev,proc,sys}
⚠️ 注意:此方法生成的系统无法直接在云服务器上启动(缺少 initramfs、firmware、cloud-init、正确内核参数),仅适合研究或作为容器基础。
✅ 最佳实践建议(云环境)
| 需求 | 推荐方案 |
|---|---|
| 安全合规/审计要求 | 使用官方 Ubuntu LTS 镜像 + CIS Benchmark 脚本加固(如 dev-sec/ansible-collection-hardening) |
| 内核定制 | 编译自定义内核 deb 包 → 在标准 Ubuntu 实例中 dpkg -i *.deb 安装 |
| 全盘加密 | 使用 cryptsetup + LUKS(注意:云平台不管理密钥,需自行处理解锁) |
| 完全离线部署 | 制作离线 apt 源镜像 + apt-offline 工具链 |
总结
| 场景 | 是否可行 | 关键条件 |
|---|---|---|
| 公有云(AWS/阿里云等) | ❌ 不可行 | 平台强制镜像启动,无底层控制权 |
| 私有云(KVM/OpenStack/Proxmox) | ✅ 完全可行 | 你掌控宿主机、可挂 ISO、可 VNC 访问 |
| 物理服务器/裸金属 | ✅ 推荐方式 | 直接 PXE 或 USB 安装 Ubuntu Server |
如你正在使用某特定云平台(请告知名称),我可以为你提供该平台下最接近“手动”的合规定制方案(如阿里云自定义镜像制作、AWS AMI 构建流程等)。
是否需要我为你生成一份完整的 cloud-init 配置模板,或一个基于 Packer 的 Ubuntu 自定义镜像构建脚本?欢迎补充需求 😊
云服务器