Linuxその他 - ディスクイメージ

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

ディスクイメージは、ディスク全体またはパーティションの完全なコピーであり、後で復元や分析が可能である。
これは、システムのバックアップや移行、テスト等で非常に役立つ。


ディスクイメージファイルの拡張

Linux OSのディスクイメージファイルをマウントして使用する場合、ディスクイメージファイルの空き領域が不足する時がある。
ここでは、ディスクイメージファイルのサイズを変更する手順について記載する。

方法 1 (推奨)

まず、ディスクイメージファイルを確認する。

sudo fdisk -lu <ディスクイメージファイル>.img

# 出力例
ディスク 2023-10-10-raspios-bookworm-arm64-lite.img: 2.54 GiB, 2722103296 バイト, 5316608 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x7788c428

デバイス                                        起動 開始位置  終了位置    セクタ   サイズ Id   タイプ
2023-10-10-raspios-bookworm-arm64-lite.img1          8192  1056767 1048576   512M  c   W95 FAT32 (LBA)
2023-10-10-raspios-bookworm-arm64-lite.img2       1056768  5316607 4259840     2G 83   Linux


ddコマンドを使用して、空き領域を追加する。
上記の例では、最初のパーティションはブートパーティション(カーネルとバイナリブロブ)、2番目のパーティションはファイルシステムである。
ディスクイメージファイルに空の空き領域を追加して、2番目のパーティションを拡張する。

sudo dd if=/dev/zero bs=1M count=3072 >> <元のディスクイメージファイル>.img  # この例では、3[GB]を追加している


空き領域を追加したディスクイメージファイルの情報を表示する。
この時、出力結果は空き領域が追加されたサイズ(以下の例では、5.54[GiB])と表示するが、ディスクイメージファイルの2番目のパーティションのサイズはまだ変更されていない。(以下の例では、2[G])

sudo fdisk -lu <元のディスクイメージファイル>.img

# 出力例
ディスク 2023-10-10-raspios-bookworm-arm64-lite.img: 5.54 GiB, 5943328768 バイト, 11608064 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x7788c428

デバイス                                        起動 開始位置  終了位置    セクタ   サイズ Id   タイプ
2023-10-10-raspios-bookworm-arm64-lite.img1          8192  1056767 1048576   512M  c   W95 FAT32 (LBA)
2023-10-10-raspios-bookworm-arm64-lite.img2       1056768  5316607 4259840     2G 83   Linux


これを解決するため、ディスクイメージファイルの空の追加領域の部分を埋めるようにパーティションのサイズを変更する必要がある。
まず、ループバックデバイスを作成する。

sudo losetup -f -P --show <元のディスクイメージファイル>.img

# 出力例
/dev/loop0


これにより、/dev/loopXがディスクイメージファイル全体、/dev/loopXp2がサイズ拡張するパーティションとして設定される。
他のループバックデバイスを選択する場合は、未使用のループバックデバイスのドライブを割り当てる。

sudo fdisk -lu /dev/loopX  # X : ループバックデバイス番号

# 実行例
sudo fdisk -lu /dev/loop0

# 出力例
ディスク /dev/loop0: 5.54 GiB, 5943328768 バイト, 11608064 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x7788c428

デバイス         起動 開始位置  終了位置    セクタ   サイズ Id  タイプ
/dev/loop0p1          8192  1056767 1048576   512M  c   W95 FAT32 (LBA)
/dev/loop0p2       1056768  5316607 4259840     2G 83   Linux


上記の出力例では、/dev/loop0p1はブートパーティション、/dev/loop0p2はルートパーティションである。

次に、partedを実行して、パーティションのサイズを変更する。
2番目のパーティションのサイズを、partedコマンドのヘッダ出力のDiskまたはディスクで始まる行で指定された/dev/loopXのフルサイズに変更する。
以下の例では、ディスクは5943[MB]である。

sudo parted /dev/loopX


(parted) print

# 出力例
モデル: Loopback デバイス (loopback)
ディスク /dev/loop0: 5943MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号   開始     終了    サイズ    タイプ     ファイルシステム      フラグ
 1    4194kB  541MB   537MB   primary  fat32             lba, type=0c
 2    541MB   2722MB  2181MB  primary  ext4              type=83


2番目のパーティションサイズを変更する。
以下の例では、2番目のパーティション(ルートパーティション)をフルサイズに変更している。

(parted) resizepart <パーティション番号> <拡張するサイズ>
または
(parted) resizepart <パーティション番号> <拡張するサイズの割合>

# 実行例
(parted) resizepart 2 5943MB
または
(parted) resizepart 2 100%


正常に拡張されているかどうかを確認する。

(parted) print

# 出力例
モデル: Loopback デバイス (loopback)
ディスク /dev/loop0: 5943MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号   開始     終了    サイズ    タイプ    ファイルシステム       フラグ
 1    4194kB  541MB   537MB   primary  fat32             lba, type=0c
 2    541MB   5943MB  5402MB  primary  ext4              type=83


e2fsckコマンドを実行して、拡張したディスクイメージファイルのファイルシステムを確認する。

sudo e2fsck -f /dev/loopXpY  # Xはデバイス番号, Yは拡張したパーティション番号


resize2fsで拡張したディスクイメージファイルのファイルシステムを拡張する。
※パーティションのサイズは既に変更しているので、ここではファイルシステムをリサイズ(拡張)する。

sudo resize2fs /dev/loopXpY  # Xはデバイス番号, Yは拡張したパーティション番号


ディスクイメージファイルが正常に拡張されているかどうかを確認する。

sudo parted /dev/loopX

(parted) print

# 出力例 (正常に拡張されている場合)
モデル: Loopback デバイス (loopback)
ディスク /dev/loop0: 5943MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号   開始     終了    サイズ    タイプ     ファイルシステム      フラグ
 1    4194kB  541MB   537MB   primary  fat32             lba, type=0c
 2    541MB   5943MB  5402MB  primary  ext4              type=83


最後に、ループバックデバイスを削除する。

sudo losetup -d /dev/loopX


方法 2

まず、空のイメージファイルを作成する。
以下の例では、拡張するサイズを5[GiB]としている。

truncate -s 5GiB <空のイメージファイル名>.img


元のディスクイメージファイルと空のイメージファイルを結合する。

cat <元のディスクイメージファイル>.img <空のイメージファイル名>.img > <結合したディスクイメージファイル名>.img


現在空いているループバックデバイスを確認する。

sudo losetup -f

# 出力例
/dev/loop0


結合したディスクイメージファイルをループバックデバイスにマウントする。

sudo losetup /dev/loopX <結合したディスクイメージファイル名>.img  # X : ループバックデバイス番号


正常にマウントできたかどうかを確認するため、ループバックデバイスの設定状況を確認する。

sudo losetup -a

# 出力例
/dev/loop0: []: (<結合したディスクイメージファイル名>.img)


パーティションテーブルを確認する。

sudo fdisk -lu /dev/loopX

# 出力例
Disk /dev/loop0: 5.6 GiB, 3054501888 bytes, 5965824 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: gpt
Disk identifier: 00CF01F2-3FB1-498B-BFE9-BA5B68507014

デバイス     起動  Start 最後から セクタ  Size Id タイプ
/dev/loop0p1         2048   1048576   131072  511M  c W95 FAT32 (LBA)
/dev/loop0p2      1048576  13913020 13313020  4.1G 83 Linux ファイルシステム


結合したディスクイメージファイルのパーティションを設定する。

sudo fdisk /dev/loopX

# 出力例
Welcome to fdisk (util-linux 2.37.4).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


まず、拡張するパーティションを削除する。
dキーを入力した後、拡張するパーティション番号を入力する。

コマンド (m でヘルプ): d
パーティション番号 (1,2, default 2): 2

Partition 2 has been deleted.


次に、拡張するパーティションの種類を選択する。
ここでは、プライマリとして使用するため、nキーを入力した後、pキーを入力する。
なお、extendedパーティション(拡張パーティション)は、主にスワップ向けに使用される。

コマンド (m でヘルプ): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)

Select (default p): p


拡張するパーティション番号および拡張するサイズ(セクタ番号の最初と最後)を入力する。
デフォルトの値は、最大セクタサイズである。

パーティション番号 (2-4, default 2): 2

# 出力例
First sector (1048576-15913020, default 1048576): 
Last sector, +sectors or +size{K,M,G,T,P} (1048576-15913020, default 15913020): 

Created a new partition 2 of type 'Linux' and of size 7.1 GiB.


拡張するパーティションタイプを指定する。
tキーを入力した後、パーティション番号およびLinuxファイルシステムを示すパーティションタイプである83を入力する。

コマンド (m でヘルプ): t
パーティション番号 (1,2, default 2): 2
Partition type (type L to list all types): 83

# 出力例
Changed type of partition 'Linux' to 'Linux'.


設定したパーティションを確認する。
pキーを入力する。

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

# 出力例
Disk /dev/loop0: 7.59 GiB, 8147483648 bytes, 14864445 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: gpt
Disk identifier: 00CF01F2-3FB1-498B-BFE9-BA5B68507014

デバイス     起動  Start 最後から セクタ  Size Id タイプ
/dev/loop0p1         2048   1048576  1048576  511M  c EFI システム
/dev/loop0p2      1048576  15913020 14864445  7.1G 83 Linux ファイルシステム


上記で設定したパーティションを書き込む。
wキーを入力する。

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

# 出力例
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: 無効な引数です

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).


ループバックデバイスを削除する。

sudo losetup -d /dev/loopX


ディスクイメージをマウントする。

sudo mount -o loop,offset=<オフセット番号  (1セクタサイズ ✕ セクタの開始番号)> <結合したディスクイメージファイル名>.img <マウントするディレクトリ>


拡張の設定をしたパーティションを拡大する。

# 設定されているループバックデバイス名を確認
sudo losetup -a

# パーティションの拡大
sudo resize2fs /dev/loopX


拡張したパーティションを確認する。

df

# 出力例
/dev/loop0                    1048576    15913020     14864445  35% /mnt



SDカードのパーティションの拡張

SDカードの場合は、SDカードをPCに挿入してパーティションのサイズを変更する。
イメージファイルをフラッシュした後にパーティションのサイズを変更する。

パーティションのサイズを拡張するには、以下に示す2つの方法がある。

  • Growpartの使用
    1. GrowPartをインストールする。
      sudo zypper install growpart
    2. GrowPartを実行して、パーティションのサイズを設定する。
      sudo growpart /dev/mmcblkX Y # Xはストレージデバイス番号, Yはパーティション番号
    3. パーティションのサイズを変更する。
      sudo resize2fs /dev/mmcblkXpY # Xはストレージデバイス番号, Yはパーティション番号

  • Partedの使用 (推奨)
    1. PCにSDカードを挿入する。
    2. Partedを実行して、パーティションのサイズを設定する。
      sudo parted /dev/sdX # Xはストレージデバイス番号
      (parted) resizepart 2 100%
      (parted) quit
    3. パーティションのサイズを変更する。
      sudo resize2fs /dev/sdXY # Xはストレージデバイス番号, Yはパーティション番号


※注意 1
実機の内部からパーティションのサイズを変更することは禁止である。
現在マウントされているパーティションのサイズを変更すると、奇妙な結果になることがある。

※注意 2 : PinePhone Beta/ProのeMMCの拡張
PinePhone Beta/ProのeMMCを拡張する場合、Jumpdriveを使用して、PCとUSBケーブルで接続してeMMCに直接アクセスする。
その後、eMMCのパーティションのサイズを変更する。


qcow2ファイルのサイズの拡張

KVMで作成した仮想マシンのディスクファイル(qcow2ファイル)を拡張する。
なお、仮想マシンのセットアップが完了していることが前提となる。

仮想マシンのディスクファイルのリサイズは、virshコマンドを使用する。

sudo virsh vol-resize <仮想マシン名 または 仮想マシンのパス> <ファイルサイズ> [--pool <プール名 または UUID>] [--allocate] [--delta] [--shrink]


ファイルサイズは、50GB50000MB、または、50GiB5120MiB等と記述する。

--allocateオプションは、rawファイルにのみ対応しており、qcow2ファイルに対して指定するとエラーになるので注意する。 (基本的には使用しない)

--deltaオプションを付加しない場合、<ファイルサイズ>には変更後のサイズを指定する。
--deltaオプションを付加する場合、代わりにサイズ拡張 / 縮小の差分の値を指定する。

--shrinkオプションを付加する場合、サイズを縮小する際に指定する。
拡張の際に指定するとエラーとなることに注意する。

拡張手順

まず、プール名を確認する。

sudo virsh pool-list

# 出力例
#  Name                     State    Autostart
# ----------------------------------------------
#  default                  active   yes


プール名にある仮想マシン名を確認する。

sudo virsh vol-list --pool <プール名>

# 出力例
#  名前          パス
# -----------------------------------------------------
#  RHEL_9       /run/media/suse/SAMSUNG860EVO/KVM/RHEL_9


現在のボリュームサイズを確認する。

sudo virsh vol-info --pool <プール名> <仮想マシン名 または 仮想マシンのファイルのパス>

# 出力例
名前:       RHEL_9.qcow2
タイプ:      ファイル
容量:       40.00 GiB
割り当て:    12.19 GiB


以下の例では、プール名 : defaultに存在するサイズ : 50[GiB]の仮想マシン名 : RHEL_9.qcow2を、50[GiB]に拡張している。
以下に示す2種類のコマンドは、同様の結果になる。

なお、--deltaを使用する方が現在の容量を意識せずに済む。

sudo virsh vol-resize <仮想マシン名 または 仮想マシンのファイルのパス> --pool <プール名> --delta 10GiB
# または
sudo virsh vol-resize <仮想マシン名 または 仮想マシンのファイルのパス> --pool <プール名> 50GiB


以下の例では、仮想マシンのファイルサイズを5[GiB]縮小している。
ファイルサイズの縮小する場合はデータを破壊するリスクがあるため、実行する前にバックアップを作成した方がよい。

sudo virsh vol-resize <仮想マシン名 または 仮想マシンのファイルのパス> --pool <プール名> --delta -5GiB --shrink
# または
sudo virsh vol-resize <仮想マシン名 または 仮想マシンのファイルのパス> --pool <プール名> 35GiB --shrink