AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 756204
Accepted
Andreas
Andreas
Asked: 2023-09-11 05:07:14 +0800 CST2023-09-11 05:07:14 +0800 CST 2023-09-11 05:07:14 +0800 CST

为什么 Linux 和 macOS 中的“ls”显示同一文件的不同所有者 (uid)?

  • 772

我使用 macOS 将一些文件复制到 HFS+,确保其复制准确。根据 ,在 macOS 上,这些复制的文件的所有者为 501 ls -han。

然后我将 HFS+ USB 棒插入 Ubuntu,根据 ,文件的所有者有 1000 个ls -han。为什么?

然后,我尝试在 Ubuntu 中复制 501 个拥有的文件之一(到同一个 HFS+ 卷),确保使用cp -a.

现在,macOSls将新文件视为用户 1000 拥有...

真的吗?我不明白 —如果它甚至不保留所有者的用户 ID,那么使用cp该选项还有什么意义呢?-a我错过了什么?

更新:澄清一下,我认为我的困惑源于——在我看来——HFS 原生支持 Unix 文件权限,并且应该“正常工作”。


我最近了解到cpspreserve=timestamps实际上并不保留时间戳(创建日期被重置)。我现在是否相信它preserve=ownership不保留所有权?

linux
  • 1 1 个回答
  • 1729 Views

1 个回答

  • Voted
  1. Best Answer
    telcoM
    2023-09-11T06:07:58+08:002023-09-11T06:07:58+08:00

    来自该模块的 Linux 内核文档hfsplus:

    安装选项

    uid=n,gid=n

    指定拥有文件系统上具有未初始化权限结构的所有文件的用户/组。默认值:安装进程的用户/组 ID。

    501 是现代 macOS 上第一个普通用户的默认 UID。

    因此,显然 macOS 不会初始化某些文件的“权限结构”。此外,Apple Technote #1150指出所有者 ID 的存储有一个额外的问题:

    所有者ID

    文件或文件夹所有者的 Mac OS X 用户 ID。10.3 之前的 Mac OS X 版本将用户 ID 99 视为当前登录到控制台的用户的用户 ID。如果没有用户登录控制台,则用户 ID 99 将被视为用户 ID 0(root)。Mac OS X 版本 10.3 将用户 ID 99 视为进行调用的进程的用户 ID(实际上,使其同时为每个人所拥有)。这些替换发生在运行时。磁盘上的实际用户 ID 不会更改。

    然后:

    笔记:

    如果 fileMode 字段的 S_IFMT 字段(高 4 位)为零,则 Mac OS X 假定权限结构未初始化,并在内部使用所有字段的默认值。默认用户和组 ID 为 99,但可以在安装卷时更改。然后,该默认所有者 ID 将被替换,如上所述。

    这意味着,由 Mac OS 8 和 9 或将权限字段设置为零的任何其他实现创建的文件,其行为就像为这些文件启用了“忽略所有权”选项,即使为这些文件禁用了“忽略所有权”。整体体积。

    这里提到的S_IFMT是16位值的最高4位,用于存储Unix风格的权限位:3x读/写/执行,以及setuid/setgid/sticky位。常规文件需要将最高 4 位设置为特定的非零值 ( S_IFREG),否则上述向后兼容机制将启动。

    HFS+ 文件系统的结构显然开启了有时“快速而宽松”地处理文件所有权的可能性,并且您的结果表明 macOS 在某些情况下似乎正是这样做的。

    对于可移动媒体,macOS 自动启用“忽略所有权”选项是有一定意义的,因为将文件写入媒体的系统可能与读取文件的系统不同,并且两者系统可能具有完全不同的 UID 映射,从而给用户带来不便。

    因此,这可能只是 macOS 试图在可移动媒体上做到用户友好,并假设用户对可移动媒体的物理拥有相当于其中数据的所有权证明。

    Ubuntu 的第一个常规用户帐户是使用 UID 1000 创建的,这显然是您将 HFS+ 卷安装到 Ubuntu 的帐户。

    由于 Linux 创建的文件将其 UID 1000 保留在 macOS 中,这表明 Linux将使用文件所有者 UID 填充 HFS+“权限结构”,一旦 macOS 读取它们,它们将按预期工作。


    经典的 POSIX 时间戳是:

    • ctime= 最后状态/元数据更改的时间
    • mtime= 内容最后一次修改的时间
    • atime= 最后访问时间。

    创建时间(crtime或出生时间)不是其中之一。文件系统可能支持也可能不支持创建时间,并且其确切语义可能因文件系统类型和 Unix 风格操作系统而异。

    一些文件系统驱动程序在内部处理分配创建时间,并且之后完全不可能修改crtime文件的时间:在这样的文件系统中,意外删除并从备份中恢复的文件可能会保留其经典ctime并mtime恢复,但创建时间将反映从备份恢复的时间,因为该文件现在不再是原始文件,尽管它可能是它的精确副本。

    当您复制文件时,您实际上创建了一个新文件:在复制操作中“保留创建时间”的想法是一个矛盾的说法。

    文件系统本身可以跟踪文件的创建时间,但这不一定与文件内数据的创建时间相同。如果您想跟踪后者,通常需要版本控制系统或可以包含数据创建时间元数据字段的文件格式......并且使用该数据格式的所有应用程序必须就“内容”的语义达成一致。数据创建时间”的意思,否则就变得毫无意义。

    • 15

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve