fdisk在10GiB设备上可创建10GiB分区却无法创建9.9GiB分区的原因及环境差异疑问
我来帮你拆解这几个问题,核心都和fdisk的扇区计算逻辑、虚拟磁盘的细微差异有关:
为什么10GiB分区可行但9.9GiB提示超出范围?
这本质是fdisk的整数扇区计算规则+浮点精度误差导致的。
fdisk的所有分区操作最终都要映射到磁盘的物理扇区(默认512字节/扇区),它完全不支持以小数字节数定义分区——所有容量换算都会被转为整数扇区数。
你的磁盘总容量是10GiB,换算成扇区数是:10 * 1024^3 / 512 = 20971520 个扇区,扇区编号从0到20971519。
当你创建分区时选了默认起始扇区2048,最大可用的结束扇区是20971519,对应的分区容量是:(20971519 - 2048 + 1) * 512 / 1024^3 = 9.9990234375GiB
这个值非常接近10GiB,fdisk会把它识别为“10GiB”并允许创建,因为它完全在磁盘的扇区范围内。
而当你输入+9.9G时,fdisk需要把9.9GiB换算成扇区数:9.9 * 1024^3 / 512 = 20761804.8
这里出现了小数,fdisk在处理时可能会向上取整为20761805个扇区,对应的结束扇区是:2048 + 20761805 - 1 = 20763852
理论上这个扇区数远小于20971519,但问题出在浮点数计算的精度误差:9.9是一个无法用二进制浮点数精确表示的十进制小数,换算过程中会产生微小的溢出,导致fdisk计算出的结束扇区意外超过了磁盘的最大扇区数,从而提示“Value out of range”。
为什么VirtualBox的VMDK磁盘上可以成功创建?
这大概率和两个因素有关:
- 虚拟磁盘的扇区总数细微差异:VirtualBox的VMDK在创建10GiB磁盘时,实际提供的扇区数可能比KVM的qcow2多几个扇区(比如因为VMDK的元数据占用方式不同,或者磁盘容量的向上取整规则不同),刚好容纳了fdisk因浮点误差多算的那几个扇区。
- fdisk版本差异:如果VirtualBox虚拟机里的fdisk版本和你Ubuntu Server 22.04上的(util-linux 2.37.2)不同,旧版本的fdisk可能对小数容量的处理逻辑更宽松(比如向下取整而非向上取整),避免了溢出问题。
这和qcow2设备有关吗?
不是qcow2的直接问题,而是KVM和VirtualBox对虚拟磁盘的容量呈现细节不同。qcow2作为稀疏磁盘,只要你创建的是固定大小的10GiB磁盘,它呈现给虚拟机的扇区总数应该和VMDK一致,但可能KVM在虚拟磁盘的边界处理上更严格,没有给额外的“缓冲”扇区,而VirtualBox则多留了几个扇区,刚好避开了fdisk的浮点误差问题。
临时解决方法
如果一定要创建9.9GiB的分区,可以绕过浮点计算,直接用扇区数来定义:
计算9.9GiB对应的扇区数(向下取整):9.9 * 1024 * 1024 * 1024 / 512 = 20761804
然后在fdisk里输入结束扇区为2048 + 20761804 - 1 = 20763851,这样就能精确创建9.9GiB左右的分区了。
备注:内容来源于stack exchange,提问作者Harsh




