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
的输出:df
POSIXLY_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 是除数。
sdb1
小于sdb2
。现在 100% 的使用率sdb2
是因为 DD 映像文件填满了分区。它现在必须是分区上唯一的文件。根据 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
每个文件系统都需要一些空间来存放元数据。此外ext
,root
为用户保留一些空间默认为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 逻辑 linux 交换(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
但是空分区里有什么?元数据和为根保留的空间?这么多空间?!!!非常感谢!!
很高兴知道这一切!!