可以對 SD 卡映像文件執行 zerofree 處理嗎?
Ubuntu 16.04:使用以下命令創建了 64GB SD 卡映像:
date; sudo sh -c 'pv /dev/mmcblk0 >rpi4_Ubuntu18.1_64GB.image'; date
rasbperry pi SD 卡配備 Ubuntu 18.1
Ubuntu 16.04 筆記型電腦可以:
- 掛載 .image 文件?
- 在 .image 文件的掛載點上運行 zerofree?
- 解除安裝 .image 文件?
我知道可以將圖像文件恢復到 SD 卡並使用zerofree處理卡並再次捕捉圖像。如果能夠在不將它們恢復到 SD 卡的情況下處理多個 .image 文件,那就太好了。
更新:測試結果
映像成功掛載到 /dev/loop9p2:
$ sudo losetup -P /dev/loop9 rpi4_Ubuntu18.1_64GB.image $ ls -l /dev/loop9* brw-rw---- 1 root disk 7, 9 Feb 2 19:12 /dev/loop9 brw-rw---- 1 root disk 259, 0 Feb 2 19:12 /dev/loop9p1 brw-rw---- 1 root disk 259, 1 Feb 2 19:12 /dev/loop9p2
零故障:
$ zerofree -v /dev/loop9p2 zerofree: failed to open filesystem /dev/loop9p2
需要零零
sudo
:$ sudo zerofree -v /dev/loop9p2 14346339/14348998/15073019
- 14346339 遇到的非零塊數
- 14348998 文件系統中的空閒塊數
- 15073019 文件系統內的總塊數
獎勵:使用腳本pishrink減小圖像大小
zerofree
無論底層儲存介質是什麼,都在兼容的文件系統上執行。我的 Debian 10 系統上的版本zerofree
支持ext2
,ext3
和ext4
文件系統,所以如果 SD 卡上使用的文件系統是其中之一,答案是yes。但看起來您已經對整張卡進行了映像,其中可能有多個分區。如果是這種情況,您將無法僅“掛載映像文件”,因為 mount 命令一次只能處理一個文件系統。而在整盤鏡像上,分區表通常會在磁碟的開頭佔用一些空間,因此您甚至可能無法通過嘗試直接掛載整卡鏡像來訪問鏡像上的第一個文件系統。
如果您的系統有一個
losetup
支持該-P
選項的命令,您可以執行一個losetup -P /dev/loop0 rpi4_Ubuntu18.1_64GB.image
,這將為您提供諸如 等設備/dev/loop0p1
-/dev/loop0p2
一個用於映像文件中的每個分區。然後,您可以掛載每個分區設備並zerofree
在它們上執行,然後解除安裝並losetup -d /dev/loop0
分離循環設備。如果您的
losetup
命令不支持該-P
選項,則有另一種選擇:該kpartx
工具(有時單獨打包,有時作為device-mapper-multipath
工具的一部分)可以為各個分區創建映射。在這種情況下,您將首先使用losetup /dev/loop0 rpi4_Ubuntu18.1_64GB.image
附加循環設備,然後kpartx -a /dev/loop
為在其上檢測到的每個分區創建映射設備。在這種情況下,分區設備的命名會有所不同:它們將是/dev/mapper/loop0p1
等。安裝和zerofree
過程將是相同的,但解除安裝文件系統後的清理也需要兩個步驟:首先kpartx -d /dev/loop0
刪除分區映射設備,然後losetup -d /dev/loop0
刪除主循環設備。