做 BMS(裸金属服务器)镜像,和做普通 ECS 或虚拟机镜像完全是两个维度的活儿。
很多人有个误区,觉得“只要系统能跑起来就行”,但在裸金属场景下,硬件直通、性能损耗、驱动兼容性是三个必须死磕的点。BMS 的本质是把物理机虚拟化后直接给用户用,所以你的镜像必须尽可能“原生化”地适配底层硬件,同时又要兼容上层 Hypervisor(如 KVM、Xen 或厂商自研的虚拟化层)。
以下是在制作 BMS 专用系统镜像时,需要重点关注的驱动、内核参数及配置细节,按优先级排序:
1. 存储驱动:重中之重(IOPS 与延迟)
BMS 的核心卖点就是高性能。如果存储驱动没调好,整台机器就废了一半。
- NVMe/SCSI 直通驱动:
- 如果底层使用 NVMe SSD 直通,确保内核中加载了最新的
nvme模块。 - 如果使用 SCSI 模拟盘,检查
virtio-scsi或厂商定制的vbd驱动是否启用。注意,很多云厂商为了兼容性会提供半虚拟化存储驱动,务必确认版本匹配当前 Hypervisor 的版本。
- 如果底层使用 NVMe SSD 直通,确保内核中加载了最新的
- 多路径软件(Multipath):
- 如果是分布式存储后端挂载的云硬盘,必须安装并正确配置
multipath-tools。 - 在
/etc/multipath.conf中,根据云厂商提供的 WWID 规则进行白名单配置,避免将本地磁盘误识别为多路径设备。 - 设置合理的
path_selector(如round-robin或queue-length),以平衡 I/O 负载。
- 如果是分布式存储后端挂载的云硬盘,必须安装并正确配置
- 文件系统对齐:
- 创建分区时,务必保证 4K 对齐。推荐使用
parted或fdisk时指定-a optimal。 - 文件系统建议 ext4 或 xfs,并开启
noatime选项以减少不必要的元数据写入。
- 创建分区时,务必保证 4K 对齐。推荐使用
2. 网络驱动:带宽与低延迟
裸金属用户通常对网络抖动极其敏感。
- 网卡驱动:
- 确认加载的是最新版的
igb,ixgbe,mlx5_core(Mellanox) 或bnxt_en等物理网卡驱动。 - 对于支持 SR-IOV 的场景,虽然 SR-IOV 通常是 VF 直通,但 PF(物理功能)的管理驱动必须在 Host 和 Guest 中都保持最新,以便管理 VLAN 和 MAC 地址绑定。
- 确认加载的是最新版的
- MTU 设置:
- 如果底层网络支持 Jumbo Frame(巨型帧),确保镜像内的网卡配置 MTU 为 9000。如果不支持,保持 1500。切忌默认值不统一导致分包重组带来的 CPU 开销。
- IPVS/Netfilter 优化:
- 如果镜像内运行高并发服务,调整
net.ipv4.ip_local_port_range和net.core.somaxconn。 - 禁用不必要的防火墙规则(如 iptables/nftables 中的复杂链),或者使用 nftables 以提升过滤性能。BMS 通常由云平台在网络层做安全组隔离,主机内部防火墙应最小化。
- 如果镜像内运行高并发服务,调整
3. 虚拟化接口驱动(Paravirtualization)
即使叫“裸金属”,大多数架构下 CPU 和内存仍是虚拟化的,只是外设尽量直通。
- virtio 系列:
- 确保
virtio_pci,virtio_net,virtio_blk已加载。 - 关键点:关闭
vhost-net或vhost-blk的用户态提速测试,如果在某些老旧内核上不稳定,可能需要回退到纯内核态处理,具体需参考云厂商的文档。
- 确保
- QEMU Guest Agent:
- 必装。这是实现热迁移、动态 IP 分配、时钟同步、安全事件上报的基础。
- 确保
qemu-guest-agent服务开机自启,并且能与 Hypervisor 的 QMP 端口通信。
- Cloud-Init / Cloud-Config:
- 预装
cloud-init或云厂商定制的配置工具。 - 在镜像中初始化 cloud-init 的状态文件(如
/var/lib/cloud/instances/下的标记),防止首次启动时重复执行初始化脚本导致冲突。
- 预装
4. 电源管理与 ACPI
裸金属服务器通常要求支持高级电源管理,以便在维护期间优雅关机或重启。
- ACPI 表:
- 确保内核编译时包含了
CONFIG_ACPI相关选项。 - 测试
acpid守护进程是否能正确处理电源按钮事件。
- 确保内核编译时包含了
- CPU 频率调节:
- 对于计算密集型业务,建议在镜像中将 CPU governor 设置为
performance模式,避免ondemand或powersave带来的频率波动导致的延迟抖动。 - 命令示例:
cpupower frequency-set -g performance
- 对于计算密集型业务,建议在镜像中将 CPU governor 设置为
5. 内核参数调优(Sysctl)
不要依赖默认值。针对云计算环境,以下参数值得在 /etc/sysctl.conf 中固化:
# 增大 TCP 缓冲区,应对大带宽长连接
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 启用 TCP Fast Open (视应用需求)
net.ipv4.tcp_fastopen = 3
# 禁用 ICMP 重定向,减少攻击面和管理复杂度
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 时间同步:启用 chrony 或 ntpd,确保与宿主机时间源一致
6. 安全与合规性陷阱
- SSH 密钥轮询:
- 镜像中不要硬编码任何 SSH 私钥或 root 密码。
- 确保
sshd_config中允许公钥登录,且禁止空密码登录。 - 首次启动时,通过 cloud-init 注入用户公钥。
- SELinux/AppArmor:
- 这是一个争议点。大多数云厂商建议在生产环境中禁用 SELinux 或将其设为 Permissive,因为复杂的权限策略极易导致容器化应用或自定义中间件启动失败。除非你有极强的运维能力,否则选 Permissive 更稳妥。
- 审计日志:
- 确保
auditd服务存在,但初始规则集要精简,避免产生海量日志撑爆磁盘。重点关注sudo操作和敏感文件访问。
- 确保
7. 验证流程(Checklist)
在交付镜像前,必须进行以下自动化测试:
- 冷启动测试:从镜像创建新实例,观察 boot 时间是否在预期范围内(通常 < 60s)。
- 驱动自检:进入系统后,运行
lspci -v确认所有 PCIe 设备都被正确识别,没有Unknown driver的残留。 - 压力测试:
- 使用
fio测试磁盘随机读写 IOPS,对比理论值,损耗应在 5% 以内。 - 使用
iperf3测试网络带宽,确认无丢包。
- 使用
- 热迁移测试(如果支持):尝试在线迁移实例,观察业务中断时间(应接近零)。
- 清理痕迹:
- 删除
/etc/udev/rules.d/中可能包含特定 MAC 地址的规则。 - 清空
/var/log/journal/或/var/log/messages。 - 重置 UUID(特别是
/etc/fstab中的 UUID,虽然通常由 cloud-init 处理,但最好确保干净)。 - 生成新的 SSH Host Keys (
rm /etc/ssh/ssh_host_*key; ssh-keygen -A)。
- 删除
总结
制作 BMS 镜像的核心逻辑是:“去虚拟化痕迹,留虚拟化接口”。
你要去掉的是那些属于上一代通用 VM 的臃肿组件(如旧版 virtio、非必要的图形界面服务),留下的是能与物理硬件高效对话的现代驱动栈。不同云厂商(阿里云、腾讯云、华为云、AWS)的底层 Hypervisor 差异巨大,最准确的做法是获取该厂商官方发布的“基础镜像 SDK”或“Golden Image Reference”,在其基础上进行裁剪和加固,而不是从零开始造轮子。
云技术博客