Linux 远程挂载 Ceph RBD 磁盘

block storage

RBD 是 Ceph 的块存储方案,最近需要在一台 Linux 服务器上挂载 Ceph 镜像,做法和 Kubernetes 挂 RBD 很像,但部分操作由于 Kubernetes 在镜像中已经固化了,所以将这次完全自己控制的步骤记录下来,加深对 Ceph 挂载的理解。

1. 安装 Ceph

要挂载 RBD 磁盘的 Linux 服务器首先要有 Ceph 的客户端,也就是 RBD 的客户端,以及一些 RBD 专用的 kernel module,毕竟这是要通过网络走特定的协议来完成的磁盘挂载,和本地直接 mount 还是有差别的。

安装过程并不复杂,因为环境中已经有了 Ceph 集群,从 Ceph 集群中的主节点使用 ceph-deploy 扩展新节点即可,就不再描述如何安装 Ceph 了。

# On Linux client
$ echo "<user-name> ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/<user-name>
$ sudo chmod 0440 /etc/sudoers.d/<user-name>
$ sudo apt-get install -y python
# On Ceph master
$ ceph-deploy install <Linux-client-IP>
$ ceph-deploy admin <Linux-client-IP>

2. 创建和挂载磁盘

上一步,已经在要挂载 RBD 的 Linux 服务器上安装好了 Ceph,接下来的操作在要挂载 Ceph RBD 磁盘的 Linux 服务器上操作即可。

首先为这个磁盘单独创建一个存储池,并指定该存储池作为 RBD 使用

$ sudo ceph osd pool create <pool-name> 50 50 # 两个 50 指定的 pg 和 pgp 的数量
$ sudo ceph osd pool application enable <pool-name> rbd

然后创建磁盘,下面这个命令创建了一个 1T 大小的磁盘,image-feature 参数指定的是 RBD 镜像的功能特性,很多功能特性只有高版本的 Linux kernel 才支持,甚至有些都没有 kernel 版本支持,所以只打开最基本的 layering 即可。

$ sudo rbd create <pool-name>/<image-name> --size 1T --image-feature=layering

接下来为了将远端的 RBD 磁盘挂载到本地,需要将其映射到本地的盘符上。

$ sudo rbd map <pool-name>/<image-name>

虽然已经关掉了大部分的 RBD 功能特性,结果还是报错了:

libceph: ... feature set mismatch, my 107b84a842aca < server's 40107b84a842aca, missing 400000000000000

3. 排错

接下来让我们看看 missing 400000000000000 是个什么意思。400000000000000 是一个二进制的字符串,每一个比特位对应一个 RBD 的功能特性,每个比特标识什么意思详见下表,表中还标出了支持该特性的内核版本,400000000000000 对应的特性是 CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING,内核是从 4.5 开始支持的,而这次用的 Linux 系统是 Ubuntu 16.04,内核版本为 4.4,所以才会报出这个问题。

Feature

BIT

OCT

3.8

3.9

3.10

3.14

3.15

3.18

4.1

4.5

4.6

CEPH_FEATURE_NOSRCADDR

1

2

R

R

R

R

R

R

R

R

R

CEPH_FEATURE_SUBSCRIBE2

4

10

-R-

CEPH_FEATURE_RECONNECT_SEQ

6

40

-R-

R

R

R

R

R

R

CEPH_FEATURE_PGID64

9

200

R

R

R

R

R

R

R

R

CEPH_FEATURE_PGPOOL3

11

800

R

R

R

R

R

R

R

R

CEPH_FEATURE_OSDENC

13

2000

R

R

R

R

R

R

R

R

CEPH_FEATURE_CRUSH_TUNABLES

18

40000

S

S

S

S

S

S

S

S

S

CEPH_FEATURE_MSG_AUTH

23

800000

-S-

S

S

S

CEPH_FEATURE_CRUSH_TUNABLES2

25

2000000

S

S

S

S

S

S

S

S

CEPH_FEATURE_REPLY_CREATE_INODE

27

8000000

S

S

S

S

S

S

S

S

CEPH_FEATURE_OSDHASHPSPOOL

30

40000000

S

S

S

S

S

S

S

S

CEPH_FEATURE_OSD_CACHEPOOL

35

800000000

-S-

S

S

S

S

S

CEPH_FEATURE_CRUSH_V2

36

1000000000

-S-

S

S

S

S

S

CEPH_FEATURE_EXPORT_PEER

37

2000000000

-S-

S

S

S

S

S

CEPH_FEATURE_OSD_ERASURE_CODES***

38

4000000000

CEPH_FEATURE_OSDMAP_ENC

39

8000000000

-S-

S

S

S

S

CEPH_FEATURE_CRUSH_TUNABLES3

41

20000000000

-S-

S

S

S

S

CEPH_FEATURE_OSD_PRIMARY_AFFINITY

41*

20000000000

-S-

S

S

S

S

CEPH_FEATURE_CRUSH_V4 ****

48

1000000000000

-S-

S

S

CEPH_FEATURE_CRUSH_TUNABLES5

58

200000000000000

-S-

S

CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING

58*

400000000000000

-S-

S

解决这个问题,可以有两种方法,第一种是升级 kernel,第二种方法是降级 Ceph 的 CRUSH 算法,本文采用的是第二种方法,因为升级第二种方法操作起来更简单,风险也更低,一条命令即可:

$ sudo ceph osd crush tunables legacy

映射操作现在可以成功了!

$ sudo rbd map <pool-name>/<image-name>
/dev/rbd0

接下来的操作和挂载一个本地磁盘就没有任何区别了:

$ sudo mkfs.ext4 /dev/rbd0
$ sudo mkdir /data
$ sudo mount /dev/rbd0 /data/

让我们看看挂载的结果吧。

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 893.8G  0 disk 
|-sda1   8:1    0   476M  0 part /boot
|-sda2   8:2    0 119.2G  0 part [SWAP]
`-sda3   8:3    0 774.1G  0 part /
rbd0   251:0    0     1T  0 disk /data

4. 参考文档

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

基于Docker部署ceph分布式文件系统(Luminous版本)

本文记录分享了ceph分布式文件系统的详尽部署过程,既是为了方便自己后续回溯,也希望能给初次接触ceph的同学提供些许参考。

4766
来自专栏数据之美

使用 django-blog-zinnia 搭建个人博客

django-blog-zinnia 虽然小巧,但是具备了个人博客应用的全部基础功能,且具有很高的拓展性,并且开箱即用。以下是官方列出的一些特性: 评论 站...

3129
来自专栏张宁的专栏

【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(一)

腾讯云作为国内一流的云服务提供商,云服务器CVM的使用可谓是“一键成站”,十分方便。今天我们就来介绍一下几种在腾讯云建立WordPress的方法。这里,我们仅介...

4.3K1
来自专栏撸码那些事

【眼见为实】数据库并发问题 封锁协议 隔离级别

此篇博客是【眼见为实】系列的第一篇博客,主要从理论上讲了数据库并发可能会出现的问题,解决并发问题的技术——封锁,封锁约定的规则——封锁协议。然后简单说明了数据库...

37711
来自专栏风中追风

如何控制线程的执行顺序

控制线程的执行顺序有两种办法,通常来说,最简单的就算用Thread类提供的API,使用join方法即可。其使用方法及原理:深入理解join方法的底层原理 还有...

38711
来自专栏不想当开发的产品不是好测试

jenkins修改时区

查看jenkins目前的时区 访问http://your-jenkins/systemInfo,查看user.timezone变量的值 ? 默认是纽约时间 修改...

35410
来自专栏向治洪

使用GitBook写电子书

工作以来一直有写博客的习惯,除了在各大站长写博客外,还可以使用 gitbook 将博客整理成电子书出版,如果受到好评还可以将图书弄成电子版出版。 经过近半年的整...

2927
来自专栏YouMeek

Camtasia Studio 心目中最好的录屏工具

软件介绍和下载 有些场景我会考虑用录制视频的方式来讲解,比如:GitNavi 的使用说明。效果如下:http://search.bilibili.com/all...

6476
来自专栏翻译

如何在CentOS 6上安装和配置phpMyAdmin

phpMyAdmin是一个Web上的数据库管理工具,它提供了一个美观的GUI界面来帮助管理MySQL数据库。phpMyAdmin支持多个MySQL服务器,相比于...

891
来自专栏blackpiglet

配置 Ceph 内外网分离

  先明确一下这么做的必要性。Ceph 的客户端,如 RADOSGW,RBD 等,会直接和 OSD 互联,以上传和下载数据,这部分是直接提供对外下载上传能力的;...

1982

扫码关注云+社区

领取腾讯云代金券