我使用 samba 设置了一个文件服务器,并将文件从同一 LAN 下的另一台计算机复制到该服务器。我设置了 SSH 服务器并用手机连接到它来监控进程。
这是我在手机上的 OpenSSH 客户端中运行的内容(服务器安装了 GNU Core Utilities):
# while :; do du -sh /media/samba; sleep 1; done
288M /media/samba
289M /media/samba
290M /media/samba
...
^C
# while :; do du -sb /media/samba; sleep 1; done
328267292 /media/samba
328267292 /media/samba
328267292 /media/samba
... ...
(repeated ~30 times)
361334588 /media/samba
361334588 /media/samba
... ...
(repeated ~30 times)
403280532 /media/samba
403280532 /media/samba
^C
#
计算机(运行 Windows 10)报告的传输速度约为。 1000KB/s,所有文件大小为 30~35 MB。
根据我的观察,du
报告文件大小为-h
,但“占用空间”为-b
。
那么为什么du
当文件增长时会报告不同的大小呢?
如何du
处理选项-h
和-b
?
答案1
根据我的观察,du 使用 -h 报告文件大小,但使用 -b 报告“占用空间”。
对于 GNU 来说,情况正好相反,du
引用du --help
:
-b, --bytes 相当于 '--apparent-size --block-size=1'
du
without--apparent-size
报告磁盘使用情况(包括目录在内的任何类型的唯一文件的字段总和st_blocks
,通过遍历目录树计算),而 with --apparent-size
(由 暗示-b
)总和st_size
(将从文件中读取的数据量)对于常规文件)。
当磁盘使用量逐渐增长时,表观大小会以大块的形式增长,一个可能的解释是,文件内容不是从头到尾顺序传输,而是随机传输。这对于比特流传输来说很常见,其中块是从不同的对等点传输的。
例如,如果您打开一个新文件进行写入,然后在 1GiB 偏移处写入 4KiB 数据块,您将看到文件大小增长到 1GiB+4KiB,但磁盘使用量将为 4KiB:
$ zsh
% zmodload zsh/system
% exec 3> file
% du -h file
0 file
% du -s file
0 file
% sysseek -u3 $((1<<30)) # seek to 1GiB
% head -c 4K < /dev/urandom >&3 # write 4KiB there
% du -h file
4.0K file
% du -b file
1073745920 file
这是一个非常大的稀疏文件,仅占用 4KiB 磁盘空间
% sysseek -u3 0
% head -c 4K < /dev/urandom >&3
% du -h file
8.0K file
% du -b file
1073745920 file
开始写入4KiB后,文件大小没有变化,但磁盘使用量增加了很多。
% head -c 4M < /dev/urandom >&3
% du -h file
4.1M file
% du -b file
1073745920 file
又写了 4MiB 后又一样。
1 虽然 BitTorrent 客户端通常会提前预先分配空间fallocate()
以保证空间并帮助系统做出磁盘分配决策。如果他们必须访问fallocate()
可能不支持的SMB 文件,他们可能无法做到这一点。
答案2
区别在于旗帜
-h
用于人类可读的输出,将使用兆
-b
字节。当然,-s
用于总结
来自 du 手册页
-b --bytes 以字节为单位打印大小,覆盖默认块大小(*note 块大小::)。
-h --human-readable 在每个大小后面附加一个大小字母,例如“M”,表示兆字节数。使用的是 1024 的幂,而不是 1000;“M”代表 1,048,576 字节。如果您喜欢 1000 的幂,请使用“-H”或“--si”选项。
-s --summarize 仅显示每个参数的总计。
因此,在您第一次调用它时,du -sh
它使用兆字节的 1024 次方以人类可读的形式汇总了总数。
在第二次调用中,du -sb
它使用字节总结参数。