资讯详情

Linux挂载Windows共享目录:SMB/CIFS挂载与自动挂载实战

📅 2026/10/4 14:14:44 | 华诺云谱 👁 阅读
Linux挂载Windows共享目录:SMB/CIFS挂载与自动挂载实战
做Linux配置这块要说哪个需求被问得最多“把Windows共享目录挂到Linux本地”绝对能排进前三。平时你可能遇到这样的场景电脑上装了双系统Windows里囤着一堆视频素材和设计稿切到Linux后只想通过文件管理器直接打开不想再回Windows去复制或者是公司内网的Windows服务器开了个共享目录Linux服务端要定时拉取文件做处理再或者你刚上手Linux对“挂载”这个词还有点陌生只觉得如果能把Windows的盘直接映射过来就方便多了。这篇文章就是解决这个问题的。我会从最基础的原理讲起把SMB/CIFS挂载的参数、环境准备、自动挂载、常见报错排查全部过一遍适合刚接触Linux的初级用户也适合给老手当一份速查参考。下面这些操作我在Ubuntu 22.04、Debian 12、CentOS 7.9以及国产的银河麒麟V10上实际跑过Windows端对应Win10、Windows Server 2016/2019可以放心抄作业。1. 先从“为什么是CIFS”聊起方案选型的底层逻辑1.1 挂载的本质把远程目录变成本地目录很多人一听到“挂载”两个字就发怵其实挂载没有想象中那么玄。Linux里一切皆文件一个U盘插进来系统把它认成一个块设备挂载就是把块设备“接入”到目录树上的某个目录点之后你进出这个目录就等于进出U盘。Windows共享目录本质上也是一套文件系统只不过它不在一块本地硬盘上而是跑在另一台机器的网络端口后面。Linux用内核自带的CIFS客户端组件去跟Windows的SMB服务端“握手”然后把对方的目录挂在本地某个空目录下这个过程就叫挂载。挂载完之后你ls这个目录看到的是Windows那边的文件cp、rm、mv、tar这些命令全部直接作用于远端目录。对应用层来说它根本感知不到这个目录在另一台机器上就像操作本地目录一样。这种设计的好处是透明坏处是如果网络断了所有基于这个目录的操作都会卡住或报错这也是后面要重点聊自动挂载和断线重连的原因。1.2 SMB/CIFS、NFS、SSHFS、FTP怎么选把Windows共享挂到Linux方案其实不止一种我身边总有朋友喜欢走弯路这里直接放个对比大家照着场景选就行。方案协议/工具Windows兼容性Linux侧配置成本适用场景SMB/CIFSmount -t cifs原生支持装cifs-utils即可绝大多数Windows共享挂载场景NFSmount -t nfs需要额外开启NFS服务低纯Linux/NAS环境SSHFSsshfs命令需要Windows开启OpenSSH Server较低临时穿透、远程主机调试FTPcurlftpfs等支持但功能弱低只传文件、不要求锁与并发SMB是Windows从系统层面原生支持的共享协议Windows默认就开了SMB服务不需要额外装东西。Linux内核自带的CIFS客户端就是为了跟Windows这套协议对接的所以两端成本最低。NFS在Windows上要开启“Services for NFS”功能配置起来麻烦而且权限模型和Windows账户体系很难对齐一般不建议跨这个平台。SSHFS适合临时用一下但Windows的OpenSSH Server默认不开而且它基于网络文件系统转发性能一般不适合做长期自动挂载。FTP就更不用说了不支持文件锁数据库和需要随机读写的应用根本没法用。所以结论很明确只要目标是把Windows共享目录稳定、可持久地当本地目录用选CIFS挂载就是最正统、最省心的路线。1.3 什么时候不该用CIFS把话说全一点CIFS也不是万能的。如果你手里两台机器都是Linux而且都有root权限用NFS在性能和生态上会更好如果只是偶尔传几个大文件直接用rsync、scp或者局域网网盘中转就够了没必要引入挂载这种长期依赖网络的方式如果你人在外面想远程访问家里的Windows共享那最忌讳的就是把445端口直接暴露到公网这种操作很容易引来扫描和爆破正确做法是先用组网或隧道方案把两台机器拉到同一个安全网络里再考虑挂载。理解了什么时候用、什么时候不用下面进入正题。2. 环境准备Windows端和Linux端都别偷懒2.1 Windows端共享设置与用户权限很多人挂载失败问题并不在Linux而在Windows端共享权限没设对。Windows的共享设置其实是两层权限叠加共享权限和NTFS权限。共享权限是你右键文件夹、进入“共享”菜单时设置的那个NTFS权限则是对文件夹本身的安全属性设置。最终生效的权限取两者交集也就是说哪边更严格以哪边为准。很多新手只把共享权限设成Everyone可读却忘了NTFS权限里Everyone没有读权限结果在Linux端怎么访问都是Permission denied。推荐的Windows端配置流程是这样在目标文件夹上右键选择“属性”进入“共享”标签页点击“共享”把需要访问的用户添加进去或者选择Everyone。进入“安全”标签页确认该用户或Everyone具备对应的NTFS权限至少要有读取写入按需开启。如果跨网段访问还要确认Windows防火墙放行了文件和打印机共享对应的端口默认是445端口老环境也可能用到139。确认系统里用于访问共享的账户没有被禁用密码不能为空。Windows默认的“仅来宾模式”在某些版本下会导致Linux端无法用普通账号登录。我建议单独建一个专用共享账户而不是直接拿管理员账户去挂载。这样权限边界清楚回头改密码也方便不用惊动整个系统。Windows端准备好之后用\\127.0.0.1\共享名在本地测试一下能否访问能通再往下走。2.2 Linux端安装cifs-utils与检查内核模块Linux要挂载CIFS得先装工具包。不同发行版包名略有区别# Debian/Ubuntu系 sudo apt update sudo apt install cifs-utils # CentOS/RHEL系 sudo yum install -y cifs-utils # 国产的银河麒麟/统信UOS一般基于Debian或CentOS用对应包管理器即可装完后可以先确认内核里有没有CIFS客户端模块modprobe cifs lsmod | grep cifs正常会看到一行cifs开头的输出。如果这条命令没有任何结果说明内核没编译进CIFS支持这时先别急着往下走要检查当前系统的内核模块路径或者换一个标准内核。嵌入式开发板、精简定制系统上比较容易遇到这种问题常见解决思路是把模块补上或者干脆在编译内核时把CONFIG_CIFS打开。绝大多数桌面Linux和云服务器发行版默认都带这个模块不用操心。2.3 网络连通性验证三板斧挂载前先做网络检查可以帮你把问题范围缩小一大半。我的习惯是按顺序测三样东西ping通不通、SMB端口通不通、凭据能不能通过SMB协议登录。先ping一下Windows主机的IPping -c 4 192.168.1.100能通说明二层三层没问题。接着测445端口nc -vz 192.168.1.100 445有些精简环境没有nc也可以用telnet 192.168.1.100 445连上了会显示SMB协议的banner说明端口通。端口不通最常见的情况是Windows防火墙拦了445或者对方主机本身不在线。端口通了之后用smbclient验证共享列表和凭据sudo apt install smbclient smbclient -L //192.168.1.100 -U linuxuser它会提示输入密码输入正确后列出这台Windows主机上开放的所有共享名。这一步能同时验证用户名、密码、共享名有没有问题。到这里环境准备就算完成了下面进入真正的挂载环节。3. 手动挂载实操从一条命令到一套稳定配置3.1 最快上手一条mount命令Linux挂载CIFS共享的语法结构不复杂核心就一句话sudo mount -t cifs //192.168.1.100/共享名 /mnt/winshare -o usernamelinuxuser,passwordMyPass123这条命令会把Windows主机上名叫“共享名”的目录挂载到本机的/mnt/winshare目录。挂载点必须提前建好如果目录不存在mount会直接报错。另外一个容易忽略的点是挂载点最好是一个专用的空目录不要把整个/mnt或者/home直接当挂载点用否则挂上去之后原来的本地文件会被盖住除非卸载否则看不到。但我个人很不推荐在命令行里直接写密码因为shell的history会记录得清清楚楚别人翻一下你的历史命令Windows共享的账号密码就全暴露了。第一次测试为了快速验证可以临时用验证完赶紧改掉。实际使用建议直接跳到3.2。3.2 把密码从命令行里解放出来credentials文件正确的做法是准备一个凭据文件把用户名、密码、域写在里面挂载命令只引用文件名sudo vim /etc/cifs.cred文件内容usernamelinuxuser passwordMyPass123 domainWORKGROUP然后锁权限sudo chmod 600 /etc/cifs.cred这时挂载命令就变成sudo mount -t cifs //192.168.1.100/共享名 /mnt/winshare -o credentials/etc/cifs.cred好处很明显密码不经过命令行不会进history以后换密码只需要改一个文件配合开机自动挂载也方便。domain这一行在加入域的环境里尤其重要不写有时候会默认带到本机名导致SMB认证失败。如果你只是普通家用网络、没有域环境写WORKGROUP就行。3.3 常用挂载参数逐项拆解-o后面那串参数是挂载的灵魂新手最容易在这里迷茫。我把自己常用的参数整理成一张表大家按需取用参数作用推荐值/说明username/password/domainSMB认证凭据优先用credentials文件credentials/path指定凭据文件权限建议600vers3.0/2.0/1.0指定SMB协议版本现代环境用3.0老环境用2.0uid/gid映射远端文件属主到本地用户/组常用当前账号的uid如uid1000file_mode/dir_mode指定文件和目录权限如file_mode0755,dir_mode0755iocharsetutf8解决中文文件名乱码基本必加nounix关闭Unix扩展有时候权限错乱就靠它解决_netdev标记网络设备配合fstab自动挂载时用noexec,nosuid,nodev安全三件套非信任共享建议加上cacheloose提高读取性能一致性要求高就别用vers参数很关键。Windows 10、Server 2016及之后的系统默认SMB 3.1.1但CIFS客户端经常需要显式指定vers3.0才能协商成功。如果对方是Windows 7或者老的NAS可能只支持SMB 1.0或2.0这时候你要往下调成vers2.0。塞在参数里长这样sudo mount -t cifs //192.168.1.100/共享名 /mnt/winshare -o credentials/etc/cifs.cred,vers3.0,uid1000,gid1000,iocharsetutf8,file_mode0755,dir_mode0755uid/gid如果不指定你在Linux端看到的文件属主可能是root非root用户访问起来很别扭甚至写不进去。把它们设成你当前登录用户的id就能直接读写。3.4 内容示例挂载一个媒体共享拿一个真实场景切一刀。假设我有一台Windows台式机IP是192.168.1.100上面开了个共享叫media里面放的是电影和剪辑素材。我想把它挂到Linux工作站的/home/me/media目录下并且让普通用户me能直接读写。mkdir -p /home/me/media sudo mount -t cifs //192.168.1.100/media /home/me/media \ -o credentials/etc/cifs.cred,vers3.0,uid$(id -u),gid$(id -g),iocharsetutf8,file_mode0755,dir_mode0755挂载完成后df -h /home/me/media能看到类似//192.168.1.100/media的条目说明挂载成功。接着试着在目录里touch test.txt如果能创建文件读写权限就算验证通过了。整个流程下来手动挂载这块就算完全掌握了。4. 开机自动挂载别再让共享目录“每次都得手动敲”4.1 最快方式写 /etc/fstab 配合 systemd automount挂载这活儿手动敲一次不难难在重启之后它还在。很多人第一反应是往/etc/fstab里塞一行记录结果重启后系统没起来或者卡了很久最后只能进单用户模式把配置删掉。为什么因为普通CIFS挂载如果写在fstab里系统启动时会去等网络等到网络没通或者Windows主机不在线就会一直卡住默认超时是漫长的90秒。解决的方案是加两个关键选项_netdev和x-systemd.automount。_netdev告诉系统这是一个网络设备启动顺序尽量靠后x-systemd.automount更狠意思是“先别真挂载等有人访问挂载点时才触发真正的挂载”。这个方案我实测下来很稳Windows主机没开机时Linux照样能正常启动等你去访问那个目录系统才会去尝试连接。fstab的写法//192.168.1.100/media /home/me/media cifs credentials/etc/cifs.cred,vers3.0,iocharsetutf8,uid1000,gid1000,file_mode0755,dir_mode0755,_netdev,x-systemd.automount 0 0修改完fstab之后先别急着重启用下面命令验证一下配置语法并立即触发挂载sudo mount -a ls /home/me/media如果这个命令报错说明fstab里某个选项写错了改完再试。确认无误再重启。4.2 只给指定用户读写uid/gid 搭配 credentials有人问fstab里配了uid1000,gid1000是不是意味着只有这个用户可以访问其实不是uid/gid只是把挂载点里所有文件和目录的属主映射成指定用户权限模型还是SMB协议在管。如果Windows端的共享权限和NTFS权限没放开就算你uid设对了也写不进去。反过来如果Windows端给了写入权限那么Linux端所有能进入挂载点的人都按这个uid身份去写。所以安全边界要靠两端权限共同约束不能单靠一个参数。在实际使用中我一般会再叠加file_mode0664,dir_mode0775这类更精细的权限设定确保挂载目录里的文件默认对组内成员可写又不至于直接全放开。这个组合对多人共用的工作机挺友好。4.3 用 autofs 玩按需挂载可选如果你要挂载的共享目录特别多而且不常访问fstab列表会越堆越长维护起来心累。这时候可以上autofs按需挂载、空闲自动卸载。配置思路是在/etc/auto.master里加一条映射规则再写一个映射文件把共享目录列进去。访问对应路径时autofs才真正发起挂载一段时间不访问就自动断开对弱网络环境非常友好。不过autofs的配置对新手来说有点抽象而且它对普通文件管理器打开路径的响应速度比直接挂载略慢。我个人的建议是如果只是三五个共享直接上fstab加x-systemd.automount就够了如果超过十个、而且来源分散再考虑autofs避免把简单问题复杂化。5. 常见问题与报错排查实录5.1 报错速查表挂载这条路我踩过的坑真不少下面这张表基本覆盖了新手最常遇到的报错照着对应解决就行。报错/现象可能原因解决办法mount error(13): Permission denied用户名密码错误、共享/NTFS权限不足smbclient验证凭据检查Windows端两层权限mount error(112): Host is down网络不通、445端口被防火墙拦ping、nc测端口检查Windows防火墙mount error(115): Operation now in progress连接超时或网络异常检查路由/网段试着加vers参数NT_STATUS_LOGON_FAILURE用户密码错误、Guest被禁用换合法账户检查密码NT_STATUS_ACCESS_DENIED权限不足检查共享权限和NTFS权限交集NT_STATUS_BAD_NETWORK_NAME共享名写错或对方未开放该共享用smbclient -L列共享列表核对mount error(22): Invalid argument挂载参数拼写或版本号不对检查vers等参数格式CIFS VFS: cifs_mount failed w/return code -13常见于凭据或共享名错误优先复验凭据文件和共享名5.2 排错流程从报错到恢复的完整路径报错信息往往只是症状根因可能藏在别处。我的排查顺序固定成一条流水线基本能覆盖八成问题。第一步先ping通了再说后面的事第二步用smbclient带同样凭据去试这一步直接验证账号密码和共享名是否能通过SMB层认证第三步手动挂载并打开详细日志核心命令是加-vvv参数sudo mount -t cifs //192.168.1.100/media /home/me/media -o credentials/etc/cifs.cred -vvv第四步如果还没头绪立刻看内核日志dmesg | tail -20CIFS在内核里跑得深很多错误细节会在dmesg里体现比如版本协商失败、inode问题、超时之类。这几步走下来问题范围基本就锁死了再对照5.1的表格处理具体原因就行。5.3 中文文件名乱码与权限入侵中文乱码这个坑主要出在挂载参数没指定字符集。Windows共享默认文件名编码是UTF-8现代版本但老NAS或者某些特殊共享可能是GBK/GB2312。正确做法是挂载时显式加iocharsetutf8。如果加上之后还乱码那重点检查Windows端是不是用了老的非UTF-8共享方式。还有一类“权限入侵”现象挂载目录下所有文件在Linux端看全是root而且不管你怎么chmod都变不了。这是CIFS的Unix扩展在作怪。Windows CIFS很常见的一个表现就是权限映射和本地文件系统不一致解决办法是挂载参数里加nounix禁用Unix扩展再用uid/gid/file_mode/dir_mode显式指定权限文件属主和权限就能按你的意思显示了。所有参数加在一起很长建议不要每次都手打。可以把常用挂载参数写成一个脚本文件放/usr/local/bin或者干脆用alias例如alias winmountsudo mount -t cifs //192.168.1.100/media /home/me/media -o credentials/etc/cifs.cred,vers3.0,iocharsetutf8,nounix,uid1000,gid1000,file_mode0755,dir_mode0755这样每次敲一行就能搞定省心。5.4 挂载后“重启生效”失败的案例复盘热搜词里有一条特别扎心“cifs挂载共享文件夹重启后失效怎么办”。这个我深有体会很多朋友第一次写fstab就把挂载写了进去但忘了加_netdev和x-systemd.automount结果每次开机都要卡一两分钟然后挂载失败。改法倒是不难把fstab那行在credentials/etc/cifs.cred后面补上_netdev,x-systemd.automount保存后执行systemctl daemon-reload再重启验证。如果还是不行多半是Windows主机在开机时还没把SMB服务拉起来可以用systemd单元设置一个延迟启动或者给autofs配置一个较短的重试时间。总之这个坑的核心就是“网络挂载不能在网络就绪之前强行挂”。6. 进阶技巧与安全建议别把共享挂成后门6.1 挂载选项里的安全三件套如果共享目录不是你自己的可信环境我强烈建议加上noexec,nosuid,nodev三个参数。noexec禁止在挂载目录里执行二进制文件防止你把Windows那边不小心放上来的木马脚本当程序跑。nosuid忽略suid位避免提权类程序通过共享目录钻空子。nodev不识别设备文件防止有人往共享目录塞一个设备文件来搞事。这三件套加上之后对正常读写文件没有影响但如果共享目录要放可执行程序比如你要直接在Windows共享上跑脚本那就得评估一下。我自己的规则是办公文件共享、媒体共享这类只读或只写数据的目录全部开三件套只有明确需要跑程序的内网开发共享才考虑剔除noexec。6.2 SMB版本、性能和安全权衡SMB版本选择直接关系到安全和性能的平衡。SMB 1.0协议早就不安全了存在大量漏洞现实中还有不少老设备默认开着网上还经常能扫到。无论什么时候我都不建议在公网或不可信网络里使用vers1.0。现代环境优先锁定vers3.0遇到兼容性问题再往下降级到vers2.02.0虽然老一点但安全性比1.0还是强不少。性能优化方面如果读大文件觉得慢可以试试cacheloose它允许客户端多用一点本地缓存来提高读取速度但是当你同时用两个客户端访问同一个共享并修改文件时这种模式可能看到旧数据一致性要求高的数据库文件千万别开。另外适当调大rsize和wsize也能提升大块传输效率比如rsize1048576,wsize1048576这两个值取决于内核和网卡性能不是越大越好需要实测。6.3 特殊场景Docker容器、开发板与多目录批量挂载Docker场景下挂载Windows共享有个常见诉求容器里的服务需要读宿主机的Windows共享目录。思路是先按本文方案在宿主机上把共享挂到某个本地目录再通过Docker的--volume参数把挂载目录映射进容器docker run -d --name media-consumer \ -v /home/me/media:/data:ro \ nginx:latest这样做的好处是容器本身不感知CIFS的存在所有网络挂载的复杂度都留在宿主机容器只看到一个普通只读目录干净又稳定。注意-v后面的:ro能防止容器写挂载目录建议默认加上。开发板挂载Windows共享是另一类高频场景常见于树莓派、RK系列、各类国产开发板跑Linux时想访问电脑上的共享。开发板系统一般比较精简可能没带cifs-utils先apt install cifs-utils或对应包管理安装即可。如果连包管理器都没有就得看内核是否支持CIFS不支持的情况下只能重编内核或者放弃CIFS改用NFS等方案。开发板的网口如果和Windows主机不在同一网段记得先配好静态路由或交换机配置不然端口通了也白搭。最后说一个批量挂载的小技巧。机器上挂多个共享时手写mount命令容易漏我习惯用一个简单的循环脚本#!/bin/bash SHARES(movies design backup) MOUNT_BASE/srv/winshare for s in ${SHARES[]}; do mkdir -p ${MOUNT_BASE}/${s} mountpoint -q ${MOUNT_BASE}/${s} || \ sudo mount -t cifs //192.168.1.100/${s} ${MOUNT_BASE}/${s} \ -o credentials/etc/cifs.cred,vers3.0,iocharsetutf8,nounix,uid1000,gid1000,_netdev donemountpoint -q先判断目录是否已经挂着避免重复挂载报错。这个脚本放到开机启动或者需要时手动执行都行。最后再分享一点我的实际使用习惯平时挂载共享我已经很少在命令行里带密码了所有凭据都收进/etc/cifs.cred权限锁成600Windows端也专门建了独立账户密码设成随机长串互不干扰。共享目录的归属我会统一放到/srv/winshare下面按主机名或者用途建子目录机器重启后一看目录列表就清楚这些目录来自哪台机器、是干嘛用的。遇到版本协商问题就按vers3.0、vers2.0的顺序往下调一般都能通。这套流程玩熟之后跨平台传文件真的不用再靠U盘和网盘中转了。希望这篇番外能帮你少走点弯路有问题也欢迎在评论区交流。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑