草庐IT

Windows/Linux客户端挂载NFS共享存储

降世神童 2024-04-27 原文

Windows/Linux客户端挂载NFS共享存储

1. Linux搭建NFS共享存储

1.1. NFS概述

NFS 是一种基于 TCP/IP 传输的网络文件系统协议,通过使用 NFS协议,客户机可以像访问本地目录一样访问远程 NFS 服务器中的共享资源。同时NFS 也是 NAS存储设备必然支持的一种协议,但是因为没有用户认证机制,而且数据在网络上明文传输,安全性很差,所以一般只能在局域网中使用。

1.2. 安装并配置NFS Server

NFS 服务的实现依赖于 RPC (Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。在Linux操作系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持。

关闭防火墙和SELinux:

systemctl disable firewalld
systemctl stop firewalld

sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
setenforce 0 
df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  8.5M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/vda1        20G  1.6G   18G   9% /
/dev/vdb1       985G   77M  935G   1% /wangzynfs	# 使用一块单独的硬盘充当共享存储空间
tmpfs           379M     0  379M   0% /run/user/0
vim /etc/fstab
UUID=d92f2371-9009-4fc9-bd60-7c468c780ce1 /                       ext4    defaults        1 1
/dev/vdb1                                 /wangzynfs              ext4    defaults        1 1

安装nfs-utils和rpcbind软件包:

yum install -y nfs-utils rpcbind

1.3. 启动并验证NFS Server

说明: 手动加载NFS共享服务时,应该先启动/停止rpcbind,再启动/停止nfs,一定要按顺序启动和停止。
启动rpcbind和nfs服务:

systemctl start rpcbind
systemctl start nfs

systemctl enable rpcbind
systemctl enable nfs

设置共享目录:
NFS的配置文件为 /etc/exports,文件内容默认为空,即无任何共享。
在exports文件中设置共享资源时,记录格式为“目录位置 客户机地址(权限选项)

cat /etc/exports
/wangzynfs 192.168.24.0/24(rw,sync,no_root_squash,insecure)
  • rw 表示允许读写
  • ro 表示为只读
  • sync 表示同步写入到内存与硬盘中
  • no_root_squash表示当客户机以root身份访问时赋予本地root权限(默认是- root_squash),如果不加那么客户端无法在里面编辑或写入文件,因为默认以nfsnobody的权限
  • root_squash 表示客户机用root用户访问该共享目录时,将root用户映射成匿名用户
  • all_squash 所有访问用户都映射为匿名用户或用户组
  • async 将数据先保存在内存缓冲区中,必要时才写入磁盘,速度快但会丢失数据
  • subtree_check(默认) 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限
  • no_subtree_check 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
  • insecure必须加,否则会报“无法创建映射网络驱动器 网络错误-53”错误

重启NFS服务并验证:

systemctl stop rpcbind
systemctl stop nfs

systemctl start rpcbind	# 注意先启动rpcbind服务
systemctl start nfs
exportfs -v
/wangzynfs      192.168.24.xxx/32(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

showmount -e localhost
Export list for localhost:
/wangzynfs 192.168.24.xxx/32

2. 客户端挂载NFS共享存储

2.1. Windows操作系统挂载NFS共享存储

打开控制面板—程序—找到“启用或关闭Windows功能”—启用NFS服务,完成之后不需要重启Windows操作系统
说明:NFS服务默认关闭,家庭中文版不支持该功能奥

  • 选择映射网络驱动器:

  • 输入:\NFS Server的IP地址\共享路径

  • 挂载完成之后,往共享存储写入文件,会报“需要权限来执行此操作”

接下来需要修改注册表,在注册表中添加匿名用户的默认UID和GID

  • 在运行中输入regedit,打开注册表编辑器:
    按照如下顺序检索:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default


    新建AnonymousGig和AnonymousUid,其值都设置为0。修改完成之后,需要重启Windows客户端操作系统,注册表才会生效
    查看共享存储NFS属性信息:

2.2. Linux操作系统挂载NFS共享存储

  • Linux客户端安装如下软件包:
yum install -y nfs-utils rpcbind
  • 验证服务端挂载点:
showmount -e 172.26.xxx.xxx
Export list for 172.26.xxx.xxx:
/wangzynfs 172.26.xxx.xxx/32
  • 安装HTTP服务挂载共享存储:
yum install -y httpd
mount -t nfs 172.26.xxx.xxx:/wangzynfs /var/www/html/
# NFS 共享的访问使用 mount 命令来进行挂载,对应的文件系统类型为 nfs 

手动挂载NFS共享目录:

mount -t nfs 172.26.xxx.xxx:/wangzynfs /var/www/html

df -h
Filesystem                 Size  Used Avail Use% Mounted on
devtmpfs                   486M     0  486M   0% /dev
tmpfs                      496M     0  496M   0% /dev/shm
tmpfs                      496M  6.7M  489M   2% /run
tmpfs                      496M     0  496M   0% /sys/fs/cgroup
/dev/vda1                   20G  1.7G   17G   9% /
tmpfs                      100M     0  100M   0% /run/user/0
172.26.xxx.xxx:/wangzynfs  985G   76M  935G   1% /var/www/html

自动挂载NFS共享目录:
修改 /etc/fstab 配置文件,加入NFS共享目录的挂载设置,文件系统类型为nfs

vim /etc/fstab
172.26.xxx.xxx:/wangzynfs  /var/www/html         nfs     defaults,_netdev  1 1

3. 强制卸载NFS共享存储

NFS客户端与服务器端的耦合度是非常高的,如果客户端正在挂载使用,服务器端NFS服务突然间停掉了,那么在客户端就会出现执行df -h命令卡死的现象。
这个时候使用umount命令是无法直接卸载的,需要加上-lf 选项才能卸载。
当出现卡死现象时,要重新开一个终端,执行cat /etc/rc.local命令,查看挂载点。然后使用umount命令卸载,其中-l 选项表示解除正在繁忙的文件系统,-f 选项表示强制。

模拟NFS服务端故障
systemctl stop nfs

客户端执行如下命令都会卡住
umount /var/www/html 
df -h 

需要在客户端强制解除挂载
umount -lf /var/www/html

有关Windows/Linux客户端挂载NFS共享存储的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  8. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  9. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  10. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

随机推荐