理论上使用nfs-kernel-server 的服务器都可以用这个方法进行配置,可以用如下命令安装
1 sudo apt-get install nfs-kernel-server
本文主要参考了Sparktour’s 博客中使用Mellanox网卡基于RDMA挂载NFS
前情提要 之前家里的服务器系统用的是VMWare ESXi,主要一开始比较图方便,而且界面也算是美观。
但用着用着,总觉得有些地方不太喜欢,比如配置TPM、链路聚合等功能,还需要一个额外的vCenter系统来进行管理配置,感觉太“重”了。
所以前几天就忙着备份服务,并将服务器的系统重装为了Proxmox VE,一个基于KVM的虚拟化平台。
在原本的服务器上,我在OpenMediaVault系统上配置了VGPU和Docker,相当于存储和业务都放在一个虚拟机里,优点ALL IN ONE的意思。
既然推倒重来了,我还是希望能将家里服务器上的各个业务理顺一点,大概的架构像这样,后面管理也比较清晰,不至于ALL IN BOOM。
那么要想实现这个架构,我必须做到,让上层的业务,能够访问存储服务器的资源。
技术选型 目前比较需要存储的业务有两个,一个是Emby媒体服务器,一个是qBittorrent,Emby的话其实主要就是读取媒体文件而已,而qBittorrent的话,跑PT下载上传,对文件IO会比较敏感一些,所以我的想法是,qBittorrent用ISCSI连接到存储服务器,最好能配置成ISER(iSCSI Extensions for RDMA),然后Emby用NFS或者SMB连接到媒体服务器。ISER的配置我还没研究明白,NFS的比较简单,并且也支持RDMA,所以就先从这个开始入手了。
我的Emby电影都是从PT站上下载的,我也不想当一个吸血鬼,下载完种子后不保种。所以我电影电视剧下载完后,是将下载的文件拷贝到Emby使用的硬盘上,某种意义上来说,把qBittorrent直接挂在存储服务器上确实方便,但综合想了一下,还是想将各个业务层分清楚一点。
开始配置NFS服务端 OpenMediaVault原生支持NFS功能,直接在web上就可以配置。
WEB UI配置 第一步,在web上,服务——NFS——共享里配置好需要分享的文件夹
第二步,在服务——NFS——设置,启动NFS服务
修改systemctl配置文件 执行完上面两步,只是完成了基本的NFS配置,此时还不支持RDMA
如果需要支持RDMA,需要加载内核模块,并让NFS服务器使用RDMA,好在OpenMediaVault的NFS基于nfs-kernel-server ,只需要修改nfs服务的启动文件即可
我们在这个路径可以看到nfs-kernel-server的启动配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [Unit] Description=NFS server and services DefaultDependencies=no Requires=network.target proc-fs-nfsd.mount Requires=nfs-mountd.service Wants=rpcbind.socket network-online.target Wants=rpc-statd.service nfs-idmapd.service Wants=rpc-statd-notify.service Wants=nfsdcld.service After=network-online.target local-fs.target After=proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service After=nfs-idmapd.service rpc-statd.service After=nfsdcld.service Before=rpc-statd-notify.service # GSS services dependencies and ordering Wants=auth-rpcgss-module.service rpc-svcgssd.service After=rpc-gssd.service gssproxy.service rpc-svcgssd.service [Service] Type=oneshot RemainAfterExit=yes ExecStartPre=-/usr/sbin/exportfs -r ExecStart=/usr/sbin/rpc.nfsd ExecStop=/usr/sbin/rpc.nfsd 0 ExecStopPost=/usr/sbin/exportfs -au ExecStopPost=/usr/sbin/exportfs -f ExecReload=-/usr/sbin/exportfs -r [Install] WantedBy=multi-user.target
我们只需要定位到ExecStart=/usr/sbin/rpc.nfsd
, 在其上下添加内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [Service] Type=oneshot RemainAfterExit=yes ExecStartPre=-/usr/sbin/exportfs -r ExecStartPre=/sbin/modprobe rpcrdma ExecStart=/usr/sbin/rpc.nfsd ExecStartPost=/bin/bash -c "sleep 3 && echo 'rdma 20049' | tee /proc/fs/nfsd/portlist" ExecStop=/usr/sbin/rpc.nfsd 0 ExecStopPost=/usr/sbin/exportfs -au ExecStopPost=/usr/sbin/exportfs -f
这个配置的意思是,在启动NFS服务之前,先加载rpcrdma内核模块
然后在启动后,添加使用RDMA支持,监听20049端口。
修改完后重载启动配置
然后重启NFS服务
1 systemctl restart nfs-kernel-server.service
配置NFS客户端 首先客户端需要安装nfs-common组件
1 sudo apt-get install nfs-common
然后用以下命令挂载即可
1 sudo mount -o proto=rdma,port=20049 NFS服务器的IP地址:/NFS共享文件夹名称 你本地的挂载点
例如,我在本地新建了一个test文件夹当做挂载点,NFS服务器地址是192.168.4.72,NFS分享的目录名称叫做pt_share_folder,
1 sudo mount -o proto=rdma,port=20049 192.168.4.72:/pt_share_folder test
挂载的时候我们通过proto=rdma,port=20049
来强制NFS走RDMA。
看看跑分(淘汰的笔记本硬盘组的RAID0,性能比较幽默,理解一下 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 magicdian@ubuntu-hpn-dev:~/test$ curl -sL yabs.sh | bash -s -- -ig Fri Mar 29 06:04:10 AM UTC 2024 Basic System Information: --------------------------------- Uptime : 0 days, 15 hours, 49 minutes Processor : QEMU Virtual CPU version 2.5+ CPU cores : 48 @ 2794.746 MHz AES-NI : ✔ Enabled VM-x/AMD-V : ❌ Disabled RAM : 31.3 GiB Swap : 8.0 GiB Disk : 100.8 GiB Distro : Ubuntu 22.04.4 LTS Kernel : 5.15.0-101-generic VM Type : KVM IPv4/IPv6 : ✔ Online / ❌ Offline IPv4 Network Information: --------------------------------- ISP : Akari Networks ASN : AS38136 Akari Networks Host : Akari Networks Limited Location : Hong Kong, Central and Western District (HCW) Country : Hong Kong fio Disk Speed Tests (Mixed R/W 50/50) (Partition 192.168.4.72:/pt_share_folder): --------------------------------- Block Size | 4k (IOPS) | 64k (IOPS) ------ | --- ---- | ---- ---- Read | 249.00 KB/s (62) | 4.85 MB/s (75) Write | 265.00 KB/s (66) | 5.09 MB/s (79) Total | 514.00 KB/s (128) | 9.95 MB/s (154) | | Block Size | 512k (IOPS) | 1m (IOPS) ------ | --- ---- | ---- ---- Read | 33.03 MB/s (64) | 51.02 MB/s (49) Write | 35.23 MB/s (68) | 54.19 MB/s (52) Total | 68.26 MB/s (132) | 105.22 MB/s (101) YABS completed in 2 min 33 sec
配置完后的效果
文件传输时,iftop看不到网络流量,应该是通过RDMA技术直接访问远程内存了
文件存储服务器重启后,docker的挂载点不需要额外的操作就可以继续访问了。
两个疑问 客户端在NFS挂载点使用fio进行测速的时候,用iftop命令是没有查看到有大流量的,但是在服务端,我使用命令 netstat -ntulp
并没有看到RDMA 20049端口的监听,应该要如何证实当前的NFS是基于RDMA的呢?
另外,如果qBittorrent下载/上传的过程中文件服务器重启/挂掉会怎样??