1. 项目背景与整体设计思路
华为私有云HCS(Huawei Cloud Stack)8.1.1这套方案,我在过去两年里前前后后部署过六七套,从最小的三节点测试环境到几十节点的生产集群都摸过一遍。很多人第一次接触HCS,最头疼的不是装底座,而是镜像制作和云主机发放这两个环节——底座装完了,ServiceOM能登录了,结果发现手里没有可用的镜像,或者镜像传上去了却发放不出虚拟机。这套流程看起来只是“做个镜像、点几下发放”,实际上中间涉及虚拟化格式转换、驱动注入、Guest OS兼容性、存储池对接、网络平面规划等一大堆细节,任何一个环节没对齐,最后都会卡在“创建中”或者“错误”状态。
这篇内容就是把我自己踩过的坑和验证过的流程完整梳理一遍。核心目标是:让你从零开始,把一台普通Linux或Windows系统做成HCS可用的镜像,再通过ServiceOM成功发放出一台能正常登录、网络可达的云主机。适合谁看?刚接手HCS运维的工程师、需要给业务方交付云主机的实施人员、以及想搞清楚私有云镜像底层逻辑的技术爱好者。不需要你事先精通OpenStack,但至少要能登录ServiceOM、看得懂基本的网络和存储概念。
整体设计思路我按“先做镜像、再传镜像、最后发主机”这条主线走。为什么是这个顺序?因为HCS的云主机发放强依赖镜像,镜像不对,后面全是白费。而镜像制作又分两条路:一条是用官方提供的ISO自己装一台再转格式,另一条是拿现成的qcow2或vhd直接改。我推荐第一条路,虽然慢一点,但可控性最强,尤其是需要注入virtio驱动的时候,自己装能确保驱动版本和HCS底层KVM匹配。第二条路适合批量场景,但前提是你已经有一套验证过的模板。
在方案选型上,我坚持几个原则:镜像格式统一用qcow2(HCS底层基于KVM,qcow2是原生支持最好的),磁盘总线用virtio(性能比IDE强太多,但Windows必须提前注入驱动),网卡模型用virtio(同理),系统盘大小控制在40G到60G之间(太小装不下驱动和补丁,太大浪费存储且发放慢)。这些选择背后都有原因,后面章节会逐个拆开讲。
另外要提前说清楚:HCS 8.1.1的ServiceOM界面和早期版本比有变化,镜像上传入口在“服务列表 > 镜像服务”下面,但有些局点会把它归到“资源 > 镜像”里,具体看你的部署模式。我下面描述的路径以标准Region Type I为准,如果你的是边缘小站或者特殊形态,菜单可能略有差异,但核心逻辑一样。
2. 镜像制作前的环境准备与关键参数
2.1 制作环境的选择与工具链
做镜像不要直接在HCS的管理节点上搞,也不要在生产业务虚拟机上搞。我的习惯是找一台独立的Linux物理机或者VMware Workstation里的虚拟机,装一个干净的CentOS 7.9或者Ubuntu 20.04作为“制作机”。为什么强调干净?因为你要在里面装虚拟化工具、挂载镜像、转换格式,如果制作机本身一堆乱七八糟的服务,容易干扰。制作机配置不用太高,4核8G、100G系统盘足够,但必须支持嵌套虚拟化(如果你要在制作机里再跑虚拟机来装系统的话)。如果制作机本身是物理机,那就更简单,直接用它当宿主机。
工具链方面,核心就几个:qemu-img(格式转换和查看)、virt-install(创建虚拟机装系统)、libguestfs-tools(离线修改镜像,比如注入驱动、改配置)、guestfish(libguestfs的命令行工具)。CentOS下一条命令装齐:
yum install -y qemu-kvm libvirt virt-install libguestfs-tools guestfishUbuntu下对应的是:
apt install -y qemu-kvm libvirt-daemon-system virtinst libguestfs-tools装完之后验证一下qemu-img --version和virt-install --version能正常输出。这里有个坑:有些发行版自带的qemu-img版本太老,转换出来的qcow2在HCS上识别不了,建议qemu-img版本不低于4.2。查看版本用qemu-img --version,如果低于4.2,考虑从源码编译或者换一个更新的发行版。
2.2 操作系统镜像的获取与校验
官方ISO从对应发行版的官网下载,别从乱七八糟的镜像站拿,避免被篡改。下载完一定要校验SHA256,这个步骤很多人跳过,但我在实际交付中真遇到过ISO损坏导致装出来的系统有问题的案例。校验命令:
sha256sum CentOS-7-x86_64-Minimal-2009.iso对比官网公布的哈希值,一致才用。Windows镜像同理,从微软官方渠道获取,校验哈希。这里不展开具体下载地址,避免广告嫌疑,你按自己习惯的渠道来,但校验这一步不能省。
2.3 关键参数的前置规划
在动手之前,先把几个关键参数定下来,后面所有操作都围绕它们:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| 镜像格式 | qcow2 | HCS原生支持,支持稀疏文件,节省空间 |
| 磁盘总线 | virtio | 性能最优,Windows需注入驱动 |
| 网卡模型 | virtio | 同上 |
| 系统盘大小 | 40G-60G | 太小不够用,太大发放慢 |
| 分区方案 | 单根分区+swap | 避免LVM,简化后续扩容 |
| 文件系统 | ext4(Linux)/ NTFS(Windows) | 兼容性最好 |
| 时区 | Asia/Shanghai | 避免时间偏差导致认证失败 |
| 主机名 | 留空或通用名 | 发放时由Cloud-Init注入 |
这些参数不是拍脑袋定的。比如为什么不用LVM?因为HCS的磁盘扩容机制对LVM支持不够友好,后期扩容容易出问题。为什么系统盘不超过60G?因为qcow2是稀疏格式,实际占用取决于写入量,但发放时HCS会按虚拟大小分配存储,太大浪费资源池。为什么时区要设对?我遇到过因为时区差8小时导致Token过期、ServiceOM登录失败的案例,排查了半天。
提示:如果你要做Windows镜像,系统盘建议至少60G,因为Windows更新和驱动占空间大,40G很容易满。
3. Linux镜像制作全流程实操
3.1 用virt-install安装基础系统
制作机上启动libvirtd:
systemctl start libvirtd systemctl enable libvirtd然后创建虚拟机装系统。我习惯用命令行,因为参数可控:
virt-install \ --name hcs-template-centos7 \ --ram 4096 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/hcs-template-centos7.qcow2,size=40,format=qcow2,bus=virtio \ --network network=default,model=virtio \ --graphics vnc,listen=0.0.0.0 \ --cdrom /path/to/CentOS-7-x86_64-Minimal-2009.iso \ --os-variant centos7.0 \ --boot cdrom,hd这里--disk的bus=virtio很关键,确保系统盘走virtio总线。--network的model=virtio同理。装系统过程中,分区方案选“自动配置分区”,但要把LVM取消掉,直接用标准分区。具体操作:在安装界面的“安装目的地”里,选“我要配置分区”,然后手动创建/boot(1G)、/(剩余全部)、swap(4G)。文件系统选ext4。
装完后重启,进入系统,做几件必做的事:
- 关闭SELinux:编辑
/etc/selinux/config,设SELINUX=disabled,然后setenforce 0临时生效。 - 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld。HCS发放时会通过Cloud-Init注入网络配置,防火墙开着容易挡掉。 - 安装Cloud-Init:
yum install -y cloud-init cloud-utils-growpart。这是HCS发放时注入主机名、密码、网络配置的关键组件,不装的话发放出来的主机可能无法登录。 - 配置Cloud-Init数据源:编辑
/etc/cloud/cloud.cfg,确保datasource_list包含ConfigDrive和OpenStack。HCS用的是ConfigDrive方式注入元数据。 - 清理网络持久化规则:删除
/etc/udev/rules.d/70-persistent-net.rules(如果有),避免网卡名绑定导致新主机网络起不来。 - 清空
/etc/machine-id:echo -n > /etc/machine-id,让每台发放的主机有唯一ID。 - 安装qemu-guest-agent:
yum install -y qemu-guest-agent,然后systemctl enable qemu-guest-agent。这个agent让HCS能获取虚拟机内部信息,比如IP地址,不装的话ServiceOM里看不到IP。
做完这些,关机:poweroff。
3.2 镜像格式转换与压缩
关机后,找到qcow2文件,通常在/var/lib/libvirt/images/下。先查看信息:
qemu-img info /var/lib/libvirt/images/hcs-template-centos7.qcow2确认格式是qcow2,虚拟大小40G。然后做一次“压缩转换”,把稀疏文件里未使用的块去掉,减小实际体积:
qemu-img convert -c -O qcow2 \ /var/lib/libvirt/images/hcs-template-centos7.qcow2 \ /tmp/hcs-centos7-final.qcow2-c表示压缩,-O qcow2指定输出格式。转换完再看一下大小,通常能从几十G降到几G。这一步不是必须的,但能显著减少上传时间,尤其是网络带宽有限的时候。
3.3 用libguestfs做离线检查与微调
有时候需要在不上虚拟机的情况下改镜像里的文件,比如确认Cloud-Init配置对不对。用guestfish:
guestfish --rw -a /tmp/hcs-centos7-final.qcow2 -i进入交互界面后,可以cat /etc/cloud/cloud.cfg查看配置,ls /etc/sysconfig/network-scripts/看网卡配置。改完exit退出。注意--rw表示可写,不加的话是只读模式,改了不生效。
注意:libguestfs对qcow2的兼容性很好,但如果镜像里有LVM,挂载可能麻烦一点,所以前面强调不用LVM。
3.4 镜像上传到ServiceOM
登录ServiceOM,找到“镜像服务”或“资源 > 镜像”,点“创建镜像”。填写:
- 名称:比如
CentOS7.9-Base-40G - 格式:qcow2
- 架构:x86_64
- 最小磁盘:40G(必须和镜像虚拟大小一致或更小)
- 最小内存:1024M
- 是否支持Cloud-Init:是
- 虚拟化类型:KVM
然后选择刚才做好的qcow2文件上传。上传时间取决于文件大小和网络,几G的文件通常几分钟到十几分钟。上传完状态变成“正常”就可以用了。
这里有个坑:最小磁盘不能填得比镜像虚拟大小大,否则发放时会报错。比如镜像虚拟大小40G,你填60G,HCS会认为镜像需要60G磁盘,但实际镜像只有40G,发放时可能失败。填一样或者略小都行。
4. Windows镜像制作的特殊处理
4.1 驱动注入是核心难点
Windows镜像比Linux麻烦的地方在于virtio驱动。默认Windows安装盘不带virtio驱动,如果你直接用virtio磁盘装系统,安装程序会找不到硬盘。解决办法有两个:一是装系统时用IDE磁盘,装完再注入virtio驱动改成virtio;二是直接用注入好驱动的ISO装。我推荐第二种,省事。
制作注入驱动的ISO:从Fedora官网下载virtio-win的ISO(搜“virtio-win iso”就能找到),然后用mkisofs或者直接挂载这个ISO,把里面的驱动文件夹复制出来。装Windows时,在“加载驱动”界面指向对应版本的驱动文件夹(比如viostor/w10/amd64),加载后就能识别virtio磁盘。
装完系统后,还要装NetKVM驱动(网卡)、Balloon驱动(内存气球)、vioserial驱动等。这些都在virtio-win ISO里,进系统后运行里面的virtio-win-guest-tools.exe一键装齐。
4.2 Windows镜像的通用化处理
Windows发放前必须做sysprep通用化,否则每台主机的SID一样,域环境会出问题。在Windows里运行:
C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown选“通用化”和“关机”。执行完系统自动关机,这时候的镜像就是通用化的。注意sysprep只能执行有限次数,别反复做。
另外,Windows的Cloud-Init对应的是Cloudbase-Init,需要单独安装。从Cloudbase官网下载msi安装包,装完后配置cloudbase-init.conf,指定ConfigDrive数据源。这个配置文件和Linux的cloud.cfg类似,但格式是INI。
4.3 Windows镜像的格式转换
Windows的qcow2通常比较大,转换时同样用qemu-img convert -c -O qcow2。但Windows镜像压缩率不如Linux高,因为系统文件本身压缩过。上传前确认虚拟大小和最小磁盘设置一致。
5. 云主机发放与网络存储对接
5.1 发放前的资源池检查
在ServiceOM里发放云主机之前,先确认几件事:计算节点是否在线、存储池是否有足够空间、网络平面是否配置正确。我见过很多次发放失败是因为存储池满了或者网络平面没配VLAN。检查路径:ServiceOM > 资源 > 计算资源,看节点状态;资源 > 存储资源,看可用容量;网络 > 网络平面,看VLAN和IP池。
5.2 发放参数填写要点
点“创建云主机”,选刚才上传的镜像。关键参数:
- 规格:按业务需求选,测试用2核4G足够
- 系统盘:默认按镜像最小磁盘,可以调大,但不能小于镜像虚拟大小
- 网络:选对网络平面,确保IP池有可用IP
- 安全组:默认放通22/3389,或者按需配置
- 登录方式:密码或密钥,密码要符合复杂度要求
- 主机名:自定义,Cloud-Init会注入
填完点创建,状态从“创建中”变“正常”通常需要1到3分钟。如果卡在“创建中”超过5分钟,大概率是存储或网络有问题,去计算节点上看libvirt日志。
5.3 发放后验证与常见问题
发放成功后,先看ServiceOM里显示的IP对不对,然后尝试SSH或RDP登录。如果登录不上,按这个顺序排查:
- 安全组是否放通端口
- 网络平面VLAN是否和物理交换机一致
- 虚拟机内部网卡是否拿到IP(通过VNC登录进去看)
- Cloud-Init是否执行成功(看
/var/log/cloud-init.log)
我遇到过最诡异的一次是虚拟机拿到了IP但ping不通网关,最后发现是物理交换机端口没配trunk。这种问题只能一层层查。
6. 常见问题速查与避坑经验
6.1 镜像相关高频问题
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 上传镜像报格式错误 | qemu-img版本太老 | 升级qemu-img到4.2以上重新转换 |
| 发放时找不到镜像 | 镜像状态不是“正常” | 等上传完成或重新上传 |
| 发放后无法登录 | Cloud-Init没装或配置错 | 检查cloud.cfg和ConfigDrive |
| Windows蓝屏 | virtio驱动没注入 | 重新制作镜像注入驱动 |
| 磁盘识别不到 | 总线不是virtio | 制作时确保bus=virtio |
6.2 网络与存储避坑
网络这块,VLAN ID一定要和物理网络对齐,我见过有人填错VLAN导致虚拟机完全不通。存储这块,qcow2文件不要放在NFS延迟高的存储上,否则发放极慢。另外,如果用的是分布式存储,确认存储池的副本数配置,副本数不够可能导致数据丢失。
6.3 我个人的几条硬核经验
第一,每次做新镜像都从干净ISO开始,别在旧镜像上改,改着改着就乱了。第二,镜像命名带日期和版本,比如CentOS7.9-Base-20240115,方便追溯。第三,发放测试用最小规格,确认没问题再上生产规格。第四,保留一份原始qcow2,别只留上传后的,万一要改还有底稿。第五,ServiceOM操作尽量用Chrome,有些浏览器兼容性不好,按钮点不动。
这套流程我反复验证过,从镜像制作到发放成功,Linux大概40分钟,Windows大概1小时。慢是慢点,但稳。你要是赶时间,可以提前做好模板镜像,后面直接克隆,那就快多了。