nfs 网络文件系统

在 debian12 下利用 nfs 实现网络文件系统

nfs 服务器端

安装 nfs server

sudo apt install nfs-kernel-server -y

准备硬盘和分区

直通一块 3.84T 的 KIOXIA CD6 pcie4 SSD 进来虚拟机。查看这块 ssd 硬盘:

lspci | grep Non-Volatile
02:00.0 Non-Volatile memory controller: KIOXIA Corporation NVMe SSD Controller Cx6 (rev 01)

硬盘分区:

sudo fdisk /dev/nvme0n1

g 转为 GPT partition table p 打印分区表 n 创建新分区,这里就只创建一个大分区。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   512G  0 disk
├─sda1        8:1    0   512M  0 part /boot/efi
├─sda2        8:2    0 465.7G  0 part /
└─sda3        8:3    0  45.8G  0 part /timeshift
nvme0n1     259:0    0   3.5T  0 disk
└─nvme0n1p1 259:1    0   3.5T  0 part

将硬盘格式化为 ext4 文件系统:

sudo mkfs.ext4 /dev/nvme0n1p1

查看 ssd 分区的 uuid:

$ sudo lsblk -f
NAME        FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1      vfat   FAT32       BE75-FC62                             505.1M     1% /boot/efi
├─sda2      ext4   1.0         81fdaf25-6712-48ee-bb53-1c4a78c8ef9f  430.4G     1% /
└─sda3      ext4   1.0         4b922cfb-2123-48ce-b9fe-635e73fb6aa8     39G     8% /timeshift
nvme0n1
└─nvme0n1p1 ext4   1.0         1dee904a-aa51-4180-b65b-9449405b841f

准备挂载这块硬盘

sudo vi /etc/fstab

增加以下内容:

# data storage was on /dev/nvme0n1p1(3.84T)
UUID=1dee904a-aa51-4180-b65b-9449405b841f /mnt/data      ext4    defaults        0       2

重启之后再看:

$ sudo lsblk -f

NAME        FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1      vfat   FAT32       BE75-FC62                             505.1M     1% /boot/efi
├─sda2      ext4   1.0         81fdaf25-6712-48ee-bb53-1c4a78c8ef9f  430.4G     1% /
└─sda3      ext4   1.0         4b922cfb-2123-48ce-b9fe-635e73fb6aa8     39G     8% /timeshift
nvme0n1
└─nvme0n1p1 ext4   1.0         1dee904a-aa51-4180-b65b-9449405b841f    3.3T     0% /mnt/data

准备伪文件系统

为了方便后续的管理,采用伪文件系统:

sudo mkdir -p /mnt/data/shared

sudo chown -R nobody:nogroup /mnt/data/shared

cd /mnt/data 

创建 export 目录:

sudo mkdir -p /exports/shared

sudo chown -R nobody:nogroup /exports

修改 /etc/fstab 文件来 mount 伪文件系统和 exports :

sudo vi /etc/fstab

增加如下内容:

# nfs exports
/mnt/data/shared /exports/shared     none bind

配置 nfs export

sudo vi /etc/exports

增加以下内容:

/exports/shared   192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)

重启 nfs-kernel-server,查看 nfs-kernel-server 的状态:

sudo systemctl restart nfs-kernel-server
sudo systemctl status nfs-kernel-server

验证:

ps -ef | grep nfs

输出为:

root         918       1  0 01:25 ?        00:00:00 /usr/sbin/nfsdcld
root        1147       2  0 01:26 ?        00:00:00 [nfsd]
root        1148       2  0 01:26 ?        00:00:00 [nfsd]
root        1149       2  0 01:26 ?        00:00:00 [nfsd]
root        1150       2  0 01:26 ?        00:00:00 [nfsd]
root        1151       2  0 01:26 ?        00:00:00 [nfsd]
root        1152       2  0 01:26 ?        00:00:00 [nfsd]
root        1153       2  0 01:26 ?        00:00:00 [nfsd]
root        1154       2  0 01:26 ?        00:00:00 [nfsd]

查看当前挂载情况:

$ sudo showmount -e
Export list for debian12:
/exports/shared 192.168.0.0/16

设置 nfs 版本支持

查看目前服务器端支持的 nfs 版本:

sudo cat /proc/fs/nfsd/versions

默认情况下,nfs server 支持的 nfs 版本为:

+3 +4 +4.1 +4.2

通常我们只需要保留 nfs 4.2 版本,其他版本都删除:

sudo vi /etc/nfs.conf

将默认的 nfsd:

[nfsd]
# debug=0
# threads=8
# host=
# port=0
# grace-time=90
# lease-time=90
# udp=n
# tcp=y
# vers3=y
# vers4=y
# vers4.0=y
# vers4.1=y
# vers4.2=y
# rdma=n
# rdma-port=20049

修改为:

[nfsd]
# debug=0
threads=32
# host=
# port=0
# grace-time=90
# lease-time=90
# udp=n
# tcp=y
vers3=n
vers4=y
vers4.0=n
vers4.1=n
vers4.2=y
# rdma=n
# rdma-port=20049

顺便把 nfs 线程数量从默认的 8 修改为 32。

重启 nfs-kernel-server:

sudo systemctl restart nfs-kernel-server

然后验证 nfs 版本:

sudo cat /proc/fs/nfsd/versions

输出为:

-3 +4 -4.0 -4.1 +4.2

注意: +4 是必须保留的,只有先设置 +4 版本,才能设置 4.0/4.1/4.2 版本,如果 -4 则 4.0/4.1/4.2 版本都会不支持。

也可以通过 rpcinfo 命令查看 nfs 版本:

rpcinfo -p localhost

输出为:

   program vers proto   port  service
    ......
    100003    4   tcp   2049  nfs

这里的 4 代表 nfs 4.x 版本,但是没法区分 4.0/4.1/4.2 版本。

nfs 客户端

安装 nfs-common

然后安装 nfs-common 作为 nfs client:

sudo apt-get install nfs-common 

配置 nfs 访问

准备好挂载点:

cd /mnt
sudo mkdir -p nfs

不带 nfsrdma 方式的挂载 nfs:

sudo mount -t nfs 192.168.3.227:/exports/shared /mnt/nfs

挂载成功后,测试一下读写速度:

cd nfs

# nfs 写入10G数据,速度大概在 610 MB/s
sudo dd if=/dev/zero of=./test-10g.img bs=1G count=10 oflag=dsync
10737418240 bytes (11 GB, 10 GiB) copied, 17.6079 s, 610 MB/s

# nfs 读取100G数据,速度大概在 1.1 GB/s
sudo dd if=./test-100g.img of=/dev/null bs=1G count=100 iflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 96.5171 s, 1.1 GB/s

对比一下在 nfs server 端直接硬盘读写 100G 数据的速度:

# 直接硬盘写入100G数据,速度大概在 1.3 GB/s
sudo dd if=/dev/zero of=./test-100g.img bs=1G count=100 oflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 82.5747 s, 1.3 GB/s

# 直接硬盘读取100G数据,速度大概在 4.0 GB/s
sudo dd if=./test-100g.img of=/dev/null bs=1G count=100 iflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 26.9138 s, 4.0 GB/s

写入性能差异很大(1.3 GB/s 降低到 610 MB/s),估计是用 pve vmbr 的网卡,导致写入性能下降。读取的性能有更大的差异(4.0 GB/s 降低到 1.1 GB/s)。

现在 nfs 服务器端和客户端之间的网络共享配置完成。