文件系统与 CIFS 的兼容性

文件系统与 CIFS 的兼容性

我一直使用我的 Raspberry Pi 作为音乐文件服务器,但我对此并不满意。当前设置使用samba我的 RPi 上的服务器以及格式为 WD Passport USB 驱动器vfat。这是我的 Sonos 音乐系统的库:Sonos 安装驱动器,并在菜单中列出它找到的所有音乐供我选择。

大多数时候,Sonos 界面似乎可以与 RPi Samba 服务器顺利运行。然而,它在我的 MacOS 上运行得不太顺利。我使用 Mac 来维护音乐库,有两个主要的棘手问题:

  1. 必须通过 Samba 配置更改用户权限才能在音乐库中进行删除和添加
  2. 在 Mac 的 Finder 应用程序中浏览 RPi 上的 Samba 音乐共享会发现许多“遗漏和伪影”,而在使用 CIFS 的 NetgearNAS 上浏览内容完全相同的文件夹则完美无缺;见下图。

在此输入图像描述

一位朋友使用 NetgearNAS 作为他的 Sonos 系统的文件服务器。它工作非常可靠,并且“工件”不会出现在 Finder 中。他的 NetgearNAS 配置为使用CIFS(且仅 CIFS)。我想在我的 RPi 上尝试 CIFS,但到目前为止我的研究只会增加我的困惑。

最后,我的问题:

  1. SMB 和 CIFS 看似密切相关,但它们是“同一个东西”吗?如果不是,有什么区别?

  2. 一些来源将 CIFS 称为文件系统(在某种意义上ext4FAT32、 等是文件系统),而其他来源则将其称为网络协议。由于 没有 CIFS 扩展名mkfs,因此将 CIFS 称为文件系统的参考文献似乎会产生误导 - 或者我是否遗漏了某些内容?

  3. 如果CIFS只是一种网络协议,它是否仅限于特定的文件系统?即可以使用 FAT32 或 ext4 与 CIFS 吗? CIFS 使用的文件系统是否会影响其作为跨平台服务器协议的使用?

答案1

脂肪组织是一个非常有限的文件系统,它完全不适合任何网络使用和任何多用户环境(它是古老的 MS-DOS 文件系统)。简而言之,除了 USB 拇指驱动器外,不要将 VFAT 用于任何其他设备,以获得最大兼容性。

基本上,您的所有问题都来自这样一个事实:MacOS 尝试通过 SMB/CIFS 向 VFAT 存储扩展属性、文件权限等,但 VFAT 不支持任何这些,也不支持很长的文件名或 UTF-8 文件名称或现代用户感兴趣的任何内容。

只需在 USB 驱动器上使用真正的、普通的 Linux 文件系统(ext4、xfs),一切都会好起来的。这肯定会解决文件丢失、权限错误、工件等问题。

关于其他问题:

  • SMB 和 CIFS 是同一事物的不同名称,即 Microsoft 网络文件系统 (服务器消息块协议)。这里有些混乱,因为 CIFS 实际上是它的第一个版本(SMB 版本 1.0),并被更新的版本(SMB v. 2.0、3.0、3.1,...)取代。然而在 Linux 上,由于某种原因,第一个版本被称为“smbfs”,而较新的版本被称为“cifs”。无论如何,现在在 Linux 和 MacOS 上这没有任何区别,两者都是可以互换的。

  • SMB/CIFS 是网络文件系统。它与a完全没有直接关系堵塞文件系统。从某种意义上说,它是一个文件系统,它提供了文件抽象及其通用 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 来解决这个问题,但是如果底层块文件系统不支持属性,你就会遇到问题。

答案2

让我尝试回答你的几个问题。

首先CIFS是SMB协议的一个版本。参见例如SMB 维基页面

第二个问题是关于文件系统与网络协议。 CIFS/SMB 是网络协议。文件系统的东西仅仅来自linux世界:你可以mount像任何其他文件系统一样共享(假设有权限)以便能够透明地访问文件。所以你有一个mount.cifs程序来处理这个特定协议的安装过程。

根据您的第三个问题:没有任何网络协议与底层文件系统有任何关系。它仅指定如何通过线路发送数据(以抽象方式)。数据可能直接来自硬盘(也称为文件系统),也可能动态生成(想想如果导出/proc/sys文件夹会发生什么......)。

然而,该协议的设计考虑到了特定的用例。据我所知,这就是 FAT 系统。进行了扩展以允许在 Linux/Unix 下扩展权限。在这里,我有点厌倦什么是可能的,什么是实现的(特别是服务器和客户端都必须找到一个共同的最大协议版本)。不同机器上的不同软件版本可能会在这里发挥作用,但我不确定。


我不会向您提供需要您进一步调查的基本信息,而是会解决您提出的一些问题:

您的“遗漏和人工制品”是由于代码页/字符集问题造成的。它只发生在非 ASCII 字符上,对吗?我现在不知道它是如何设置的。您能否首先验证 USB 设备上的文件是否以正确的名称写入文件系统中?然后验证 RPi 是否也可以读取文件(没有 CIFS,请使用ssh或直接连接的显示器/键盘前往那里)。

不同的底层文件系统支持文件名中的不同字符集,因此可以将 SMB 配置为以不同方式处理文件名。这是一个支持尽可能多的底层文件系统的功能(请参阅 参考资料man smb.conf)。这也可能是您的客户端上的安装问题,假设编码错误。因此,首先要构建系统并验证每个步骤。

关于您提到的用户权限问题,您需要经过身份验证的访问(用户+密码),将 samba/cifs 服务器配置为使用具有默认权限的默认用户,否则您的存储就是问题。再次从下往上:

  • USB 存储器中的文件属于哪个用户/组?它们躺在vfat没有主人的地方。因此,Linux 内核根据挂载选项将用户应用于文件。
  • 验证所有文件/文件夹是否属于该用户(再次在 Rpi 上使用 ssh/终端访问)。
  • 检查新创建的文件(从终端)是否获得相同的权限。如果没有,请采用您的安装配置(安装选项uidgidumask、可能dmaskfmask)。看man mount
  • 从 SMB/CIFS 创建文件/文件夹并验证 UID/GID/权限。如果是仅限来宾访问,则samba 配置 ( ) 的create mask和可能就足够了。如果没有,您应该更深入地描述您的问题。directory maskman smb.conf

相关内容