web-dev-qa-db-ja.com

合計ディスクイメージの縮小:UEFIGPTフラッシュドライブ-最後に空き容量

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

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

gpartedはパーティションの変更とサイズ変更には優れていますが、最後に空き領域を縮小することはできません。理論的にはファイルを切り捨てることは可能ですが、試してみると(?disk table?推測)、パーティションがなく、ファイルが台無しになっています。スピニングディスクや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

動作しませんでした

4
John Fisher

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

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

さらに、新しいセカンダリGPTを格納するには、最後に少なくとも33のフルセクターの空き領域が必要です。 ウィキペディアからのこの写真 を参照してください。

全体として、ファイルの(セクターサイズ)*(最大エンドセクター+ 34)バイトが必要です。ファイルをこのサイズ以上に切り捨てます。

truncate -s <new_size> myfile.raw

次に呼び出す

gdisk myfile.raw

あなたは(とりわけ)得るでしょう:

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

wと入力し、ヒットします Enter 正しいパーティションテーブルを作成します。セカンダリGPTが移動されようとしているため、注意が表示されます。ファイルの最後に十分な空き容量があるので、心配する必要はありません。求められたら確認します。

qで終了します。 Entergdiskを再度実行します–警告はありません。 GPTは修正されています


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

コマンドSudo gparted myfile.rawは、ファイルmyfile.raw1myfile.raw2などが存在し、myfile.raw内のパーティションに対応していることを前提としています。 /dev/sdbのような特別なファイルの場合、udev/dev/sdb1/dev/sdb2…を処理します。通常のファイルの場合はそうではありません。 myfile.rawNファイルがない場合、多くのgparted機能は失敗します。

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

Sudo kpartx -av myfile.raw

その出力(loopXpYデバイスが作成された)を観察し、すべてのパーティションへのシンボリックリンクを作成します。最初のものは次のようになります。

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

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

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

5