我一直在使用我的 Raspberry Pi 作为音乐文件服务器,但我对此并不满意。当前设置samba
在我的 RPi 上使用服务器,并带有 WD Passport USB 驱动器,格式为vfat
. 这是我的 Sonos 音乐系统的库:Sonos 安装驱动器,并在一个菜单中列出它找到的所有音乐供我选择。
大多数时候,Sonos 界面似乎可以与 RPi Samba 服务器顺利运行。但是,它在我的 MacOS 上运行并不顺利。我使用我的 Mac 来维护音乐库,有两个主要的琐碎问题:
- 必须通过 Samba 配置更改用户权限以启用音乐库中的删除和添加
- 在 Mac 的 Finder 应用程序中浏览我的 RPi 上的 Samba 音乐共享会发现许多“遗漏和伪影”,而使用 CIFS 在 NetgearNAS 上浏览具有完全相同内容的文件夹则完美无缺;见下图。
一位朋友使用 NetgearNAS 作为其 Sonos 系统的文件服务器。它工作非常可靠,并且“工件”不会出现在 Finder 中。他的 NetgearNAS 配置为使用CIFS
(且仅 CIFS)。我想在我的 RPi 上尝试 CIFS,但到目前为止我的研究只会增加我的困惑。
最后,我的问题:
SMB 和 CIFS 似乎关系密切,但它们是“一回事”吗?如果不是,有什么区别?
一些来源将 CIFS 称为文件系统(在某种意义上
ext4
,FAT32
、 等是文件系统),而其他来源则将其称为网络协议。由于 没有 CIFS 扩展名mkfs
,因此将 CIFS 称为文件系统的引用似乎具有误导性 - 还是我遗漏了什么?如果 CIFS 只是一种网络协议,它是否仅限于特定的文件系统?即可以将FAT32 或ext4 与CIFS 一起使用吗?CIFS 使用的文件系统是否会影响其作为跨平台服务器协议的使用?
vfat是一个非常有限的文件系统,它完全不适合任何网络使用和任何多用户环境(它是古老的 MS-DOS 文件系统)。简而言之,不要将 VFAT 用于 USB 拇指驱动器以外的任何东西,以获得最大的兼容性。
基本上你所有的问题都来自这样一个事实,即 MacOS 试图通过 SMB/CIFS 将扩展属性、文件权限等存储到不支持任何这些的 VFAT,也不支持非常长的文件名或 UTF-8 文件名称或现代用户感兴趣的任何内容。
只需在您的 USB 驱动器(ext4、xfs)上使用真正的、普通的 Linux 文件系统,一切都会好起来的。这肯定会解决丢失文件、错误的权限和权限、工件等问题。
关于其他问题:
SMB 和 CIFS 是同一事物的不同名称,即 Microsoft 网络文件系统(服务器消息块协议)。这里有些混乱,因为 CIFS 实际上是它的第一个版本(SMB 版本 1.0),并被更新的版本(SMB v. 2.0、3.0、3.1,...)取代。但是在 Linux 上,出于某种原因,第一个版本被称为“smbfs”,而较新的版本被称为“cifs”。无论如何,现在在 Linux 和 MacOS 上这没有任何区别,两者都是可以互换的。
SMB/CIFS 是一个网络文件系统。它与块文件系统完全没有直接关系。从某种意义上说,它是一个文件系统,它提供了文件抽象及其常见的 I/O 模式;但是,您可以使用任何网络文件系统(NFS、SMB、WebDAV、AFP...)来共享来自任何块文件系统(FAT32、ext4、HFS+、xfs、NTFS、ZFS...)的数据。
不同的块文件系统提供不同的功能(直接 IO、POSIX ACL、Windows ACL、扩展属性、文件流、“空心”文件、文件版本控制、元数据版本控制、子卷、卷快照......)。不同的网络文件系统也提供不同的特性。网络文件系统的特征映射到底层块文件系统的方式差异很大,并且是无休止的混乱、痛苦和错误的来源。
例如,源自 Windows 的 CIFS 默认使用 Windows ACL,遗憾的是它不会一对一地映射到大多数 Unix/Linux 文件系统的 POSIX ACL。现在 Samba 通过使用扩展属性来存储实际的 Windows ACL 来解决这个问题,但是如果底层块文件系统不支持xattr,你就会遇到问题。
让我试着回答你的几个问题。
第一个 CIFS 是 SMB 协议的一个版本。参见例如SMB 的 wiki 页面。
第二个问题是关于文件系统与网络协议的。CIFS/SMB 是网络协议。文件系统的东西仅来自 linux 世界:您可以
mount
像任何其他文件系统(假设权限)一样共享这样的共享,以便能够透明地访问文件。所以你有一个mount.cifs
程序来处理这个特定协议的挂载过程。根据您的第三个问题:没有网络协议与底层文件系统有任何关系。它仅指定如何通过线路发送数据(以抽象方式)。数据可能直接来自硬盘(也称为文件系统),也可能是动态生成的(想想如果您导出
/proc
或/sys
文件夹会发生什么......)。但是,该协议的设计考虑了特定的用例。据我所知,这是FAT系统。在 Linux/Unix 下也进行了扩展以允许扩展权限。在这里,我有点厌倦什么是可能的,什么是实现的(尤其是服务器和客户端都必须找到一个通用的最大协议版本)。各种机器上的不同软件版本可能会在这里发挥作用,但我不确定。
我不会向您提供需要您进一步调查的基本信息,而是解决您提出的一些问题:
您的“遗漏和人工制品”是由于代码页/字符集问题造成的。它只发生在非 ASCII 字符上,对吧?我现在不知道它是如何设置的。您能否首先验证 USB 设备上的文件在文件系统中是否以正确的名称写入?然后验证 RPi 是否也可以读取文件(没有 CIFS,使用
ssh
或直接连接监视器/键盘去那里)。不同的底层文件系统支持文件名中的不同字符集,因此可以配置 SMB 以区别对待文件名。这是一个支持尽可能多的底层文件系统的特性(请参阅 参考资料
man smb.conf
)。这也可能是客户端上的安装问题,假设编码错误。因此,首先要建立系统并验证每个步骤。关于您提到的用户权限问题,您需要经过身份验证的访问(用户+密码),将 samba/cifs 服务器配置为使用具有默认权限的默认用户,或者您的存储是问题所在。再次从下往上:
vfat
没有所有者存储的地方。因此,Linux 内核根据挂载选项将用户应用于文件。uid
可能和gid
)。见。umask
dmask
fmask
man mount
create mask
和可能就足够了。如果没有,您应该更深入地描述您的问题。directory mask
man smb.conf