長い話を短く
複数のパーティションを持つイメージがあります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 p1
、p3
そしてp5
を使用すると、ファイルシステムとすべてのファイルシステムのバイト数をdumpe2fs
表示できます。私の場合、上記のように3つのパーティションでホストされています。logical block size
4096
ext4
今この文章を口頭で正しく読んだら(間違っていたら訂正してください)
ファイルシステムの主なスーパーブロックは、一般的に予想される0
「はパーティションにあります。
そのため、スーパーブロック情報をダンプできます。
dumpe2fs -h -o superblock=0 -o blocksize=4096 /dev/loopNpartX
disk.dd
これで、ファイルサイズを減らすためにパーティションを縮小します。
block count
再び各ファイルシステムを使用してください。dumpe2fs
fdisk
physical 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 -U
をdd
イメージの内容に戻しました。
--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
ゼロ以外のターゲットドライブに復元するときにそれを別の方向に使用すると、結果が破損する可能性があります。