当您需要跨操作系统共享数据时,可以通过Windows系统挂载NAS NFS文件系统实现数据上传与下载。本文为您介绍如何在Windows操作系统中挂载NFS文件系统。
前提条件
在创建NAS文件系统的节点,已有可用的ENS实例(Windows系统)。
已创建NAS NFS文件系统,并获取到文件系统的挂载点地址,且与ENS实例属于同一VPC。
操作步骤
远程连接ENS计算实例。
安装NFS客户端。
打开服务器管理器。
选择管理 > 添加角色和功能。
根据添加角色和功能向导提示安装NFS客户端。
在服务器角色选项卡下,选择文件和存储服务 > 文件和iSCSI服务下的NFS服务器。
在功能页签,选择NFS客户端。
重启ENS实例。
启动命令提示符,执行mount命令。如果返回以下信息,说明NFS客户端安装成功。
修改注册表,目的是添加匿名用户的默认UID和GID,防止mount nas后可能会出现没有权限打开文件的问题。
修改路径:HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > ClientForNFS > CurrentVersion > Users > Default > Mount,创建Locking、AnonymousGID、AnonymousUID这三个注册表项,注意其中 Locking值必须为1 。
修改路径:HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > ClientForNFS > CurrentVersion > Default,创建以下注册表项设置GID和UID。
重启系统。
必须重启系统,否则只有读权限。
添加路由。
访问NAS挂载点前,需要在Windows实例上先执行添加路由的命令
route add 100.64.128.0/18 实例内网IP
。挂载NFS系统。
在Windows客户端,执行以下命令挂载NFS文件系统mount 挂载点地址 <挂载盘符>。
说明Windows客户端仅支持NFS v3协议
您可在目标文件系统的详情页获取到NFS v3协议挂载点地址,如详情页展示的NFS v3挂载点地址为
100.64.XXX.XXX:/source_path
,则在Windows客户端挂载时,挂载点地址为\\100.64.128.X\source_path
。验证挂载结果。
挂载成功后,您可以双击这台电脑图标,在界面查看新的共享文件系统。
脚本挂载
脚本能力
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
}