#author("2018-12-15T13:57:39+09:00","default:nowsky","nowsky") *qemu-img [#k2d7581e] [[RedHat 仮想化ガイド>+https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/5/html/Virtualization/sect-Virtualization-Tips_and_tricks-Using_qemu_img.html]] KVMディスクイメージ(仮想HDD)を操作する為のコマンド。 ディスクイメージの拡大・縮小、空HDDの追加などを行える。 ~ *仮想HDDの拡張 [#caf8ee36] 仮想HDDの容量拡張をおこなっても、ゲストOS側のパーティションは変更前の設定になっている。 その為、容量拡張を行った後にゲストOS側でもパーティションのリサイズをする必要がある。 例えば、仮想HDDの容量を100GB増やす場合は以下の様になる。 # qemu-img info gest-os.img image: gest-os.img file format: qcow2 virtual size: 120G (128849018880 bytes) disk size: 49G cluster_size: 65536 # qemu-img resize gest-os.img +100G ~ *仮想HDDの追加 [#s9cac1b3] 仮想HDDを作成する場合は、ホストOSで仮想HDDを作成した後にゲストOSのHDDマウントポイントを書き換え、 ゲストOS側でフォーマットをする。 -100GBの仮想HDDを追加 -追加する仮想HDDは"/var/libvirt/images/hdd-2nd.img" -ゲストOSの設定ファイルは"/etc/libvirt/qemu/gest.xml" # cd /var/libvirt/images # qemu-img create -f qcow2 hdd-2nd.img 100G # vi /etc/libvirt/qemu/gest.xml --- 仮想HDDを追加マウントする為、 以下の内容をxmlファイルの<devices>ディレクティブ配下に追加する 追加する時は<target dev='***'>や<address slot='***' fonction='***'>等が、 他のxml要素と被らない様にする。 下の記述方法では、追加する仮想HDDをゲストOSの/dev/vdb、 IDEコントローラをPCIスロット10(0x0A)に割り当てている。 === <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/libvirt/images/hdd-2nd.img'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0A' function='0x0'/> </disk> 仮想HDDを追加した後は、 ゲストOS側から仮想HDDをフォーマットする。 ~ *仮想HDDの圧縮 [#t2d45c00] ゲストOS内でファイルの書き込み削除を繰り替えすと、仮想HDDでqcow2を利用している場合、 0を書き込まれた空領域に変換されてしまい、ホストOSから見た仮想HDDが膨張していく。 仮想HDDを圧縮する場合は、この0で埋められた箇所を切り詰める作業となる。 ただし、圧縮した後はゲストOSの書き込み(iowait)に負荷がかかる為、 敢えて圧縮しないで運用するのも一つの手である。 -圧縮前後ともに、qcow2形式とする -圧縮前の仮想HDDは"/var/libvirt/images/hdd.img" -圧縮後の仮想HDDは"/var/libvirt/images/hdd.comp.img" # qemu-img convert -c -f qcow2 -O qcow2 /var/libvirt/images/hdd{,.comp}.img" ~ *仮想HDDの固定 [#j7b41ded] qcow2形式で作成した仮想HDDは、シンプロビジョニング(容量増加HDD)となるが、 必要となる容量を常に確保しつつ、仮想HDDを拡張しながら書き込むので動作が遅くなる。 書き込み速度を重視する場合、シックプロビジョニング(容量固定HDD)で作成しておくと、 0パディングされた状態となる為、書き込みオーバーヘッドが減って動作が速くなる。 qcow2をシックプロビジョニングにする場合、シンプロビジョニングで一度作成した後に、仮想HDDの変換を行う。 -シンプロビジョニング・シックプロビジョニングともに、qcow2形式とする -シンプロビジョニングの仮想HDDは"/var/libvirt/images/hdd.thin.img" -シックプロビジョニングの仮想HDDは"/var/libvirt/images/hdd.thick.img" # qemu-img convert -p -f qcow2 -O qcow2 -o preallocation=full /var/libvirt/images/hdd.thin.img /var/libvirt/images/hdd.thick.img ~ *仮想HDDの縮小 [#h0c35457] 仮想HDD領域の容量縮小をするには様々の方法が存在するのだが、今回は手順が多いが確実に縮小出来る方法を行う。 ただし、縮小前のゲストOSが、現在割り当てられている仮想HDD容量の限界まで使っている場合は、 容量縮小をする事が出来ない場合もある。 大まかな手順は下記の通り +縮小後容量で仮想HDDを作成 +GParted LiveCDを使って、ゲストOSを起動(GPartedを起動) +GPartedを使って縮小前仮想HDDのパーティションを縮小後のパーティションにリサイズ(容量縮小) +GPartedのコンソールから、ddコマンドで縮小前仮想HDDを縮小後仮想HDDへダンプする +GPartedから、縮小後仮想HDDのパーティションをリサイズ(容量拡張) +ホストOSから縮小前仮想HDDと縮小後仮想HDDを入れ替える +縮小後仮想HDDを圧縮する 他に前提として下記の通りとする -縮小前の仮想HDDを150GB、縮小後の仮想HDDを100GBとする -kvm-libvirtから読み込ませる為に、GPartedはPAE非採用版(gparted-live-0.21.0-1-i586.iso)を使う -ゲストOSの設定ファイルは"/etc/libvirt/qemu/gest.xml" -GPartedのLiveCDは"/var/libvirt/images/gparted.iso" -縮小前の仮想HDD(150GB)は"/var/libvirt/images/hdd.img"、マウントポイントは"/dev/vda" -縮小後の仮想HDD(100GB)は"/var/libvirt/images/hdd.dec.img"、マウントポイントは"/dev/vdb" ~ ---- &font(b){1). 縮小後の仮想HDD作成}; [[仮想HDDの追加>#s9cac1b3]]と同じ操作を行う。 # cd /var/libvirt/images/ # qemu-img create -f qcow2 hdd.dec.img 100G &font(b){2). 仮想HDDのリサイズ}; 後の作業でHDDのダンプをする為に、縮小前のHDDの使用領域を&font(b){縮小後のHDD領域よりも少なく};する。 例えば、150GBの仮想HDDから100GBの仮想HDDへ縮小する場合、パーティションのリサイズは95GB程度にする。 あと、GPartedから仮想HDDを操作する為に、[[縮小後仮想HDDの追加>#s9cac1b3]]と、 下の設定をゲストOS設定ファイル(xml)の<devices>ディレクティブ配下に追加する。 他のアドレス情報である<target>や<address>についても他と被らない様に変更する。 さらに、<os>ディレクティブのbootデバイスもcdromに変更する。 # vi /etc/libvirt/qemu/gest.xml --- <os> <type arch='x86_64' machine='centos'>hvm</type> <root>/dev/vda</root> <boot dev='cdrom'/> </os> === <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/libvirt/images/gparted.iso'/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> &font(b){3). 仮想HDDのリサイズ}; GParted上から縮小前仮想HDD上のパーティションをリサイズする。 GUIを見れば使い方はわかるので詳細説明は割愛。 &font(b){4). 仮想HDDのダンプ}; GParted上のコンソールから、縮小前仮想HDDの内容を縮小後仮想HDDへダンプする GPartedのrootへログインする為には、rootのパスワード変更をする必要がある。 ちなみに、GPartedの初期ログインユーザは"user"、パスワードは"live"になっている。 $ sudo passwd root Enter new UNIX password: Retype new UNIX password: $ su - Password: # dd if=/dev/vda of=/dev/vdb bs=4096 &font(b){5). 仮想HDDのリサイズ}; 縮小後仮想HDD容量はダンプの都合でパーティションを少なくしている為、 縮小後仮想HDD容量の最大値まで利用出来るように、パーティションを切り直す。 パーティションを切り直した後はGPartedを終了する。 &font(b){6). ホストOSから縮小前仮想HDDと縮小後仮想HDDを入れ替える}; ゲストOSの起動HDDが縮小前仮想HDDになっている為、縮小後仮想HDDに変更を行う。 ひとまず、仮想HDDの入れ替えで対応し、縮小後仮想HDDの起動が問題ない事を確認でき次第、 縮小前仮想HDDを削除する。 # cd /var/libvirt/images # mv hdd.img hdd.original.img # mv hdd.dec.img hdd.dec.img &font(b){7). 縮小後仮想HDDの圧縮}; 仮想HDDの中身をddした時に、仮想HDDの空領域にも0が書き込まれている為、 ホストOSから見た仮想HDDの容量が最大値まで増加している。 0パディングされか箇所が勿体ないので、[[仮想HDDの圧縮>#t2d45c00]]を行う。 &font(b){0). おまけ}; qemu-imgコマンドだけでリサイズする場合、 ゲストOS上でデフラグを掛けた上で以下のコマンドでも出来る。 この時、コマンドの仕様を回避する為に'-'を二回入力する必要がある点に注意。 # qemu-img resize hdd.img -- -50GB