为什么 DD 输出映像文件大于源分区/将分区复制到文件时空间不足

为什么 DD 输出映像文件大于源分区/将分区复制到文件时空间不足

DD 输出映像文件大于源分区,并且尽管目标分区(创建映像的位置)大于源分区,但 DD 在目标分区(创建映像的位置)上的空间不足。

我正在尝试将一个分区复制到同一磁盘上的另一个分区上的文件。目标分区比输入分区稍大。两者都是ext3分区。

从 OpenSuse-Rescue LIVE CD 运行。Yast 显示输入分区(sdb1)为 62.5 GiB,输出分区sdb2为 62.85 GiB。

Thunar 显示输入sdb1为 65.9 GB,输出sdb2为 66.2 GB,而输出dd图像文件也是 66.2,因此显然已达到最大值sdb2

这是控制台:

sdb1已卸载,尝试过dd几次)

linux:# dd if=/dev/sdb1 of=RR.image bs=4096

dd: error writing ‘RR.image’: No space left on device
16156459+0 records in
16156458+0 records out
66176851968 bytes (66 GB) copied, 2648.89 s, 25.0 MB/s

根据要求提供更多信息:

再次:我看到源分区大小sdb1和它从中创建的 DD 映像文件存在差异RR.image。该文件位于sdb2


这里还有一些不清楚的地方:我正在以 ROOT 身​​份运行 DD,因此保留的空间可供写入,对吗?目标是 62.85 GiB,而您所说的图像的总字节数约为 61.63 GiB。以下是和命令sdb2的输出:dfPOSIXLY_CORRECT=1 df

现在的系统是 system-rescue-cd

root@sysresccd /root % df

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb1 64376668 7086884 56241208 12% /media/Data1
/dev/sdb2 64742212 64742212 0 100% /media/Data2
/dev/sdb3 5236728 4785720 451008 92% /usr/local

root@sysresccd /root % POSIXLY_CORRECT=1 df /dev/sdb1 
Filesystem     512B-blocks     Used Available Use% Mounted on
/dev/sdb1        128753336 14173768 112482416  12% /media/Data1

root@sysresccd /root % POSIXLY_CORRECT=1 df /dev/sdb2    
Filesystem     512B-blocks      Used Available Use% Mounted on
/dev/sdb2        129484424 129484424         0 100% /media/Data2

如果我们将其除以 2 ,则所得数字与简单数字完全相同df。1024b/512b=2 是除数。

  1. sdb1小于sdb2。现在 100% 的使用率sdb2是因为 DD 映像文件填满了分区。它现在必须是分区上唯一的文件。

  2. 根据 DD(运行时)和 Thunar 报告,映像文件本身的大小为 66,176,851,968 字节。除以 1024 字节,我们得到 64625832 个 K 块,对吗?因此,它仍然比df报告的要sdb2小 116380K 以上,并且比(源)大sdb1,但它使分区达到最大值sdb2

问题是:那里有什么东西可以占用这个空间sdb2


但最重要的和最有趣的是:

为什么目标文件比dd创建它的源分区大?这对我来说意味着:我无法将其写回。

sdb1(64376668K)< RR.image(64625832K)

sdb1(64376668 个 1K 块)< RR.image(64625832 个 1K 块)< sdb2(64742212 个 1K 块)

(我希望事情计算正确……)

现在我检查了为 ROOT 保留的块。我发现要执行此命令:

root@sysresccd /root % dumpe2fs -h /dev/sdb1 2> /dev/null | awk -F ':' '{ if($1 == "Reserved block count") { rescnt=$2 } } { if($1 == "Block count") { blkcnt=$2 } } END { print "Reserved blocks: "(rescnt/blkcnt)*100"%" }'

Reserved blocks: 1.6%

root@sysresccd /root % dumpe2fs -h /dev/sdb2 2> /dev/null | awk -F ':' '{ if($1 == "Reserved block count") { rescnt=$2 } } { if($1 == "Block count") { blkcnt=$2 } } END { print "Reserved blocks: "(rescnt/blkcnt)*100"%" }'

Reserved blocks: 1.59999%

因此,如果有任何特殊情况,两个分区上为 ROOT 保留的百分比也是相同的。


以下是 的输出gdisk

root@sysresccd /root % gdisk -l /dev/sdb

GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. 
***************************************************************

Disk /dev/sdb: 312581808 sectors, 149.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): DCF8AFC4-11CA-46C5-AB7A-4818336EBCA3
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 312581774
Partitions will be aligned on 2048-sector boundaries
Total free space is 7789 sectors (3.8 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       131074047   62.5 GiB    8300  Linux filesystem
   2       131074048       262889471   62.9 GiB    8300  Linux filesystem
   3       302086144       312580095   5.0 GiB     0700  Microsoft basic data
   5       262891520       293771263   14.7 GiB    8300  Linux filesystem
   6       293773312       302086143   4.0 GiB     8200  Linux swap

那么它的真实尺寸是多少sdb1

(N2)不是sdb2大于sdb1(N1) 吗?那么为什么映像文件会变得比sdb2(N2) 大呢?如果我关闭为 root 保留的空间sdb2,那么它能放得下吗?

答案1

每个文件系统都需要一些空间来存放元数据。此外extroot为用户保留一些空间默认为5%。

例子

在我的 Kubuntu 中,我创建了一个 1GiB 的(稀疏)文件:

truncate -s 1G myfile

ext3在其中创建文件系统。命令很简单

mkfs.ext3 myfile

这立即为 分配了大约 49MiB(在本例中约为 5%)myfile。我可以看到,由于文件很稀疏,最初在我的实际磁盘上报告使用量为 0B,然后它就增长了。我假设这就是元数据所在的地方。

我挂载了文件系统;df -h报告显示总空间为 976MiB,但可用空间只有 925MiB。这意味着另外约 5% 的空间对我来说不可用。

然后我用以下代码填充了这个空间(在cd挂载点之后)

dd if=/dev/urandom of=placeholder

作为普通用户,我只能使用 925MiB。报告的“磁盘”使用率为 100%。但是,执行与 相同的操作后root,我可以将 976MiB 写入文件。当文件超过 925MiB 时,使用率仍为 100%。

结论

在这种情况下,比较分区的大小是错误的;比较文件系统的大小也是错误的。您应该检查目标上的可用空间文件系统(例如df)并将其与源的大小进行比较分割


编辑:

说清楚一点:您的 66176851968 字节大约为 61.63 GiB。这是不是大于源分区(62.5 GiB)。源分割当目标没有完全读取时文件系统吃饱了。

如果你不熟悉 GB/GiB 的区别,请阅读man 7 units


编辑2

现在我们得到了所有实际数字。我们坚持使用 单位512B,这是一个常见的扇区大小。

  • 你的sdb1 分割占用131074048-2048=131072000磁盘上的单位。我们称之为P1。这是来自gdisk输出。
  • 你的sdb2 分割262889472-131074048=131815424在磁盘上占用单位。设是P2。这也是来自gdisk输出。
  • 你的文件系统里面总共sdb1可以存储文件数为128753336个。我们把这个数字称为 个F1。这是从df输出中得到的。
  • 你的文件系统里面sdb2最多可以存储129484424单位。设F2。这也是从df输出来的。

如果您知道必须有元数据的空间,则可以解释P1和之间的差异F1以及和之间的差异P2。这在本答案的前面提到过。F2

dd试图复制整个sdb1 分割P1数据,放入占用空间的文件中,由文件系统内部sdb2,即可F2用空间。

P1> F2——这是最终答案。您的图像文件没有超过其应有的大小。在我看来,您预期其大小为F1。实际上,整个图像的大小为 个P1单位。

P2并且F1与本文无关。

答案2

经过长时间的讨论,我明白了你的意思。

我们终于切入正题了。好吧,在我编辑之前,我的问题一开始有点模糊。非常感谢!

我发现这个命令可以获取分区的确切大小(以字节为单位):

root@sysresccd /root%parted /dev/sdb单元B p

型号:ATA WDC WD1600AAJS-0 (scsi)

磁盘 /dev/sdb:160041885696B

扇区大小(逻辑/物理):512B/512B

分区表:msdos

磁盘标志:

编号 起始 结束 大小 类型 文件系统 标志

1 1048576B 67109912575B 67108864000B 主 ext3 引导

2 67109912576B 134599409663B 67489497088B 主扩展3

4 134600457216B 154668105727B 20067648512B 扩展

5 134600458240B 150410887167B 15810428928B 逻辑 ext4

6 150411935744B 154668105727B 4256169984B 逻辑 li​​nux 交换(v1)

3 154668105728B 160041009151B 5372903424B 初级脂肪32 lba

所以基本上我需要将此列表中 sdb1(N1)的实际大小与此列表中 sdb2(N2)上的可用空间进行比较。

但为此,我们在目标(sdb2)文件系统上使用 POSIXLY_CORRECT=1 df 命令,在本例中为:129484424 512b-blocks。

如果我们将 sdb1 中的 67108864000B 除以 512 b = 131072000 个 512b 块。或者我们可以乘以 129484424*512 = 66296025088 字节。

因此 66296025088 字节(sdb2 上的可用空间)< 67108864000 字节(sdb1 的原始大小)。显然,sdb1 分区映像无法放入 sdb2 上的可用空间中。而且 sdb2 上为 ROOT 保留的空间也应考虑在内。

至于我关于映像文件大于分区的问题,我基本上将 sdb1 文件系统大小与 DD 映像进行比较,而不是将原始分区大小与 DD 应完整读取的原始分区大小进行比较。对吗?我甚至可以估算出完成操作所需的空间:66,176,851,968 字节是未完成的 DD 映像的大小,因此我将其与原始 sdb1 分区的大小进行比较 66,176,851,968 = 66176851968 B < 67108864000 B = 小 932012032 字节 = 888 MiB

但是空分区里有什么?元数据和为根保留的空间?这么多空间?!!!非常感谢!!

很高兴知道这一切!!

相关内容