QEMU+OCFS2: 使用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文件系統的配置
這一步安裝和配置軟件
$ 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/E52668_01/E54669/E54669.pdf, Chapter 23 Oracle Cluster File System Version 2
由于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_64OCFS2配置簡單,只需要在每個要掛載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
$ o2cb.init configure 第一項選yes,集群名稱填上面配置文件里的,默認是ocfs2
systemctl enable o2cb 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,并且用來存儲虛擬機用的虛擬磁盤文件。
在【存儲-塊存儲】界面,新建一個GPFS類型的共享存儲。

存儲記錄創建成功后,選擇該存儲的“管理宿主機”菜單按鈕,在關聯存儲的宿主機列表,選擇“關聯宿主機”,將掛載該存儲的宿主機節點都注冊關聯,讓Cloudpods平臺知道這個共享存儲掛載到哪些宿主機的哪個目錄下。
以上配置完成后,在新建虛擬機時,就可以選擇新建的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感知設備的容量變化,再重新掛載分區就可以了。
產品試用
通過云聯壹云官網可以有三個版本進行選擇,快速管理企業異構IT資源:
鏈接:
在線平臺,注冊后立即使用
鏈接:https://www.yunion.cn/comparison/index.html
私有化部署,支持定制化開發
鏈接:
https://www.yunion.cn/comparison/index.html


