web-dev-qa-db-ja.com

GPTパーティションテーブル(エンドポインター)を破損せずに未使用領域のディスクイメージファイルを切り捨てる方法

ディスクのイメージを取得し、ルート(バイオニック)ファイルシステムパーティションを縮小し、イメージを切り捨てて空き領域になった部分を削除することに関する多くの情報。いいね https://softwarebakery.com//shrinking-images-on-linux

したがって、基本的に3つのステップがあります。 resize2fsを使用してパーティション上のファイルシステムを縮小し、次にパーティションのサイズも小さくします。次に、イメージファイル内の未使用のスペースを最後に削除します。

それは私が問題を抱えている第三部です。イメージファイル内のGPTパーティションテーブルがゴミ箱に入れられたかのように、私がddまたは切り捨てを試みるたびに、イメージのすべてのパーティションが削除されます。

これが元の画像です

GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk rock64-base.img: 30310400 sectors, 14.5 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 159DCEDE-DBEA-4657-96D9-2CE178A96B7E
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 30310366
Partitions will be aligned on 64-sector boundaries
Total free space is 30 sectors (15.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              64            8063   3.9 MiB     8300  loader1
   2            8064            8191   64.0 KiB    8300  reserved1
   3            8192           16383   4.0 MiB     8300  reserved2
   4           16384           24575   4.0 MiB     8300  loader2
   5           24576           32767   4.0 MiB     8300  atf
   6           32768          262143   112.0 MiB   0700  boot
   7          262144        30310366   14.3 GiB    8300  root

その後、最初の2つのステップの後

Found valid GPT with protective MBR; using GPT.
Disk test.img: 30310400 sectors, 14.5 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 159DCEDE-DBEA-4657-96D9-2CE178A96B7E
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 30310366
Partitions will be aligned on 64-sector boundaries
Total free space is 23555002 sectors (11.2 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              64            8063   3.9 MiB     8300  loader1
   2            8064            8191   64.0 KiB    8300  reserved1
   3            8192           16383   4.0 MiB     8300  reserved2
   4           16384           24575   4.0 MiB     8300  loader2
   5           24576           32767   4.0 MiB     8300  atf
   6           32768          262143   112.0 MiB   0700  boot
   7          262144         6755394   3.1 GiB     8300  primary

ルートファイルシステムのパーティションが3.1Gに減少したことがわかります

その画像をうまく読み込むことができます。 SDカードに戻し、デバイスを起動できます。したがって、ステップ1と2は問題ありません。

enter image description here

今...

`truncate --size = $ [(6755394 + 1)* 512] 'test.img'を実行してプロセスを完了した場合

そして

GPT fdisk (gdisk) version 1.0.3

Warning! Disk size is smaller than the main header indicates! Loading
secondary header from the last sector of the disk! You should use 'v' to
verify disk integrity, and perhaps options on the experts' menu to repair
the disk.
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.

Warning! Error 25 reading partition table for CRC check!
Warning! One or more CRCs don't match. You should repair the disk!

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: damaged

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
Disk test2.img: 6755395 sectors, 3.2 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 159DCEDE-DBEA-4657-96D9-2CE178A96B7E
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 30310366
Partitions will be aligned on 64-sector boundaries
Total free space is 23555002 sectors (11.2 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              64            8063   3.9 MiB     8300  loader1
   2            8064            8191   64.0 KiB    8300  reserved1
   3            8192           16383   4.0 MiB     8300  reserved2
   4           16384           24575   4.0 MiB     8300  loader2
   5           24576           32767   4.0 MiB     8300  atf
   6           32768          262143   112.0 MiB   0700  boot
   7          262144         6755394   3.1 GiB     8300  primary

enter image description here

明らかにトランケート(またはその点ではdd)はGPTでうまく機能しません。このファイルでgdiskを実行すると、gptがゴミ箱に移動したことが確認されます

切り捨てられたファイルに対してgdiskを実行すると、GPTが壊れていると報告されます。

だから私はここに何かが欠けています。どうやらディスクファイルの末尾が変更されると、GPTが破損するか、修正する必要があります(不一致)。手順2の最後で問題ありませんが、gdiskをいじって修復できませんでした。その上、スクリプトで実行できる解決策が必要でしたが、このGPTでは機能しません。

つまり、これはGPTなので、切り捨てやdd以外のものを使用する必要がありますか、それとも切り捨て後に手動でGPTを「修正」する必要がありますか。

Gdisk検証レポートは次のとおりです

Caution: The CRC for the backup partition table is invalid. This table may
be corrupt. This program will automatically create a new backup partition
table when you save your partitions.

Problem: The secondary header's self-pointer indicates that it doesn't reside
at the end of the disk. If you've added a disk to a RAID array, use the 'e'
option on the experts' menu to adjust the secondary header's and partition
table's locations.

Problem: Disk is too small to hold all the data!
(Disk size is 6755395 sectors, needs to be 30310400 sectors.)
The 'e' option on the experts' menu may fix this problem.

Problem: GPT claims the disk is larger than it is! (Claimed last usable
sector is 30310366, but backup header is at
30310399 and disk size is 6755395 sectors.
The 'e' option on the experts' menu will probably fix this problem

Partition(s) in the protective MBR are too big for the disk! Creating a
fresh protective or hybrid MBR is recommended.
1
DKebler

GPTには、ディスクの先頭にあるメインパーティションテーブルと、ディスクの末尾にあるバックアップパーティションテーブルの両方が含まれています。 (文字通り、ディスクの終わり-ディスクの最後のいくつかのセクター。)したがって、ディスクイメージを切り捨てると、バックアップパーティションテーブルが削除されます。さらに、メインパーティションテーブル内のポインターとメタデータの一部は、(仮想)ディスクの終わりを過ぎているため、無効になりました。これがvgdiskコマンドが不満を言っていたことのほとんどです。

これは、ディスクが完全にゴミ箱に入れられたことを意味しません。メインパーティションテーブルのデータが有効である限り、gdisk(および他のほとんどのGPTパーティションツール)は回復できます。 gdiskでは、xと入力してエキスパートのメニューに入り、次にeと入力してバックアップパーティションテーブルデータをディスクの新しい端に移動し、次のように入力します。 w変更をディスクに書き込みます。 (別の問題を見落とした場合に備えて、vの前にwをもう一度入力することをお勧めします。また、以下を参照してください。..)

ただし、もう1つの問題があることに注意してください。gdiskによると、ディスクイメージのサイズは6,755,395セクターです。しかし、最後のパーティションの最終セクターはセクター6,755,394です。これでは、バックアップパーティションテーブルに十分なスペースが残りません(デフォルトでは33セクターを消費します)。プロセス全体を再実行できる場合は、ディスクイメージを少しだけ縮小する必要があります。そうでない場合は、gdiskを使用してバックアップパーティションテーブルを再作成する前に、ディスクイメージを33 * 512(16,896)バイト拡張してみてください。

1
Rod Smith