存储
- 1: Ramdisk
- 1.1: tmpfs
- 2: 用虚拟机实现的SSD NAS存储
- 3: [归档]用虚拟机实现的SSD NAS存储
- 4: [归档]用物理机实现的SSD NAS存储
- 5: [归档]用虚拟机实现的SSD NAS存储
1 - Ramdisk
1.1 - tmpfs
手工挂载
手工操作, 实验一下. 先创建挂载点
sudo mkdir -p /mnt/ramdisk
手动挂载一个 8G 的内存盘:
sudo mount -t tmpfs -o size=8G tmpfs /mnt/ramdisk
测试写入速度和读取:
sudo dd if=/dev/zero of=/mnt/ramdisk/test5g.img bs=1G count=5 oflag=dsync
sudo dd if=/mnt/ramdisk/test5g.img of=/dev/null bs=8M
不同机器的cpu和内存性能不一样, 测试出来的 ramdisk 读写性能也不一样, 以下是在家用平台的测试:
| 机器配置 | 写入性能 | 读取性能 |
|---|---|---|
| x99 + e5 2650v4 2.2GHz + ddr4 2133 | 1.4 GB/s | 5.5 GB/s |
| e3 1265l v3 + ddr3 1600 | 2.7 GB/s | 8.8 GB/s |
| intel 13900hk 5.4g + ddr4 4000 | 3.6 GB/s | 14.7 GB/s |
| intel 13700k 5.4G + ddr4 4000 | 4.3 GB/s | 17.0 GB/s |
测试完成手工卸载并删除目录:
sudo umount /mnt/ramdisk
sudo rm -rf /mnt/ramdisk
自动挂载
创建 systemd 服务 ramdisk:
sudo vi /etc/systemd/system/ramdisk.service
内容为:
[Unit]
Description=Mount tmpfs and copy data to RAM disk
DefaultDependencies=no
After=local-fs.target
Before=umount.target
[Service]
Type=oneshot
# 确保挂载点目录存在
ExecStartPre=/bin/mkdir -p /mnt/ramdisk
# 挂载 tmpfs
ExecStart=/bin/mount -t tmpfs -o size=8G tmpfs /mnt/ramdisk
# 复制数据到内存盘
ExecStart=/bin/bash -c 'if [ -d /opt/data-for-ramdisk ] && [ "$(ls -A /opt/data-for-ramdisk)" ]; then cp -a /opt/data-for-ramdisk/* /mnt/ramdisk/; else echo "Source dir missing or empty, skip copy"; fi'
# 挂载为只读
ExecStartPost=/bin/mount -o remount,ro /mnt/ramdisk
# 在关机时自动卸载
ExecStop=/bin/umount /mnt/ramdisk
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
启动, 并设置开机自动启动:
sudo systemctl daemon-reload
sudo systemctl enable ramdisk.service
sudo systemctl start ramdisk.service
2 - 用虚拟机实现的SSD NAS存储
构想
devserver192 开发服务器上,需要搭建一个 nfs 服务器,给 pve 和其他方式使用。
准备工作
准备虚拟机
基于 template-debian13-dev 的虚拟机上搭建。
硬盘直通
在虚拟机硬件中,增加两块 hard disk,大小为 1024g,scsi 类型,virtIO scsi 控制器。注意把 backup 选项勾选去掉。
能看到这块 ssd 硬盘:
$ lspci | grep storage
09:01.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI
09:02.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI
09:03.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI
因为硬盘没有分区,所以看起来是这样:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 512G 0 disk
|-sda1 8:1 0 976M 0 part /boot/efi
|-sda2 8:2 0 476.8G 0 part /
`-sda3 8:3 0 34.2G 0 part /timeshift
sdb 8:16 0 1T 0 disk
sdc 8:32 0 1T 0 disk
sdb 和 sdc 是虚拟机的磁盘,分配了 1T 容量。
硬盘分区
sudo fdisk /dev/sdb
g 转为 GPT partition table p 打印分区表 n 创建新分区,这里就只创建一个900g的大分区给 nas 用。
分区完成后执行
sudo fdisk -l
查看硬盘的情况:
Disk /dev/sda: 512 GiB, 549755813888 bytes, 1073741824 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 04D3A8CA-AB44-4DEC-8A1B-98AD4FEF1F44
Device Start End Sectors Size Type
/dev/sda1 2048 2000895 1998848 976M EFI System
/dev/sda2 2000896 1002000383 999999488 476.8G Linux filesystem
/dev/sda3 1002000384 1073739775 71739392 34.2G Linux filesystem
Disk /dev/sdc: 1 TiB, 1099511627776 bytes, 2147483648 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3d9a3f59
Device Boot Start End Sectors Size Id Type
/dev/sdc1 2048 2147483647 2147481600 1024G 83 Linux
Disk /dev/sdb: 1 TiB, 1099511627776 bytes, 2147483648 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0268fcf0
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2147483647 2147481600 1024G 83 Linux
硬盘格式化
将硬盘格式化为 ext4 文件系统:
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdc1
挂载分区
查看 sdb1 和 sdc1 两块分区的 uuid:
$ sudo lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
|-sda1 vfat FAT32 43A0-39FF 965.3M 1% /boot/efi
|-sda2 ext4 1.0 79a94e00-07b1-4621-992b-979ab27184f4 439.3G 1% /
`-sda3 ext4 1.0 b34600b0-581d-4d80-b1bf-d484d9ebc212 28.6G 9% /timeshift
sdb
`-sdb1 ext4 1.0 179f9dd8-139b-4648-bcbd-953eab84527b
sdc
`-sdc1 ext4 1.0 be5ac1c0-11b9-4dcf-bdcd-cdd9234e7fa5
执行
sudo vi /etc/fstab
查看目前现有的系统盘的三个分区的挂载情况:
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during installation
UUID=79a94e00-07b1-4621-992b-979ab27184f4 / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/sda1 during installation
UUID=43A0-39FF /boot/efi vfat umask=0077 0 1
# /timeshift was on /dev/sda3 during installation
UUID=b34600b0-581d-4d80-b1bf-d484d9ebc212 /timeshift ext4 defaults 0 2
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
增加两块 ssd 硬盘的挂载,挂载到 “/mnt/data” 和 “/mnt/app”:
# data storage was on /dev/sdb1(1t)
UUID=179f9dd8-139b-4648-bcbd-953eab84527b /mnt/data ext4 defaults 0 2
# app storage was on /dev/sdc1(1t)
UUID=be5ac1c0-11b9-4dcf-bdcd-cdd9234e7fa5 /mnt/app ext4 defaults 0 2
重启机器。再看一下分区挂载情况:
$ sudo lsblk -f
[sudo] password for sky:
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
`-sda1 ext4 1.0 be5ac1c0-11b9-4dcf-bdcd-cdd9234e7fa5 955.6G 0% /mnt/app
sdb
|-sdb1 vfat FAT32 43A0-39FF 965.3M 1% /boot/efi
|-sdb2 ext4 1.0 79a94e00-07b1-4621-992b-979ab27184f4 439.3G 1% /
`-sdb3 ext4 1.0 b34600b0-581d-4d80-b1bf-d484d9ebc212 28.6G 9% /timeshift
sdc
`-sdc1 ext4 1.0 179f9dd8-139b-4648-bcbd-953eab84527b 955.6G 0% /mnt/data
比较奇怪的是,重启之后, 三块硬盘的顺序变化了, 系统所在的硬盘原来是 sda, 现在变成 sdb 了. 好在不影响功能, 凑合这么用吧.
准备共享目录
为了方便后续的管理,采用伪文件系统:
cd /mnt/data
sudo mkdir shared
sudo mkdir pve-shared
sudo chown -R nobody:nogroup /mnt/data/shared
sudo chown -R nobody:nogroup /mnt/data/pve-shared
创建 export 目录:
sudo mkdir -p /exports/{shared,pve-shared}
sudo chown -R nobody:nogroup /exports
修改 /etc/fstab 文件来 mount 伪文件系统和 exports
sudo vi /etc/fstab
增加如下内容:
# nfs exports
/mnt/data/shared /exports/shared none bind
/mnt/data/pve-shared /exports/pve-shared none bind
重启。
搭建 nfs 服务器端
安装 nfs server
# 安装
sudo apt install nfs-kernel-server -y
# 开机自启
sudo systemctl start nfs-kernel-server
sudo systemctl enable nfs-kernel-server
# 验证
sudo systemctl status nfs-kernel-server
Nov 07 09:58:15 devserver193 systemd[1]: Starting nfs-server.service - NFS server and services...
Nov 07 09:58:15 devserver193 sh[892]: nfsdctl: lockd configuration failure
Nov 07 09:58:15 devserver193 systemd[1]: Finished nfs-server.service - NFS server and services.
备注: “nfsdctl: lockd configuration failure” 的报错可以忽略.
设置 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 export
sudo vi /etc/exports
修改 nfs exports 的内容,这里我们 export shared/pve-shared 目录:
/exports/shared 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)
/exports/pve-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
输出为:
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: enabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Fri 2025-11-07 11:04:59 CST; 4h 51min ago
Invocation: 98ff0eaeb5d640ecbf09b338cc217903
Docs: man:rpc.nfsd(8)
man:exportfs(8)
Process: 1347 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 1350 ExecStart=/bin/sh -c /usr/sbin/nfsdctl autostart || /usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Main PID: 1350 (code=exited, status=0/SUCCESS)
Mem peak: 2M
CPU: 8ms
Nov 07 11:04:59 devserver193 systemd[1]: Starting nfs-server.service - NFS server and services...
Nov 07 11:04:59 devserver193 sh[1352]: nfsdctl: lockd configuration failure
Nov 07 11:04:59 devserver193 systemd[1]: Finished nfs-server.service - NFS server and services.
验证:
ps -ef | grep nfs
输出为:
ps -ef | grep nfs
root 714 1 0 23:04 ? 00:00:00 /usr/sbin/nfsdcld
root 866 2 0 23:09 ? 00:00:00 [nfsd]
root 867 2 0 23:09 ? 00:00:00 [nfsd]
root 868 2 0 23:09 ? 00:00:00 [nfsd]
root 869 2 0 23:09 ? 00:00:00 [nfsd]
root 870 2 0 23:09 ? 00:00:00 [nfsd]
root 871 2 0 23:09 ? 00:00:00 [nfsd]
root 872 2 0 23:09 ? 00:00:00 [nfsd]
root 873 2 0 23:09 ? 00:00:00 [nfsd]
查看当前挂载情况:
$ sudo showmount -e
Export list for devserver91:
/exports/pve-shared 192.168.0.0/16
/exports/shared 192.168.0.0/16
设置 nfs 客户端
debian client
安装 nfs client:
sudo apt install nfs-common
准备目录:
sudo mkdir /mnt/shared193
挂载 nfs 到本地目录:
sudo mount -t nfs4 192.168.3.193:/exports/shared /mnt/shared193
这样就能手工将远程 /exports/shared 目录挂载到本地目录。
暂时不采用开机自动挂载的方式,避免减缓开机的速度,增加故障概率,需要 mount 时手工挂载就是。
方便起见,准备一个 mount_shared193 脚本:
sudo vi /mnt/mount_shared193.zsh
内容为:
#!/usr/bin/env zsh
# 定义变量
NFS_SERVER="192.168.3.193"
NFS_EXPORT="/exports/shared"
MOUNT_POINT="/mnt/shared193"
# 检查挂载点是否存在,不存在则创建
if [[ ! -d "$MOUNT_POINT" ]]; then
echo "创建挂载点目录: $MOUNT_POINT"
sudo mkdir -p "$MOUNT_POINT"
sudo chown "$USER:$USER" "$MOUNT_POINT" # 可选:设置当前用户为所有者
fi
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
echo "⚠️ $MOUNT_POINT 已经挂载"
else
echo "正在挂载 NFS: $NFS_SERVER:$NFS_EXPORT → $MOUNT_POINT"
sudo mount -t nfs4 "$NFS_SERVER:$NFS_EXPORT" "$MOUNT_POINT"
# 检查挂载是否成功
if [[ $? -eq 0 ]]; then
echo "✅ 挂载成功"
df -h | grep "$MOUNT_POINT" # 显示磁盘使用情况
else
echo "❌ 挂载失败,请检查:"
echo "1. NFS 服务器是否在线?"
echo "2. 客户端是否安装 nfs-common? (sudo apt install nfs-common)"
echo "3. 防火墙是否放行 NFS 端口?"
fi
fi
再准备一个 unmount_shared193 脚本:
sudo vi /mnt/unmount_shared193.zsh
内容为:
#!/usr/bin/env zsh
# 定义变量
NFS_SERVER="192.168.3.193"
NFS_EXPORT="/exports/shared"
MOUNT_POINT="/mnt/shared193"
if mount | grep -q "$MOUNT_POINT"; then
sudo umount -l "$MOUNT_POINT"
echo "✅ 已卸载 $MOUNT_POINT"
else
echo "⚠️ $MOUNT_POINT 未挂载"
fi
增加可执行权限:
sudo chmod +x /mnt/mount_shared193.zsh
sudo chmod +x /mnt/unmount_shared193.zsh
之后只要执行相应的命令就可以手工挂载和卸载 nfs shared 目录。
pve storage
在 pve 下,点击 “datacenter” -> “storage” -> “Add”

完成这个设置之后,该集群内的任何一台机器上,都会出现一个 /mnt/pve/nfs193 目录,mount 到 上面的 nfs exports。之后就可以通过这个目录像访问本地文件夹一样访问nfs。
测速和对比
挂载成功后,测试一下读写速度.
走 vmbr 虚拟网络
nfs client 运行在同一个物理机上的另一个虚拟机, 没有走物理网络, 而是走的 vmbr 网络, 测试速度为:
cd nfs
# vmbr 网络写入10G数据,速度大概在 2.1 GB/s
sudo dd if=/dev/zero of=./test-10g.img bs=1G count=10 oflag=dsync
10737418240 bytes (11 GB, 10 GiB) copied, 5.17145 s, 2.1 GB/s
# vmbr 网络写入100G数据,速度大概在 2.1 GB/s(很稳定)
sudo dd if=/dev/zero of=./test-100g.img bs=1G count=100 oflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 50.9795 s, 2.1 GB/s
# vmbr 网络读取10G数据,速度大概在 3.5 GB/s
sudo dd if=./test-10g.img of=/dev/null bs=1G count=10 iflag=dsync
10737418240 bytes (11 GB, 10 GiB) copied, 3.06611 s, 3.5 GB/s
# vmbr 网络读取100G数据,速度大概在 3.6 GB/s
sudo dd if=./test-100g.img of=/dev/null bs=1G count=100 iflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 30.1485 s, 3.6 GB/s
走 100g 物理网络
nfs 客户端在另外一台机器上的虚拟机, 走了物理网络, 两台机器之间 100g 网卡直连, 但都通过了 vmbr , 测试速度为:
cd nfs
# nfs 写入10G数据,速度大概在 1.8 GB/s
sudo dd if=/dev/zero of=./test-10g.img bs=1G count=10 oflag=dsync
10737418240 bytes (11 GB, 10 GiB) copied, 5.80745 s, 1.8 GB/s
# nfs 写入100G数据,速度大概在 2.2 GB/s(甚至比走本机 vmbr 网络的 2.1 GB还快?)
sudo dd if=/dev/zero of=./test-100g.img bs=1G count=100 oflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 49.8112 s, 2.2 GB/s
# nfs 读取10G数据,速度大概在 3.2 GB/s
sudo dd if=./test-10g.img of=/dev/null bs=1G count=10 iflag=dsync
10737418240 bytes (11 GB, 10 GiB) copied, 3.33347 s, 3.2 GB/s
# nfs 读取100G数据,速度大概在 3 GB/s
sudo dd if=./test-100g.img of=/dev/null bs=1G count=100 iflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 35.2614 s, 3.0 GB/s
本机直接访问硬盘
对比一下在 nfs server 端直接硬盘读写 100G 数据的速度:
# 本地硬盘写入10G数据,速度大概在 3.1 GB/s
sudo dd if=/dev/zero of=./test-10g.img bs=1G count=10 oflag=dsync
10737418240 bytes (11 GB, 10 GiB) copied, 3.49949 s, 3.1 GB/s
# 本地硬盘写入100G数据,速度大概在 2.9 GB/s
sudo dd if=/dev/zero of=./test-100g.img bs=1G count=100 oflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 37.1302 s, 2.9 GB/s
# 本地硬盘读取10G数据,速度大概在 5.4 GB/s
sudo dd if=./test-10g.img of=/dev/null bs=1G count=10 iflag=dsync
10737418240 bytes (11 GB, 10 GiB) copied, 1.97764 s, 5.4 GB/s
# 本地硬盘读取100G数据,速度大概在 5.6 GB/s
sudo dd if=./test-100g.img of=/dev/null bs=1G count=100 iflag=dsync
107374182400 bytes (107 GB, 100 GiB) copied, 19.311 s, 5.6 GB/s
速度对比
物理硬盘为凯侠 CD6 3.84T nvme SSD, u2 接口, pcie 4.0 接口.
| 持续写入 10 GB | 持续写入 100 GB | 持续读取 10 GB | 持续读取 100 GB | |
|---|---|---|---|---|
| vmbr 网络 | 2.1 GB/s | 2.1 GB/s | 3.5 GB/s | 3.6 GB/s |
| nfs 100g 网络 | 1.8 GB/s | 2.2 GB/s | 3.2 GB/s | 3.0 GB/s |
| 本地硬盘 | 3.1 GB/s | 2.9 GB/s | 5.4 GB/s | 5.6 GB/s |
3 - [归档]用虚拟机实现的SSD NAS存储
归档原因: 换用 4T SSD, 然后不再直通单独的 1T SSD.
构想
devserver91 开发服务器上,需要搭建一个 nfs 服务器,给 pve 和其他方式使用。
准备工作
准备虚拟机
基于 template-debian12-dev 的虚拟机上搭建。
硬盘直通
在开启 pve 直通的基础上,将两块三星 pm983a 900g 的 ssd 硬盘直通到 devserver91 虚拟机中。
能看到这块 ssd 硬盘:
$ lspci | grep Non-Volatile
01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
02:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
因为硬盘没有分区,所以看起来是这样:
$ 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 838.4G 0 disk
nvme1n1 259:1 0 838.4G 0 disk
sda 是虚拟机的磁盘,虚拟了 512g。
nvme0n1 和 nvme1n1 是直通进来的 ssd 硬盘,900G 大小但实际可用大小为 838G。
硬盘分区
sudo fdisk /dev/nvme0n1
g 转为 GPT partition table p 打印分区表 n 创建新分区,这里就只创建一个900g的大分区给 nas 用。
分区完成后查看这块硬盘的情况:
sudo fdisk -l
Disk /dev/nvme0n1: 838.36 GiB, 900185481216 bytes, 219771846 sectors
Disk model: MZ1LB960HBJR-000FB
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 131072 bytes / 131072 bytes
Disklabel type: gpt
Disk identifier: 5BA21D3B-9403-0B4B-9399-E72086BE6F46
Device Start End Sectors Size Type
/dev/nvme0n1p1 256 219771647 219771392 838.4G Linux filesystem
Disk /dev/nvme1n1: 838.36 GiB, 900185481216 bytes, 219771846 sectors
Disk model: MZ1LB960HBJR-000FB
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 131072 bytes / 131072 bytes
Disklabel type: gpt
Disk identifier: 39AFF853-D9C1-7841-93CB-83DD3A83C7F0
Device Start End Sectors Size Type
/dev/nvme1n1p1 256 219771647 219771392 838.4G Linux filesystem
Disk /dev/sda: 512 GiB, 549755813888 bytes, 1073741824 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 784AC8F8-8E2A-4A0D-A9AD-D3056175791B
Device Start End Sectors Size Type
/dev/sda1 2048 1050623 1048576 512M EFI System
/dev/sda2 1050624 977612799 976562176 465.7G Linux filesystem
/dev/sda3 977612800 1073739775 96126976 45.8G Linux filesystem
硬盘格式化
将硬盘格式化为 ext4 文件系统:
sudo mkfs.ext4 /dev/nvme0n1p1
sudo mkfs.ext4 /dev/nvme1n1p1
挂载分区
查看 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 429G 1% /
└─sda3
ext4 1.0 4b922cfb-2123-48ce-b9fe-635e73fb6aa8 37.7G 11% /timeshift
nvme0n1
└─nvme0n1p1
nvme1n1
└─nvme1n1p1
执行
sudo vi /etc/fstab
查看目前现有的三个分区的挂载情况:
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during installation
UUID=81fdaf25-6712-48ee-bb53-1c4a78c8ef9f / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/sda1 during installation
UUID=BE75-FC62 /boot/efi vfat umask=0077 0 1
# /timeshift was on /dev/sda3 during installation
UUID=4b922cfb-2123-48ce-b9fe-635e73fb6aa8 /timeshift ext4 defaults 0 2
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
增加两块 ssd 硬盘的挂载,挂载到 “/mnt/data” 和 “/mnt/app”:
# data storage was on /dev/nvme0n1p1(960g)
UUID=be0b8bd0-edf1-49c2-b08d-dfc2d064c5ee /mnt/data ext4 defaults 0 2
# app storage was on /dev/nvme1n1p1(960g)
UUID=64e00394-bc95-4ca6-996d-7827f77e3a0d /mnt/app 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 429G 1% /
└─sda3 ext4 1.0 4b922cfb-2123-48ce-b9fe-635e73fb6aa8 37.6G 11% /timeshift
nvme1n1
└─nvme1n1p1 ext4 1.0 64e00394-bc95-4ca6-996d-7827f77e3a0d 782.2G 0% /mnt/app
nvme0n1
└─nvme0n1p1 ext4 1.0 be0b8bd0-edf1-49c2-b08d-dfc2d064c5ee 782.1G 0% /mnt/data
准备共享目录
为了方便后续的管理,采用伪文件系统:
cd /mnt/data
sudo mkdir shared
sudo mkdir pve-shared
sudo chown -R nobody:nogroup /mnt/data/shared
sudo chown -R nobody:nogroup /mnt/data/pve-shared
创建 export 目录:
sudo mkdir -p /exports/{shared,pve-shared}
sudo chown -R nobody:nogroup /exports
修改 /etc/fstab 文件来 mount 伪文件系统和 exports
sudo vi /etc/fstab
增加如下内容:
# nfs exports
/mnt/data/shared /exports/shared none bind
/mnt/data/pve-shared /exports/pve-shared none bind
重启。
搭建 nas
安装 nfs server
# 安装
sudo apt install nfs-kernel-server -y
# 开机自启
sudo systemctl start nfs-kernel-server
sudo systemctl enable nfs-kernel-server
# 验证
sudo systemctl status nfs-kernel-server
Jan 29 20:40:15 skynas3 systemd[1]: Starting nfs-server.service - NFS server and services...
Jan 29 20:40:15 skynas3 exportfs[1422]: exportfs: can't open /etc/exports for reading
Jan 29 20:40:16 skynas3 systemd[1]: Finished nfs-server.service - NFS server and services.
设置 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 export
sudo vi /etc/exports
修改 nfs exports 的内容,这里我们 export shared/pve-shared 目录:
/exports/shared 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)
/exports/pve-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
输出为:
nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; preset: enabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Wed 2024-03-20 23:09:19 EDT; 17ms ago
Process: 863 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 864 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Main PID: 864 (code=exited, status=0/SUCCESS)
CPU: 7ms
Mar 20 23:09:19 skynas3 systemd[1]: Starting nfs-server.service - NFS server and services...
Mar 20 23:09:19 skynas3 systemd[1]: Finished nfs-server.service - NFS server and services.
验证:
ps -ef | grep nfs
输出为:
ps -ef | grep nfs
root 714 1 0 23:04 ? 00:00:00 /usr/sbin/nfsdcld
root 866 2 0 23:09 ? 00:00:00 [nfsd]
root 867 2 0 23:09 ? 00:00:00 [nfsd]
root 868 2 0 23:09 ? 00:00:00 [nfsd]
root 869 2 0 23:09 ? 00:00:00 [nfsd]
root 870 2 0 23:09 ? 00:00:00 [nfsd]
root 871 2 0 23:09 ? 00:00:00 [nfsd]
root 872 2 0 23:09 ? 00:00:00 [nfsd]
root 873 2 0 23:09 ? 00:00:00 [nfsd]
查看当前挂载情况:
$ sudo showmount -e
Export list for devserver91:
/exports/pve-shared 192.168.0.0/16
/exports/shared 192.168.0.0/16
nfs客户端
安装 nfs client:
sudo apt install nfs-common
准备目录:
sudo mkdir /mnt/shared91
sudo mount -t nfs4 192.168.3.91:/exports/shared /mnt/shared91
这样就能手工将远程 /exports/shared 目录挂载到本地目录。
暂时不采用开机自动挂载的方式,避免减缓开机的速度,增加鼓掌概率,需要 mount 时手工挂载就是。
方便起见,准备一个 mount_shared91 脚本:
sudo vi /mnt/mount_shared91.zsh
内容为:
#!/usr/bin/env zsh
# 定义变量
NFS_SERVER="192.168.3.91"
NFS_EXPORT="/exports/shared"
MOUNT_POINT="/mnt/shared91"
# 检查挂载点是否存在,不存在则创建
if [[ ! -d "$MOUNT_POINT" ]]; then
echo "创建挂载点目录: $MOUNT_POINT"
sudo mkdir -p "$MOUNT_POINT"
sudo chown "$USER:$USER" "$MOUNT_POINT" # 可选:设置当前用户为所有者
fi
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
echo "⚠️ $MOUNT_POINT 已经挂载"
else
echo "正在挂载 NFS: $NFS_SERVER:$NFS_EXPORT → $MOUNT_POINT"
sudo mount -t nfs4 "$NFS_SERVER:$NFS_EXPORT" "$MOUNT_POINT"
# 检查挂载是否成功
if [[ $? -eq 0 ]]; then
echo "✅ 挂载成功"
df -h | grep "$MOUNT_POINT" # 显示磁盘使用情况
else
echo "❌ 挂载失败,请检查:"
echo "1. NFS 服务器是否在线?"
echo "2. 客户端是否安装 nfs-common? (sudo apt install nfs-common)"
echo "3. 防火墙是否放行 NFS 端口?"
fi
fi
再准备一个 unmount_shared91 脚本:
sudo vi /mnt/unmount_shared91.zsh
内容为:
#!/usr/bin/env zsh
# 定义变量
NFS_SERVER="192.168.3.91"
NFS_EXPORT="/exports/shared"
MOUNT_POINT="/mnt/shared91"
if mount | grep -q "$MOUNT_POINT"; then
sudo umount -l "$MOUNT_POINT"
echo "✅ 已卸载 $MOUNT_POINT"
else
echo "⚠️ $MOUNT_POINT 未挂载"
fi
增加可执行权限:
sudo chmod +x /mnt/mount_shared91.zsh
sudo chmod +x /mnt/unmount_shared91.zsh
之后只要执行相应的命令就可以手工挂载和卸载 nfs shared 目录。
pve nfs storage
在 pve 下,点击 “datacenter” -> “storage” -> “Add”

完成这个设置之后,该集群内的任何一台机器上,都会出现一个 /mnt/pve/nfs91 目录,mount 到 上面的 nfs exports。之后就可以通过这个目录像访问本地文件夹一样访问nfs。
参考资料
4 - [归档]用物理机实现的SSD NAS存储
归档说明: 为了方便还是安装为 pve 虚拟机了。
构想
在前面实现的软交换的基础上,顺便实现一个SSD NAS,方便其他机器存储资料,如 pve 相关的虚拟机备份/模版/iso等。
这样就实现了 56g 网络 + 高速 SSD 的 NAS。
备注:因为兼容性原因,56g的 hp544+ 这块 cx3 pro 的网卡无法直通多块网卡给单个虚拟机(可以直通一块卡,两块就报错,换cx4以上就正常),所以这台机器使用的是物理机安装 debian 12.7。
准备工作
准备物理机
软交换机器为了性能和兼容采用的是物理机方式安装 debian,插了四块 hp544+ 网卡,实现了 40g/56g 软交换。
基于 40g/56g 网卡的高速网络已经满足。
硬盘情况
机器上目前是一块256g的三星pm981a用来安装 debian 操作系统,两块三星pm983a 1t 用来做 nas,lspci 能看到这三块 ssd 硬盘:
$ lspci | grep Non-Volatile
03:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
04:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
07:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
还有一块东芝 mg08 14t 的机械硬盘,准备用来做资料备份。
分区情况:
$ sudo lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 12.7T 0 disk
sda1 8:1 0 12.7T 0 part /var/data3
nvme1n1 259:0 0 838.4G 0 disk
nvme0n1 259:1 0 838.4G 0 disk
nvme1n1p1 259:2 0 838.4G 0 part /var/data2
nvme0n1p1 259:3 0 838.4G 0 part /var/data
nvme2n1 259:4 0 238.5G 0 disk
nvme2n1p1 259:5 0 512M 0 part /boot/efi
nvme2n1p2 259:6 0 186.3G 0 part /
nvme2n1p3 259:7 0 51.7G 0 part /var/timeshift
用 fdisk 看更清晰一些:
$ sudo fdisk -l
Disk /dev/nvme1n1: 838.36 GiB, 900185481216 bytes, 1758174768 sectors
Disk model: MZ1LB960HBJR-000FB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 131072 bytes / 131072 bytes
Disklabel type: gpt
Disk identifier: B724F254-A8C9-4FDD-B030-B68A85D4F6FD
Device Start End Sectors Size Type
/dev/nvme1n1p1 2048 1758173183 1758171136 838.4G Linux filesystem
Disk /dev/nvme0n1: 838.36 GiB, 900185481216 bytes, 1758174768 sectors
Disk model: MZ1LB960HBJR-000FB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 131072 bytes / 131072 bytes
Disklabel type: gpt
Disk identifier: D495383E-8798-4B53-BED6-4CB6BBA29B74
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1758173183 1758171136 838.4G Linux filesystem
Disk /dev/nvme2n1: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: SAMSUNG MZVLB256HBHQ-000L7
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F33C8916-7384-11EF-A4EE-8B1FC28B9DC5
Device Start End Sectors Size Type
/dev/nvme2n1p1 2048 1050623 1048576 512M EFI System
/dev/nvme2n1p2 1050624 391675903 390625280 186.3G Linux filesystem
/dev/nvme2n1p3 391675904 500117503 108441600 51.7G Linux filesystem
Disk /dev/sda: 12.73 TiB, 14000519643136 bytes, 27344764928 sectors
Disk model: TOSHIBA MG08ACA1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: D64050D6-6671-0C41-9881-3E1CECCD24C1
Device Start End Sectors Size Type
/dev/sda1 2048 27344762879 27344760832 12.7T Linux filesystem
准备使用 /dev/nvme1n1p1 / /dev/nvme0n1p1 / /dev/sda1 这三个分区来存放 nfs 共享文件。在根目录下建立 “/data” 目录:
sudo mkdir /data
修改 timeshift 配置,将 /data 加入到 excludes 。
搭建 nas 服务器端
安装 nfs server
# 安装
sudo apt install nfs-kernel-server -y
# 开机自启
sudo systemctl start nfs-kernel-server
sudo systemctl enable nfs-kernel-server
# 验证
sudo systemctl status nfs-kernel-server
● nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; preset: enabled)
Active: active (exited) since Tue 2024-09-17 04:06:44 CST; 28s ago
Main PID: 1901 (code=exited, status=0/SUCCESS)
CPU: 6ms
Sep 17 04:06:42 switch99 systemd[1]: Starting nfs-server.service - NFS server and services...
Sep 17 04:06:42 switch99 exportfs[1900]: exportfs: can't open /etc/exports for reading
Sep 17 04:06:44 switch99 systemd[1]: Finished nfs-server.service - NFS server and services.
配置 nfs v4
sudo vi /etc/default/nfs-common
修改内容如下
NEED_STATD="no"
NEED_IDMAPD="yes"
继续修改 nfs-kernel-server 的配置:
sudo vi /etc/default/nfs-kernel-server
修改内容:
# 这行新增
RPCNFSDOPTS="-N 2 -N 3"
# 这行已经存在,修改内容
RPCMOUNTDOPTS="--manage-gids -N 2 -N 3"
# 其他不动
重启 nfs-server
sudo systemctl restart nfs-server
配置 UFW 防火墙
安装 nfs 之后必须配置防火墙。先安装 ufw:
sudo apt install ufw -y
安装完成之后第一个必须执行的步骤就是开放 ssh 登录:
sudo ufw allow ssh
sudo ufw enable
然后是容许访问 nfs
sudo ufw allow from 192.168.0.0/16 to any port nfs
重启 ufw 并查看 ufw 状态:
sudo ufw reload
sudo ufw status
可以看到 2049 端口开放给 nfs 了。
$ sudo ufw status
[sudo] password for sky:
Firewall reloaded
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
2049 ALLOW 192.168.0.0/16
22/tcp (v6) ALLOW Anywhere (v6)
备注:暂时不知道为什么 ufw 开启之后就无法访问 nfs 了,上面的 allow rule 没能生效。只好暂时先 sudo ufw disable 关闭防火墙先。
准备共享目录
为了方便后续的管理,采用伪文件系统
sudo mkdir -p /data/{share,pve-share}
sudo chown -R nobody:nogroup /data/share
sudo chown -R nobody:nogroup /data/pve-share
创建 export 目录:
sudo mkdir -p /exports/{share,pve-share}
sudo chown -R nobody:nogroup /exports
修改 /etc/fstab 文件来 mount 伪文件系统和 exports
sudo vi /etc/fstab
增加如下内容:
# nfs exports
/data/share /exports/share none bind
/data/pve-share /exports/pve-share none bind
配置 nfs export
sudo vi /etc/exports
修改 nfs exports 的内容:
/exports/share 192.168.0.0/16(rw,no_root_squash,no_subtree_check,crossmnt,fsid=0)
/exports/pve-share 192.168.0.0/16(rw,no_root_squash,no_subtree_check,crossmnt,fsid=0)
重启 nfs-kernel-server,查看 nfs-kernel-server 的状态:
sudo systemctl restart nfs-kernel-server
sudo systemctl status nfs-kernel-server
输出为:
nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; preset: enabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Mon 2024-03-18 21:11:34 CST; 21ms ago
Process: 6678 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 6679 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Main PID: 6679 (code=exited, status=0/SUCCESS)
CPU: 7ms
Mar 18 21:11:34 switch99 systemd[1]: Starting nfs-server.service - NFS server and services...
Mar 18 21:11:34 switch99 systemd[1]: Finished nfs-server.service - NFS server and services.
验证:
ps -ef | grep nfs
输出为:
root 4438 1 0 20:24 ? 00:00:00 /usr/sbin/nfsdcld
root 6682 2 0 21:11 ? 00:00:00 [nfsd]
root 6683 2 0 21:11 ? 00:00:00 [nfsd]
root 6684 2 0 21:11 ? 00:00:00 [nfsd]
root 6685 2 0 21:11 ? 00:00:00 [nfsd]
root 6686 2 0 21:11 ? 00:00:00 [nfsd]
root 6687 2 0 21:11 ? 00:00:00 [nfsd]
root 6688 2 0 21:11 ? 00:00:00 [nfsd]
root 6689 2 0 21:11 ? 00:00:00 [nfsd]
查看当前挂载情况:
sudo showmount -e
输出为:
Export list for switch99:
/exports 192.168.0.0/255.255.0.0
nfs客户端
pve nfs storage
在 pve 下,点击 “datacenter” -> “storage” -> “Add”

备注: nfs version 这里无法选择 4 / 4.1 / 4.2,只能选择 default 。后续再看。
完成这个设置之后,该集群内的任何一台机器上,都会出现一个 /mnt/pve/nfs99 目录,mount 到 上面的 nfs exports。之后就可以通过这个目录像访问本地文件夹一样访问nfs。
清理 /mnt/pve 目录
如果多次操作 nfs 存储,比如添加后再删除,则在 /mnt/pve/nfs99 目录下会残留一些数据,如:
ls -la
ls: cannot access 'nfs-test11': Stale file handle
total 12
drwxr-xr-x 4 root root 4096 Mar 18 22:26 .
drwxr-xr-x 3 root root 4096 Mar 18 22:23 ..
drwxr-xr-x 7 nobody nogroup 4096 Mar 18 22:26 nfs99
d????????? ? ? ? ? ? nfs-test11
这个 nfs-test11 就是删除之后的残余,不能直接删除:
rm -rf nfs-test11
rm: cannot remove 'nfs-test11': Is a directory
而是要使用 umount 命令:
$ sudo umount nfs-test11
$ ls -la
total 16
drwxr-xr-x 4 root root 4096 Mar 18 22:26 .
drwxr-xr-x 3 root root 4096 Mar 18 22:23 ..
drwxr-xr-x 7 nobody nogroup 4096 Mar 18 22:26 nfs99
drwxr-xr-x 2 root root 4096 Mar 18 22:23 nfs-test11
$ sudo rm -rf nfs-test11
复制 pve 文件
在 pve 页面上查看 backup 里面需要复制的备份,主要看虚拟机 id 和时间。
对于已经加入 pve 集群的机器,本地已经 mount 了 /mnt/pve/nfs99 目录,因此可以直接执行 cp 命令复制到 nfs 上:
cp /var/lib/vz/dump/vzdump-qemu-101-2024_02_12-16_13_09.* /mnt/pve/nfs99/dump
对于还没有加入 pve 集群的机器,需要先手工 mount nfs 到本地:
sudo mkdir -p /mnt/pve/nfs
sudo mount.nfs 192.168.0.99:/exports/pve-share /mnt/pve/nfs
# mount.nfs4 会报错,暂时不清楚问题出在哪里,mount.nfs 就可以正常使用
# sudo mount.nfs4 192.168.0.99:/exports/pve-share /mnt/pve/nfs
然后再复制 backup 文件:
cp /var/lib/vz/dump/vzdump-qemu-101-2024_02_12-16_13_09.* /mnt/pve/nfs/dump
为了方便备份各个机器独有的文件(而不是模版等可以共享的文件),在这个 nfs 目录下新建一个 node-backup 目录,并为每个节点建立一个子目录:
mkdir -p /mnt/pve/nfs/node-backup/skyserver4/dump
然后就可以复制
cp xxxx /mnt/pve/nfs/node-backup/skyserver4/dump
参考资料
5 - [归档]用虚拟机实现的SSD NAS存储
归档说明: nfs on rdma 没能搞定,nfs 访问的速度很一般,放弃。
构想
在前面实现的软交换的基础上,直通一块 4t 的国产 pcie4 ssd 进入(型号为爱国者 p7000z),实现一个小型的纯 SSD NAS。
未来可能会陆续加入多块 ssd 进行扩容。
这样就实现了 25g 网络 + 高速 SSD 的 NAS。
准备工作
准备虚拟机
之前的利用 linux bridge 实现软交换的解决方案中,已经建立了一个名为 skynas3 的虚拟机。
基于 25g 网卡的高速网络已经满足。
硬盘直通
在开启 pve 直通的基础上,将硬盘直通到 skynas3 虚拟机中。
能看到这块 ssd 硬盘:
$ lspci | grep Non-Volatile
03:00.0 Non-Volatile memory controller: MAXIO Technology (Hangzhou) Ltd. NVMe SSD Controller MAP1602 (rev 01)
因为硬盘没有分区,所以看起来是这样:
lsblk -l
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
sr0 11:0 1 3.7G 0 rom
nvme0n1 259:0 0 3.7T 0 disk
sda 是虚拟机的磁盘,虚拟了 512g。
nvme0n1 是直通进来的 ssd 硬盘,4t 大小但实际为 3.7 T。
用 fdisk 看更清晰一些:
$ sudo fdisk -l
[sudo] password for sky:
Disk /dev/sda: 512 GiB, 549755813888 bytes, 1073741824 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D53AE25D-B704-4192-A436-54BD53A9DAC0
Device Start End Sectors Size Type
/dev/sda1 2048 1050623 1048576 512M EFI System
/dev/sda2 1050624 977612799 976562176 465.7G Linux filesystem
/dev/sda3 977612800 1073739775 96126976 45.8G Linux filesystem
Disk /dev/nvme0n1: 3.73 TiB, 4096805658624 bytes, 8001573552 sectors
Disk model: aigo NVMe SSD P7000Z 4TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9F1409D0-DA10-5446-8662-4ADAFBF1128F
硬盘分区
sudo fdisk /dev/nvme0n1
g 转为 GPT partition table p 打印分区表 n 创建新分区,这里就只创建一个4t的大分区给 nas 用。
参考:
分区完成后查看这块硬盘的情况:
$ sudo fdisk -l
Disk /dev/nvme0n1: 3.73 TiB, 4096805658624 bytes, 8001573552 sectors
Disk model: aigo NVMe SSD P7000Z 4TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: BCA9FF34-B3F2-B44D-B385-041E061B8F52
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 8001572863 8001570816 3.7T Linux filesystem
将这个分区格式化为 ext4 格式:
sudo mkfs.ext4 /dev/nvme0n1p1
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 1000196352 4k blocks and 250052608 inodes
Filesystem UUID: 1b50172f-44fd-46a3-8499-b169d7d91eac
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
挂载分区
查看 ssd 分区的 uuid:
sudo lsblk -f
[sudo] password for sky:
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat FAT32 80D7-F301 505.1M 1% /boot/efi
├─sda2 ext4 1.0 59bbb3ad-27e7-4e1e-b40e-0e6a8a8386cc 430.8G 1% /
└─sda3 ext4 1.0 d5aaad4b-8382-4153-adfc-f7c797e74ee5 38.6G 9% /timeshift
nvme0n1
└─nvme0n1p1 ext4 1.0 b4e82288-5290-4d64-a45e-94c4ef657611
执行
sudo vi /etc/fstab
查看目前现有的三个分区的挂载情况:
# / was on /dev/sda2 during installation
UUID=59bbb3ad-27e7-4e1e-b40e-0e6a8a8386cc / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/sda1 during installation
UUID=80D7-F301 /boot/efi vfat umask=0077 0 1
# /timeshift was on /dev/sda3 during installation
UUID=d5aaad4b-8382-4153-adfc-f7c797e74ee5 /timeshift ext4 defaults 0 2
增加第一块 ssd 硬盘的挂载,挂载到 “/mnt/storage1”:
# /storage1 was on /dev/nvme0n1p1(aigo p7000z 4t)
UUID=b4e82288-5290-4d64-a45e-94c4ef657611 /mnt/storage1 ext4 defaults 0 2
重启机器。再看一下分区挂载情况:
$ sudo lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat FAT32 80D7-F301 505.1M 1% /boot/efi
├─sda2 ext4 1.0 59bbb3ad-27e7-4e1e-b40e-0e6a8a8386cc 430.7G 1% /
└─sda3 ext4 1.0 d5aaad4b-8382-4153-adfc-f7c797e74ee5 38.6G 9% /timeshift
nvme0n1
└─nvme0n1p1 ext4 1.0 b4e82288-5290-4d64-a45e-94c4ef657611 3.5T 0% /mnt/storage1
准备共享目录
为了方便后续的管理,采用伪文件系统:
cd /mnt/storage1
sudo mkdir share
sudo mkdir pve-share
sudo chown -R nobody:nogroup /mnt/storage1/share
sudo chown -R nobody:nogroup /mnt/storage1/pve-share
创建 export 目录:
sudo mkdir -p /exports/{share,pve-share}
sudo chown -R nobody:nogroup /exports
修改 /etc/fstab 文件来 mount 伪文件系统和 exports
sudo vi /etc/fstab
增加如下内容:
# nfs exports
/mnt/storage1/share /exports/share none bind
/mnt/storage1/pve-share /exports/pve-share none bind
重启。
搭建 nas
安装 nfs server
# 安装
sudo apt install nfs-kernel-server -y
# 开机自启
sudo systemctl start nfs-kernel-server
sudo systemctl enable nfs-kernel-server
# 验证
sudo systemctl status nfs-kernel-server
Jan 29 20:40:15 skynas3 systemd[1]: Starting nfs-server.service - NFS server and services...
Jan 29 20:40:15 skynas3 exportfs[1422]: exportfs: can't open /etc/exports for reading
Jan 29 20:40:16 skynas3 systemd[1]: Finished nfs-server.service - NFS server and services.
配置 nfs v4
sudo vi /etc/default/nfs-common
修改内容如下
NEED_STATD="no"
NEED_IDMAPD="yes"
继续修改 nfs-kernel-server 的配置:
sudo vi /etc/default/nfs-kernel-server
修改内容:
# 这行新增
RPCNFSDOPTS="-N 2 -N 3"
# 这行已经存在,修改内容
RPCMOUNTDOPTS="--manage-gids -N 2 -N 3"
# 其他不动
配置 nfs export
sudo vi /etc/exports
修改 nfs exports 的内容,这里我们先 export 第一块4t ssd 硬盘的 share/pve-share 目录:
/exports/share 192.168.0.0/16(rw,no_root_squash,no_subtree_check,crossmnt,fsid=0)
/exports/pve-share 192.168.0.0/16(rw,no_root_squash,no_subtree_check,crossmnt,fsid=0)
重启 nfs-kernel-server,查看 nfs-kernel-server 的状态:
sudo systemctl restart nfs-kernel-server
sudo systemctl status nfs-kernel-server
输出为:
nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; preset: enabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Wed 2024-03-20 23:09:19 EDT; 17ms ago
Process: 863 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 864 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Main PID: 864 (code=exited, status=0/SUCCESS)
CPU: 7ms
Mar 20 23:09:19 skynas3 systemd[1]: Starting nfs-server.service - NFS server and services...
Mar 20 23:09:19 skynas3 systemd[1]: Finished nfs-server.service - NFS server and services.
验证:
ps -ef | grep nfs
输出为:
ps -ef | grep nfs
root 714 1 0 23:04 ? 00:00:00 /usr/sbin/nfsdcld
root 866 2 0 23:09 ? 00:00:00 [nfsd]
root 867 2 0 23:09 ? 00:00:00 [nfsd]
root 868 2 0 23:09 ? 00:00:00 [nfsd]
root 869 2 0 23:09 ? 00:00:00 [nfsd]
root 870 2 0 23:09 ? 00:00:00 [nfsd]
root 871 2 0 23:09 ? 00:00:00 [nfsd]
root 872 2 0 23:09 ? 00:00:00 [nfsd]
root 873 2 0 23:09 ? 00:00:00 [nfsd]
查看当前挂载情况:
sudo showmount -e
输出为:
Export list for skynas3:
/exports/pve-share 192.168.0.0/16
/exports/share 192.168.0.0/16
nfs客户端
pve nfs storage
在 pve 下,点击 “datacenter” -> “storage” -> “Add”

备注: nfs version 这里无法选择 4 / 4.1 / 4.2,只能选择 default 。后续再看。
完成这个设置之后,该集群内的任何一台机器上,都会出现一个 /mnt/pve/nfs99 目录,mount 到 上面的 nfs exports。之后就可以通过这个目录像访问本地文件夹一样访问nfs。
遇到的问题
nfs 残余数据
期间遇到一个问题,我先创建了一个 nfs storage,指向了 share 目录。后来发现需要 export 两个目录,普通 share 和 pve 专用的 pve-share,避免将两者的文件混合起来。
然后就遇到问题:旧的 nfs storage 删除之后,再创建同名的 nfs storage 指向新的 pve-share,但实际操作的依然是旧的 share。反复尝试过各种方法都无效。
- 清理
/mnt/pve/目录 - 清理
/var/lib/rrdcached/db/pve2-storage/目录
sudo find / -type f -exec grep "nfs02" {} \;
grep: /var/log/journal/4ba9084c7be94c57a943bf7c2aa034a5/system.journal: binary file matches
update /var/lib/rrdcached/db/pve2-storage/skyaio2/nfs02 1710992038:4031332220928:0
只好在清理完这些信息之后,再用一个新的名字重新创建 nfs storage,比如 nfs02-ssd 。