win10 nfs客户端配置以访问Linux文件系统(以vmware workstation中ArchLinux作为虚拟服务器,解决乱码问题,nfs固定端口转发)

这里使用ArchLinux作为虚拟机服务器系统,客户端是win10 ltsc,首先在win10上启用nfs客户端和nfs管理程序。

首先,在主机上安装vmware workstation 16 pro,注册许可後,创建虚拟机。

一、服务器系统安装
这里只需要安装最基本的ArchLinux,占用空间约为2G,分配内存1G,处理器2核,使用NAT网络(端口映射,要求与主机能ping通)。
由于使用桥接网络会受主机网络链路速度影响,所以应该使用主机内部网络,NAT网络是一个较好选择。
在虚拟机设置中,添加物理磁盘,使用UEFI固件【重要】。
【注:所有命令都必须手动输入】
先进入archiso,使用"ip a"命令查看IP地址,然後使用ping命令检查网络。
更新系统时间:timedatectl set-ntp true
注:查看块设备命令:lsblk # 能方便查看存储设备
1、建立分区:
创建GPT分区表:
parted /dev/sdX # /dev/sdX 是虚拟磁盘设备名,动态分配8G
(parted) mklabel
New disk label type? gpt
(parted) q
创建efi分区和linux root分区:
使用cfdisk命令:cfdisk /dev/sdX
依次创建两个分区,第一个0.5G作为efi分区(修改Type值),第二个划分剩余空间作为根分区。写入之後退出cfdisk.
格式化分区并挂载:
mkfs.fat -F32 /dev/sdX1 # efi分区格式化为fat32
mkfs.ext4 -b 4096 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdX2 # linux root分区格式化为ext4(不启用惰性初始化)
mount /dev/sdX2 /mnt
mkdir /mnt/boot
mount /dev/sdX1 /mnt/boot # 不区分efi分区和boot分区,两者使用同一分区
不需要交换分区,也没必要支持休眠。
2、安装系统:
添加国内软件源:vim /etc/pacman.d/mirrorlist
添加以下内容:(任一)
##清华
Server = http://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
##中科大
Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
更新:pacman -Syy
安装必须的软件包:
pacstrap /mnt base linux linux-firmware vim networkmanager
【注意:还需安装其他软件包以支持其他Linux文件系统,如:】
Linux Raid:pacstrap /mnt mdadm
挂载nfs共享必须的目录,将物理磁盘上文件系统挂载到/mnt/mnt下的目录上。
配置fstab:genfstab -U /mnt >> /mnt/etc/fstab # 根据/mnt下挂载的文件系统自动生成fstab,请用命令检查fstab:cat /mnt/etc/fstab
chroot到新系统:arch-chroot /mnt
设置时区:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
本地化:
vim /etc/locale.gen # 修改文件,去掉en_US.UTF-8 UTF-8之行首的#号(i进入Insert模式,esc退出後输入":wq"保存)
vim /etc/locale.conf # 创建文件,内容为"LANG=en_US.UTF-8"
网络配置:
vim /etc/hostname # 创建文件,内容为虚拟机hostname
vim /etc/hosts # 添加内容如下:
127.0.0.1    localhost
::1        localhost
127.0.1.1    myhostname.localdomain    myhostname
# myhostname是虚拟机hostname
设置root密码:passwd
安装Grub:
pacman -S grub efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch # Arch是启动项名字
vim /etc/default/grub # 编辑"GRUB_TIMEOUT=5"这行,改为"GRUB_TIMEOUT=0",以开机直接进入系统
grub-mkconfig -o /boot/grub/grub.cfg
退出chroot并重启:
exit
umount -R /mnt
#reboot
poweroff # 在虚拟机环境推荐直接关机,然後去掉安装iso文件的虚拟设备再开机
3、配置系统
首先登陆到新系统,需要先配置网络:
systemctl enable --now NetworkManager
ip a # 查看IP地址
ping wwww.baidu.com
新建用户:useradd -m -G wheel username && passwd username # 可跳过
安装nfs-utils:pacman -S nfs-utils
注:默认安装包含systemd-timesyncd时间守护进程,所以不需要额外安装
配置nfs-server:
vim /etc/exports # 添加内容示例如下:
/mnt 192.168.0.0/16(rw,async,all_squash,no_subtree_check,crossmnt,fsid=0) # crossmnt允许访问共享目录的子文件系统,fsid=0指定导出根目录
/mnt/myraid0 192.168.0.0/16(rw,async,all_squash,no_subtree_check)
/mnt/linuxfs 192.168.0.0/16(rw,async,all_squash,no_subtree_check)
然後,重新导出:exportfs -arv
systemctl enable --now nfs-server
不用配置防火墙,此类软件未安装。
接下来说明/etc/exports的配置:
每行导出一个共享目录,行首是共享目录的绝对路径,其後接导出说明。
导出说明由Machine Name和RPCSEC_GSS security,User ID Mapping组成,详见:https://jlk.fjfi.cvut.cz/arch/manpages/man/exports.5
前者一般是一个IP地址网络号,以允许匹配的客户机访问该nfs服务。
後者紧接着且用小括号包括,不同配置项以逗号分隔,常用的有:
ro|rw        前者是默认选择,此项为读写权限
sync|async    前者默认,同步和异步
root_squash|no_root_squash    前者默认,是否将客户端root用户映射到匿名用户
no_all_squash|all_squash    前者默认,是否将客户端所有用户映射到匿名用户
anonuid=uid,anongid=gid        设置匿名用户的uid(用户id)和gid(组id)
接下来,说明nfs的大致工作过程:
nfsd服务监听连接,idmapd处理用户映射,只要来自exports匹配的客户端访问就能够被挂载其共享目录,而这一过程是用IP来匹配的(不是用户名和密码验证)。
没有用户名和密码验证也决定了nfs更适合内网使用。
客户端对其挂载的共享目录可以设置其创建文件或目录的读写权限(要注意此权限不是服务端设置的,服务端的读写权限会限制客户端的访问)。
注意,这在Windows客户端中体现为其创建的文件或目录无论如何只有755的权限,需要在Windows客户端中修改才行。
从这一点看,nfs也继承了Linux文件系统访问权限的设计。
附:
ACL权限设置,可以设置共享目录的ACL权限:
setfacl -m d::rwx -R /dir # 设置/dir的递归默认ACL权限为rwx

二、Windows客户端的配置
在win10上启用了nfs客户端和nfs管理程序。(Windows的nfs版本是v3)
在网络文件系统服务(搜索nfs应用)中修改NFS客户端的属性,找到文件权限,修改默认权限为允许所有(重启生效)。
修改vmware workstation的设置:勾选Workstation关闭後保持虚拟机运行
在文件资源管理器中,映射网络驱动器:(可以不在此映射,推荐用开机脚本映射)
y: \\192.168.72.128\mnt
e: \\192.168.72.128\mnt\myraid0
h: \\192.168.72.128\mnt\linuxfs
注:192.168.72.128是虚拟机服务器IP地址。
新建三个批处理文件:
ArchDiskServer-start.bat:


"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "C:\Users\yang\Documents\Virtual Machines\ArchDiskServer\ArchDiskServer.vmx"


ArchDiskServer-suspend.bat:

"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws suspend "C:\Users\yang\Documents\Virtual Machines\ArchDiskServer\ArchDiskServer.vmx"


ArchDiskServer-mount.bat:【需要该脚本是因为Windows的管理员和普通用户看到的驱动器不一样,要分别映射】

@ECHO OFF
call :runas
setlocal EnableDelayedExpansion
color 3e
title 添加服务配置
PUSHD %~DP0 & cd /d "%~dp0"
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :runas","","runas",1)(window.close)&goto :eof
:runas
rem 填写自己的脚本,此处在管理员和用户下运行以映射网络驱动器
net use y: \\192.168.72.128\mnt
net use e: \\192.168.72.128\mnt\myraid0
net use h: \\192.168.72.128\mnt\linuxfs


设置登录/注销时执行脚本:
win+R打开运行gpedit.msc,用户配置->Windows设置->脚本(登录/注销),
依次添加登录脚本ArchDiskServer-start.bat,ArchDiskServer-mount_admin.bat,添加注销脚本ArchDiskServer-suspend.bat,退出并重启。
这样,Windows主机上运行ArchLinux虚拟机服务器以提供访问Linux文件系统服务,Windows主机开机登录後,虚拟服务器也启动,而关机注销时则挂起虚拟服务器。

三、共享目录乱码问题解决
一个困扰我很久的问题是Windows的nfs client不支持utf-8编码,且仅支持nfs v2 v3,不支持nfs v4版本。以至于Windows上挂载nfs文件系统总是出现乱码。
乱码问题的解决方法主要有三个:其一是改用smb服务,其二是开启Windows的utf-8支持(不过会导致某些不支持utf-8的应用文件乱码,不建议),其三是改用第三方nfs客户端。
而第三方客户端主要有:
1、ms-nfs41-client
这是一个较老(几年前)的客户端以替换Windows自身的nfs客户端,可能目前安装有问题。
2、nfs-win
这是fuse-nfs在Windows上的应用,nfs-win仅是它的cli前端。它需要winfsp以提供支持,且其本身安装就包含了fuse-nfs。
nfs-win:https://github.com/billziss-gh/nfs-win
winfsp:https://github.com/billziss-gh/winfsp
目前存在的问题有:
    网络映射後,在文件管理器中不能彻底断开连接。
    权限问题,客户端创建的文件只有自己有权限读写,而服务器上其他用户无权读写。
    如果不设置卷前缀,会建立本地磁盘映射而不是网络驱动器。
尝试解决第二个问题,从源码编译,运行失败,应该是编译方式和环境问题。
如果编译成功,应该使用如下方式映射,应该能设置777的文件权限:
net use x: "\\cfs\192.168.72.128\mnt\linuxfs -p 0 -a --umask=000"
另一尝试,修改原程序二进制数据,查找字符串"--VolumePrefix=%s"替换为"--umask=000\0ix=%s",两者长度一致,这样文件大小不变。
但是,只指定umask没有指定"-p 0",所以并未生效。
如果使用nfs-win,则修改ArchDiskServer-mount.bat的net use命令部分如下:
net use y: \\nfs\192.168.72.128\mnt
net use e: \\nfs\192.168.72.128\mnt\myraid0
net use h: \\nfs\192.168.72.128\mnt\linuxfs

四、端口转發使其他内网访问
如果需要让其他内网用户能够访问虚拟机nfs服务,就需要设置端口转发。
在VMware的虚拟网络编辑器中,选择NAT设置,添加端口转发规则,推荐主机端口和虚拟机端口一致,需要转发的端口有:
2049        nfsd监听端口,包括tcp和udp,一般只用tcp即可,udp用于nfsv2
111         portmapper监听端口,包括tcp和udp,都转发
20048       mountd监听端口,这项在archlinux是固定的(/etc/services中设定了),应该在/etc/nfs.conf中修改(找到mountd项的端口)
xxxxx       nlockmgr监听端口,其是lockd内核模块的服务,在/etc/nfs.conf中修改(找到lockd项的端口)
xxxxx       status监听端口,可以在/etc/services中设定,也应该在/etc/nfs.conf中修改(找到statd项的端口)
以上端口的tcp和udp连接都应转发。
配置完毕,还应创建Windows防火墙的入站规则(出站规则默认允许所有):
在Windows的网络和Internet设置中单击Windows防火墙,选择高级设置,点击入站规则,为tcp和udp端口新建规则。
这样,其他内网机器就能挂载虚拟服务器中的nfs,另外,使用nfs-win不能挂载nfsv4,这需额外注意,nfsv4需要以"fsid=0"指定导出的根目录且挂载时根目录应从之起,如:nfs-server-ip:/linuxfs不是nfs服务器上的/linuxfs而是/mnt/linuxfs(/mnt为导出根目录)。
服务端默认禁用nfsv2启用nfsv3和nfsv4且以tcp进行传输,如果要禁用tcp传输必须禁用nfsv4,nfsv2只使用udp进行传输。
使用NAT虚拟网卡的nfs服务器性能瓶颈是nfs服务和客户端(比如,我的千兆网卡下nfs传输速度是100M左右),不知道为何网速会受限。
使用hostonly模式网卡则瓶颈也在nfs服务和客户端,原因应该和NAT是一样的。
而使用桥接模式则瓶颈在主机所连接的路由器上,所以不推荐使用桥接模式。
注:使用nfs的传输速度总是会受限,nfs的性能并不适合高速网络,即使网络连接速度是万兆(网络极限是1.25GB/s),nfs速度也很难达到200MB/s,这应该是nfs协议的问题,不管如何设置参数都没有很大改善。
使用Linux系统挂载nfs的话,能够获得比Windows更好的性能(这是Windows对nfs支持较差,很多参数不能使用,且不能使用nfsv4)。如果有条件可以使用nfs over rdma,能获取更好的性能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值