ncdu 1.15版本在MacOS上的行为变化

最近忽然发现一个使用ncdu的脚本没有起作用,查询发现有升级记录Ncdu Release History。

Ncdu Release History
1.15 - 2020-05-30 - ncdu-1.15.tar.gz

  • (Linux) Add --exclude-kernfs option to exclude pseudo filesystems (Christian Göttsche)
  • (MacOS) Exclude firmlinks by default (Saagar Jha)
  • (MacOS) Add --follow-firmlinks option to follow firmlinks (Saagar Jha)
  • Fix bug in calculating the apparent size of directories containing hardlinks
  • Fix integer overflow with directories containing >2GiB worth of file names
  • Fix yet another possible 100% CPU bug when losing terminal

简单翻译一下

  • (Linux) 添加 --exclude-kernfs 选项用于排除伪文件系统 (Christian Göttsche)
  • (MacOS) 默认排除 firmlinks (Saagar Jha)
  • (MacOS) 添加 --follow-firmlinks 选项用于进入 firmlinks (Saagar Jha)
  • 修复包含硬连接的文件夹的显示尺寸的 bug
  • 修复文件夹中包含超过 2GiB 文件名的整数溢出
  • 修复失去终端时 CPU 达到 100% 的另一个 bug

在ncdu首页有这样的说明。

Latest version
1.15 (ncdu-1.15.tar.gz - changes)

I also have convenient static binaries for Linux i486 , x86_64 , ARM and AArch64 . Download, extract and run; no compilation or installation necessary (uses musl).

MacOS users: Version 1.15 tends to skip some directories, you can use --follow-firmlinks as a workaround, see bug #153. Patches welcome, I don’t have a macOS system to test on.

最后一句

MacOS 用户:1.15 版本倾向于跳过某些目录,你可以使用 --follow-firmlinks 绕过,详情参见 #153. 欢迎补丁,我没有用于测试的MacOS系统

虽然没有测试,毕竟是开源软件,毕竟文档都说了,只是自动升级没想到 1.14.21.15 这么的小版本号也会改接口。

接下来看看 firmlinks 是什么。

前面没有翻译 firmlinks ,既不是符号链接,也不是硬链接。因为 firmlinksMacOS 的专有概念,用Apple工程师自己的原话说

它就是数据卷与系统卷之间的 双向虫洞

firmlinks 技术源于 MacOS 保护系统文件的技术演进。

保护系统文件一直是操作系统的核心安全问题,基于开源BSD系列的MacOS也是如此。

MacOSEI Captitan 增加了 系统完整性保护 技术。

系统完整性保护是 OS X El Capitan 及更高版本所采用的一项安全技术,旨在帮助防止潜在恶意软件修改 Mac 上受保护的文件和文件夹。系统完整性保护可以限制 root 用户帐户,以及 root 用户能够在 Mac 操作系统的受保护部分完成的操作。

在实施系统完整性保护之前,root 用户不受任何权限限制,因此可以访问 Mac 上的任意系统文件夹或应用。如果您在安装软件时输入了管理员用户名和密码,这个软件就能获得 root 级访问权限。这样使软件能够修改或覆盖任意系统文件或应用。

系统完整性保护包含对以下系统部分的保护:

  • /System
  • /usr
  • /bin
  • /sbin
  • /var
  • OS X 预装的应用

第三方应用和安装器可以针对以下路径和应用继续完成写入操作:

  • /Applications
  • /Library
  • /usr/local

仅当进程拥有 Apple 签名并拥有对系统文件(如 Apple 软件更新和 Apple 安装器)完成写入操作的特殊授权时,系统完整性保护才会允许它修改这些受保护部分。从 Mac App Store 下载的应用兼容系统完整性保护。升级至 OS X El Capitan 或更高版本时,与系统完整性保护冲突的其他第三方软件可能会被忽略。

系统完整性保护还有助于防止软件选择启动磁盘。要选择启动磁盘,请从苹果菜单中选取“系统偏好设置”,然后点按“启动磁盘”。或者,在重新启动时按住 Option 键,然后从启动磁盘的列表中进行选择。

简而言之,系统完整性保护 技术是一种基于 授权 的技术,从上述叙述可知,获得了root权限后,仍旧有可能自授权后读写系统文件。

Catalina 中,进一步进入了 firmlinks 技术,与前面的 系统完整性保护 技术不同,firmlinks 技术是在比较底层的文件系统中,不同于软链接和硬链接作为文件系统中的一种特殊的文件类型,firmlinks 技术可以理解为是文件系统的配置,查看方式为

cat /usr/share/firmlinks

结果为

/AppleInternal	AppleInternal
/Applications	Applications
/Library	Library
/System/Library/Caches	System/Library/Caches
/System/Library/Assets	System/Library/Assets
/System/Library/PreinstalledAssets	System/Library/PreinstalledAssets
/System/Library/AssetsV2	System/Library/AssetsV2
/System/Library/PreinstalledAssetsV2	System/Library/PreinstalledAssetsV2
/System/Library/CoreServices/CoreTypes.bundle/Contents/Library	System/Library/CoreServices/CoreTypes.bundle/Contents/Library
/System/Library/Speech	System/Library/Speech
/Users	Users
/Volumes	Volumes
/cores	cores
/opt	opt
/private	private
/usr/local	usr/local
/usr/libexec/cups	usr/libexec/cups
/usr/share/snmp	usr/share/snmp

对应关系为

第1列 第2列 对应路径
/AppleInternal AppleInternal (无)
/Applications Applications /System/Volumes/Data/Applications
/Library Library /System/Volumes/Data/Library
/System/Library/Caches System/Library/Caches /System/Volumes/Data/System/Library/Caches
/System/Library/Assets System/Library/Assets /System/Volumes/Data/System/Library/Assets
/System/Library/PreinstalledAssets System/Library/PreinstalledAssets /System/Volumes/Data/System/Library/PreinstalledAssets
/System/Library/AssetsV2 System/Library/AssetsV2 /System/Volumes/Data/System/Library/AssetsV2
/System/Library/PreinstalledAssetsV2 System/Library/PreinstalledAssetsV2 /System/Volumes/Data/System/Library/PreinstalledAssetsV2
/System/Library/CoreServices/CoreTypes.bundle/Contents/Library System/Library/CoreServices/CoreTypes.bundle/Contents/Library /System/Volumes/Data/System/Library/CoreServices/CoreTypes.bundle/Contents/Library
/System/Library/Speech System/Library/Speech /System/Volumes/Data/System/Library/Speech
/Users Users /System/Volumes/Data/Users
/Volumes Volumes /System/Volumes/Data/Volumes
/cores cores /System/Volumes/Data/cores
(无) (无) /System/Volumes/Data/mnt
/opt opt /System/Volumes/Data/opt
/private private /System/Volumes/Data/private
(无) (无) /System/Volumes/Data/sw
/usr/local usr/local /System/Volumes/Data/usr/local
/usr/libexec/cups usr/libexec/cups /System/Volumes/Data/usr/libexec/cups
/usr/share/snmp usr/share/snmp /System/Volumes/Data/usr/share/snmp

通过对应关系可知,firmlinks 表格中的第2列大部分对应于 /System/Volumes/Data,然而 /AppleInternal 并没有对应,同时,/System/Volumes/Data 中的 /System/Volumes/Data/mnt/System/Volumes/Data/sw 也没有对应的 firmlinks

firmlinks 的对应关系起到的作用,可以通过查询文件的 Inode 信息对照了解。

路径 FileType Device Inode
/ Directory 1,4 2
/Applications Directory 1,4 106381676
/System Directory 1,4 1152921500311901982
/System/Volumes Directory 1,4 1152921500312301543
/System/Volumes/Data Directory 1,4 1152921500311879682
/System/Volumes/Data/Applications Directory 1,4 106381676
/System/Volumes/Data/Volumes Directory 1,4 31220848
/System/Volumes/Data/Volumes/Macintosh HD Symbolic Link 1,4 112123035
/System/Volumes/Data/Volumes/Macintosh HD/ Directory 1,4 2
/System/Volumes/Data/Volumes/Macintosh\ HD/Applications Directory 1,4 106381676

Inode 可以看出,/Applications/System/Volumes/Data/ApplicationsInode 相同,是同一个文件,路径中没有硬链接和符号链接,是由 firmlinks 实现的,而 /System/Volumes/Data/Volumes/Macintosh HD 是符号链接,因此 /System/Volumes/Data/Volumes/Macintosh HD/ 指向 /,相应的 /System/Volumes/Data/Volumes/Macintosh\ HD/Applications 指向 /Applications,也就是 /System/Volumes/Data/Applications

查询装载情况

mount

结果为

/dev/disk1s5 on / (apfs, local, read-only, journaled)
devfs on /dev (devfs, local, nobrowse)
/dev/disk1s1 on /System/Volumes/Data (apfs, local, journaled, nobrowse)
/dev/disk1s4 on /private/var/vm (apfs, local, journaled, nobrowse)
map auto_home on /System/Volumes/Data/home (autofs, automounted, nobrowse)

对照前面分析可知,和 firmlinks 技术相关的是 /dev/disk1s5 装载到 //dev/disk1s1 装载到 /System/Volumes/Data/read-only,这样用户访问文件时,如果通过 firmlinks 技术映射到 /System/Volumes/Data,就可写,否则只读。这种限制由文件系统实现,对用户而言透明。

查询磁盘信息

diskutil list

结果为

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         500.0 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +500.0 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD - 数据     465.9 GB   disk1s1
   2:                APFS Volume Preboot                 82.5 MB    disk1s2
   3:                APFS Volume Recovery                528.6 MB   disk1s3
   4:                APFS Volume VM                      5.4 GB     disk1s4
   5:                APFS Volume Macintosh HD            11.2 GB    disk1s5

对照可知 /dev/disk1s1 的名称为 Macintosh HD - 数据 /dev/disk1s5 的名称为 Macintosh HD,也就是 /System/Volumes/Data/Volumes/Macintosh HD 软链接的名称。

查询 /dev/disk1s1 详情

diskutil info disk1s1

还会看到有这么几行(其余行略)

Volume UUID:               7A993015-DBBC-40F3-A3A1-6CAC003694D7
Disk / Partition UUID:     7A993015-DBBC-40F3-A3A1-6CAC003694D7

APFS Volume Group:         7A993015-DBBC-40F3-A3A1-6CAC003694D7

类似命令查询 /dev/disk1s5 详情有这么几行(其余行略)

Volume UUID:               CA7D790C-C781-4306-AD64-461DAA508524
Disk / Partition UUID:     CA7D790C-C781-4306-AD64-461DAA508524

APFS Volume Group:         7A993015-DBBC-40F3-A3A1-6CAC003694D7

这说明 /dev/disk1s1 是先创建的,而 /dev/disk1s5 加入 /dev/disk1s1 组成卷组。

把这些信息结合起来即可得到存储的层次关系。

  • 物理设备 physical/dev/disk0500.3 GB
    • 可扩展固件接口 EFI/dev/disk0s1314.6 MB
    • APFS 容器。/dev/disk0s2,也是 /dev/disk1500.0 GB
      • APFSPreboot/dev/disk1s282.5 MB
      • APFSRecovery/dev/disk1s3528.6 MB
      • APFSVM/dev/disks4,挂载在 /private/var/vm5.4 GB
      • APFS 卷组 7A993015-DBBC-40F3-A3A1-6CAC003694D7。基于 /dev/disk1s1
        • APFS/dev/disk1s1,挂载在 /System/Volumes/Data
        • APFS/dev/disk1s5,挂载在 /,只读

进一步可以结合前面的 firmlinks 分析。

你可能感兴趣的:(MacOS,ncdu,APFS,macos,ncdu,APFS,firmlinks,Catalina)