恢復損壞的 ubuntu 映像
我使用以下命令創建了我的一個虛擬伺服器的磁碟映像(Ubuntu 18.04)的 .gz 存檔:
dd if=/dev/sdb | gzip -1 - | pv | ssh user@ip dd of=/home/user/sdb.gz
在解壓縮檔案時,我遇到了以下錯誤:
gzip: sdb.gz: unexpected end of file
當我試圖
.img
在我自己的 unraid 機器上作為 VM 執行 -file 時,我最終進入了 grub。所以我知道圖像可能有問題。使用 ls 似乎最重要的文件在那裡。伺服器有一個 15GB 的磁碟,但我沒有意識到它失去了一部分,因為它無論如何都被壓縮了。生成的圖像文件只有 4.3GB。
從那以後,我的 VPS 提供商刪除了我的虛擬伺服器。現在我已經意識到,存檔並不完整,因為它在接收機器上遇到了磁碟大小限制。
由於基本文件結構可用,而且我天真地認為前 4GB 包含我想要恢復系統的所有 VM。這些數據並不重要,恕我直言,但它似乎很有用,值得一試。我的懷疑是分區資訊有問題,系統由於某種原因找不到正確的引導路徑。
在執行時
linux /boot/vmlinuz-4.15.0-135-generic root=/dev/sda1
,我收到錯誤:error: attempt to read or write outside of hd1
。對我來說正確的文件系統似乎是
(hd1,1)
.因此我 事先使用
set root=(hd1,1)
和 。set prefix=(hd1,1)/boot/grub
執行以下命令
insmod linux insmod normal normal
似乎什麼都不做。
我需要執行哪些步驟才能使系統再次啟動?我可以使用 ubuntu iso 修復它嗎?
附加資訊(編輯):
如前所述,原始 VPS 的大小為 15GB,我從損壞的 .gz 存檔中提取的 .img 文件大小約為 4.3GB。我是否需要/是否能夠使用 gparted 或類似工具增加此大小?(我在空間超過 4TB 的未RAID 機器上執行它,但我懷疑這不是@Bodo 的意思。)
此外,提取單個文件對我來說價值有限。很久以前就已經備份了所有真正重要的東西,這個圖像的重點是能夠啟動我的軟體在租用的虛擬伺服器上執行的確切(或盡可能接近)環境。
Gparted(編輯 2):
我只是查看了 gparted 路線:我收到了此錯誤消息:
Invalid argument during seek for read on /dev/sdb
一個快速的Google搜尋導致這個頁面上的一個條目告訴我
分區表在磁碟的末尾
這就是缺少分區資訊的原因。
由於 .img 文件太小,我無法使用“w”命令來編寫同一頁面上提到的更改。我目前正在努力擴大這個文件。
巧合的是,我最近做了類似的事情(儘管是由於硬碟驅動器故障)。在我的例子中,ext4 恰好將有效負載儲存在磁碟的開頭,如下圖所示(ext4 組使用率超過組位置):
方式A:使用磁碟驅動器
- 有一個足夠大的磁碟來容納整個圖像
- 將損壞的圖像添加到該磁碟上
方式B:放大原始圖像文件
truncate -s 16 G image.img
(附加用零填充的空間)- 安裝圖像
udisksctl loop-setup --file image.img
A 和 B 的共同點:
- 執行適當的文件系統檢查器,例如作為驅動器或循環設備
fsck.ext4 $device
上$device
的分區- 文件系統現在可以掛載了
如果損壞足夠小,系統可能仍然可以啟動。