ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu间Samba共享文件夹配置实战与问题排查

Ubuntu间Samba共享文件夹配置实战与问题排查 两台Ubuntu之间通过Samba共享文件夹是我在工作中处理Linux设备间文件交换时最常用的方案。虽然Ubuntu自带的文件管理器已经能通过“其他位置”直接访问局域网主机但要实现稳定的、可复用路径的共享自己手动配置一次Samba反而能让后续使用省掉很多麻烦。这篇文章我会从Samba的实际用途讲起把两台Ubuntu互通文件这件事的完整操作流程、配置文件解读、挂载方式和常见问题都梳理一遍。内容包含我实操时踩过的坑和总结出来的经验后续你在自己环境里照着做基本能避开所有比较隐蔽的雷区。适合刚接触Linux共享、需要在内网设备间交换数据的用户参考也适合运维新手快速掌握Samba的基础配置逻辑。1. Samba选型思路为什么在两台Ubuntu之间依然选它1.1 Samba解决的是什么问题当你手头有两台Ubuntu机器想把其中一台的目录直接当成另一台的本地文件夹来用本质上需要一种“跨主机的文件系统访问协议”。Linux生态里可选方案不少比如NFS、FTP、sshfs、rsync但Samba始终是我在局域网混用场景下的默认首选。原因很直观Samba实现的是SMB/CIFS协议这是Windows、macOS、Linux三方天然支持的协议栈意味着同一套共享配置将来如果加入一台Windows机器也能无缝使用。内核内置的cifs.ko模块对SMB协议支持成熟吞吐、稳定性在小规模内网环境下都有保障。它的权限模型与Linux本地权限结合紧密可以通过配置精确控制多个用户的读写范围。相比FTPSamba没有冗长的文件列表刷新延迟相比NFSSamba在认证、广播、防火墙兼容性上更友好。在两台Ubuntu之间共享文件很多人第一反应是用NFS觉得“都是Linux没必要走SMB”。但我在实际环境中对比过NFS虽然配置简单、性能略高可在客户端断线重连、权限漂移、以及后续添加非Linux设备时维护成本远高于Samba。如果你只是临时传几个文件那怎么都行但如果你需要长期把远端目录挂载到本地作为工作目录Samba的容错性和工具链完善度明显更胜一筹。1.2 Samba与Ubuntu的版本兼容性Ubuntu官网镜像和桌面版、服务器版的迭代并不影响Samba本身的安装方式。只要你的系统还在支持周期内apt源里都能直接拉到对应版本的samba包。我这边主力环境是Ubuntu 22.04 LTS和24.04 LTS两个版本在Samba配置上基本一致主要差异在默认的SMB协议版本和某些安全策略的默认值上。需要注意一个细节Samba版本越高默认的server min protocol越倾向于更安全的协议版本。较早的Ubuntu 18.04/20.04默认可能允许SMB1协议但新版本早已默认禁用SMB1。所以如果两台机器版本差距过大比如一台是旧版、一台是24.04配置共享时一定要在smb.conf里显式指定一个两者都支持的server min protocol比如SMB2_10避免低版本机器用老协议握手时被拒。1.3 和其他方案的选择对比我整理了一个简单的对比表方便你根据自己场景判断是否该用Samba方案协议适用场景配置复杂度跨平台能力性能SambaSMB/CIFS局域网多设备共享、需要用户认证中等极强Win/macOS/Linux稳定可靠NFSNFS纯Linux环境、高性能计算集群低弱Windows支持差略高于SambaFTPFTP/SFTP临时传输、公网访问低强一般sshfsFUSE over SSH简单、临时的远程目录挂载低中一般rsync自有协议同步备份、增量传输中中特定场景优秀如果你只是偶尔传一次文件rsync或者sshfs其实更轻量。但如果你想在客户端上直接操作远端文件像本地目录一样进行浏览、编辑、保存Samba的体验最接近“网络磁盘”这一直觉。我在日常开发中常把编译服务器上的一块存储通过Samba挂载到工作机这样编辑器、终端、文件管理器三层操作全都在同一套路径语义下完成不会出现“本地一份、远端一份”这类同步混乱。2. 环境准备安装Samba前的必要梳理2.1 两台Ubuntu的通信基线检查很多人直接从“安装Samba、改配置、重启服务”开始结果死活连不上回头排查发现根本没有Ping通对方。所以我的建议是动手配置之前先把通信基线打牢至少确认三个点两台机器在同一网段且能互相Ping通网关和对方IP。SSH能互连如果SSH都不通Samba大概率也会受同样问题拖累。主机名解析正常或者你直接使用IP进行连接避免DNS和WINS问题干扰判断。举例来说我的两台测试机分别是ubuntu-server192.168.1.10和ubuntu-work192.168.1.20。首先要保证的是它们互相之间执行ping 192.168.1.10和ping 192.168.1.20都能通。如果Ping不通先检查网卡配置、路由表、还有交换机/路由器端口而不是急着折腾Samba。2.2 统一用户与目录规划Samba的共享目录不像FTP根目录那么粒度单一它可以直接指向Linux文件系统里的任意路径。但权限模型上Samba用户必须映射到Linux系统用户。也就是说你需要在提供服务的那台机器上创建一个系统用户然后把这个用户添加到Samba的用户数据库里设置独立的Samba密码。我做规划时通常遵循一套固定模式共享根目录放在/srv/samba/share不会随意放在home目录下因为home目录可能涉及加密家目录encrypted homeSamba服务用户无法正常读取容易出诡异权限问题。创建一个专用系统用户sambauser设置nologin作为shell避免这个用户被用于其他登录用途。把共享目录所有者设置为sambauser组设置为sambauser权限控制在755或750。如果需要多个用户看到不同子目录我通常建立子目录并在Samba配置里用valid users来控制访问范围。2.3 安装Samba本体在Ubuntu上安装Samba非常单纯执行下面两行即可sudo apt update sudo apt install samba安装完成后可以用smbd --version查看版本号。以Ubuntu 22.04为例默认拉到的Samba版本一般是4.15系列24.04则可能是4.19系列。这两个版本在默认配置行为上有细微差异主要体现在密码加密算法协商和协议下限上但普通共享场景不受影响。安装完毕先不急着改配置先把服务跑起来sudo systemctl enable --now smbd sudo systemctl status smbd如果执行systemctl status出现active (running)说明Samba服务本身已经就绪。此时/etc/samba/smb.conf是默认最小配置还没有任何自定义共享。3. Samba核心配置拆解smb.conf在讲什么3.1 配置文件的全局段[global]/etc/samba/smb.conf是Samba的心脏。默认文件里已经有完整的注释但真正需要关注和修改的核心参数并不多。我会直接给出一个精简且适合内网两台机器共享的全局段配置[global] workgroup WORKGROUP server string %h samba server netbios name ubuntu-server security user map to guest Bad User server min protocol SMB2_10 server max protocol SMB3_11 log file /var/log/samba/log.%m max log size 1000 logging file panic action /usr/share/samba/panic-action obey pam restrictions Yes unix password sync Yes passwd program /usr/bin/passwd %u passwd chat *Enter\snew\s*\spo\s*password:* %n\n *Retype\snew\s*\spo\s*password:* %n\n *password\supdated\ssuccessfully* . pam password change Yes socket options TCP_NODELAY IPTOS_LOWDELAY这里挑几个关键参数说说为什么这样设security userSamba的认证模式。这是最常用、也最安全的模式每个访问共享的用户都需要通过本地Samba用户数据库认证。与之相对的是security share老古董模式早已不推荐。map to guest Bad User当一个不存在于Samba数据库中的用户尝试访问共享时自动将其映射为guest用户。这个参数常用于配置公共共享让访客无需密码访问某目录但如果你想要严格认证就把它改成map to guest Never。server min protocol SMB2_10关闭SMB1避免老协议带来的安全风险同时兼容Win10以后的默认策略。在两台Ubuntu之间这个值完全够用。socket options TCP_NODELAY IPTOS_LOWDELAY降低小文件传阅时的网络延迟。虽然现代内核和Samba会自动优化TCP栈但写上这个选项在局域网小文件场景下实测有效果。3.2 共享目录段[share]的参数讲解在smb.conf末尾追加共享定义。以下是我在一台服务端机器上常用的配置模板[myshare] comment Ubuntu Shared Folder path /srv/samba/share browseable yes writable yes valid users sambauser create mask 0644 directory mask 0755 force user sambauser force group sambauser逐项解释path共享目录的真实路径这一项的权限需要被认真处理Samba服务进程对它有直接读写权限。browseable yes同一局域网内可被自动发现或浏览到。writable yes允许通过Samba协议写入文件。valid users sambauser只有指定的Linux用户才能访问这个共享其他用户一律拒绝。create mask 0644新创建的文件默认权限为rw-r--r--。如果你需要保留可执行位可以改成0744。directory mask 0755新创建的目录默认权限为rwxr-xr-x。force user sambauser即使客户端以其他用户身份建立会话服务端也会把所有文件操作强制映射为sambauser来执行。这一项可以有效避免多个客户端创建出的文件属主混乱问题。3.3 配置校验与服务重载改完配置后不要直接重启服务先检查配置语法testparm如果显示Loaded services file OK说明配置没问题。接着重启或重载服务sudo systemctl restart smbd sudo systemctl reload smbd我一般用restart因为reload在某些版本上不会完全重新解析配置文件里的共享段可能导致新共享没有生效。完成后再用smbclient -L //127.0.0.1 -U sambauser验证是否能列出共享列表。4. 实操服务端配置与客户端挂载全流程4.1 服务端完整配置步骤假设我现在有两台机器Ubuntu ServerIP 192.168.1.10作为服务端Ubuntu DesktopIP 192.168.1.20作为客户端。完整流程如下第一步创建共享目录并设定权限sudo mkdir -p /srv/samba/share sudo chown -R sambauser:sambauser /srv/samba/share sudo chmod -R 0755 /srv/samba/share创建系统用户如果还没有sudo useradd -M -s /usr/sbin/nologin sambauser sudo smbpasswd -a sambausersmbpasswd -a命令会要求输入两次密码这个密码专门用于Samba访问认证可以不同于系统密码也可以一致视你的安全策略而定。第二步编辑smb.confsudo nano /etc/samba/smb.conf把上面给的[global]和[myshare]段落写进去保存退出。第三步校验并重启testparm sudo systemctl restart smbd你也可以顺手检查一下Samba端口监听状态sudo ss -tlnp | grep -E 139|445正常情况下应该能看到smbd进程监听在445和139端口这时服务端准备完毕。4.2 客户端图形界面访问双击路径即可在Ubuntu Desktop上打开文件管理器Files在左侧栏找到“其他位置”在底部“连接到服务器”输入框中填写smb://192.168.1.10/myshare回车后会弹出认证窗口输入sambauser和对应的Samba密码就能直接看到共享目录里的内容。这个方式最快适合临时访问但缺点是无法指定本地挂载点无法在终端里通过绝对路径访问。4.3 客户端命令行挂载稳定且可复现命令行挂载是我最常用的方式因为挂载后可以在脚本、编译工具、终端编辑器里自由使用路径体验等同于本地目录。安装CIFS工具sudo apt install cifs-utils创建挂载点并挂载sudo mkdir -p /mnt/ubuntuserver sudo mount -t cifs //192.168.1.10/myshare /mnt/ubuntuserver -o usernamesambauser,uid$(id -u),gid$(id -g),vers3.1.1,file_mode0644,dir_mode0755参数解释usernamesambauserSamba认证用户。uid$(id -u),gid$(id -g)把挂载后的文件所有者映射为本地当前用户这样可以避免文件权限显示成nobody或者某些文件写不进去的窘境。vers3.1.1强制使用SMB 3.1.1协议版本和之前服务端的server max protocol对应。file_mode0644,dir_mode0755为不支持Linux权限分配的文件系统提供默认文件/目录权限。挂载完成后在/mnt/ubuntuserver里写文件、做同步、用rsync拉数据一切都和本地操作一样。4.4 开机自动挂载编辑fstab如果你希望客户端每次开机都自动挂载这个共享可以在/etc/fstab里加一行//192.168.1.10/myshare /mnt/ubuntuserver cifs usernamesambauser,password你的密码,uid1000,gid1000,vers3.1.1,file_mode0644,dir_mode0755,_netdev 0 0有几个注意事项特别重要不建议在fstab的长期挂载项里明文写密码。如果是在自家内网安全环境图省事可以这样做严谨一点的话推荐使用credentials/etc/samba/credentials文件并把这个文件的权限设为600。_netdev这个选项很关键告诉系统这是一个网络设备需要等待网络就绪后再挂载。不加的话开机时网络栈未初始化挂载会失败。uid和gid建议写实际数字不要写用户名因为fstab解析时某些版本对用户名的映射不稳定。credentials文件的写法如下echo usernamesambauser ~/.smbcredentials echo password你的密码 ~/.smbcredentials chmod 600 ~/.smbcredentials然后把fstab里的username、password替换成credentials/home/你的用户名/.smbcredentials。4.5 挂载时遇到权限被拒怎么办这个是我遇到最多的问题。客户端访问时提示“Permission denied”或“无法写入”排查顺序很关键先看服务端共享目录的实际权限是否允许sambauser写入sudo -u sambauser touch /srv/samba/share/test.txt如果这步失败直接定位到目录属主和权限问题别先怀疑Samba配置。再看Samba配置里writable和force user是否生效testparm可以给出最终解析结果。我一直觉得一个高效的排查原则是本地层面先打通再谈网络协议层面的问题。5. 常见问题与排查技巧实录5.1 连接报错“protocol negotiation failed”这个报错最容易出现在两台机器Samba协议支持范围不一致的时候。比如新客户端默认支持SMB3但老服务端只支持到SMB1或者反之。解决方法是统一两侧或单侧配置在服务端smb.conf的[global]段里显式指定server min protocol SMB2 server max protocol SMB3_11然后重启smbd。如果改用客户端命令行挂载可以在挂载参数里增加vers3.0或vers3.1.1绕过协商。5.2 客户端能连接但只能读不能写最常见原因是共享目录的本地权限不够。Samba工作在内核的用户态受文件系统权限约束。也就是说即使Samba配置里设置了writable yes如果Linux文件系统本身对sambauser没有写权限依然无法写入。排查步骤确认共享目录属主设置为sambauser。确认属组权限包含写权限至少给组或其他用户开写权限。确认create mask和directory mask是否限制得过死。检查挂载参数里是否带了ro或者file_mode是否设置为0444。我见过不少人在fstab里写了ro却忘了结果折腾半天配置和权限。5.3 防火墙导致无法访问Ubuntu桌面版默认不开ufw服务器版则可能开着。如果之前关过或开过防火墙需要放行Samba相关的端口sudo ufw allow 139/tcp sudo ufw allow 445/tcp sudo ufw allow 137/udp sudo ufw allow 138/udp也可以用更简洁的sudo ufw allow samba直接放行Samba服务。注意Samba除了TCP端口还需要UDP的137和138用于NetBIOS名称解析。如果只放行TCP可能导致客户端通过主机名访问时解析失败但用IP访问却正常。5.4 文件属主显示nobody这个问题在客户端挂载时特别常见。原因是CIFS升版后默认访问方式下远端用户无法映射到客户端本地的用户体系。解决办法就是挂载时用uid和gid参数强制指定属主。例如sudo mount -t cifs //192.168.1.10/myshare /mnt/ubuntuserver -o usernamesambauser,uid1000,gid1000这样操作后所有文件在客户端看来都归属于uid 1000也就是你当前的本地用户。5.5 挂载断连后无法自动重连内网环境下偶尔会遇到路由器重启、服务端休眠等情况客户端挂载会进入“不可用”状态。此时使用该目录的进程可能卡死需要强制卸载后重新挂载sudo umount -l /mnt/ubuntuserver sudo mount -a-l参数是lazy unmount可以解除卡在IO上的挂载点。如果你想要自动重连内核的CIFS支持echo_interval参数在挂载时添加-o usernamesambauser,echo_interval30,hard其中hard模式会让客户端在服务器恢复后持续重试而不是在短暂网络故障时报Input/output error。但要注意hard模式下如果服务器长时间不可用客户端进程会一直阻塞在IO等待上需要用户自行判断是否该放弃操作。5.6 小文件传输性能差如果你在两台Ubuntu之间通过Samba频繁操作大量小文件比如代码仓库、图片素材目录可能会觉得比rsync慢不少。这一部分是SMB协议本身的开销另一部分也和网络延迟有关。几个优化小技巧服务端在[global]中保持socket options TCP_NODELAY IPTOS_LOWDELAY。客户端挂载参数里加上cachenone或cacheloose根据实际数据一致性要求取舍。小文件场景我通常用cachenone减少缓存同步损耗。如果共享文件要被并行写入建议服务端挂载共享目录时使用strict allocateyes可以避免频繁扩展文件占用的性能波动。对于超大文件拷贝不要用文件管理器拖拽用rsync或cp命令行效率更高进度监控也更方便。5.7 Samba用户密码修改与同步如果需要修改Samba用户的访问密码执行sudo smbpasswd sambauser如果系统用户本身密码被修改了想要同步到Samba密码可以开启unix password sync yes选项但前提是你希望两者保持一致。有时候反而会造成困扰比如系统密码改了Samba密码也跟着变导致客户端凭据失效。我一般建议保持两者独立统一用smbpasswd管理Samba侧密码。6. 进阶多用户隔离与性能调优6.1 多用户不同权限的共享规划如果不止一个用户访问共享比如团队里有人要读写、有人只读可以在同一台服务端建立多个Linux用户然后为每个用户分别设置Samba密码smb.conf里为不同用户配置不同的valid users和read list、write list[teamshare] path /srv/samba/team browseable yes writable no valid users alice, bob, carol read list alice, bob write list carol这样alice和bob只能读取carol可以写入。保持writable no作为兜底策略再通过write list精确开放写权限比writable yes然后试图用read list限制更安全因为后者容易被管理员遗漏。6.2 在共享上启用回收站功能Samba没有原生的回收站机制但可以通过配置vfs_recycle模块来实现。在共享段中添加[myshare] vfs objects recycle recycle:repository .deleted recycle:keeptree yes recycle:touch no这样客户端删除文件时不会直接物理删除而是移动到共享目录下的.deleted隐藏文件夹中。这个功能在多人协作时特别实用防止误删难以恢复。注意启用后需要创建对应的.deleted目录且目录的所有者需要能被force user写入。6.3 网络层面如何提升实际传输速度如果两台机器都支持千兆网卡但Samba传输速度始终上不去先排查链路本身的问题。用iperf3测一下两台机器之间的原始TCP吞吐量# 服务端192.168.1.10 iperf3 -s # 客户端192.168.1.20 iperf3 -c 192.168.1.10如果iperf3测得的吞吐远低于网卡速率问题大概率在交换机端口协商、网线质量或TCP窗口设置上与Samba无关。如果iperf3结果正常但Samba慢可以尝试检查服务端和客户端的网卡是否开启了offload相关特性比如tso、gso。在极端情况下开启这些特性反而会导致大包传输效率下降。挂载共享时增加rsize65536,wsize65536参数注意这需要设为131072倍数才有意义直接写65536对现代内核来说已经是优化过的默认值手动调整空间不大。使用smbstatus -S查看当前会话的传输情况判断是读阻塞还是写阻塞再针对性优化。6.4 Samba时区与文件时间戳问题Samba使用UTC存储时间戳客户端挂载时如果时区设置不一致可能导致文件修改时间与本地时间有偏差。Ubuntu桌面版一般会自动设置时区服务器版如果之前直接修改过硬件时钟可能产生时间偏移。检查方式timedatectl确保Local time、Universal time、RTC time都符合预期。如果RTC被设置成了local time建议改回UTCsudo timedatectl set-local-rtc false这一步对文件同步校验很重要。如果你用rsync基于时间戳做增量备份时间差会让每次同步都产生大量非必要的文件重传。6.5 Samba备份与日志轮转Samba自身生成的日志文件可能占满磁盘特别是长时间运行且访问频繁的共享服务器。smb.conf里的max log size单位为KB默认1000即1MB每个日志文件。日志文件命名格式log.%m会按照访问主机名生成独立文件时间久了可能积累出大量小文件。建议开启系统的logrotate对Samba日志做轮转。Ubuntu上默认的轮转配置在/etc/logrotate.d/samba如果不存在可以手写一个/var/log/samba/log.* { daily rotate 7 compress delaycompress missingok notifempty copytruncate }copytruncate的作用是备份后截断原文件不影响正在运行的smbd进程写入。这个细节比较容易忽略但实际运维中作用很大。7. 安全加固与配置基线7.1 仅允许内网IP访问如果服务端同时有多个网络接口或者公网IP暴露在外建议在Samba配置的[global]段限制监听接口和允许来源。最简单的方式是用防火墙限定也可以使用interfaces和bind interfaces only参数[global] interfaces lo 192.168.1.0/24 bind interfaces only yes绑定了接口后只有来自该网段的请求能访问Samba端口其他网段的连接会被直接拒绝。这个设置比防火墙多一层应用层保护。7.2 禁止guest访问如果你不需要匿名共享务必确认map to guest Never restrict anonymous 2restrict anonymous 2禁止任何匿名枚举可以防止攻击者通过空会话获取共享列表和用户信息。针对两台内网可信机器这个配置没有任何副作用。7.3 配置层面的最小化暴露Samba默认会共享打印机相关服务如果你只是共享文件可以在[global]增加load printers no printing bsd printcap name /dev/null disable spoolss yes这些配置会关闭打印相关的IPC接口减少不必要的服务暴露同时也能让启动日志更干净。7.4 Samba服务本身的更新维护Ubuntu的apt源会定期发布Samba安全更新建议保持系统更新sudo apt update sudo apt upgrade当你执行apt upgrade看到samba包有更新时不要犹豫。这个软件在公网上的攻击面比较大虽然内网环境风险偏低但及时修补总是稳妥的。更新后重启smbd服务即可不用重新配置。8. 从实操中沉淀下来的经验这篇文章写到这里已经把两台Ubuntu之间通过Samba共享文件夹的完整链路梳理清楚了从协议选型、环境准备、配置编写、服务端部署、客户端挂载到常见问题排查、性能优化和基础安全加固。我在实际使用中最深的体会是Samba配置出错绝大多数不是协议问题而是Linux本地权限和文件系统特性没搞清楚。创建共享前先在服务端本地把目录权限调整到目标用户可读可写的状态再启动Samba服务。如果本地登录测试都过不了配置Samba共享也一样寸步难行。另外强烈建议把客户端的挂载方式固化下来。哪怕刚开始不打算长期用也花一分钟写好credentials文件别把密码裸奔在fstab里。内网虽然相对可信但一旦这台机器将来被攻破或共享出去明文密码就是一颗定时炸弹。最后分享一个小技巧在客户端挂载完成后可以用mount | grep cifs确认挂载参数是否生效。如果看到rw,relatime,vers3.1.1这类输出说明挂载状态正常。后续如果有权限或性能问题第一条命令看这个能帮你快速确认自己到底是以什么参数访问的远端共享。Samba在Ubuntu生态里的角色像是一座桥把两个“各管各的”的文件系统连成一套统一的工作空间。第一次配好后你会发现自己再也不想用U盘来回拷数据了。
返回列表