合計ディスクイメージの縮小:UEFI GPT Flashdrive-終了時の空き領域


4

ブート可能なフラッシュドライブからディスクイメージがあります。EFIブート用のGPTであるため、小さなVfat32パーティションと3つの他のLinuxパーティションがあり、その後に約3Gの空きスペースがあります。

ディスクイメージのコピーを少し小さいフラッシュドライブにコピーする必要があるため、15Gから14Gに多少縮小する必要があります。Linuxでddを使用してコピーを作成します。

gpartedはパーティションの変更とサイズ変更には優れていますが、最後に空き領域を縮小することはできません。理論的には、ファイルを切り捨てることは可能ですが、試してみると(?diskテーブル?推測)が爆発するため、パーティションがなくなり、ファイルが台無しになります。回転ディスクやMBRディスクを使用していれば、以下の手法が機能したはずですが、まだテストしていません。

試した:

dd bs=1M count=14000 iflag=fullblock if=/dev/sda  of=myfile.raw

縮まなかった

rsync --sparse filename filename 

それはディスクテーブルを爆破しませんでしたが、スワップを縮小し、未割り当て領域を維持しました。

qemu-img convert -f raw -O qcow2 -S 4k filename filename (元に戻す予定)

テーブルを爆破

truncate size=140000M <filename>

テーブルも爆破した

cp --sparse=always filename filename

うまくいかなかった

回答:


5

によって作成されたrawファイルの最初にプライマリ(メイン)GUIDパーティションテーブルがあり、最後にセカンダリ(バックアップ)テーブルがあるはずddです。ファイルを切り捨てると、セカンダリファイルが破壊されます。修正する方法があります。

最後に空き領域がある切り捨てられていないファイルから始めましょう。を実行しますgdisk -l myfile.raw論理セクタサイズに注意してください(512Bおそらく)。最大の最後のセクターを見つけます(おそらく最後のパーティションのセクターですが、パーティションエントリは順序が正しくない可能性があるため、最大のセクターを注意深く探してください)。セクターにはから番号が付けられている0ため、すべてのパーティションを保存するには(セクターサイズ)*(最大終了セクター + 1)バイトが必要です。

また、新しいセカンダリGPTを保存するには、最後に少なくとも33の空きセクターの空き領域が必要です。ウィキペディアのこの写真をご覧ください。

全体で(セクタサイズ)*(最大終了セクタ + 34)バイトのファイルが必要です。ファイルをこれ以上のサイズに切り捨てます。

truncate -s <new_size> myfile.raw

次に呼び出す

gdisk myfile.raw

(特に)取得します。

警告!ディスクサイズはメインヘッダーが示すよりも小さいです!
注意:バックアップGPTヘッダーは無効ですが、メインヘッダーは有効です。メインヘッダーからバックアップヘッダーを再生成します。

を押してwEnter正しいパーティションテーブルを書き込みます。セカンダリGPTが移動されようとしているため、警告が表示されます。ファイルの最後に十分な空き領域があるため、心配する必要はありません。要求されたら確認します。

で終了しますqEntergdisk再度実行します-警告はありません。GPTは修正されました


gparted画像で使用する必要がある場合、いくつかのヒントがあります。

このコマンドはsudo gparted myfile.raw、ファイルを期待myfile.raw1myfile.raw2などが存在し、内部のパーティションに対応しますmyfile.raw。以下のように、それは特別なファイルであった場合/dev/sdb、その後udevの世話をするだろう/dev/sdb1/dev/sdb2...それは通常のファイルの場合ではありません。ファイルgpartedがない場合、多くの機能が失敗しmyfile.rawNます。

そのようなファイルを作成するには、以下を使用しますkpartx(またはpartx+ losetupタンデム):

sudo kpartx -av myfile.raw

その出力(loopXpY作成されたデバイス)を確認し、すべてのパーティションへのシンボリックリンクを作成します。最初の可能性があります:

ln -s /dev/mapper/loop0p1 myfile.raw1

今すぐgparted実行して、それらのパーティションを操作する必要があります。ただし、落とし穴があります。パーティションが変更された(たとえば、移動/サイズ変更された)場合、作成されたマッピングkpartxは更新されません。通常gparted、呼び出すpartprobeか何かを更新し/dev/sd*ます。これはこのケースでは機能しません。マッピングを破棄して再作成する必要があります。パーティションの移動/サイズ変更ではgparted、1つのタスクを実行し、プログラムを閉じ、マッピングを修正し、gparted2番目のタスクで実行します。

マッピングを破棄するには、を呼び出しsudo kpartx -dv myfile.rawます。孤立したシンボリックリンクを最後に削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.