乐趣区

关于云计算:QEMUOCFS2-使用OCFS2作为虚拟机磁盘文件的SAN存储文件系统

本文介绍 OCFS2 共享集群文件系统,如何配置以及如何在线扩容。

什么是 OCFS2 文件系统?

OCFS2 是 Oracle Cluster File System Version 2 的缩写,是 Oracle 公司外部开发的共享磁盘文件系统,于 2011 年开源,应用 GNU GPL 协定。

什么是共享磁盘文件系统呢?咱们上面通过解释三个概念的比照来阐明:

  • 磁盘文件系统

这是最常见的文件系统,构建在本地的磁盘(块存储,Block Storage)之上。通过磁盘文件系统,磁盘上的内容以文件目录的模式进行组织,不便了用户无效应用磁盘上的存储空间。磁盘文件系统的例子有:ext4, xfs 等。

  • 共享文件系统

共享文件系统通过远端服务器上运行的服务程序拜访挂载在远端服务器上的文件系统。例子为:NFS(Network File System),Samba(CIFS)。

  • 共享磁盘文件系统

共享磁盘文件系统又叫集群文件系统(Cluster File System),是专门构建在网络共享的磁盘上的文件系统。网络共享磁盘通过 SAN(Storage Area Network)被多台主机独特拜访,和磁盘文件系统相比,共享磁盘文件系统除了要解决磁盘空间的无效治理问题之外,还要解决文件系统被多台主机同时拜访的并发批改问题。因而分布式锁机制是共享磁盘文件系统共有的机制。

从应用场景来看,三种文件系统的差异很显著:磁盘文件系统间接拜访本地磁盘,共享文件系统须要通过共享文件服务拜访挂载在服务器上的文件系统,而共享磁盘文件系统则间接访问共享磁盘。

因而,在网络共享的场景下,通过共享磁盘文件系统拜访 SAN 存储,能够间接访问共享存储设备。拜访门路短,效率高,并且能解决多主机并发访问共享存储的问题。

QEMU 通过 OCFS2 应用共享 SAN 存储

QEMU 应用共享 SAN 存储有多种计划。常见计划是在须要新建虚拟机磁盘时,应用 SAN 存储的治理 API,调配出卷(LUN)之后,间接将卷挂载给 QEMU 虚拟机应用。这种计划的长处是 QEMU 虚拟机间接拜访 LUN,损耗低,性能好。而毛病是须要应用存储设备特定的 API,和设施绑定,不够通用。

本文介绍通过 OCFS2 共享磁盘文件系统,将一个大容量的 SAN 存储卷作为存储 QEMU 虚拟机虚构磁盘文件的存储,达到 QEMU 应用共享贮存的目标。

OCFS2 文件系统的配置

  • 筹备环境

这一步装置和配置软件

  • 下载和装置 ocfs2-tools 的 rpm 包装置(也依赖 net-tools)

$ wget http://public-yum.oracle.com/public-yum-ol7.repo -O /etc/yum.repos.d/public-yum-ol7.repo
$ rpm --import http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol7
$ yum install yum-plugin-downloadonly -y
$ mkdir /tmp/ocfs2 && cd /tmp/ocfs2/
$ yum install --downloadonly --downloaddir=/tmp/ocfs2/ ocfs2-tools net-tools -y

具体操作步骤见官网文档:
https://docs.oracle.com/cd/E5…, Chapter 23 Oracle Cluster File System Version 2

  • 装置 Cloudpods 内核,自带编译了 ocfs2 文件系统的内核模块

因为 OCFS2 应用场景较少,在常见发行版的内核中都不会启用 OCFS2 的内核模块。咱们提供了事后编译好的启用了 OCFS2 的内核安装包:

$ yum install -y yum-utils
# 增加 yunion Cloudpods rpm 源
$ yum-config-manager --add-repo https://iso.yunion.cn/yumrepo-3.6/yunion.repo
$ yum install -y kernel-3.10.0-1062.4.3.el7.yn20191203

同时,部署时写配置文件到 /etc/modules-load.d/ocfs2.conf,确保内核的 ocfs2 模块主动加载

# Load ocfs2.ko at boot
ocfs2

装置内核后须要重启失效,重启后查看新的内核曾经失效

$ uname -r
3.10.0-1062.4.3.el7.yn20191203.x86_64
  • OCFS2 配置文件

OCFS2 配置简略,只须要在每个要挂载 OCFS2 的节点上都配置雷同的配置文件,申明成员节点即可。\
以下为示例配置文件:

$ cat /etc/ocfs2/cluster.conf 
cluster:
        node_count = 3            <== 集群节点数目
        name = ocfs2              <== 集群名字

node:
        ip_port = 7777
        ip_address = 192.168.7.10
        number = 0                <== 节点编号
        name = client01           <== 节点名字
        cluster = ocfs2
node:
        ip_port = 7777
        ip_address = 192.168.7.11
        number = 1
        name = client02
        cluster = ocfs2
node:
        ip_port = 7777
        ip_address = 192.168.7.12
        number = 2
        name = client03


        cluster = ocfs2
  • 初始化 ocfs2 的配置

$ o2cb.init configure      第一项选 yes,集群名称填下面配置文件里的,默认是 ocfs2
  • 确保 o2cb ocfs2 服务启动并设置为开机自启

systemctl enable o2cb ocfs2

至此,OCFS2 的软件和配置实现,下一步将格式化磁盘,挂载 OCFS2 文件系统

  • 挂载 OCFS2 文件系统

这一步应用 OCFS2 格式化网络共享磁盘,并且挂载到各台宿主机上。
在此之前可能要配置 SAN 存储的多路径 multipath(因为行文起因,细节在此省略),在此之后应用 parted 分区,格式化成 ocfs2(只在一台机器分区格式化,其余机器 partprobe 就能看到格式化后的分区)并挂载到多台机器。
以下命令在第一个节点执行:

# 查看多路径 multipath 磁盘状况
$ multipath -l

应用 mkfs.ocfs2 格式化分区

$ parted /dev/dm-0
$ mkfs.ocfs2 /dev/dm-1
$ mount /dev/dm-1 /data

长久化磁盘挂载到 /etc/fstab

# /etc/fstab
/dev/dm-1  /opt/cloud/workspace/disks  ocfs2     _netdev,defaults  0 0

在其余节点,则只须要执行 partprobe 探测分区变动,并且挂载分区。也应该批改 /etc/fstab,长久化分区的挂载。

Cloudpods 应用 OCFS2 文件系统

在 Cloudpods 中,通过 OCFS2 挂载的共享文件系统能够作为 GPFS 类型的共享存储类型进行治理。通过以下步骤将 OCFS2 的共享存储注册到 Cloudpods,并且用来存储虚拟机用的虚构磁盘文件。

  • 注册 OCFS2 块存储

在【存储 - 块存储】界面,新建一个 GPFS 类型的共享存储。

存储记录创立胜利后,抉择该存储的“治理宿主机”菜单按钮,在关联存储的宿主机列表,抉择“关联宿主机”,将挂载该存储的宿主机节点都注册关联,让 Cloudpods 平台晓得这个共享存储挂载到哪些宿主机的哪个目录下。

  • 应用 OCFS2 创立主机虚构磁盘

以上配置实现后,在新建虚拟机时,就能够抉择新建的 OCFS2 存储作为虚构磁盘的存储。

OCFS2 文件系统的扩容

首先须要将 OCFS2 只挂载在第一个节点,将其余节点都卸载。以下操作都只在第一个节点上执行。

首先,须要在 SAN 存储扩容该物理卷,这一步在 SAN 设施上操作,在此不详叙述。

其次,针对 multipath 设施,须要 rescan 该设施下的每个磁盘,让操作系统感知到设施的扩容。

# 首先执行 multipath -l 查看 multipath 设施底层的磁盘设施
$ multipath -ll
Jun 24 15:09:16 | ignoring extra data starting with '}' on line 16 of /etc/multipath.conf
Jun 24 15:09:16 | sdi: alua not supported
Jun 24 15:09:16 | sdb: alua not supported
Jun 24 15:09:16 | sdc: alua not supported
Jun 24 15:09:16 | sdd: alua not supported
Jun 24 15:09:16 | sde: alua not supported
Jun 24 15:09:16 | sdf: alua not supported
Jun 24 15:09:16 | sdg: alua not supported
Jun 24 15:09:16 | sdh: alua not supported
Jun 24 15:09:16 | sdq: alua not supported
Jun 24 15:09:16 | sdj: alua not supported
Jun 24 15:09:16 | sdm: alua not supported
Jun 24 15:09:16 | sdn: alua not supported
Jun 24 15:09:16 | sdo: alua not supported
Jun 24 15:09:16 | sdp: alua not supported
Jun 24 15:09:16 | sdk: alua not supported
Jun 24 15:09:16 | sdl: alua not supported
36488eef100d71ed122ace06c00000001 dm-0 HUAWEI  ,XSG1
size=15T features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=-1 status=active
  |- 1:0:7:1 sdi 8:128 active ready running
  |- 1:0:0:1 sdb 8:16  active ready running
  |- 1:0:1:1 sdc 8:32  active ready running
  |- 1:0:2:1 sdd 8:48  active ready running
  |- 1:0:3:1 sde 8:64  active ready running
  |- 1:0:4:1 sdf 8:80  active ready running
  |- 1:0:5:1 sdg 8:96  active ready running
  |- 1:0:6:1 sdh 8:112 active ready running
  |- 2:0:7:1 sdq 65:0  active ready running
  |- 2:0:3:1 sdj 8:144 active ready running
  |- 2:0:6:1 sdm 8:192 active ready running
  |- 2:0:0:1 sdn 8:208 active ready running
  |- 2:0:2:1 sdo 8:224 active ready running
  |- 2:0:5:1 sdp 8:240 active ready running
  |- 2:0:1:1 sdk 8:160 active ready running
  `- 2:0:4:1 sdl 8:176 active ready running

对每个设施执行:

echo 1 > /sys/class/block/sdi/device/rescan

再执行上面的命令,让操作系统感知到 multipath 设施的容量变动:

$ multipathd -k
# multipathd> resize map 36488eef100d71ed122ace06c00000001
# ok
# multipathd> exit

通过下面步骤,操作系统曾经感知到设施的容量变动,这时候须要应用 parted 扩充分区表,办法是应用 parted 删除分区再重建分区

$ parted /dev/dm-0
(parted) unit s
(parted) p
Model: Linux device-mapper (multipath) (dm)
Disk /dev/dm-0: 32212254720s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
 
Number  Start  End           Size          File system  Name   Flags
 1      2048s  10737416191s  10737414144s               disks
 
(parted) rm 1
(parted) mkpart
Partition name?  []?
File system type?  [ext2]?
Start? 2048
End? 100%
device-mapper: create ioctl on 36488eef100d71ed122ace06c00000001p1 part1-mpath-36488eef100d71ed122ace06c00000001 failed: Device or resource busy
(parted) p
Model: Linux device-mapper (multipath) (dm)
Disk /dev/dm-0: 32212254720s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
 
Number  Start  End           Size          File system  Name  Flags
 1      2048s  32212252671s  32212250624s
 
(parted) quit

扩容分区表之后,再应用 tunefs.ocfs2 扩容文件系统

# 扩容文件系统
# tunefs.ocfs2 -S /dev/dm-1

通过以上步骤后,文件系统扩容结束。最初,在其余节点执行 partprobe 感知设施的容量变动,再从新挂载分区就能够了。

退出移动版