在 Ubuntu 中加载 smb 共享目录为本地路径
最近在家里搭建了局域网环境,使用了一个海康威视 H99 网络驱动器作为家里的存储中心。它可以实现 smb 和 arp 协议的共享,从而满足我的基本需求。
访问 smb 共享目录的方法是在文件浏览器中通过:smb://xxx.xxx.xxx.xxx
的模式输入地址,然后就会将网络驱动器挂载到本地,显示为一个本地网络路径。之后就可以正常的管理远程文件内容了。
但是我发现在使用一些下载软件的时候,无法直接将共享目录作为下载目录设置,只能选择本地的目录地址。此时就需要将 smb 网络共享路径映射为本地地址才可以实现上述需求。
下面介绍在 Ubuntu 中配置。
在 Linux 中,可以通过 mount 命令的 cifs 选项将 smb 共享加载到本地驱动器的某个地方。Common Internet File System (CIFS) 是一个网络文件共享协议,它是 smb 的一种格式。
安装
首先我们安装 CIFS 工具:
sudo apt install cifs-utils
加载
加载一个远程 smb 共享和加载本地文件系统类似,使用 mount 命令实现。需要首先创建一个加载目录服务于远程路径:
sudo mkdir /mnt/h99_share
通过下面命令加载某个 smb 共享:
sudo mount -t cifs -o username=win_share_user,password=win_share_password //xxx.xxx.xxx.xxx/usbshare /mnt/h99_share
其中 username 和 password 是访问远程设备的账户密码,需要在配置 smb 共享时设置好。后面需要定义远程地址及共享目录,最后指定本地映射的目录地址。
默认情况下加载的共享目录所有者为 root 且权限为 777。通过 dir_mode 和 file_mode 参数可以自定义挂载的目录权限:
sudo mount -t cifs -o username=win_share_user,password=win_share_password,dir_mode=0755,file_mode=0755 //xxx.xxx.xxx.xxx/usbshare /mnt/h99_share
如果当前登录用户不是 root 用户,则可能你无法修改共享目录下的内容,可以在挂载时指定用户和用户组:
sudo mount -t cifs -o username=win_share_user,password=win_share_password,mfsymlinks,uid=marco,gid=marco,dir_mode=0755,file_mode=0755 //xxx.xxx.xxx.xxx/usbshare /mnt/h99_share
以上示例中,我们设置用户和用户组为 marco,这样当本地用户登录为 marco 时就可以读写共享目录的内容了。
以上参数中加入的 mfsymlinks
可以让挂载的路径下的文件支持配置软链接 ln -s
,但硬链接 ln
受文件系统的关系依然不可以。
经过查询了解到 exfat 格式不支持创建 link,所以当我在 smb 共享中通过 ln 命令创建硬链接的时候报错:
ln: failed to create hard link Operation not supported
ntfs 文件系统支持各种 link 方式,详细信息可以查看微软官方介绍:File System Functionality Comparison
自动挂载
以上命令挂载的目录在系统重启后会取消。
在 /etc/fstab
文件中可以定义指定的路径及文件系统在系统启动时自动挂载。下面我们在此文件中定义自动挂载配置,需要指定远程地址,共享目录以及本地映射地址:
# <file system> <dir> <type> <options> <dump> <pass>
//xxx.xxx.xxx.xxx/usbshare /mnt/h99_share cifs username=win_share_user,password=win_share_password,mfsymlinks,uid=marco,gid=marco,dir_mode=0755,file_mode=0755 0 0
配置好 fatab 文件后,我们就可以使用以下命令直接挂载对应远程目录了:
sudo mount /mnt/h99_share
mount 命令会自动读取 /etc/fstab
文件并挂载对应远程地址目录。并且下次系统重启会自动挂载此目录。
卸载目录
通过 umount 命令可以下载已经加载的文件系统:
sudo umount /mnt/h99_share
如果当前加载的文件正在被其他进程使用,则 umount 卸载会失败,提示文件正忙。查询当前加载目录正在被那个进程使用,可以通过 fuser 命令实现:
fuser -m /mnt/h99_share
可以根据输出信息使用 kill 结束对应进程,然后就可以正常卸载了。
参考链接
How to Mount Windows Share on Linux using CIFS
Forcing Linux to Unmount a Filesystem Reporting “device is busy”
Making sure symlinks work on CIFS/SMB mounted shares
Symlinks on shared volumes not supported
如何在docker卷中创建文件的硬链接
File System Functionality Comparison
标签:无