OSX/Linux 之间共享的 HFS+ 主分区上的锁定文件

OSX/Linux 之间共享的 HFS+ 主分区上的锁定文件

我在 MacBook Pro 上双启动到 Arch Linux 和 OS X 10.6。我在两个操作系统之间同步了我的 UID,并创建了一个 HFS 分区(没有日志记录)用作共享主/用户分区。在大多数情况下,它的工作方式与我预期的一样,但有时当我启动到 OS X 时,某些文件被“锁定”(当我获取有关特定文件的信息时,“常规”窗格下的“锁定”框被选中。我可以通过手动取消选中该框来解决这个问题)和/或当我尝试删除或 chmod 文件时,我收到“操作不允许”的提示。在这两种情况下,我都没有看到使用 ls -l 显示的权限位有任何异常,除了在通常出现粘性位的位置尾随一个“@”字符:

-rw-r--r--@  1 myuser  mygroup   296 Mar 29 11:44 myfile

这个“@”字符出现在所有普通文件上,因此似乎与锁定/操作未经许可的情况无关。

在 Linux 方面,我从未遇到过权限问题。就我对 ACL 的有限知识和经验而言,我未在任何相关文件上发现任何 ACL。

不管怎样,我大部分的文件编辑都是使用 emacs(OSX 中的 Aquamacs),是否有可能设置了奇怪的权限位?

  1. OS X 使用的“锁定”设置是什么,它是否具有等效的权限位(因此至少我可以从终端递归解锁主目录中的所有文件)
  2. 为什么在启动 OS X 时某些文件会被“锁定”,而其他文件不会?
  3. “@”字符的含义是什么?

答案1

我也遇到了同样的问题。

根据我在这里和其他地方读到的信息,我理解这是 hfsplus 模块中的一个 Linux 内核错误。它会向文件添加随机用户标志。有两个标志可防止编辑/删除文件:uchg 和 uappnd。这两个标志很危险。它们可以应用于文件,甚至可以应用于父目录。

标志显示为:

$ ls -laO /Volumes/我的卷

可以使用以下方法递归删除标志:

$ man chflags

$ chflags -R nouchg,nouappnd,noopaque,dump /Volumes/my-volume

注意:我还删除了 opaque 和 nodump 标志。我不需要标志。

答案2

@意味着该文件在文件系统中附加了“扩展属性”(额外元数据,缩写为“xattrs”)。要查看附加到文件的 xattrs 列表,请ls -l@在 Mac OS X 中执行。

经典 Mac OS 有“Finder 信息”的概念,它是 HFS 卷上所有文件都具有的一小组固定(不可扩展)元数据。这包括“类型和创建者代码”和“Finder 标志”,包括“锁定”位、“可见”(隐藏)位和其他几个。Mac OS X 基本上已经弃用了旧的 Finder 元数据,但在仍然需要它的情况下,它现在会作为 xattr 附加到文件系统中的文件记录中。您看到的那些锁定文件几乎肯定附加了这个 Finder 信息 xattr,以便可以记录旧 Finder“锁定”位的状态。

我的 Snow Leopard 系统有一个/usr/bin/xattr命令似乎没有手册页,但如果你用 调用它,它确实有一个使用说明-h。请注意,这xattr -l filename对于获取文件附加的 xattrs 值的十六进制/ASCII 转储很有用。

Mac OS X 的内置命令用于从终端查看和操作旧 Finder info xattr 包括GetFileInfo(1)SetFile(1)

更新:
我无法很好地解释为什么这些文件会被锁定,但我的直觉是,无论您在 Linux 中运行什么 HFS 支持软件,要么误解了旧 Finder 锁定位的用途和弃用状态并在不应该设置它时设置它,要么故意使用锁定位作为将某种 Linux 文件系统语义概念映射到 HFS 的机制。

Finder 锁定位旨在让用户手动锁定自己的文件,以免他们意外修改或删除它们,并且不是旨在作为一种进程级文件锁定机制,以避免多个进程同时写入同一文件。也就是说,它不应该替代fcntl(2)flock(2)。在设计 Finder 锁定位时,Mac 还不是多处理系统。

更新 2: 也可能是 Aquamacs 滥用旧的 Finder 锁定位来实现 emacs 的文件锁定愿望。

答案3

我找到了一个解决方法。这似乎是 hfsplus 内核模块中的竞争条件,由对用户标志的非原子访问引起。我已禁用它,并且用户标志将永远为零,解锁,对我来说没问题。

fs/hfsplus/inode.c 第 248 行附近:

    inode->i_mode = mode;

/* FIXME commented out because of unreliable results, needs mutex_lock (?) */
//    HFSPLUS_I(inode)->userflags = perms->userflags;
    if (perms->rootflags & HFSPLUS_FLG_IMMUTABLE)

fs/hfsplus/catalog.c 第 79 行附近:

            perms->rootflags &= ~HFSPLUS_FLG_APPEND;

/* FIXME commented out because of unreliable results, needs mutex_lock (?) */
//    perms->userflags = HFSPLUS_I(inode)->userflags;
    perms->mode = cpu_to_be16(inode->i_mode);

您可以构建自定义内核,但我使用 dkms:

$ cd /usr/src
$ tar xjpvf linux-source-*.tar.bz2 linux-source-*/fs/hfsplus
$ cp -R linux-source-*/fs/hfsplus hfsplus-YOUR_VERSION
$ vi hfsplus-YOUR_VERSION/inode.c
$ vi hfsplus-YOUR_VERSION/catalog.c
$ vi hfsplus-YOUR_VERSION/dkms.conf (see below for the content)
$ su
# dkms install hfsplus/YOUR_VERSION

/usr/src/hfsplus-您的版本/dkms.conf:

NAME=hfsplus
VERSION=YOUR_VERSION
PACKAGE_NAME="$NAME"
PACKAGE_VERSION="$VERSION"
MAKE[0]="make -C ${kernel_source_dir}
  SUBDIRS=${dkms_tree}/${NAME}/${VERSION}/build modules"
BUILT_MODULE_NAME[0]="hfsplus"
DEST_MODULE_LOCATION[0]="/kernel/fs/hfsplus"
REMAKE_INITRD=y
AUTOINSTALL="yes"

注意:如果我不进入 /usr/src ,安装将会失败。

卸载方法:

# dkms remove hfsplus/YOUR_VERSION --all

环境:MacBookPro7,1、Core 2 Duo、SATA NVidia MCP89 AHCI、Mac OS X 10.6、Debian GNU/Linux、内核 2.6.28、2.6.29、3.0、3.1、3.2。

答案4

这是 Linux 内核的一个错误,已在 3.4 版中修复(修补)。

使用纯 Unix 实用程序时我也遇到过同样的问题。也就是说,我使用 rsync 从 Xubuntu 12.04 live 备份了我的 Mac OS X 硬盘。恢复后,许多文件夹被随机锁定,包括 git 存储库中的目录(我非常怀疑 git 会这样做)。您可以使用 查看这些属性ls -lO。在我的备份上执行此操作表明这些位基本上具有随机值:

# ls -ldO /Volumes/HFS+Backup/Users/pgiarrusso/*
drwx------   31 pgiarrusso  staff  uchg,nodump,opaque         1054 Aug 13 02:00 /Volumes/HFS+Backup/Users/pgiarrusso/Desktop
drwx------   36 pgiarrusso  staff  nodump                     1224 Jul 22 16:04 /Volumes/HFS+Backup/Users/pgiarrusso/Documents
drwx------  108 pgiarrusso  staff  uappnd                     3672 Aug 13 11:43 /Volumes/HFS+Backup/Users/pgiarrusso/Downloads
drwx------   13 pgiarrusso  staff  uappnd,uchg,opaque          442 Jul 22 05:04 /Volumes/HFS+Backup/Users/pgiarrusso/Dropbox
drwx------   53 pgiarrusso  staff  -                          1802 Aug 12 00:58 /Volumes/HFS+Backup/Users/pgiarrusso/Library
drwx------   11 pgiarrusso  staff  uchg,nodump,opaque          374 Jul 22 17:25 /Volumes/HFS+Backup/Users/pgiarrusso/Movies
drwx------   13 pgiarrusso  staff  uappnd,uchg,nodump          442 Jun 10 12:05 /Volumes/HFS+Backup/Users/pgiarrusso/Music
drwx------   15 pgiarrusso  staff  uappnd,nodump,opaque        510 Jun 10 12:05 /Volumes/HFS+Backup/Users/pgiarrusso/Pictures
drwxr-x---   11 pgiarrusso  staff  opaque                      374 Jul  6 15:33 /Volumes/HFS+Backup/Users/pgiarrusso/Public
drwxr-xr-x   34 pgiarrusso  staff  uappnd,uchg,opaque         1156 May 27 12:39 /Volumes/HFS+Backup/Users/pgiarrusso/Sites
drwxr-xr-x    2 pgiarrusso  staff  uappnd,nodump,opaque         68 Jun 10 21:43 /Volumes/HFS+Backup/Users/pgiarrusso/VirtualBox VMs
-rwxr-xr-x    1 pgiarrusso  staff  uappnd,nodump,opaque       1703 Feb 19  2012 /Volumes/HFS+Backup/Users/pgiarrusso/bash-prompt.sh
drwxr-xr-x   22 pgiarrusso  staff  -                           748 Aug 10 19:47 /Volumes/HFS+Backup/Users/pgiarrusso/bin
lrwxrwxrwx    1 pgiarrusso  staff  nodump,opaque                37 Sep 27  2011 /Volumes/HFS+Backup/Users/pgiarrusso/default.sfx -> /Users/pgiarrusso/opt/rar/default.sfx
-rw-r--r--    1 pgiarrusso  staff  uappnd,uchg          1375563169 Aug  2 18:52 /Volumes/HFS+Backup/Users/pgiarrusso/heapdump-1343925310626.hprof
drwxr-xr-x   22 pgiarrusso  staff  uappnd,nodump               748 Aug  1 22:15 /Volumes/HFS+Backup/Users/pgiarrusso/opt
drwxr-xr-x    7 pgiarrusso  staff  uappnd                      238 Apr 19 20:00 /Volumes/HFS+Backup/Users/pgiarrusso/share
drwxr-xr-x   35 pgiarrusso  staff  nodump,opaque              1190 Aug 10 00:06 /Volumes/HFS+Backup/Users/pgiarrusso/tmp

我将其与工作文件系统上的同一目录进行了比较,并且这些位尚未设置。

相关内容