如何挂载远程 Windows 共享资源

没错,我们生活在 Linux 的美好世界里。然而对我们当中不少人来说,面对 Windows 是生活的一部份。例如你可能想应用一个 Linux 服务器来备份 Windows 文件。将 Windows 共享资源挂载在服务器上可以简化这个程序。你将能够访问 Windows 文件如同它们是本地的一样,基本上所有 Linux 指令都可以使用。挂载 Windows(或其它 samba)共享资源要应用到内核里的 cifs 虚拟文件系统客户端(cifs vfs),与及 samba 软件系列中的 mount.cifs 挂载辅助程序。

下列名称会用在我们的例子里。

警告:mount.cifs 缺省是不会为已挂载的共享资源加上安全性保障(http://bugs.centos.org/view.php?id=4537)。假如你管理多重用户的系统,请考虑为你的挂载点加入 dir_modefile_mode 的设置。

1. 所需组件

请确保以下组件已被安装:

[root@host]# yum install samba-client samba-common cifs-utils

这样亦会加入所有依赖性组件。留意 cifs-utils 只限 CentOS-6(或更新版本)。

2. 基本的方法

创建一个本地挂载点。例如:

[root@host]# mkdir /mnt/win

编辑 /etc/fstab 档并加入如下一行:

\\winbox\getme /mnt/win cifs user,uid=500,rw,suid,username=sushi,password=yummy 0 0

Windows 共享资源将会在开机时被挂载。如果你想利用 mount /mnt/win 这个指令来手动挂载它,请加入 noauto 这个选项。在这个样例里,本地用户(uid=500)将会成为挂载文件的拥有人。使用 uid 这个选项是选择性的。然而,某些对权限较挑剔的应用程序(例如 Acrobat)或许会需要它。

你可能会想为 cifs 设置其它选项。举例说,nocase 容许文件路径不按尺寸写配对。请执行 man mount.cifs 来查看更多选项。

[注:如果你在较早版本的 CentOS 内使用 smbfs,你必须在 CentOS 5 内以 cifs 代替,因为 smbfs 已不宜使用。]

3. 较好的方法

以上的方法有一个小毛病 —— 用户名称与口令是人人可见的。我们可以通过凭证文件来避免这个问题。

\\winbox\getme /mnt/win cifs user,uid=500,rw,noauto,suid,credentials=/root/secret.txt 0 0

注:以下是 IRC 用户 jbroome 提供的一个实际例子

\\jellyfish\DBRefreshLogs\beta2 /media/DBRefreshLogs/beta2 cifs credentials=/root/secret.txt,_netdev,uid=oracle,gid=dba 0 0

至於 /root/secret.txt 档就看似这样:

username=sushi
password=yummy

这个文件可以放置在任何地方。你不能采用被加密的口令。请确定它不能被所有人阅读。另外请留意它不容有空格。

(注:用户名称的格式可以是 username=<域名>/<主机名>

4. 更好的方法

当远程的共享资源通过 /etc/fstab 被挂载后,它会维持这个状况直至你卸下它。假若远程的共享资源变为无效这便会构成问题,因为过时的挂载将会出现。举个例说,你连接的 Windows 机器或许会当机(想不到吧!),或者网络会倒闭。

这时自动挂载便大派用场(如果你仍未有 autofs,请使用 yum install autofs 来安它)。下面是你须要做的步骤。首先,创建一个挂载点

[root@host]# mkdir /mymount

[注:你可以使用任何目录;请确定那个目录存在]

/etc/auto.master 档内加入如下一行:

/mymount /etc/auto.mymount

接著编辑你刚输入的 /etc/auto.mymount 档:

winbox  -fstype=cifs,rw,noperm,user=sushi,pass=yummy ://winbox/getme

或者如上面使用同一个凭证文件:

winbox  -fstype=cifs,rw,noperm,credentials=/root/secret.txt ://winbox/getme

[注:你可以取消其它人对 /etc/auto.mymount 的阅读权限,因此凭证文件的应用并不像在上个方法中重要。]

[注:假若你不能用机器名称,但可以通过它的 IP 地址连接,请在 etc/nsswitch.confhosts 行内加入 wins。]

当一切准就绪当后,请以 root 的身份执行 /sbin/service autofs restart

现在尝试通过 ls /mymount/winboxcd /mymount/winbox 来访问共享资源。它会在被访问时自动被挂载。当活动静止一段时间后(缺省 60 秎),共享资源便会自动被卸下。

[注:进行卸下时,你可能会在 /var/log/messages 内看见 mount_cifs.so: cannot open shared object file 这个错误。这是无害的,可以安全地忽略。]

5. 另一个更好的方法

假若你有多个共享资源是用同一个凭证来挂载的,这里有一个很方便的设置方法。

创建一个本地的挂载点(依你的首选):

[root@host]# mkdir /mnt/smb

/etc/auto.master 内加入这行:

/mnt/smb /etc/auto.smb.top

创建 /etc/auto.smb.top 如下:

* -fstype=autofs,-Dhost=& file:/etc/auto.smb.sub

创建 /etc/auto.smb.sub 如下(按需要作修改):

* -fstype=cifs,credentials=/root/secret.txt,uid=500,gid=100 ://${host}/&

让我们确保权限是正确的,然后重新引导服务:

[root@host]# chmod 644 /etc/auto.smb.*
[root@host]# /sbin/service autofs restart

现在要访问共享资源,你只须简单地输入:

[root@host]# cd /mnt/smb/winbox/getme

(多谢 Mia Via 提供这个提示)

额外提示:

假若你拥有多个设有不同用户名称及/或密码的外置服务器和共享资源,请采用这个格式:

* -fstype=cifs,credentials=/root/${host}.secret.txt,uid=${UID},gid=${EUID} ://${host}/&

如果要让用户在他们的主目录内放置个别的用户名称/密码(或许会进一步削弱安全性):

* -fstype=cifs,credentials=${HOME}/${host}.secret.txt,uid=${UID},gid=${EUID} ://${host}/&

要提升 Samba 服务器的安全性的话,你也可以加入 sec=ntlmv2,并且以这个方法隐藏凭证文件:

* -fstype=cifs,sec=ntlmv2,credentials=${HOME}/.${host}.secret.txt,uid=${UID},gid=${EUID} ://${host}/&

有关 sec- 及其它 cifs 挂载参数的细节,请参阅 mount.cifs 的使用手册。

(多谢 Tapio Ryhänen 提供这个提示)

如何浏览 Windows 共享资源

如果你只是想浏览 Windows 文件,你下必挂载它们。你可以通过文件浏览器更容易地访问它们。

在 Konqueror:开始 -> 网络数据夹 -> Samba 共享
在 Nautilus:位置 -> 网络 -> Windows 网络

要更快捷地转至指定的共享资源,你可以在 konqueror 的位置栏正接输入:

smb://winbox/getme

假如你使用 nautilus,请先输入一个 '/' 字符(多谢 JohnnyHughes 提供这个提示)。


Translation of revision 70

zh/TipsAndTricks/WindowsShares (last edited 2014-01-22 03:21:33 by TimothyLee)