為什麼 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

應要求提供的附加資訊:

再次:我看到來源分割區大小和從中建立的sdb1DD 映像檔的差異。RR.image該文件駐留在sdb2.


這裡還有一些不清楚的地方:我正在以 root 身分執行 DD,因此保留的空間可用於寫入,對嗎?目標sdb2是 62.85 GiB,而您所說的圖像的總位元組約為 61.63 GiB。這也是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

df如果我們除以 2,這些數字與 simple 中的數字完全相同。

  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

sdb2(N2)不是比sdb1(N1)大嗎?那麼為什麼圖像檔案會變得比sdb2(N2)大呢?如果我關閉為 root 保留的空間sdb2,那麼它適合那裡嗎?

答案1

每個檔案系統都需要一些空間來儲存元資料。另外ext家庭root為使用者保留一些空間預設為 5%。

例子

在我的 Kubuntu 中,我建立了一個 1GiB 的(稀疏)檔案:

truncate -s 1G myfile

ext3在其中創建文件系統。指令很簡單

mkfs.ext3 myfile

這立即為myfile.我可以看到,因為該文件很稀疏,並且最初在我的真實磁碟上報告了 0B 使用量,然後它增長了。我認為這就是元資料所在的地方。

我安裝了檔案系統;df -h報告總空間為 976MiB,但只有 925MiB 可用。這意味著我無法使用另外 5% 的資源。

然後我用以下內容填滿了這個空間(在cd安裝點之後)

dd if=/dev/urandom of=placeholder

作為普通用戶,我只能使用 925MiB。報告的「磁碟」使用率為 100%。但是,執行與 a 相同的操作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 主 ext3

4 134600457216B 154668105727B 20067648512B 擴展

5 134600458240B 150410887167B 15810428928B 邏輯 ext4

6 150411935744B 154668105727B 4256169984B 邏輯 li​​nux-swap(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-blocks 。或者我們可以乘以 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 < 6710838米布

但是,嘿,空分區上有什麼?為根保留的元資料和空間?這麼大的空間? ?非常感謝!

很高興知道這一切!

相關內容