【学习笔记】Ubuntu与Windows系统实现共享文件夹
共享文件夹实现方法
- 摘要
- 1. 系统版本介绍
- 2. Win系统设置共享文件夹
- 3. Ubuntu系统挂载共享文件夹
- 4. 共享文件夹中遇到的问题
- 结论
摘要
本文基本思路是在Windows系统下设置共享文件夹,然后在Ubuntu系统中通过 CIFS/SMB 协议挂载网络共享文件夹,最终实现Ubuntu和Win系统共享文件夹操作和开机自动挂载功能。具体步骤如下:
1. 系统版本介绍
首先介绍使用的ubuntu系统和win系统版本:
Ubuntu: 24.04.2
Win: win11家庭中文版
如何查看自己的系统版本号呢?
Ubuntu:
Win:
命令:
- 查看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 0 0
其中:
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中的匿名用户来挂载共享文件夹,由于该机制需要验证用户密码,导致无法实现开机自动挂载,因此开机自动挂载需要换为自己的普通用户名和密码。