在国产化替代进程中,银河麒麟V10作为主流的服务器操作系统,经常需要对接已有的Ceph分布式存储集群。对接的核心操作就是把Ceph的RBD块设备映射到本地,变成一个类似/dev/rbd0的块设备,再进行格式化和挂载使用。整个流程看似只有几条命令,但实际操作中坑不少,比如ceph-common没有安装、密钥文件权限不对、映射成功后重启丢失等。本文把完整流程和常见问题的解决办法一次性讲清楚。

准备工作:安装客户端工具并配置认证信息
银河麒麟V10基于CentOS 8的软件仓库体系,安装Ceph客户端工具推荐直接使用yum或dnf。如果服务器可以访问外网源,执行下面的命令即可;如果是内网环境,需要提前配置本地源或者挂载Ceph安装介质的repo文件。
# 安装ceph客户端基础包 yum install -y ceph-common # 确认rbd命令可用 rbd --version # 输出类似:ceph version 14.2.x 或更高版本
安装完成后,需要从Ceph集群侧拿到两份关键文件:一个是ceph.conf配置文件,另一个是对应用户的keyring密钥文件。通常用client.admin做测试,生产环境建议单独创建一个只授权特定池的用户,例如client.kylin。在Ceph管理节点上执行:
# 在Ceph集群节点上创建专用用户并导出密钥 ceph auth get-or-create client.kylin mon 'allow r' osd 'allow rwx pool=kylin_pool' > ceph.client.kylin.keyring # 导出精简格式的密钥(推荐客户端使用) ceph auth print-key client.kylin
把ceph.conf复制到麒麟客户端的/etc/ceph/目录下,同时创建密钥文件。这里密钥文件的权限必须是600,否则rbd命令会直接报权限错误,这是新手最容易踩的第一个坑。
mkdir -p /etc/ceph
# 编辑 /etc/ceph/ceph.conf,内容示例:
# [global]
# mon host = 192.168.10.101,192.168.10.102,192.168.10.103
# 创建密钥文件(keyring格式)
cat > /etc/ceph/ceph.client.kylin.keyring << 'EOF'
[client.kylin]
key = AQD1P8VgAAAAABAAAPh0XBl3N0EXAMPLEKEY==
EOF
chmod 600 /etc/ceph/ceph.client.kylin.keyring
# 验证连通性
ceph -s --name client.kylin
如果ceph -s能正常返回集群健康状态,说明客户端认证和mon节点网络都没问题,可以进入下一步。如果报monclient(hunting): couldn't connect,优先检查防火墙3300端口和mon host地址写法。
执行RBD映射并挂载使用
认证通过后,先确认目标镜像存在,然后使用rbd map命令把镜像映射为本地块设备。映射成功后系统会生成/dev/rbd0这样的设备文件,后续操作就和普通磁盘完全一样了。
# 查看池中的镜像 rbd ls kylin_pool --name client.kylin # 执行映射(第一次使用需要先禁用部分特性,避免老内核不支持) rbd feature disable kylin_pool/data-vol exclusive-lock object-map fast-diff deep-flatten --name client.kylin # 映射到本地 rbd map kylin_pool/data-vol --name client.kylin # 输出:/dev/rbd0 # 查看已映射的设备 rbd showmapped
有一个非常典型的问题需要特别注意:麒麟V10的内核如果版本偏旧,映射时会报rbd: sysfs write failed或者Unknown feature错误。这是因为Ceph新版本镜像默认开启了exclusive-lock、object-map等特性,而旧内核的rbd模块不认识这些特性。解决办法就是像上面那样先disable掉多余特性,只保留layering。执行rbd info可以查看当前镜像开启了哪些特性。
映射成功后,对/dev/rbd0进行格式化和挂载:
# 格式化为xfs(麒麟推荐文件系统) mkfs.xfs /dev/rbd0 # 创建挂载点并挂载 mkdir -p /data mount /dev/rbd0 /data # 查看挂载结果 df -h /data
卸载时要注意顺序:先umount,再执行rbd unmap,顺序颠倒可能造成设备忙。如果设备一直显示busy,可以用rbd unmap -o force强制解除,但强制操作前务必确认没有进程还在读写该设备。
开机自动映射与自动挂载配置
手动映射在服务器重启后会失效,生产环境必须配置自动化。这里不推荐把rbd map命令简单写进rc.local,因为rc.local执行时机太晚且不管理依赖关系,网络未就绪时会导致映射失败。更稳妥的做法有两种。
第一种是使用RBD的原生自动映射机制。在镜像上打上krbd标签,内核模块加载时会自动完成映射:
# 给镜像打krbd标签,开机自动映射 rbd add kylin_pool/data-vol krbd --name client.kylin # 同时在/etc/ceph/目录下确保存在 rbdmap 文件 cat > /etc/ceph/rbdmap << 'EOF' kylin_pool/data-vol id=kylin,keyring=/etc/ceph/ceph.client.kylin.keyring EOF # 启动rbdmap服务并设置开机自启 systemctl enable --now rbdmap
第二种是配置systemd服务单元,灵活度更高,适合有定制需求的场景。创建/etc/systemd/system/rbd-map.service文件,内容如下:
[Unit] Description=Map Ceph RBD device After=network-online.target Wants=network-online.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/rbd map kylin_pool/data-vol --name client.kylin ExecStop=/usr/bin/rbd unmap /dev/rbd0 --name client.kylin [Install] WantedBy=multi-user.target
写好服务文件后执行systemctl daemon-reload并systemctl enable --now rbd-map。挂载部分建议写在/etc/fstab中,并且一定要加上_netdev参数,让系统知道这是网络设备,避免开机时因设备未就绪而卡住:
# /etc/fstab 中添加一行 /dev/rbd0 /data xfs defaults,_netdev 0 0
常见报错排查思路汇总
最后把实际运维中高频出现的几类问题整理一下。第一类是认证失败,报RADOS permission denied,一般是keyring文件权限不是600,或者使用的用户名和keyring文件名不匹配,客户端要求ceph.client.用户名.keyring这种严格的对应关系。
第二类是映射报Request timed out,通常是客户端到Ceph集群OSD节点的网络不通。RBD数据面走的是6789以外的动态端口,只放行mon的3300端口是不够的,需要保证客户端到所有OSD节点的内网互通,最好把客户端和存储集群放在同一网段。
第三类是重启后/dev/rbd0变成/dev/rbd1,导致fstab挂载失败。这种情况建议在fstab中不写设备名,改用镜像名称的方式挂载,或者用rbd map输出的稳定符号链接/dev/rbd/kylin_pool/data-vol,这个路径不会因为设备号变化而改变,是最推荐的生产写法。
第四类是性能问题,如果发现映射后读写速度明显偏低,可以用rbd bench-write做基准测试,同时在客户端执行rbd -p kylin_pool perf dump观察指标。常见原因是副本池跨机房部署导致延迟高,或者是麒麟服务器网卡没有做bond、MTU没有开启巨帧。排除掉这些因素后,RBD在万兆内网下跑满磁盘带宽是完全没有问题的。
整体来看,在银河麒麟上使用Ceph块设备,关键点集中在认证文件规范、内核特性兼容、自动化映射这三块。把这三块配置规范到位,麒麟服务器对接Ceph存储的稳定性和性能都能达到生产水准。如果在容器化场景中还需要对接Kubernetes,可以进一步研究ceph-csi插件,原理上同样是基于RBD映射,只是把映射过程交给了CSI驱动自动完成。