Skip to content

Instantly share code, notes, and snippets.

@grim13b
Created September 29, 2019 11:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save grim13b/071d8d990b15f74b1d1c738a8fef830d to your computer and use it in GitHub Desktop.
Save grim13b/071d8d990b15f74b1d1c738a8fef830d to your computer and use it in GitHub Desktop.
ddで作ったイメージのサイズを概ね実容量まで小さくする方法

ddで作ったイメージのサイズを概ね実容量まで小さくする方法

バックアップは必ず取っておくこと。

イメージファイルをLoopbackデバイスにアタッチ

losetup --partscan $(losetup -f) /home/your/images/imagefile.org.img

losetup -l
lsblk

Loopbackデバイスの各種サイズを変更

fsの変更

mount /dev/loopNNp1 /mnt
fstrim -v /mnt

umount /mnt
e2fsck -f -y -v -C 0 /dev/loopNNp1
tune2fs -l /dev/loopNNp1

# tune2fsの結果から必要なfsのサイズを計算する(但し適当に大きくしておく)
# (BlockCount - FreeBlock) * BlockSize = fsの使用済みサイズ(単位Byte)
resize2fs -p /dev/loopNNp1 2356M

Pertitionの変更

バーティションを削除して、小さくしたfsのサイズに合うよう調整したサイズで再確保し直す。

fdisk /dev/loopNN

    fdisk (util-linux 2.33.1) へようこそ。
    ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
    書き込みコマンドを使用する際は、注意して実行してください。


    コマンド (m でヘルプ): p
    ディスク /dev/loopNN: 14.6 GiB, 15677259776 バイト, 30619648 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ディスクラベルのタイプ: dos
    ディスク識別子: 0x75e88d10

    デバイス      起動 開始位置 最後から   セクタ サイズ Id タイプ
    /dev/loopNNp1          8192 30619647 30611456  14.6G 83 Linux

    コマンド (m でヘルプ): d
    パーティション 1 を選択
    パーティション 1 を削除しました。

    コマンド (m でヘルプ): n
    パーティションタイプ
    p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
    e   拡張領域 (論理パーティションが入ります)
    選択 (既定値 p): p
    パーティション番号 (1-4, 既定値 1): 1
    最初のセクタ (2048-30619647, 既定値 2048): 8192
    Last sector, +/-sectors or +/-size{K,M,G,T,P} (8192-30619647, 既定値 30619647): +2560M

    新しいパーティション 1 をタイプ Linux、サイズ 2.5 GiB で作成しました。
    パーティション #1 には ext4 署名が書き込まれています。

    署名を削除しますか? [Y]es/[N]o: n

    コマンド (m でヘルプ): w

    パーティション情報が変更されました。
    ioctl() を呼び出してパーティション情報を再読み込みします。
    ディスクを同期しています。

変更後の確認とか微調整とか

lsblk -l

e2fsck -f -y -v -C 0 /dev/loopNNp1
resize2fs -p /dev/loopNNp1

サイズを変更したイメージの出力

fdisk -l /dev/loopNN

    ディスク /dev/loopNN: 14.6 GiB, 15677259776 バイト, 30619648 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ディスクラベルのタイプ: dos
    ディスク識別子: 0x75e88d10

    デバイス      起動 開始位置 最後から  セクタ サイズ Id タイプ
    /dev/loopNNp1          8192  5251071 5242880   2.5G 83 Linux

dd if=/dev/loopNN of=imagefile.shrink.img bs=512 count=5251072 status=progress

# デタッチする
losetup -d /dev/loopNN

サイズ変更したイメージの確認

losetup --partscan $(losetup -f) /home/your/images/imagefile.shrink.img
losetup -l

fdisk -l /dev/loopNN

mount /dev/loopNNp1 /mnt
ls -al /mnt

後始末

適宜

umount /mnt
losetup -d /dev/loopNN

参考

https://www7390uo.sakura.ne.jp/wordpress/archives/184

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment