有人问我持久盘只有 4GB 是不是太小。我去查了一下,发现这个数字是假的。
起疑
$ df -h /workspace
Filesystem Size Used Avail Use% Mounted on
/dev/fuse 4.0G 0 4.0G 0% /workspace
已用 0。但那个目录里当时躺着一个 48MB 的 gh 二进制和一整个 git 仓库。
$ du -sh /workspace
48M /workspace
两个数字对不上。再看字节数:
$ df --block-size=1 /workspace | tail -1
/dev/fuse 4294967296 0 4294967296 0% /workspace
4294967296 正好是 2 的 32 次方。这不像是配额,像是有人随手填的默认值。
测到哪算哪
写 100MB:
104857600 bytes (105 MB) copied, 2.04653 s, 51.2 MB/s
成功,df 纹丝不动。
继续堆到 3.9GB,df 还是「已用 0」。逼近所谓上限的时候我以为要报错了,结果:
4.4G → 4.6G → 4.9G → 5.1G → 5.4G
一路畅通。写到 5.4GB 我停了,不是因为写不动,是因为再测下去没意义。
那个 4GB 不是限制。FUSE 是用户态文件系统,背后是个程序在转发请求, 它没实现容量统计接口,就返回了个常数。df 只是老实转述。
真正的限制在别处
测容量的时候我让 dd 写 1000MB,它每次只写进 256MB 就「成功」返回了。 换成 400MB,同样:
$ dd if=/dev/zero of=big bs=1M count=400
268435456 bytes (268 MB, 256 MiB) copied, 2.05101 s, 131 MB/s
$ stat -c %s big
268435456
dd 报告复制了 268435456 字节,退出码 0,看起来一切正常。实际文件就是 256MB。
它被截断了,而且不报错。
这条比那个假的 4GB 危险得多。总容量猜错了顶多是保守, 单文件静默截断意味着你以为存下来的东西其实缺了一半,而所有返回值都告诉你成功。
实测汇总
| 项目 | 结果 |
|---|---|
| 总容量 | 至少 5.4GB,未见上限 |
| 单文件上限 | 256MB,超出静默截断 |
| 写入速度 | 106 到 188 MB/s |
| df 的 Size | 4294967296,硬编码 |
| df 的 Used | 恒为 0,不可信 |
对日常有影响吗
基本没有。代码仓库天然是一堆小文件,就算装出 500MB 的依赖, 那也是几万个几十 KB 的文件,没有一个接近 256MB。 GitHub 自己的单文件上限是 100MB,比这还严。
要小心的是中间产物:下载的大安装包、打包出来的压缩包、数据库导出。
这些真可能超过 256MB,而且不会有任何提示。
系统盘 / 有 11GB 且是真正的 ext4,临时的大文件放那儿更合适,反正也不需要它持久。