起動可能なフラッシュドライブからのディスクイメージがあります。これは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
動作しませんでした
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
で終了します。 Enter。 gdisk
を再度実行します–警告はありません。 GPTは修正されています。
画像でgparted
を使用する必要がある場合に備えて、いくつかのヒントがあります。
コマンドSudo gparted myfile.raw
は、ファイルmyfile.raw1
、myfile.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
によって作成されたマッピングは更新されません。通常、gparted
はpartprobe
または何かを呼び出して/dev/sd*
を更新します。これは私たちの場合は機能しません。マッピングを破棄して再作成する必要があります。パーティションの移動/サイズ変更中に、1つのgparted
タスクを実行し、プログラムを閉じ、マッピングを修正し、2番目のタスクでgparted
を実行します。
マッピングを破棄するには、Sudo kpartx -dv myfile.raw
を呼び出します。最後に孤立したシンボリックリンクを削除します。