三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Ubuntu 18.04 Samba共享文件夹配置与跨平台访问全攻略

Ubuntu 18.04 Samba共享文件夹配置与跨平台访问全攻略

1. 项目概述:为什么共享文件夹是Linux桌面协作的基石

在Ubuntu这类Linux发行版的日常使用中,无论是个人多设备同步,还是团队项目协作,文件共享都是一个绕不开的核心需求。你可能刚从Windows或macOS转过来,习惯了右键菜单里直观的“共享”选项,到了Ubuntu 18.04.6 LTS(一个长期支持版本,至今仍有不少用户和服务器在使用)上,一时会有点摸不着头脑:共享文件夹到底怎么创建?创建完了又该去哪里访问它?

这背后涉及的是两种主流的共享协议:SMB/CIFSNFS。简单来说,如果你需要在Ubuntu和Windows、macOS之间共享文件,SMB是首选;如果是在纯Linux/Unix环境(比如服务器集群)内,NFS则性能更优、配置更简洁。今天,我们就聚焦于最通用、需求最广的SMB共享,手把手带你从零开始,在Ubuntu 18.04.6上搭建一个稳定、安全的共享文件夹,并告诉你从本地和远程访问它的所有方法。整个过程,我会穿插我这些年踩过的坑和总结的技巧,确保你一次成功。

2. 核心原理与方案选型:SMB vs. NFS

在动手之前,花几分钟理解背后的原理,能让你在遇到问题时知道从何下手,而不是机械地复制命令。

2.1 SMB协议:跨平台文件共享的事实标准

SMB(Server Message Block)协议,现在主要由其增强版CIFS(Common Internet File System)代表,是微软主导的、用于在网络上提供文件共享、打印机共享等服务的协议。它的最大优势就是跨平台兼容性极好。你的Ubuntu通过Samba软件(一个开源的SMB/CIFS协议实现)搭建共享后,同一网络内的Windows电脑可以直接在“网络”里看到它,macOS也能通过“访达”轻松连接。

为什么选择Samba(SMB)作为主要方案?

  1. 生态兼容性:这是决定性因素。在混合操作系统环境中,SMB是唯一的“通用语言”。
  2. 功能完善:支持用户认证、权限控制、访问控制列表(ACL),安全性有保障。
  3. 社区成熟:Samba项目历史悠久,遇到任何问题,几乎都能在网上找到解决方案。

2.2 NFS协议:Linux/Unix环境的高性能选择

NFS(Network File System)由Sun公司开发,是类Unix系统之间进行文件共享的原生协议。它的设计更贴近Unix的文件系统哲学,在传输效率和元数据操作(如大量小文件读写)上,通常比SMB有优势。

什么情况下考虑NFS?

  • 你的网络环境全是Linux或macOS(macOS也原生支持NFS)。
  • 共享主要用于服务器之间挂载,例如Web服务器挂载存储服务器上的静态资源目录。
  • 你对网络性能有极致要求,且客户端都支持NFSv4。

对于绝大多数桌面用户和需要与Windows互通的场景,Samba是不二之选。因此,本文将详细展开基于Samba的SMB共享配置。

注意:在同一个目录上同时配置SMB和NFS共享是可行的,但需要极其小心地协调两者的权限系统(Unix权限 vs. Samba权限),否则会导致混乱。初学者不建议这么做。

3. 实战:安装与配置Samba服务端

理论清晰后,我们进入实战环节。请打开你的Ubuntu 18.04.6终端。

3.1 系统更新与Samba安装

首先,确保你的软件包列表是最新的,然后安装Samba套件。

sudo apt update sudo apt install samba

sudo apt install samba这个命令会安装Samba的服务端(smbd)、客户端(smbclient)以及一些基础工具。安装完成后,Samba服务会自动启动,你可以用以下命令验证:

sudo systemctl status smbd

如果看到active (running)的字样,说明服务正在运行。

3.2 创建专用的共享目录并设置权限

我强烈建议不要直接共享你的家目录(/home/你的用户名。虽然技术上可行,但这会带来巨大的安全风险。最佳实践是创建一个专用于共享的独立目录。

  1. 创建目录:比如,我在根目录下创建一个叫shared_data的文件夹。

    sudo mkdir /shared_data

    为什么用sudo?因为这个目录创建在根目录下,所有用户都可能需要访问,由系统管理员统一管理权限更清晰。

  2. 修改目录所有权和权限:为了让特定用户(比如你当前的用户)能读写,我们需要改变目录的所有者,并设置合适的权限。

    sudo chown -R your_username:your_username /shared_data sudo chmod -R 0755 /shared_data
    • chown:将/shared_data目录及其内部所有内容(-R递归)的所有者和所属组都改为你的用户名(请替换your_username为你的实际用户名)。
    • chmod 0755:设置权限。7(所有者:读、写、执行)、5(所属组:读、执行)、5(其他用户:读、执行)。这里的“执行”权限对于目录意味着“可以进入该目录”,是必须的。

3.3 深度配置Samba:编辑smb.conf文件

Samba的所有共享配置都存储在/etc/samba/smb.conf文件中。在修改前,先做个备份是个好习惯。

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup sudo nano /etc/samba/smb.conf

使用nano编辑器打开配置文件。我们将主要关注两个部分:全局设置[global]和具体的共享定义。

  1. 检查全局设置(通常无需大改): 找到[global]部分。确保workgroup设置与你的Windows工作组名一致(默认通常是WORKGROUP)。server string可以自定义,这是在网络邻居中显示的服务器描述。

  2. 添加你的共享配置: 滚动到文件末尾,添加如下配置块。请务必根据你的实际情况修改注释说明的地方

    [SharedData] # 这是共享名,将在网络中被看到的名字 comment = Ubuntu Shared Folder # 共享描述,可选 path = /shared_data # 共享目录的绝对路径,必须与之前创建的目录一致 browseable = yes # 是否允许被浏览到 writable = yes # 是否可写 read only = no # 是否只读,与writable相反,设置一个即可 create mask = 0775 # 新创建文件的默认权限 directory mask = 0775 # 新创建目录的默认权限 valid users = your_username # 允许访问此共享的Samba用户(重要!) # force user = your_username # 强制所有连接以此用户身份操作,慎用 # guest ok = no # 是否允许匿名访问,出于安全考虑,建议设为 no

    关键参数解析

    • valid users:这是访问控制的核心。只有这里列出的Samba用户才能访问该共享。注意,系统用户不等于Samba用户,需要单独添加(下一步会做)。
    • create mask&directory mask:这决定了通过网络创建的文件/目录的权限。0775意味着所有者可读写执行,组用户可读写执行,其他用户只读执行。这通常是一个平衡了便利性和安全性的设置。
    • writableread only:看似矛盾,其实以最后一个有效设置为准。明确设置writable = yes即可。

3.4 添加Samba用户并设置密码

系统用户不能直接用于Samba登录,必须为其添加Samba密码。这个密码是独立的,可以与系统登录密码不同,强烈建议设置不同的密码以增加安全性

sudo smbpasswd -a your_username

系统会提示你输入并确认新的Samba密码。这个用户必须已经是存在的系统用户(即你的登录用户)。

3.5 重启Samba服务并应用配置

每次修改smb.conf后,都需要重启Samba服务使配置生效。建议先测试配置文件语法是否正确。

sudo testparm # 测试配置文件语法,无报错即可 sudo systemctl restart smbd nmbd # 重启smbd(主服务)和nmbd(NetBIOS名称服务) sudo systemctl enable smbd nmbd # 设置开机自启(可选但推荐)

4. 防火墙与网络配置:打通访问通道

服务配好了,但你的电脑防火墙可能会阻止外部访问。Ubuntu 18.04默认使用ufw防火墙。

4.1 开放Samba所需端口

Samba主要使用以下端口:

  • 137/udp, 138/udp: NetBIOS 名称服务
  • 139/tcp, 445/tcp: SMB over NetBIOS 和 SMB over TCP

一次性开放它们:

sudo ufw allow samba

或者更精确地:

sudo ufw allow 139/tcp sudo ufw allow 445/tcp sudo ufw allow 137/udp sudo ufw allow 138/udp

启用防火墙(如果尚未启用)并查看状态:

sudo ufw enable sudo ufw status verbose

4.2 处理网络发现(NetBIOS)问题

如果你的Windows电脑在“网络”里看不到Ubuntu,可能是NetBIOS名称解析的问题。除了确保nmbd服务运行,还可以尝试:

  1. 在Windows上,按Win+R,输入\\Ubuntu机器的IP地址(例如\\192.168.1.100)直接访问。
  2. 检查网络配置文件/etc/samba/smb.conf中的name resolve order选项,可以尝试设置为hosts lmhosts wins bcast

5. 多平台访问共享文件夹全攻略

配置完成后,我们来看看如何从各个地方打开这个共享文件夹。

5.1 在Ubuntu本地访问(作为客户端)

即使共享服务端和客户端在同一台Ubuntu机器上,你也可以通过文件管理器访问,这常用于验证配置。

  1. 使用文件管理器(GUI)

    • 打开“文件”管理器。
    • 在左侧边栏,找到并点击“其他位置”。
    • 在底部的“连接到服务器”输入框中,输入:smb://localhost/SharedDatasmb://你的本机IP/SharedData
    • 点击“连接”,会弹出认证窗口,输入之前设置的Samba用户名和密码即可。
  2. 使用命令行挂载(CLI): 对于需要脚本化或持久化挂载的场景,命令行更强大。

    • 首先,创建一个本地挂载点:
      mkdir ~/Desktop/local_share
    • 使用cifs-utils工具包进行挂载(如果未安装:sudo apt install cifs-utils):
      sudo mount -t cifs -o username=your_username,password=your_samba_password //localhost/SharedData ~/Desktop/local_share
      安全警告:在命令行中直接暴露密码不安全。更好的做法是将凭据存入文件:
      # 创建凭据文件,设置仅root可读 echo "username=your_username" | sudo tee /etc/samba/credentials > /dev/null echo "password=your_samba_password" | sudo tee -a /etc/samba/credentials > /dev/null sudo chmod 600 /etc/samba/credentials # 使用凭据文件挂载 sudo mount -t cifs -o credentials=/etc/samba/credentials //localhost/SharedData ~/Desktop/local_share
    • 卸载共享:sudo umount ~/Desktop/local_share

5.2 从Windows访问

这是最常见的场景。

  1. 通过文件资源管理器

    • 打开“此电脑”或任意文件夹。
    • 在地址栏直接输入:\\Ubuntu主机的IP地址(如\\192.168.1.100),回车。
    • 或者,在“网络”侧边栏中浏览,理论上应该能看到你的Ubuntu主机名,双击进入。
    • 系统会要求输入用户名和密码。这里有个巨坑:Windows默认会尝试用你当前的Windows登录凭据去连接,如果用户名不匹配就会失败。你需要点击“更多选项”,选择“使用其他账户”,然后输入格式为Ubuntu主机名\用户名IP地址\用户名的用户名(例如UBUNTU-PC\your_username192.168.1.100\your_username),以及对应的Samba密码。
  2. 映射网络驱动器: 为了更方便,可以将共享文件夹映射为一个本地驱动器盘符(如Z:盘)。

    • 在成功访问共享文件夹后,在文件夹上右键,选择“映射网络驱动器”。
    • 选择一个盘符,勾选“使用其他凭据连接”,点击“完成”。
    • 再次输入Samba用户名和密码(格式同上),并勾选“记住我的凭据”,以后开机就会自动连接。

5.3 从macOS访问

macOS对SMB的支持也很好。

  1. 在Finder中,点击菜单栏“前往” -> “连接服务器”。
  2. 在服务器地址中输入:smb://Ubuntu主机的IP地址smb://Ubuntu主机名.local
  3. 点击“连接”,选择你要连接的共享卷(即SharedData)。
  4. 输入身份验证信息,选择“注册用户”,输入Samba用户名和密码即可。

5.4 从其他Linux设备或手机访问

  • Linux客户端:方法与5.1节在Ubuntu本地访问类似,使用文件管理器的“连接到服务器”功能或mount.cifs命令。
  • Android/iOS:可以在应用商店搜索“SMB文件管理器”或“网络存储”,有很多App支持。输入服务器IP、共享名、用户名和密码即可访问。

6. 高级配置与权限调优

基础共享搭建完成后,你可能会遇到更复杂的需求。

6.1 多用户与权限管理

如果你需要让多个用户访问,并且拥有不同的权限(例如,用户A可读写,用户B只读)。

  1. 为每个用户添加Samba账户

    sudo smbpasswd -a userA sudo smbpasswd -a userB
  2. 修改共享配置: 在smb.conf的共享定义中,可以这样设置:

    [SharedData] path = /shared_data valid users = userA, userB @smbgroup # @smbgroup 表示一个Samba用户组 write list = userA # 只有userA可写 read list = userB # userB只读(如果设置了writable=yes,则read list优先级更高)

    更精细的控制可以使用force group结合Unix文件系统权限,或者使用ACL(访问控制列表)。

6.2 使用ACL进行更精细的权限控制

标准的Unix权限(chmod)有时不够灵活。ACL允许你为特定用户或组设置独立的权限。

  1. 安装ACL工具sudo apt install acl
  2. 为目录启用ACL:需要在挂载文件系统时添加acl选项。检查/etc/fstab中对应分区的挂载选项,通常已有defaults(包含acl)。如果没有,可以改为defaults,acl
  3. 设置ACL规则
    # 给目录设置默认ACL,使得在此目录下新建的文件/目录继承权限 sudo setfacl -R -d -m u:userB:rx /shared_data # 给特定用户添加权限 sudo setfacl -m u:userA:rwx /shared_data # 查看ACL getfacl /shared_data
    结合Samba的force userforce group参数,可以实现非常复杂的共享权限模型。

7. 故障排查与常见问题实录

即使按照步骤操作,你也可能会遇到问题。这里是我总结的常见“坑点”和解决方法。

7.1 连接被拒绝或无法找到网络路径

  • 症状:Windows提示“无法访问。你可能没有权限使用网络资源。”或“网络路径未找到”。
  • 排查步骤
    1. 检查服务状态sudo systemctl status smbd nmbd,确保两者都是active (running)
    2. 检查防火墙sudo ufw status,确认Samba端口已放行。
    3. 检查IP地址:在Ubuntu上运行ip addr,确认你使用的是正确的局域网IP(通常是eth0wlan0接口下的inet地址)。
    4. 使用smbclient自检:在Ubuntu本机上运行smbclient -L localhost -U your_username。输入密码后,如果能列出共享(包括SharedData),说明服务端配置基本正确。如果失败,根据错误信息检查smb.conf和Samba用户密码。
    5. 检查SELinux/AppArmor:Ubuntu默认使用AppArmor。虽然Samba有默认配置,但如果你修改了共享路径,可能需要调整。查看日志:sudo dmesg | grep -i deniedsudo journalctl -xe | grep -i apparmor。可以尝试将共享目录移到家目录下,或临时禁用AppArmor对Samba的限制进行测试:sudo aa-complain /usr/sbin/smbd

7.2 可以连接但无法写入

  • 症状:能打开共享文件夹,但创建文件或文件夹时提示权限不足。
  • 排查步骤
    1. 确认Samba配置:检查smb.conf中该共享的writableread onlywrite list设置。
    2. 确认目录的Unix权限:运行ls -ld /shared_data,确保目录的所有者和权限允许你的Samba用户写入。记住,Samba最终受限于底层文件系统的Unix权限。
    3. 检查create mask:确保create maskdirectory mask包含了写权限(例如07550775)。
    4. 用户身份问题:如果Samba用户和目录的Unix所有者不同,写入可能失败。可以尝试在共享配置中添加force user = your_username,强制所有连接操作都以该用户身份进行。注意:这会带来安全影响,仅在你完全信任所有连接者时使用。

7.3 Windows提示“用户名或密码不正确”

  • 症状:确认密码无误,但Windows一直报错。
  • 排查步骤
    1. 用户名格式:这是最常见的原因。在Windows的登录框中,尝试使用\用户名(反斜杠)或IP地址\用户名的格式。
    2. Samba密码同步:确保你使用的是sudo smbpasswd -a设置的密码,而不是系统登录密码。
    3. Samba用户状态:使用sudo pdbedit -L查看Samba用户列表,确认用户已存在且状态正常。
    4. Samba服务器加密协议:旧版Windows(如Win7)和新版Samba在默认加密协议上可能不匹配。可以在smb.conf[global]部分添加以下行来兼容旧客户端:
      server min protocol = SMB2 client min protocol = SMB2 # 或者为了最大兼容性(安全性降低),可以设置为 NT1(即SMB1,不推荐) # server min protocol = NT1 # client min protocol = NT1
      重要:SMB1协议存在严重安全漏洞,除非绝对必要,否则不要启用。

7.4 访问速度慢

  • 症状:列出文件、打开文件时响应迟缓。
  • 优化建议
    1. smb.conf[global]部分添加性能参数
      socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536 min receivefile size = 16384 use sendfile = yes aio read size = 16384 aio write size = 16384
    2. 禁用不必要的服务:如果你不需要通过NetBIOS名称发现,可以停止nmbd服务并直接在客户端使用IP地址访问。
    3. 检查网络:使用千兆有线网络通常比Wi-Fi更稳定快速。

配置一个稳定可靠的Samba共享文件夹,就像是给你的Ubuntu系统打开了一扇标准的网络之门。关键在于理解“协议-服务-权限-客户端”这条链路上的每一个环节。从最基础的安装配置,到跨平台访问的细微差别,再到遇到问题时的排查思路,我希望这份超过五千字的详细指南能成为你手边的实用手册。记住,遇到问题多查日志(sudo tail -f /var/log/samba/log.smbd),耐心按步骤排查,你一定能搭建出符合自己需求的文件共享环境。

← 返回列表