2.3 区块大小

2.3 区块大小

我最近遇到了分区问题,我无法找出哪个实用程序正在使用 MB 或 MiB,以及为什么它们在这三个实用程序中不能保持一致。

例如,在 fdisk 中,当您打印出分区表时,大小以 M 或 G 为单位(我假设是兆字节和千兆字节??)而在 gdisk 中,它们以 MiB 或 GiB 为单位(即兆比字节和千兆比字节)...而在 resize2fs 中,它实际上在手册页中指定以 MB 为单位(即兆字节)。至于 parted,我甚至还没有看过它...

现在,请记住 100 MB 与 100 MiB 完全不同,并且此信息对于避免丢失所有数据至关重要,那么实际的经验法则是什么呢?

答案1

许多程序都遵循相同的大小单位或“块大小”约定。但这不是一条通用规则,每个程序通常都可以“做它想做的事”,因此请务必阅读每个工具的手册或信息页以确保无误。

对于分区,我肯定会使用 gparted,它可以避免任何混淆,并清楚地向您显示它正在使用的单位。


man resize2fs实际上并没有说它只使用了 MB(一百万字节),而是这样的:

   The  size parameter specifies the requested new size of the filesystem.
   If no units are specified, the units of the size parameter shall be the
   filesystem blocksize of the filesystem.  Optionally, the size parameter
   may be suffixed by one of the following  the  units  designators:  's',
   'K',  'M', or 'G', for 512 byte sectors, kilobytes, megabytes, or giga‐
   bytes, respectively.  The size of the filesystem may  never  be  larger
   than the size of the partition.  If size parameter is not specified, it
   will default to the size of the partition.

   Note: when kilobytes is used above, I mean real, power-of-2  kilobytes,
   (i.e.,  1024 bytes), which some politically correct folks insist should
   be  the  stupid-sounding  ``kibibytes''.   The  same  holds  true   for
   megabytes,  also sometimes known as ``mebibytes'', or gigabytes, as the
   amazingly silly ``gibibytes''.  Makes you want to gibber, doesn't it?

fdisk 会根据所检查设备所显示的扇区大小来显示扇区大小。以下是小型设备的示例输出,其大小显示为 3997 MB,即 3997171712 字节,这是使用制造商首选的“更大”的 1MB = 1,000,000 字节:

$ sudo fdisk -l /dev/sdb

Disk /dev/sdb: 3997 MB, 3997171712 bytes
17 heads, 16 sectors/track, 28702 cylinders, total 7806976 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
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            8192     7806975     3899392    b  W95 FAT32

你可能会注意到它告诉我唯一的分区是 3899392 个块,但是从开始减去结束得到的结果是两倍......这很奇怪而且不正确,但是man fdisk确实说“fdisk 是一个有缺陷的程序,它所做的事很模糊 - 通常它会产生合理的结果。它的唯一优点是它支持 BSD 磁盘标签和其他非 DOS 分区表。如果可以的话,请避免使用它。”
它确实推荐cfdisk,更准确地显示(以 512 字节块为单位):

$ sudo cfdisk -P s /dev/sdb
Partition Table for /dev/sdb

               First       Last
 # Type       Sector      Sector   Offset    Length   Filesystem Type (ID) Flag
-- ------- ----------- ----------- ------ ----------- -------------------- ----
   Pri/Log           0        8191*     0#       8192*Free Space           None
 1 Primary        8192*    7806975*     0     7798784 W95 FAT32 (0B)       None

parted 默认显示 MB=1,000,000 字节,但可以使用以下命令进行更改:

Model: Multi Flash Reader (scsi)
Disk /dev/sdb: 3997MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  3997MB  3993MB  primary  ext3

但可以使用其单位命令来更改单位:

unit unit
  Set unit as the unit to use when displaying locations and
  sizes,  and for interpreting those given by the user when
  not suffixed with an explicit unit.  unit can be  one  of
  "s"  (sectors),  "B" (bytes), "kB", "MB", "GB", "TB", "%"
  (percentage of device  size),  "cyl"  (cylinders),  "chs"
  (cylinders,  heads, sectors), or "compact" (megabytes for
  input, and a human-friendly form for output).

但是,gparted它以(我偏爱的) M 或 MiB(1024 的幂)为单位显示大小,并且如果您愿意,它也可以执行所有移动/缩小/调整大小/格式化操作,或者您只能使用它创建分区,然后稍后使用“整个”分区自行格式化它们,而不必担心确切的大小。

在此处输入图片描述


您可能需要阅读 coreutils.info 页面上的块大小:

2.3 区块大小

一些 GNU 程序(至少是“df”、“du”和“ls”)以“块”为单位显示大小。您可以调整块大小和显示方法,使大小更易于阅读。用于显示的块大小与任何文件系统块大小无关。小数块计数将四舍五入为最接近的整数。

...

整数块大小后可以跟一个后缀,以指定该大小的倍数。裸大小字母或后跟“iB”的大小字母指定使用 1024 的幂的倍数。后跟“B”的大小字母则指定 1000 的幂。例如,“1M”和“1MiB”相当于“1048576”,而“1MB”相当于“1000000”。

不带前导整数的普通后缀的作用就像在前面添加了“1”,只不过它会导致将大小指示附加到输出中。例如,“--block-size="kB"”将 3000 显示为“3kB”。

定义了以下后缀。由于计算机的算法限制,像“1Y”这样的大尺寸可能会被计算机拒绝。

‘kB’ 千字节:10^3 = 1000。

'k' 'K' 'KiB' 千比字节:2^10 = 1024。'K' 很特殊:SI 前缀为 'k',ISO/IEC 80000-13 前缀为 'Ki',但传统和 POSIX 使用 'k' 来表示 'KiB'。

‘MB’ 兆字节:10^6 = 1,000,000。

‘M’ ‘MiB’ 兆字节:2^20 = 1,048,576。

‘GB’ 千兆字节:10^9 = 1,000,000,000。

'G' 'GiB' 吉比字节:2^30 = 1,073,741,824。

‘TB’ 兆兆字节:10^12 = 1,000,000,000,000。

'T' 'TiB' 太字节:2^40 = 1,099,511,627,776。

“PB” 千兆字节:10^15 = 1,000,000,000,000,000。

'P' 'PiB' 百亿字节:2^50 = 1,125,899,906,842,624。

“EB” 艾字节:10^18 = 1,000,000,000,000,000,000。

'E' 'EiB' 艾字节:2^60 = 1,152,921,504,606,846,976。

'ZB' 泽字节:10^21 = 1,000,000,000,000,000,000,000

'Z' 'ZiB' 2^70 = 1,180,591,620,717,411,303,424。

“YB” 尧字节:10^24 = 1,000,000,000,000,000,000,000,000。

'Y' 'YiB' 2^80 = 1,208,925,819,614,629,174,706,176。

块大小默认值可以通过显式“--block-size=SIZE”选项覆盖。“-k”选项相当于“--block-size=1K”,除非设置了“POSIXLY_CORRECT”环境变量,否则它是默认值。“-h”或“--human-readable”选项相当于“--block-size=human-readable”。“--si”选项相当于“--block-size=si”。

相关内容