パーティションを左に展開した後、ファイルシステムを左に移動

パーティションを左に展開した後、ファイルシステムを左に移動

長い話を短く

複数のパーティションを持つイメージがありますdd。究極の目標は、disk.ddこの画像のファイルサイズを減らすことです。dd

より高い番号のパーティションを削除して再作成した後start sector offset(たとえば、パーティションを左に拡張)、その中にファイルシステムがあるパーティションがあり、そのパーティションはprimary superblockパーティションの内側のどこかにあり、そのパーティションがどのセクタにあるかを知っています。primary superblock存在します。

e2fsckこのファイルシステムをパーティションの先頭に移動するにはどうすればよいですか?

その後、ファイルシステムを縮小し、右側のパーティションをresize2fs縮小できます。つまり、低い値でパーティションを再作成しますend sector offset

ddその後、最後のパーティションまで後続のパーティションに対してこのプロセスを繰り返して、すべてのパーティションを効果的に縮小して画像サイズを縮小します。

提案しないでくださいgparted。コマンドラインソリューションを探しています。

また、使いやすくなることを知っていますLVM。しかし、このレガシーシステムは


長いバージョン


disk.ddコマンドで撮影したdd画像があります

dd if=/dev/sda of=/path/to/disk.dd

次のレイアウトのシステム

Disk /dev/loop15: 465.78 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x54093dd5

Device        Boot     Start       End   Sectors   Size Id Type
/dev/loop15p1 *         2048  81922047  81920000  39.1G 83 Linux
/dev/loop15p2       81922048 143362047  61440000  29.3G 82 Linux swap / Solaris
/dev/loop15p3      143362048 163842047  20480000   9.8G 83 Linux
/dev/loop15p4      163842048 976773167 812931120 387.7G  5 Extended
/dev/loop15p5      163844096 976773119 812929024 387.7G 83 Linux

今、私は別のシステムでdisk.ddループデバイスを使ってアクセスしています。

losetup --find --partscan disk.dd

ext4すべてのファイルシステムのサイズを変更しました。

resize2fs -M /dev/loopNpartX
resize2fs /dev/loopNpartX FSsize

つまり、partition p1p3そしてp5

を使用すると、ファイルシステムとすべてのファイルシステムのバイト数をdumpe2fs表示できます。私の場合、上記のように3つのパーティションでホストされています。logical block size4096ext4

今この文章を口頭で正しく読んだら(間違っていたら訂正してください)

ファイルシステムの主なスーパーブロックは、一般的に予想される0「はパーティションにあります。

そのため、スーパーブロック情報をダンプできます。

dumpe2fs -h -o superblock=0 -o blocksize=4096 /dev/loopNpartX

disk.ddこれで、ファイルサイズを減らすためにパーティションを縮小します。


block count再び各ファイルシステムを使用してください。dumpe2fs

fdiskphysical block sizeまたはデバイスの場合、sectors私の場合は512バイト

sectorsそのため、ファイルシステムに対応するのに十分な数を見つけるために、次の式を使用しました。

Required Sectors = ( ( Block Count + 100 ) * Logical Block Size ) / Physical Block Size

100バッファとして機能します。ファイルシステムの構成について見逃した場合に備えて、これで十分です。

すべてのファイルシステムに対してこれを行いました。



以下を使用して、lsblk -f既存のファイルシステムのUUIDを取得できます。

以下を使用して、開いたままにしたいfdisk -lパーティションを取得できます。boot flag

それでは、パーティションを縮小するために削除して再作成します。fdisk

- 最初のパーティション

start sector offset = 2048
last sector offset  = 2048 + "Required Sectors" for this filesystem

- 2番目のパーティション

既存のディスクの2番目のパーティションは縮小せずにswap左に移動するだけです。

start sector offset = "last sector offset" of first partition + 1
last sector offset  = "start sector offset" + Total sectors as as on existing partition

次にタイプを次に変更し、Swap UUIDtune2fs -Uddイメージの内容に戻しました。

--3部リーグ

start sector offset = "last sector offset" of second partition + 1
last sector offset  = "start sector offset" + "Required Sectors" for this filesystem

ここが私がついているところだ


3番目のパーティションを左に展開した後、パーティションにファイルシステムがあり、起動セクタ(つまりそのセクタprimary superblock)を知っています。

e2fsckただし、ファイルシステムがパーティションの先頭に左に移動するように、パーティション内でこのファイルシステムを変更する方法がわかりません。

答え1

fsckは不可能です。ファイルシステムではすべてが相殺されますスタートセクタを変更するとこれらのオフセットはすべて変更されます。。 fsckには、すべてのもの(スーパーブロック、ログ、ディレクトリ、ファイルセグメントなど)に対するすべてのオフセットを書き換える機能はありません。これは可能ですが、新しい起動セクタが内部ファイルシステム構造と整列している場合にのみ機能します。

まだ完了していません。

代わりに、ddを使用してすべてのデータを左に移動する必要があります(基本的にgpartedが実行する操作)。ファイルシステムを完全に移動しなければ、ファイルシステム内のオフセットは変更されません。

原則として、ddコマンドは次のように動作できます。異なるオフセットで同じデバイスを読み書きします。左に移動するためにのみ使用できるので、ナビゲーション(書き込み)以下より小さくなければなりません。スキップ(読み取り)。 512bセクタのすべてのセル(指定した場合、bs=1MパーティションはMiBでソートする必要があり、すべてのセルはMiBでソートする必要があります)

dd if=/dev/sdx of=/dev/sdx \
   seek=newpartitionstart \
   skip=oldpartitionstart \
   count=filesystemsize

しかし、これは非常に危険自分の責任で使用してください。まず、データをバックアップしてください。

右に移動する方が複雑です。逆さまに作業する必要があります。そうしないと、まだ読み込まれていないデータが上書きされ、プロセス内のすべてが破壊されます。


データを移動せずにこれを行うことができる唯一のツールは、blocks --lvmify既存のファイルシステムパーティションをLVMに変換することです。 LVM を使用すると、論理的に右に拡張され、物理的にストレージは左に拡張されます。 LVMがない場合は、リニアデバイスマッピングを手動で設定することもできますが、そうすることで非標準ソリューションを使用します。


この種の問題を解決する最も賢い方法(gpartedを使用したくない場合)は、すべてのデータをバックアップし、必要なレイアウトに新しいパーティションとファイルシステムを作成してからデータを復元することです。

このddイメージがバックアップソリューションの場合は、代わりにファイルのバックアップを検討してください。ディスクイメージは作業が難しい場合があります。


主な目標がイメージファイルの保存要件を減らすことである場合、できることはfstrim(ループマウントファイルシステムの場合 - すべての空き容量の損失)またはblkdiscard(ループスワップパーティションの場合 - すべてのデータの損失)です。

画像を保存するファイルシステムがスパースファイルとホールパンチングをサポートしている場合、画像の空き容量もサポートファイルシステムに解放されるため、レイアウトを変更せずにdd画像はより少ない記憶領域を使用します。

繰り返しますが、これは危険です。画像ファイルの誤った部分を破棄すると、画像ファイルが元に戻せないほど破損する可能性があります。イメージファイル用のループデバイスを作成してマウントする簡単な行為により、イメージファイルが修正/破損しました。

ソースディスクがSSDで既に定期的にfstrimを使用し、切り捨てられた領域をバイナリZEROに読み込む場合は、まずddを使用してすでにまれなddイメージを作成できますdd conv=sparse if=/dev/ssd of=ssd.img。これにより、バイナリゼロ領域はssd.imgファイルのスペースを占有しません。conv=sparseゼロ以外のターゲットドライブに復元するときにそれを別の方向に使用すると、結果が破損する可能性があります。

関連情報