如何取得僅包含實際分區而不是分區後的空白空間的 SD 卡映像?

如何取得僅包含實際分區而不是分區後的空白空間的 SD 卡映像?

我有一張 16 GB SD 卡(特別是用於 PinePhone 的可啟動 Mobian SD 卡),有兩個分區,總共 6 GB。剩餘空間未分配。如何取得 SD 卡的 6 GB 映像?

答案1

使用稍微脆弱的命令,可以根據請求將磁碟機的第一部分複製到映像檔。然而,有幾點需要注意:

  • 由於需要從命令列直接存取設備文件,因此必須執行整個命令root(如sudo su使用解決方案之前的命令。)
  • 備份分區表,如果是GPT分區表,將要不是被複製
  • 「技巧」取決於分區表是否完整 - 提到的未分配空間真的是未指派的分割區,不是您不想複製的某個分割區。
  • 一個或多個隔板被收集在前面。如果它們有間隙,則該間隙將被複製。
  • 這取決於您的系統同時安裝了fdisk命令(可能)和bc命令(可能)。兩者都是標準的,如果需要,可以從預設儲存庫安裝。
  • 該圖像檔案將歸 root 所有,因此chown如果您需要使用者擁有完全存取權限,則必須使用它。

這是完整的命令,斷行以便於閱讀

dd if=/dev/sdx of=Mobian.img\
    bs="$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)"\
    count="$(echo "$(fdisk -o end -l /dev/sdx | tail -1) + 1"|bc)"\
    status=progress

細分:

首先,/dev/sdx需要變更以反映正確的裝置名稱,除非您碰巧有 23 個其他先前連接的磁碟。

第一行是預期的dd命令,設備名稱和檔案名稱根據您目前的需求設定。

第二行將區塊大小設定為ddSD 卡的磁區大小。幾乎可以肯定是 512 位元組。如果您 100% 確定它是 512,則可以將該行替換為bs=512。如果您想安全並保持該命令將來在任何裝置上可用,請將多餘的內容保留在那裡。操作是:

  • fdisk -l /dev/sdx報告有關設備的數據
  • grep sector“sector”在輸出中出現兩次
  • tail -1只取得最後一行包含「扇區」的內容
  • cut -d' ' -f6在欄位之間使用空格只能得到第 6 個欄位(磁區大小以位元組為單位)

第三行告訴我們要複製dd多少個「區塊」的大小。bs=同樣,如果您恰好知道該數字是什麼,請使用它而不是命令。為了“面向未來”,我再次保留了完整的命令:

- `fdisk -o end -l /dev/sdx` list the partition information about the device, and only output the ending sector ID of each `-o end`
- `tail -1` it don't matter how many there are, we only need the last sector of the last partion.
- `echo "... + 1" | bc` add one to the last sector ID. Uses the `bc` command, which is in integers unless told otherwise. Sectors are numbered from zero, to to copy sector #10 we have to copy 10 + 1 sectors (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

第四行是娛樂價值。一張速度等級為 10 的好卡將需要近 4 分鐘才能讀取 6 Gig 的資料。此status=progress選項dd將導致終端在“進展”時更新。否則你只會有一個終端機等待命令完成,感覺就像永遠一樣。

最後:如果您確定要複製的內容是 bog 標準、分割區正確對齊且大小剛好為 6 GiB,則可以使用以下簡單指令:

dd if=/dev/sdx of=Mobian.img bs=1048576 count=6145 status=progress

當然,一旦他們製作了新圖像並且您切換到該圖像,那麼所有的賭注都將與簡短版本一起消失。原來的頂部將繼續工作。它也適用於您稍後可能需要複製的其他“圖像”。

獎金:

如果您出於某種原因不喜歡dd,您可以使用相同的數位收集步驟並應用命令head

head -c $(\echo "\
    "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" *\
    ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc)\
    /dev/sdx > Mobian.img

作為單行:

head -c $(\echo " "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" * ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc) /dev/sdx > Mobian.img'

答案2

您可以使用linux dd 命令。您可以選擇單獨讀出兩個分割區並隨後將它們連接起來,或者進行一些計算以確定第二個分割區的最後一個磁區。然後,您可以使用 bs(區塊大小)和 count(區塊數)參數執行 dd 命令,以使副本在第二個分區的末尾結束。

相關內容