最近在家里搭建了局域网环境,使用了一个海康威视 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_modefile_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

标签:无

你的评论