Fedora增加OCFS2支持

OCFS2是oracle的SAN集群共享文件系统,全称是oracle cluster file system 2,为了在新封装的Fedora系统中增加ocfs2的支持,需要对内核进行重新编译。

背景

在实际的部署环境中,往往会由客户现场的设备,决定云平台的部署模式,目前主要在存储上遇到的问题就是如何利用用户环境中的SAN存储设备,并将SAN存储作为共享文件系统提供给虚拟机使用。目前所能选择的文件系统范围就十分狭窄了,使用的方式一般有三种:

  • 将SAN磁盘挂载到服务器,作为本地盘使用
  • 将SAN磁盘挂载到服务器,然后使用共享文件系统或分布式文件系统进行再次发布
  • 使用集群共享文件系统直接使用SAN磁盘,作为共享磁盘使用

前两种都有一定的弊端,第一种会影响虚拟机的迁移和高可用能力,第二种情况如果使用共享文件系统例如NFS,会损失相当大的性能和造成单点故障。如果使用第二种的分布式文件系统再发布,也会造成性能的损失,并且目前分布式文件系统生产环境一般都是以3份的方式进行多份处理,实际的使用大小会变为原SAN文件系统的1/3。

综合以上弊端,我们选择使用集群共享文件系统,选择的余地就十分狭小,现有技术中,ocfs2是一种比较理想的选择。

安装

ocfs2在目前的内核版本中是默认关闭的,所以在想要使用ocfs2的情况下, 需要重新编译内核。

1 验证ocfs2是否已经安装
# modprobe ocfs2
modprobe: FATAL: Module ocfs2 not found in directory /lib/modules/5.7.6-201.fc32.x86_64

如果没有返回值,说明加载成功,我这里会报错说明内核中没有ocfs2的kmod

# lsmod |grep ocfs2
# 

lsmod没有返回值,说明ocfs2的kmod没有加载

这种情况下就要开始编译内核进行支持了

2 下载kernel的源码包

先看一下当前的操作系统内核版本

[root@10 SPECS]# uname -a
Linux 10.211.55.230 5.7.6-201.fc32.x86_64 #1 SMP Mon Jun 29 15:15:52 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

内核版本是5.7.6,进入到国内各大镜像站,可以下载到最新的kernel源码rpm包,以163的源为例:

http://mirrors.163.com/fedora/updates/32/Everything/SRPMS/Packages/k/

这个目录中是k开头的源码包

注: 如果这里的kernel版本比之前系统的版本高的话,也没有什么大问题,编译完成之后安装新的kernel相当于进行升级kernel,也没有什么大碍。

下载kernel-5.7.6-201.fc32.src.rpm, 放到fedora的目录下即可,这里示例是放在/root/目录下

3 构建编译环境

进入到root目录下,然后执行

rpm -ivh kernel-5.7.6-201.fc32.src.rpm

会发现在root目录下生成了一个rpmbuild的文件夹,这个就构建的环境

之后在安装编译时所需要的包:

yum install fedora-packager bison dwarves elfutils-devel flex m4 gcc make nss-tools openssl-devel perl-devel perl-generators pesign python3-devel

这里只是根据我的环境需要安装的包,在编译的开始阶段,如果有工具包遗失,系统会提示安装,我们再进行补充即可。编译环境就已经具备了。

4 更改kernel.spec配置文件

这里更改的原因其实主要是要将kernel的配置文件中的# CONFIG_OCFS2_FS is not set/替换为CONFIG_OCFS2_FS=m

由于kernel的配置文件有很多,包括对不同的cpu架构,所以我们要在kernel.spec文件中使用命令行进行替换,kernel.spec在rpmbuild/SPEC/目录下。

编辑的行数在我这里是1608行左右,不同版本会有不同的变化,这里找到的主要依据是找到kernel中有对config文件进行循环操作的部分,比如:

%if %{with_gcov}
for i in *.config
do
  sed -i 's/# CONFIG_GCOV_KERNEL is not set/CONFIG_GCOV_KERNEL=y\nCONFIG_GCOV_PROFILE_ALL=y\n/' $i
done
%endif

在这些代码中的一个下面增加一个循环:

# enable GCOV kernel config options if gcov is on
%if %{with_gcov}
for i in *.config
do
  sed -i 's/# CONFIG_GCOV_KERNEL is not set/CONFIG_GCOV_KERNEL=y\nCONFIG_GCOV_PROFILE_ALL=y\n/' $i
done
%endif

for i in *.config
do
  sed -i "s/# CONFIG_OCFS2_FS is not set/CONFIG_OCFS2_FS=m/" $i
done

意思是在所有的config文件中将# CONFIG_OCFS2_FS is not set替换成CONFIG_OCFS2_FS=m/

这样就修改完毕了

5 编译内核
# rpmbuild -ba kernel.spec

这个时间会相当的长,我大概用了2个小时左右编译完成,完成后会在/root/rpmbuild/RPMS/x86_64/目录下生成如下文件:

[root@10 x86_64]# ls
kernel-5.7.6-201.fc32.x86_64.rpm
kernel-core-5.7.6-201.fc32.x86_64.rpm
kernel-debug-5.7.6-201.fc32.x86_64.rpm
kernel-debug-core-5.7.6-201.fc32.x86_64.rpm
kernel-debug-debuginfo-5.7.6-201.fc32.x86_64.rpm
kernel-debug-devel-5.7.6-201.fc32.x86_64.rpm
kernel-debuginfo-5.7.6-201.fc32.x86_64.rpm
kernel-debuginfo-common-x86_64-5.7.6-201.fc32.x86_64.rpm
kernel-debug-modules-5.7.6-201.fc32.x86_64.rpm
kernel-debug-modules-extra-5.7.6-201.fc32.x86_64.rpm
kernel-debug-modules-internal-5.7.6-201.fc32.x86_64.rpm
kernel-devel-5.7.6-201.fc32.x86_64.rpm
kernel-modules-5.7.6-201.fc32.x86_64.rpm
kernel-modules-extra-5.7.6-201.fc32.x86_64.rpm
kernel-modules-internal-5.7.6-201.fc32.x86_64.rpm

查看一下ocfs2是否打包成功:

[root@10 x86_64]#  rpm -qpl kernel-modules-extra-5.7.6-201.fc32.x86_64.rpm |grep ocfs
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/cluster
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/cluster/ocfs2_nodemanager.ko.xz
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/dlm
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/dlm/ocfs2_dlm.ko.xz
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/dlmfs
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/dlmfs/ocfs2_dlmfs.ko.xz
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/ocfs2.ko.xz
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/ocfs2_stack_o2cb.ko.xz
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/ocfs2_stack_user.ko.xz
/lib/modules/5.7.6-201.fc32.x86_64/extra/fs/ocfs2/ocfs2_stackglue.ko.xz
6 升级替换内核

将上述rpm copy到目标主机上,运行

# yum install kernel-5.7.6-201.fc32.x86_64.rpm kernel-modules-extra-5.7.6-201.fc32.x86_64.rpm

即可安装成功。

7 验证
[root@10 ~]# modprobe ocfs2
[root@10 ~]# lsmod |grep ocfs2
ocfs2                1134592  0
ocfs2_stackglue        20480  1 ocfs2
ocfs2_nodemanager     196608  1 ocfs2

说明安装成功。

ps

 

About the author

liuyuhang

View all posts

1 Comment

发表评论