摘要
本文基本思路是在 Windows 系统下设置共享文件夹,然后在 Ubuntu 系统中通过 CIFS/SMB 协议挂载网络共享文件夹,最终实现 Ubuntu 和 Win 系统共享文件夹操作和开机自动挂载功能。具体步骤如下:
1. 系统版本介绍
首先介绍使用的 ubuntu 系统和 win 系统版本: Ubuntu: 24.04.2 Win: win11 家庭中文版
如何查看自己的系统版本号呢? Ubuntu:
命令:
- 查看 Ubuntu 操作系统的详细信息
lsb_release -a
- 弹窗显示 Windows 版本及内部版本号
winver
2. Win 系统设置共享文件夹
首先创建个空的文件夹用作共享文件夹,并进入文件夹属性设置:
这里本文设置的共享文件夹名为"Share",在'属性' -> "共享"中设置要共享的用户,为了方便这里添加 Everyone 作为新的共享用户,在后续 Ubuntu 挂载时可以跳过用户名和密码要求。并且设置用户的属性为读取/写入。
共享完成后会弹窗显示共享路径如图:
这里需要记住路径中最后的文件夹名称,即"Share"。
接着在高级共享中确认用户 Everyone 的权限有读取/写入和完全控制。
在这里已经基本设置完共享文件夹了,接着需要进一步设置 Win 系统的网络和共享策略。 打开控制面板,选择网络和共享中心,选择更改高级共享设置,在所有网络中设置无密码保护的共享。其他的网络也都选择启动共享。这样就能正常使用网络共享功能了。
3. Ubuntu 系统挂载共享文件夹
首先本文是通过 CIFS/SMB 协议来挂载网络共享文件夹,需要安装 cifs-utils 软件包,可以直接在终端中通过如下命令安装:
sudo apt-get install cifs-utils
下一步创建一个新的目录用来挂载 Windows 系统的共享文件夹,可以直接创建,也可以在终端中用命令创建,为了方便我创建在当前用户目录下:
mkdir ~/my_share
或者通过 root 权限创建目录:
sudo mkdir ~/my_share
这两个命令的区别在于 root 权限创建的目录当前用户只能访问不能修改文件。
接着在终端挂载共享文件夹,这里需要用到 Win 系统主机的 IP 地址,那么怎么知道我 Win 系统的主机地址呢? 可以在 Win 系统 cmd 终端中通过命令 ipconfig 来查看。我们需要的是其中的 IPv4 地址, 关键词:IPv4 地址
ipconfig
比如我的 IPv4 地址为:192.168.1.1
也可以在挂载之前查看自己的 IP 地址是否能正确连接,在 Ubuntu 终端中:
ping 192.168.1.1
如果能正确连接则会有 ping 的输出。
根据电脑的 IPv4 地址和共享文件夹名称,在 Ubuntu 系统终端中输入如下命令:
sudo mount -t cifs //192.168.1.1/Share ~/my_share
请诸位更改为自己的 IP 地址和名称。
此时便能成功连接到共享文件夹,如果在连接过程中仍提示需要输入 Win 系统的用户密码,说明 Win 系统默认设置了安全策略的强制验证机制,对于来宾用户仍需验证密码。出于安全考虑,这里不推荐修改这个强制验证机制,乖乖输入密码进行验证即可。
成功挂载共享文件夹之后,在 Ubuntu 系统对应挂载目录下便能显示共享文件夹的内容了。
也可以在终端中检查是否成功挂载共享文件夹:
df -h
这里初步实现了挂载共享文件夹,但是仍然存在一些小问题。在下一章中详细了解。
4. 共享文件夹中遇到的问题
本章简单列出了我在共享文件夹中遇到的问题,并给出解决办法,并在最后实现了开机自动挂载功能。
(1)为什么我挂载的文件夹只能访问文件,不能写入文件?
这是因为使用 sudo 挂载共享文件夹时,只有 root 用户才有读写权限,而挂载目录的归属用户和归属组只有访问权限:
解决办法是在挂载的时候显示地指定挂载目录的归属用户和归属组并且赋予其读写权限,因此挂载命令修改如下:
sudo mount -t cifs //192.168.1.1/Share ~/my_share \
-o uid=$(id -u),gid=$(id -g),dir_mode=0777,file_mode=0777
如果现在的目录 my_share 已经挂载完成,但是没有写入权限,记得先卸载现在的挂载点,再重新挂载并指定权限:
sudo umount ~/my_share
sudo mount -t cifs //192.168.1.1/Share ~/my_share \
-o uid=$(id -u),gid=$(id -g),dir_mode=0777,file_mode=0777
现在实现了对共享文件夹的双向读取、写入操作了。
(2)我想对挂载目录重命名,但是提示无法重命名,有进程正在使用它。
这是因为该目录仍处于挂载状态,需要先卸载挂载点,重命名后再挂载。
sudo umount ~/my_share
mv ~/my_share ~/new_share
sudo mount -t cifs //192.168.1.1/Share ~/new_share \
-o uid=$(id -u),gid=$(id -g),dir_mode=0777,file_mode=0777
(3)我不想用 Everyone 来共享了,我想通过已经有的用户来共享文件夹,怎么做?
在 Ubuntu 终端挂载文件夹的时候指定用户名和密码即可:
sudo mount -t cifs //192.168.1.1/Share ~/new_share \
-o username=Windows 用户名,password=Windows 用户名的密码, \uid=$(id -u),gid=$(id -g),dir_mode=0777,file_mode=0777
请诸位自行改为自己的用户名和密码。
如果不想在命令行中显示地指定用户名和密码,为了确保密码安全,可以将用户名和密码写入隐藏文件,挂载时由隐藏文件来指定用户名和密码:
- 创建隐藏文件
sudo touch /etc/.smbcredentials
- 设置隐藏文件权限为仅允许所有者读写:
sudo chmod 600 /etc/.smbcredentials
- 将用户名和密码写入隐藏文件
sudo gedit /etc/.smbcredentials
请诸位自行改为自己的用户名和密码。 挂载命令修改如下:
sudo mount -t cifs //192.168.1.1/Share ~/new_share \
-o credentials=/etc/.smbcredentials, \uid=$(id -u),gid=$(id -g),dir_mode=0777,file_mode=0777
如果不知道自己电脑有哪些用户名,可以在 Windows 中用管理员权限运行 powershell 终端: 按下 win+X,选择 Windows 终端(管理员),输入如下命令:
Get-LocalUser
该命令会列出本地计算机上的所有用户账户。
(4)为什么我每次启动 Ubuntu 系统都要重新挂载啊,好麻烦,怎么才能开机自动挂载呢?
可以通过/etc/fstab 文件来配置开机自动挂载。
- 在终端中打开/etc/fstab 文件
sudo gedit /etc/fstab
- 在文件的最后添加如下命令:
//192.168.1.1/Share ~/new_share cifs credentials=/etc/.smbcredentials,iocharset=utf8,vers=3.0,_netdev,auto,dir_mode=0777,file_mode=0777 00
其中: cifs 指定使用 CIFS/SMB 协议挂载 Windows 共享 credentials=/etc/.smbcredentials 从指定文件读取用户名和密码 iocharset=utf8 支持中文等特殊字符(考虑到用户名和密码包含中文和特殊字符等情况) vers=3.0 强制使用 SMB3.0 协议(兼容性最佳) _netdev 等待网络就绪后再挂载 auto 系统启动时自动挂载 dir_mode=0777,file_mode=0777 设置目录和文件权限为全开放 0 0 禁用文件系统备份和启动检查
结论
至此,Ubuntu 与 Windows 系统共享文件夹的功能完成了,每次启动 Ubuntu 系统都能自动挂载共享文件夹。需要特别注意的是,因为 Win 系统设置了安全策略的强制验证机制,如果用 Everyone 中的匿名用户来挂载共享文件夹,由于该机制需要验证用户密码,导致无法实现开机自动挂载,因此开机自动挂载需要换为自己的普通用户名和密码。
