
1. 项目背景与整体设计思路华为私有云HCSHuawei Cloud Stack8.1.1这套方案我在过去两年里前前后后部署过六七套从最小的三节点测试环境到几十节点的生产集群都摸过一遍。很多人第一次接触HCS最头疼的不是装底座而是镜像制作和云主机发放这两个环节——底座装完了ServiceOM能登录了结果发现手里没有可用的镜像或者镜像传上去了却发放不出虚拟机。这套流程看起来只是“做个镜像、点几下发放”实际上中间涉及虚拟化格式转换、驱动注入、Guest OS兼容性、存储池对接、网络平面规划等一大堆细节任何一个环节没对齐最后都会卡在“创建中”或者“错误”状态。这篇内容就是把我自己踩过的坑和验证过的流程完整梳理一遍。核心目标是让你从零开始把一台普通Linux或Windows系统做成HCS可用的镜像再通过ServiceOM成功发放出一台能正常登录、网络可达的云主机。适合谁看刚接手HCS运维的工程师、需要给业务方交付云主机的实施人员、以及想搞清楚私有云镜像底层逻辑的技术爱好者。不需要你事先精通OpenStack但至少要能登录ServiceOM、看得懂基本的网络和存储概念。整体设计思路我按“先做镜像、再传镜像、最后发主机”这条主线走。为什么是这个顺序因为HCS的云主机发放强依赖镜像镜像不对后面全是白费。而镜像制作又分两条路一条是用官方提供的ISO自己装一台再转格式另一条是拿现成的qcow2或vhd直接改。我推荐第一条路虽然慢一点但可控性最强尤其是需要注入virtio驱动的时候自己装能确保驱动版本和HCS底层KVM匹配。第二条路适合批量场景但前提是你已经有一套验证过的模板。在方案选型上我坚持几个原则镜像格式统一用qcow2HCS底层基于KVMqcow2是原生支持最好的磁盘总线用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离线修改镜像比如注入驱动、改配置、guestfishlibguestfs的命令行工具。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 关键参数的前置规划在动手之前先把几个关键参数定下来后面所有操作都围绕它们参数项推荐值说明镜像格式qcow2HCS原生支持支持稀疏文件节省空间磁盘总线virtio性能最优Windows需注入驱动网卡模型virtio同上系统盘大小40G-60G太小不够用太大发放慢分区方案单根分区swap避免LVM简化后续扩容文件系统ext4Linux/ NTFSWindows兼容性最好时区Asia/Shanghai避免时间偏差导致认证失败主机名留空或通用名发放时由Cloud-Init注入这些参数不是拍脑袋定的。比如为什么不用LVM因为HCS的磁盘扩容机制对LVM支持不够友好后期扩容容易出问题。为什么系统盘不超过60G因为qcow2是稀疏格式实际占用取决于写入量但发放时HCS会按虚拟大小分配存储太大浪费资源池。为什么时区要设对我遇到过因为时区差8小时导致Token过期、ServiceOM登录失败的案例排查了半天。提示如果你要做Windows镜像系统盘建议至少60G因为Windows更新和驱动占空间大40G很容易满。3. Linux镜像制作全流程实操3.1 用virt-install安装基础系统制作机上启动libvirtdsystemctl 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,size40,formatqcow2,busvirtio \ --network networkdefault,modelvirtio \ --graphics vnc,listen0.0.0.0 \ --cdrom /path/to/CentOS-7-x86_64-Minimal-2009.iso \ --os-variant centos7.0 \ --boot cdrom,hd这里--disk的busvirtio很关键确保系统盘走virtio总线。--network的modelvirtio同理。装系统过程中分区方案选“自动配置分区”但要把LVM取消掉直接用标准分区。具体操作在安装界面的“安装目的地”里选“我要配置分区”然后手动创建/boot1G、/剩余全部、swap4G。文件系统选ext4。装完后重启进入系统做几件必做的事关闭SELinux编辑/etc/selinux/config设SELINUXdisabled然后setenforce 0临时生效。关闭防火墙systemctl stop firewalld systemctl disable firewalld。HCS发放时会通过Cloud-Init注入网络配置防火墙开着容易挡掉。安装Cloud-Inityum 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-idecho -n /etc/machine-id让每台发放的主机有唯一ID。安装qemu-guest-agentyum 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配置对不对。用guestfishguestfish --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你填60GHCS会认为镜像需要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和ConfigDriveWindows蓝屏virtio驱动没注入重新制作镜像注入驱动磁盘识别不到总线不是virtio制作时确保busvirtio6.2 网络与存储避坑网络这块VLAN ID一定要和物理网络对齐我见过有人填错VLAN导致虚拟机完全不通。存储这块qcow2文件不要放在NFS延迟高的存储上否则发放极慢。另外如果用的是分布式存储确认存储池的副本数配置副本数不够可能导致数据丢失。6.3 我个人的几条硬核经验第一每次做新镜像都从干净ISO开始别在旧镜像上改改着改着就乱了。第二镜像命名带日期和版本比如CentOS7.9-Base-20240115方便追溯。第三发放测试用最小规格确认没问题再上生产规格。第四保留一份原始qcow2别只留上传后的万一要改还有底稿。第五ServiceOM操作尽量用Chrome有些浏览器兼容性不好按钮点不动。这套流程我反复验证过从镜像制作到发放成功Linux大概40分钟Windows大概1小时。慢是慢点但稳。你要是赶时间可以提前做好模板镜像后面直接克隆那就快多了。