我在 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),是否有可能设置了奇怪的权限位?
- OS X 使用的“锁定”设置是什么,它是否具有等效的权限位(因此至少我可以从终端递归解锁主目录中的所有文件)
- 为什么在启动 OS X 时某些文件会被“锁定”,而其他文件不会?
- “@”字符的含义是什么?
答案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
我将其与工作文件系统上的同一目录进行了比较,并且这些位尚未设置。