最近忽然发现一个使用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.2
到 1.15
这么的小版本号也会改接口。
接下来看看 firmlinks
是什么。
前面没有翻译 firmlinks
,既不是符号链接,也不是硬链接。因为 firmlinks
是 MacOS
的专有概念,用Apple工程师自己的原话说
它就是数据卷与系统卷之间的
双向虫洞
firmlinks
技术源于 MacOS
保护系统文件的技术演进。
保护系统文件一直是操作系统的核心安全问题,基于开源BSD
系列的MacOS
也是如此。
MacOS
从 EI 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/Applications
的 Inode
相同,是同一个文件,路径中没有硬链接和符号链接,是由 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/disk0
,500.3 GB
EFI
。/dev/disk0s1
,314.6 MB
APFS
容器。/dev/disk0s2
,也是 /dev/disk1
,500.0 GB
APFS
卷 Preboot
。/dev/disk1s2
,82.5 MB
APFS
卷 Recovery
。/dev/disk1s3
,528.6 MB
APFS
卷 VM
。/dev/disks4
,挂载在 /private/var/vm
,5.4 GB
APFS
卷组 7A993015-DBBC-40F3-A3A1-6CAC003694D7
。基于 /dev/disk1s1
APFS
卷 /dev/disk1s1
,挂载在 /System/Volumes/Data
APFS
卷 /dev/disk1s5
,挂载在 /
,只读进一步可以结合前面的 firmlinks
分析。