2021/01/30

ディレクトリをQEMU / KVM仮想ディスクイメージに変換

USBブートのUnixをディレクトリに展開して、中身をアップデートした。そのディレクトリをQEMUからブートできないものだろうか。

ということで、まずはこのディレクトリをRAWファイルに取り込む。それができれば、qemu-imgでQCOW2に変換できる。

qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2

まずは、必要なサイズのRAWイメージを作成する。とりあえず、3GBで(1M x 3000)。ところで、seekオプションは、seekで指定された回数だけブロック(サイズ指定はbs)のコピーをスキップするという動作をするので、下記の例では、1MBのブロックのコピーを3000回スキップした後に、/dev/nullから1回だけ1MBをコピーするという動作をする。(でも、/dev/nullは空なので、0バイトがコピーされることになる。)

スキップされたところはスパースファイル(Sparse file)になっているので、使用されるディスク容量を節約できるし、ddでファイルを作成するスピードを大幅に短縮できる。

# dd if=/dev/null of=raw_disk.img bs=1M seek=3000
0+0 records in
0+0 records out
0 bytes copied, 0.000183467 s, 0.0 kB/s

続いて、このファイルの上にファイルシステムを作成する。-Fオプションをつけることで、ディスクパーティションではなく、ファイルを操作することができる。

# mkfs.ext4 -F raw_disk.img
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 768000 4k blocks and 192000 inodes
Filesystem UUID: 36521e3a-f835-4dda-9831-d8ff797bf61c
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done


パーティションができたので、ファイルをコピーする。

# mkdir /mnt/raw_disk
# mount -t ext4 -o loop raw_disk.img /mnt/raw_disk/
# cp -a squashfs-root/. /mnt/raw_disk
# umount /mnt/raw_disk


これで終わり。ただ、これではブートできない。Grubのインストールが必要。

なお、上記のcpで、コピー元の指定が「/.」で終わっているのは別記事を参照。



0 件のコメント:

コメントを投稿