通过 df 与 dumpe2fs 获取块大小

通过 df 与 dumpe2fs 获取块大小

这两个工具似乎报告不同的block尺寸

root@ubuntu-xenial:~# df
Filesystem     1K-blocks     Used Available Use% Mounted on
udev              498588        0    498588   0% /dev
tmpfs             101584     3116     98468   4% /run
/dev/sda1       10098468  1438288   8643796  15% /
tmpfs             507916        0    507916   0% /dev/shm
tmpfs               5120        0      5120   0% /run/lock
tmpfs             507916        0    507916   0% /sys/fs/cgroup
vagrant        343946960 55977016 287969944  17% /vagrant
tmpfs             101584        0    101584   0% /run/user/1000

root@ubuntu-xenial:~# dumpe2fs /dev/sda1 | grep -i block | grep -i size
dumpe2fs 1.42.13 (17-May-2015)
Block size:               4096
Flex block group size:    16

更重要的是,fdisk命令报告不同的sector大小(术语sector和不是block可以互换的吗?)

root@ubuntu-xenial:~# fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x38d40272

Device     Boot Start      End  Sectors Size Id Type
/dev/sda1  *     2048 20971486 20969439  10G 83 Linux


Disk /dev/sdb: 10 MiB, 10485760 bytes, 20480 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

我在vagrant机器上做重要的事

答案1

您不会“通过 df 获取块大小”。这根本没有显示在输出中。

df 在一个列表中列出了所有文件系统、它们的使用情况和挂载点 - 显示的值仅指大小(总计/已用/可用),而不是其他单独的属性,如文件系统类型、块大小等。

默认情况下,表示大小的单位是 1K-blocks,您可以将其更改为 1M-blocks 或 1G-blocks 或变量(人类可读)。

$ df
Filesystem               1K-blocks       Used Available Use% Mounted on
/dev/dm-34                25155584   19811668   5343916  79% /

$ df --block-size=M
Filesystem              1M-blocks     Used Available Use% Mounted on
/dev/dm-34                 24566M   19348M     5219M  79% /

$ df --block-size=G
Filesystem              1G-blocks  Used Available Use% Mounted on
/dev/dm-34                    24G   19G        6G  79% /

$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/dm-34                24G   19G  5.1G  79% /

(请注意细微的差别-BG-h可用列显示6Gvs.5.1G人类可读的大小根据大小进行调整,而使用大块大小时没有分数块)。

至于文件系统,它不必像存储设备一样以 512 字节为单位工作。尽管现在很多存储都有更大的扇区,但出于兼容性原因仍然假装是 512 字节。

这些术语sector和不是block可以互换的吗?

不幸的是,这些术语根据上下文以不同的方式使用。

答案2

...报告不同的扇区大小(扇区和块这两个术语不是可以互换的吗?)

“块”已被用来表示许多不同的事物。你得看具体的语境。

df进一步延伸,“1K 块”表示 1 KB 的单位,即使文件系统使用不同的块大小。

“扇区”最初是指磁盘使用的块大小。但请注意您fdisk报告了两种不同类型的扇区大小:“物理”和“逻辑”:-)。因此,您还需要注意此处的上下文。 [*]

文件系统块大小是多少?

因为您提到的第一个工具是dfdumpe2fs,所以我猜您可能正在寻找文件系统块大小。在这种情况下,您需要dumpe2fs显示为“块大小”的值。

dumpe2fs是 ext2/3/4 的特定工具,但我认为这是最强大的方法。也就是说,这意味着如果您使用不同的文件系统,您将必须使用不同的工具并准确确认它使用的“块大小”。

正常文件系统块大小可能存在一些例外。最近的 ext4 可能支持 inode 中内联数据存储。也就是说,小于特定大小的文件可以存储在文件的索引节点中,而根本不分配任何数据块。看如何使用新的 Ext4 内联数据功能? (直接在inode中存储数据)

替代查询方法:statvfs()

或者,您可以运行stat -f /来显示statvfs()根文件系统的信息。这里讨论过:统计文件系统大小

stat -f输出包括两个不同的字段,“基本块大小”和“块大小”:-)。

“基本”块大小是空间使用的粒度报道in - 这将适用于df.您可以希望这与用于分配文件空间的粒度相同。至少对于 ext2/3/4 以及许多其他情况都是如此。

stat声称其他块大小将用于“快速传输”。在 ext2/3/4 中,这两个块大小始终相同。

如果 ext2 曾经实现过片段,就像 BSD UNIX 中的 UFS 一样,那么两个大小可能会有所不同。这反映在dumpe2fs始终显示等于“块大小”的“片段大小”值。看f_bsize 可以用来做什么? (和st_blksize类似吗?)

作为一种更通用的工具,stat -f在某些情况下容易产生误导。

它的使用也不是很广泛;这可能会增加风险。它报告两个不同的值,这并没有帮助,这两个值的原始含义与本机 Linux 文件系统无关。 FWIW,该网站的用户讨厌我要求确认其行为的问题(上面的链接)。我通常认为这意味着他们生气了,因为没有人知道如何回答这个问题。

stat -f是 GNU coreutils 的一个功能。 (从 FreeBSD 7.2 开始不支持stat)。

“用于快速传输的块大小”有意义吗?

该描述可能与实现片段的文件系统相关。如果它们没有实现“延迟分配”,那么在增加文件长度时确保使用块大小的写入缓冲区可能会更有效。与往常一样,如果您正在考虑做出改变以提高性能,您应该旨在通过测量来确认改进。

在 Linux 文件系统上,两个块大小将是相同的值。在这种情况下,我不知道有什么理由使用该特定值进行优化。

大多数情况下,用户空间不必过多担心“为了快速传输”调整 I/O 调用的大小。 IO 调度程序可以合并相邻的 I/O 以提高效率。通过页面缓存进行的未同步 IO 通过回写缓存和自动预读获得了巨大的性能优势。仅使用页面缓存大小或硬编码 4KB 就可以发挥很大作用:-)。

在大多数传输中,页缓存规定了物理 IO 的最小大小。大多数系统上的页面大小为 4KB,通常文件 IO 会经过页面缓存。 (同样,小文件是一种特殊情况。或者更确切地说,如果文件大小不是 4KB 的整数倍,则文件的最后一页是一种特殊情况)。


[*] 例如,给定现代抽象层,您有时可能会在使用 4KB 物理扇区的现代“高级格式”磁盘上看到一个“扇区大小”字段报告为 512。

答案3

经过一番挖掘后发现,获取块大小的适当方法是

root@ubuntu-xenial:/proc# blockdev --getbsz /dev/sda
4096

当然,一个块设备与另一个块设备之间可能有所不同。

无论如何,上面的值似乎与输出一致dumpe2fs

相关内容