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

日记详情

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

Ubuntu 18.04.6 Samba共享文件夹搭建与跨平台访问全攻略

Ubuntu 18.04.6 Samba共享文件夹搭建与跨平台访问全攻略

1. 从“共享”这个需求说起:为什么我们需要共享文件夹?

在任何一个需要协作的环境里,无论是小型工作室、家庭局域网,还是开发团队内部,文件共享都是一个刚需。想象一下,你在一台Ubuntu服务器上部署了一个项目,团队成员需要频繁地访问和更新其中的文档、代码或者媒体资源。如果每个人都通过U盘拷贝或者用聊天工具传来传去,效率低下不说,版本管理也会成为一场噩梦。这时候,一个稳定、便捷的局域网共享文件夹就显得至关重要了。

Ubuntu 18.04.6作为一个长期支持版本,至今仍在许多生产环境和开发机器上稳定运行。虽然它的桌面环境可能不如新版炫酷,但其在服务器和作为开发主机的角色上依然非常可靠。在它上面搭建Samba共享,意味着你可以在Windows、macOS以及其他Linux机器上,像访问本地磁盘一样访问Ubuntu上的文件,这种无缝的体验能极大提升工作效率。

很多人第一次接触共享文件夹时,可能会被“Samba”、“NFS”、“权限”这些术语吓到,觉得这是系统管理员的专属领域。其实不然,通过图形化工具和简单的命令行配置,普通用户完全可以在十分钟内搭建起一个可用的共享。本文将手把手带你完成在Ubuntu 18.04.6上创建Samba共享文件夹的全过程,并详细解释每个步骤背后的“为什么”,最后还会告诉你,在其他系统上究竟该“在哪打开”这个共享文件夹,以及过程中可能遇到的坑和解决办法。

2. 创建前的核心准备:理解Samba与用户权限

在动手之前,我们必须先理清两个核心概念:Samba服务Linux文件权限。这是保证共享既能被访问又足够安全的基础。

2.1 Samba是什么?为什么是它?

简单来说,Samba是一套让Linux系统能够理解和响应Windows网络邻居(SMB/CIFS协议)请求的软件。Windows和macOS原生就支持访问SMB共享,因此,在Ubuntu上安装并配置Samba,就相当于为你的Linux机器安装了一个“Windows文件共享协议兼容层”。这样,局域网内的其他设备就能通过熟悉的“网络”位置发现并连接它。

为什么不选NFS?NFS在纯Linux/Unix环境间共享性能极佳,但Windows和macOS需要额外配置才能访问。而Samba的通用性更好,是跨平台共享的首选。在Ubuntu 18.04.6上,我们将使用Samba这个软件包来实现。

2.2 Linux文件权限:共享安全的基石

这是最容易出问题的地方。Linux有一套严格的用户和文件权限系统(User, Group, Others的读r、写w、执行x权限)。Samba共享的访问,最终会映射到Linux系统的某个用户上。

举个例子:你打算共享/home/yourname/Projects这个目录。当Windows用户通过Samba连接时,Samba服务会以某个Linux用户的身份去读取这个目录。如果这个Linux用户对/home/yourname/Projects没有读或写权限,那么即使在Samba配置里允许了访问,客户端也会收到“拒绝访问”的错误。

因此,我们的操作逻辑是:

  1. 确定或创建一个用于共享的Linux系统用户(比如专门创建一个用户sambauser,或者使用你已有的普通用户)。
  2. 确保要共享的目录,对这个用户有适当的权限(至少要有读权限,如果需要写入则要有写权限)。
  3. 在Samba配置中,将这个共享目录与上述Linux用户绑定,并设置Samba专用的密码。

很多人配置失败,问题就出在只配置了Samba,却忽略了底层Linux文件系统的权限,导致“明明配置都对,就是访问不了”。接下来,我们就从零开始,一步步操作。

3. 实战步骤:安装、配置与创建共享

我们假设你要共享的目录是/srv/share(这是一个常用于存放服务相关数据的标准目录),并使用一个新建的用户sambashare来管理这个共享。

3.1 第一步:更新系统与安装Samba

首先,打开终端(Ctrl+Alt+T),确保软件源是最新的,然后安装Samba。

sudo apt update sudo apt install samba -y

注意-y参数表示自动确认安装,避免中途询问。安装完成后,Samba服务(smbdnmbd)会自动启动。smbd处理文件和打印共享,nmbd处理网络名称解析(让其他电脑能在网络邻居里看到你的机器)。

你可以用以下命令检查Samba服务是否在运行:

sudo systemctl status smbd

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

3.2 第二步:创建共享目录与设置系统权限

现在,创建我们计划共享的目录,并为其设置正确的所有权和权限。

# 创建共享目录 sudo mkdir -p /srv/share # 创建一个专门用于Samba共享的系统用户(不创建家目录,不允许登录shell) sudo useradd -M -s /usr/sbin/nologin sambashare # 将共享目录的所有者改为sambashare用户及其同名用户组 sudo chown sambashare:sambashare /srv/share # 设置目录权限,例如755(所有者可读可写可执行,组用户和其他用户可读可执行) sudo chmod 755 /srv/share

参数解释与避坑点

  • -M:不创建用户的家目录,因为我们只是用它来授权文件访问,不需要登录。
  • -s /usr/sbin/nologin:禁止该用户通过Shell登录系统,增强安全性。
  • chown sambashare:sambashare:将目录的用户用户组都改为sambashare。这意味着sambashare用户对这个目录拥有完全控制权(受chmod权限限制)。
  • chmod 755:这是目录的典型权限。7(rwx)代表所有者sambashare可读、写、进入;5(r-x)代表同组用户和其他用户可读、可进入但不能写。如果你希望所有访问者都能自由创建删除文件,可以设为777,但极不安全,不推荐在生产环境使用。

3.3 第三步:配置Samba——核心环节

Samba的主配置文件是/etc/samba/smb.conf。在修改前,强烈建议先备份

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

然后使用文本编辑器(如nano或vim)进行编辑:

sudo nano /etc/samba/smb.conf

滚动到文件末尾,添加以下共享定义段落:

[Share] comment = Ubuntu 18.04 Shared Folder path = /srv/share browseable = yes read only = no guest ok = no valid users = sambashare create mask = 0644 directory mask = 0755

逐行解析配置,理解每个参数的意义

  • [Share]:共享的名称,也就是其他电脑在网络里会看到的文件夹名字。你可以改成[MyProjects]等任何你喜欢的名字。
  • comment:共享的描述信息,方便管理员识别。
  • path:这是最关键的路径,必须与你之前创建的目录(/srv/share)完全一致。
  • browseable = yes:允许在网络邻居中浏览到这个共享。
  • read only = no:共享可写。如果只想提供只读共享,则设为yes
  • guest ok = no:禁止匿名访问。必须提供用户名密码才能访问,更安全。
  • valid users = sambashare:指定允许访问这个共享的Samba用户。这里只允许sambashare用户。
  • create maskdirectory mask:分别控制客户端新建文件和目录时的默认权限。0644意味着新建文件所有人可读,仅所有者可写;0755意味着新建目录所有人可读可进入,仅所有者可写。这保证了文件的基本安全性。

3.4 第四步:设置Samba用户密码

Samba有一套独立的用户密码数据库。我们需要将系统用户sambashare添加到Samba数据库,并为其设置一个密码。这个密码可以与系统登录密码不同,并且为了安全,建议设置不同的强密码。

sudo smbpasswd -a sambashare

系统会提示你输入并确认密码。这个密码就是之后从其他电脑连接时需要输入的密码。

重要提示smbpasswd -a是“添加”用户。如果你想修改已存在Samba用户的密码,直接使用sudo smbpasswd sambashare即可。

3.5 第五步:重启服务并应用配置

修改完配置并添加用户后,必须重启Samba服务才能使更改生效。

sudo systemctl restart smbd nmbd

为了确保配置无误,可以使用testparm工具检查配置文件语法:

sudo testparm

如果输出中没有报错,并且能看到你定义的[Share]段落的配置信息,说明配置文件语法正确。

4. 防火墙与网络发现:打通访问的“最后一公里”

服务配好了,但在其他电脑上可能还是找不到或连不上。问题通常出在防火墙和网络发现协议上。

4.1 配置UFW防火墙(如果启用)

Ubuntu 18.04默认使用UFW防火墙。Samba需要开放几个端口:

  • 139445:用于SMB文件共享。
  • 137138:用于NetBIOS名称服务(网络发现)。

如果UFW是激活状态(可通过sudo ufw status查看),需要放行这些端口:

sudo ufw allow samba

这条命令等价于放行上述一组端口。你也可以更精确地只允许来自局域网的访问,例如sudo ufw allow from 192.168.1.0/24 to any app samba

4.2 确保网络发现正常工作

在Windows的网络邻居里看到Ubuntu电脑,依赖于NetBIOS over TCP/IP和WS-Discovery等协议。有时可能需要调整Samba配置中的workgroup设置,使其与Windows电脑的工作组一致(默认为WORKGROUP)。

/etc/samba/smb.conf[global]部分,通常会有类似设置:

workgroup = WORKGROUP server string = %h server (Samba, Ubuntu) wins support = yes

确保workgroup一致,并可以尝试将wins support设为yes,这有助于在混合网络环境中进行名称解析。

5. 客户端访问指南:在不同系统上“打开”共享文件夹

这是标题中的另一个核心问题:“在哪打开共享文件夹?”答案因操作系统而异。

5.1 在Windows上访问

有几种常用方法:

  1. 文件资源管理器:直接在地栏输入\\ubuntu_ip_address(例如\\192.168.1.100)或\\ubuntu_hostname,然后回车。系统会弹出凭据窗口,输入用户名sambashare和你用smbpasswd设置的密码。
  2. 网络邻居:打开“此电脑”,在左侧导航栏点击“网络”。如果发现功能正常,你应该能看到你的Ubuntu计算机名。双击它,同样需要输入凭据。
  3. 映射网络驱动器:在“此电脑”中点击“计算机”选项卡下的“映射网络驱动器”。选择一个驱动器号(如Z:),在文件夹栏输入\\ubuntu_ip_address\Share(注意Share是你的共享名)。勾选“使用其他凭据连接”,然后输入用户名密码。这样每次开机后会自动连接。

Windows访问常见问题

  • 错误0x80070035,找不到网络路径:通常是因为Windows禁用了SMB 1.0,而Ubuntu 18.04默认可能使用更高版本。可以在Ubuntu的smb.conf[global]部分添加server min protocol = SMB2,强制使用SMB2或以上协议,然后重启smbd。
  • 用户名密码错误:请确认你输入的是Samba用户名(sambashare)和用smbpasswd设置的密码,而不是Ubuntu的系统登录密码。

5.2 在macOS上访问

  1. 在Finder中,按下Command + K,或点击菜单栏“前往”->“连接服务器...”。
  2. 在服务器地址中输入smb://ubuntu_ip_addresssmb://ubuntu_hostname.local,点击“连接”。
  3. 在弹出的窗口中,选择“注册用户”,输入名称sambashare和对应的密码。
  4. 连接成功后,会显示可用的共享卷(即你的[Share]),双击即可打开。

5.3 在另一台Linux机器上访问

图形界面(如GNOME Files)

  1. 打开文件管理器。
  2. 在侧边栏找到“其他位置”或类似选项。
  3. 在“连接到服务器”的输入框中,输入smb://ubuntu_ip_address/share,然后点击连接并输入凭据。

命令行挂载: 有时需要永久挂载,可以编辑/etc/fstab文件添加一行:

//192.168.1.100/share /mnt/share cifs credentials=/home/yourname/.smbcredentials,uid=1000,gid=1000,iocharset=utf8 0 0

其中,.smbcredentials是一个包含用户名和密码的纯文本文件,内容如下:

username=sambashare password=your_samba_password

务必设置该文件权限为600chmod 600 .smbcredentials)以保护密码。然后使用sudo mount -a测试并挂载。

6. 高级配置与故障排查深度解析

基本的共享搭建完成后,你可能会遇到一些特定需求或问题。这里深入探讨几个进阶场景。

6.1 多用户与权限精细控制

上面我们只用一个sambashare用户。现实中,可能需要为不同的人设置不同的访问权限。例如,让用户A只能读,用户B可以读写。

实现方法

  1. 创建多个系统用户并添加到Samba
    sudo useradd -M -s /usr/sbin/nologin user_a sudo useradd -M -s /usr/sbin/nologin user_b sudo smbpasswd -a user_a sudo smbpasswd -a user_b
  2. 修改共享目录的属组和权限
    # 创建一个用户组,比如share_group sudo groupadd share_group # 将user_a和user_b都加入这个组 sudo usermod -aG share_group user_a sudo usermod -aG share_group user_b # 将共享目录的所属组改为share_group,并设置setgid位 sudo chown sambashare:share_group /srv/share sudo chmod 2775 /srv/share
    2775中的2是setgid位,它使得在该目录下新建的文件/目录,其所属组自动继承父目录的share_group,而不是创建者的主要组。
  3. 修改Samba配置
    [Share] ... valid users = @share_group write list = user_b read list = user_a
    @share_group表示允许share_group组的所有成员。write list指定有写权限的用户,read list指定只有读权限的用户。这样,user_a只能读,user_b可读写。

6.2 匿名共享(无密码访问)

对于打印机共享或完全公开的资料库,可能需要允许匿名访问。务必谨慎,仅在内网安全环境使用。

配置修改

[Public] comment = Public Anonymous Share path = /srv/public browseable = yes read only = yes # 通常匿名共享设为只读 guest ok = yes # 关键:允许访客 guest only = yes # 可选:强制所有访问均为访客 force user = nobody # 将所有访客访问映射到系统用户nobody

同时,需要确保目录/srv/public对系统用户nobody有读权限(chmod 755,且所有者最好设为root)。

6.3 系统性故障排查链路

当共享无法访问时,不要盲目尝试。遵循以下排查链路,可以高效定位问题:

  1. 本地基础检查

    • 服务状态sudo systemctl status smbd nmbd确认服务在运行。
    • 配置语法sudo testparm确保无语法错误。
    • 防火墙sudo ufw status查看Samba相关端口是否放行。可临时关闭防火墙测试(sudo ufw disable),测试后记得重新开启
  2. 从Ubuntu自身测试: 使用smbclient命令从本机连接自己,这是最直接的测试。

    smbclient -L localhost -U sambashare%

    输入密码后,如果能看到Share共享列表,说明Samba服务本身配置正确。

  3. 网络连通性与端口扫描

    • 从客户端ping Ubuntu的IP地址,确保网络层通畅。
    • 在Ubuntu上使用sudo netstat -tlnp | grep smbd,查看139和445端口是否在监听。
    • 从客户端使用telnet ubuntu_ip 445(Windows需开启Telnet客户端功能)测试端口是否可达。
  4. 客户端连接测试与日志分析

    • 在客户端尝试连接时,注意弹出的具体错误代码和信息。
    • 查看Samba日志获取最详细的错误信息。主要日志文件在/var/log/samba/目录下,如log.smbd。可以使用sudo tail -f /var/log/samba/log.smbd实时查看连接尝试的日志,这对于诊断权限错误尤其有用。
  5. 权限问题深度检查: 这是最常见的问题。请严格按照以下链条检查:

    • Samba配置中的path:绝对路径是否正确?目录是否存在?
    • Linux文件系统权限:执行ls -ld /srv/share,确认目录的所有者和权限。访问用户(或force user指定的用户)是否对该目录及其父目录有x(执行/进入)权限?对要访问的文件是否有r(读)权限?
    • SELinux/AppArmor:Ubuntu默认使用AppArmor。虽然对Samba限制不多,但极端情况下也可能干扰。可以尝试临时禁用AppArmor对Samba的配置进行测试:sudo aa-complain /usr/sbin/smbd。测试后可通过sudo aa-enforce /usr/sbin/smbd恢复。

通过这样一层层由内到外、由服务到权限的排查,绝大多数共享访问问题都能被定位和解决。搭建共享文件夹不是一劳永逸的事,理解其背后的原理和掌握排查方法,才能在各种环境下都应对自如。

← 返回列表