Windows挂载NFS文件系统

当您需要跨操作系统共享数据时,可以通过Windows系统挂载NAS NFS文件系统实现数据上传与下载。本文为您介绍如何在Windows操作系统中挂载NFS文件系统。

前提条件

  • 在创建NAS文件系统的节点,已有可用的ENS实例(Windows系统)。

  • 已创建NAS NFS文件系统,并获取到文件系统的挂载点地址,且与ENS实例属于同一VPC。

操作步骤

  1. 远程连接ENS计算实例。

  2. 安装NFS客户端。

    1. 打开服务器管理器。

    2. 选择管理 > 添加角色和功能。

    3. 根据添加角色和功能向导提示安装NFS客户端。

    4. 在服务器角色选项卡下,选择文件和存储服务 > 文件和iSCSI服务下的NFS服务器。

    5. 在功能页签,选择NFS客户端。

    6. 重启ENS实例。

    7. 启动命令提示符,执行mount命令。如果返回以下信息,说明NFS客户端安装成功。

      image.png

  3. 修改注册表,目的是添加匿名用户的默认UID和GID,防止mount nas后可能会出现没有权限打开文件的问题。

    1. 修改路径:HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > ClientForNFS > CurrentVersion > Users > Default > Mount,创建Locking、AnonymousGID、AnonymousUID这三个注册表项,注意其中 Locking值必须为1 。image.png

    2. 修改路径:HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > ClientForNFS > CurrentVersion > Default,创建以下注册表项设置GID和UID。image.png

  4. 重启系统。

    必须重启系统,否则只有读权限。

  5. 添加路由。

    访问NAS挂载点前,需要在Windows实例上先执行添加路由的命令route add 100.64.128.0/18 实例内网IP

  6. 挂载NFS系统。

    在Windows客户端,执行以下命令挂载NFS文件系统mount 挂载点地址 <挂载盘符>。

    说明

    Windows客户端仅支持NFS v3协议

    您可在目标文件系统的详情页获取到NFS v3协议挂载点地址,如详情页展示的NFS v3挂载点地址为100.64.XXX.XXX:/source_path,则在Windows客户端挂载时,挂载点地址为\\100.64.128.X\source_path

  7. 验证挂载结果。

    挂载成功后,您可以双击这台电脑图标,在界面查看新的共享文件系统。

    image.png

脚本挂载

脚本能力

  • NFS客户端安装。

  • 注册表修改。

  • NFS读写挂载。

  • 开机自动挂载。

说明

脚本未包含重启,对于新机器安装了NFS客户端以及修改注册表需要手动进行一次重启,否则对于挂载的目录只有读权限。

使用方式

  • 脚本放置指定目录下,例如C盘,命名为:nfs_mount.ps1。

  • powershell执行命令。

    • 执行方式一:

      powershell -file C:\nfs_mount.ps1
    • 执行方式二:

      powershell -file C:\nfs_mount.ps1 -url 挂载点 -drive z
      # 备注:该方式会覆盖脚本中默认的url(挂载点)和drive(盘符)

NFS读写挂载

[CmdletBinding()] 
Param( 
#挂载点
[string]$url="100.125.255.100\nas_test",
#挂载Windows盘符
[string]$drive="z" 
)
#获取当前执行时间
$now = Get-Date 
#指定log文件的场所 当前执行目录
$logPath="C:\"
#设定log文件名  
$logName = "executLog"
$logFileName= $logName + "_" + $now.ToString("yyyy-MM-dd")+".log"
$logInfo = $now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " " 
#log 全路径设定
$logPathFile = Join-Path $logPath $logFileName
Write-Output ($logInfo+"挂载路径:"+$url+" 挂载盘符:"+$drive)
Write-Output ($logInfo+"挂载路径:"+$url+" 挂载盘符:"+$drive) | Out-File -FilePath $logPathFile -Encoding default -Append
$nfs=get-WindowsFeature -Name "NFS-Client"
if($nfs.installed){
$nas_start = (Get-Item HKCU:\Software\Microsoft\Windows\CurrentVersion\Run).GetValueNames().Contains("nas_run")
Write-Output ($logInfo+":开机自启动>>"+$nas_start)
Write-Output ($logInfo+":开机自启动>>"+$nas_start) | Out-File -FilePath $logPathFile -Encoding default -Append
if(!$nas_start){
Write-Output ($logInfo+":设置开机自启动")
Write-Output ($logInfo+":设置开机自启动") | Out-File -FilePath $logPathFile -Encoding default -Append
$nas_script_path = $myinvocation.mycommand.definition
$run_script = "powershell -file "+ $nas_script_path +" -url "+ $url +" -drive "+ $drive
$nas_run = "nas_run"
$nas_run_result = New-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name $nas_run  -PropertyType String -Value $run_script -ErrorAction Continue -ErrorVariable run_err_msg
if($err_msg){
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg)
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result)
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
Write-Output ($logInfo+"已存在nfs-client,挂载nfs挂载点")
Write-Output ($logInfo+"已存在nfs-client,挂载nfs挂载点") | Out-File -FilePath $logPathFile -Encoding default -Append
$nfs_url = "mount -o  nolock -o  mtype=hard -o  timeout=60 \\$url ${drive}:"
Write-Output ($logInfo + ":开始挂载nas "+$nfs_url)
Write-Output ($logInfo + ":开始挂载nas "+$nfs_url) | Out-File -FilePath $logPathFile -Encoding default -Append
$reslut = cmd /c $nfs_url
Write-Output ($logInfo+$reslut)
Write-Output ($logInfo+$reslut) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +":没有安装nfs-client,进行安装&注册表配置 运行完成请重启")
Write-Output ($logInfo +":没有安装nfs-client,进行安装&注册表配置 运行完成请重启") | Out-File -FilePath $logPathFile -Encoding default -Append
Add-WindowsFeature -Name "NFS-Client"
$lock_path = Test-Path HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount
if($lock_path){
$lock = (Get-Item HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount).GetValueNames().Contains("Locking")
if(!$lock){
$lock_result = New-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount" -Name "Locking" -PropertyType DWord -Value 1 -ErrorAction Continue -ErrorVariable err_msg
if($err_msg){
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$err_msg)
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$lock_result)
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$lock_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
}else{
Write-Output "不存在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount项请自行生成"
Write-Output "不存在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount项请自行生成" | Out-File -FilePath $logPathFile -Encoding default -Append
}


$id_path = Test-Path HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default
if ($id_path){
$gid = (Get-Item HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default).GetValueNames().Contains("AnonymousGID")
$uid = (Get-Item HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default).GetValueNames().Contains("AnonymousUID")
if (!$gid){
$gid_result = New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default" -Name "AnonymousGID" -PropertyType DWord -Value 0   -ErrorAction Continue -ErrorVariable gid_err_msg
if($gid_err_msg){
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$gid_err_msg)
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$gid_err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$gid_result)
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$gid_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
if (!$uid){
$uid_result = New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default" -Name "AnonymousUID" -PropertyType DWord -Value 0  -ErrorAction Continue -ErrorVariable uid_err_msg
if($uid_err_msg){
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$uid_err_msg)
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$uid_err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$uid_result)
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$uid_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
}else{
Write-Output ($logInfo +"不存在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default项请自行生成")
Write-Output ($logInfo +"不存在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default项请自行生成") | Out-File -FilePath $logPathFile -Encoding default -Append
}
$nas_start = (Get-Item HKCU:\Software\Microsoft\Windows\CurrentVersion\Run).GetValueNames().Contains("nas_run")
Write-Output ($logInfo+":开机自启动>>"+$nas_start)
Write-Output ($logInfo+":开机自启动>>"+$nas_start) | Out-File -FilePath $logPathFile -Encoding default -Append
if(!$nas_start){
Write-Output ($logInfo+":设置开机自启动")
Write-Output ($logInfo+":设置开机自启动") | Out-File -FilePath $logPathFile -Encoding default -Append
$nas_script_path = $myinvocation.mycommand.definition
$run_script = "powershell -file "+ $nas_script_path +" -url "+ $url +" -drive "+ $drive
$nas_run = "nas_run"
$nas_run_result = New-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name $nas_run  -PropertyType String -Value $run_script -ErrorAction Continue -ErrorVariable run_err_msg
if($err_msg){
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg)
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result)
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
$nfs_url = "mount -o  nolock -o  mtype=hard -o  timeout=60 \\$url ${drive}:"
Write-Output ($logInfo + ":开始挂载nas "+$nfs_url)
Write-Output ($logInfo + ":开始挂载nas "+$nfs_url) | Out-File -FilePath $logPathFile -Encoding default -Append
$result = cmd /c $nfs_url
Write-Output ($logInfo  +":nas挂载结束"  +$result)
Write-Output ($logInfo  +":nas挂载结束"  +$result) | Out-File -FilePath $logPathFile -Encoding default -Append
Write-Output ($logInfo  +":设置结束")
Write-Output ($logInfo  +":设置结束") | Out-File -FilePath $logPathFile -Encoding default -Append
}

只读挂载&开机自动挂载

[CmdletBinding()] 
Param( 
#挂载点
[string]$url="100.125.255.100\nas_test",
#挂载Windows盘符
[string]$drive="z"
)
#获取当前执行时间
$now = Get-Date 
#指定log文件的场所 当前执行目录
$logPath="C:\"
#设定log文件名  
$logName = "executLog"
$logFileName= $logName + "_" + $now.ToString("yyyy-MM-dd")+".log"
$logInfo = $now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " " 
#log 全路径设定
$logPathFile = Join-Path $logPath $logFileName
Write-Output ($logInfo+"挂载路径:"+$url+" 挂载盘符:"+$drive)
Write-Output ($logInfo+"挂载路径:"+$url+" 挂载盘符:"+$drive) | Out-File -FilePath $logPathFile -Encoding default -Append
$nfs=get-WindowsFeature -Name "NFS-Client"
if($nfs.installed){
$nas_start = (Get-Item HKCU:\Software\Microsoft\Windows\CurrentVersion\Run).GetValueNames().Contains("nas_run")
Write-Output ($logInfo+":开机自启动>>"+$nas_start)
Write-Output ($logInfo+":开机自启动>>"+$nas_start) | Out-File -FilePath $logPathFile -Encoding default -Append
if(!$nas_start){
Write-Output ($logInfo+":设置开机自启动")
Write-Output ($logInfo+":设置开机自启动") | Out-File -FilePath $logPathFile -Encoding default -Append
$nas_script_path = $myinvocation.mycommand.definition
$run_script = "powershell -file "+ $nas_script_path +" -url "+ $url +" -drive "+ $drive
$nas_run = "nas_run"
$nas_run_result = New-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name $nas_run  -PropertyType String -Value $run_script -ErrorAction Continue -ErrorVariable run_err_msg
if($err_msg){
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg)
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result)
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
Write-Output ($logInfo+"已存在nfs-client,挂载nfs挂载点")
Write-Output ($logInfo+"已存在nfs-client,挂载nfs挂载点") | Out-File -FilePath $logPathFile -Encoding default -Append
$nfs_url = "mount -o  nolock -o  mtype=hard -o  timeout=60 \\$url ${drive}:"
Write-Output ($logInfo + ":开始挂载nas "+$nfs_url)
Write-Output ($logInfo + ":开始挂载nas "+$nfs_url) | Out-File -FilePath $logPathFile -Encoding default -Append
$reslut = cmd /c $nfs_url
Write-Output ($logInfo+$reslut)
Write-Output ($logInfo+$reslut) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +":没有安装nfs-client,进行安装&注册表配置 运行完成请重启")
Write-Output ($logInfo +":没有安装nfs-client,进行安装&注册表配置 运行完成请重启") | Out-File -FilePath $logPathFile -Encoding default -Append
Add-WindowsFeature -Name "NFS-Client"
$lock_path = Test-Path HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount
if($lock_path){
$lock = (Get-Item HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount).GetValueNames().Contains("Locking")
if(!$lock){
$lock_result = New-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount" -Name "Locking" -PropertyType DWord -Value 1 -ErrorAction Continue -ErrorVariable err_msg
if($err_msg){
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$err_msg)
Write-Output ($logInfo +"注册表配置完成返回结果失败:" +$err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$lock_result)
Write-Output ($logInfo +"注册表配置完成返回结果为:" +$lock_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
}else{
Write-Output "不存在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount项请自行生成"
Write-Output "不存在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Users\Default\Mount项请自行生成" | Out-File -FilePath $logPathFile -Encoding default -Append
}
$nas_start = (Get-Item HKCU:\Software\Microsoft\Windows\CurrentVersion\Run).GetValueNames().Contains("nas_run")
Write-Output ($logInfo+":开机自启动>>"+$nas_start)
Write-Output ($logInfo+":开机自启动>>"+$nas_start) | Out-File -FilePath $logPathFile -Encoding default -Append
if(!$nas_start){
Write-Output ($logInfo+":设置开机自启动")
Write-Output ($logInfo+":设置开机自启动") | Out-File -FilePath $logPathFile -Encoding default -Append
$nas_script_path = $myinvocation.mycommand.definition
$run_script = "powershell -file "+ $nas_script_path +" -url "+ $url +" -drive "+ $drive
$nas_run = "nas_run"
$nas_run_result = New-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name $nas_run  -PropertyType String -Value $run_script -ErrorAction Continue -ErrorVariable run_err_msg
if($err_msg){
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg)
Write-Output ($logInfo +"设置开机自启动返回结果失败:" +$run_err_msg) | Out-File -FilePath $logPathFile -Encoding default -Append
}else{
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result)
Write-Output ($logInfo +"设置开机自启动完成:" +$nas_run_result) | Out-File -FilePath $logPathFile -Encoding default -Append
}
}
$nfs_url = "mount -o  nolock -o  mtype=hard -o  timeout=60 \\$url ${drive}:"
Write-Output ($logInfo+":开始挂载nas "+$nfs_url)
Write-Output ($logInfo+":开始挂载nas "+$nfs_url) | Out-File -FilePath $logPathFile -Encoding default -Append
$result = cmd /c $nfs_url
Write-Output ($logInfo  +":nas挂载结束"  +$result)
Write-Output ($logInfo  +":nas挂载结束"  +$result) | Out-File -FilePath $logPathFile -Encoding default -Append
Write-Output ($logInfo  +":设置结束")
Write-Output ($logInfo  +":设置结束") | Out-File -FilePath $logPathFile -Encoding default -Append
}