#author("2017-12-11T22:42:34+09:00","default:nowsky","nowsky")
*qemu-img [#rb94bcf5]
[[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の追加などを行える。
#author("2023-05-22T22:27:17+09:00","default:nowsky","nowsky")
*CountryCode IPList [#p5cb902a]
グローバルIPv4アドレス、ユニキャストIPv6アドレスは、
5つの地域インターネットレジストリ(RIR:Regional Internet Registry)で管理を行っており、
RIRで国別に割り当てたIPアドレスリストは都度更新される形でインターネット公開されている。
|LEFT:80|LEFT:|c
|CENTER:~RIR|CENTER:~IPLIST|
|[[ARIN:+https://www.arin.net/]]| http://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest|
|[[RIPE NCC:+https://www.ripe.net/]]|http://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest|
|[[APNIC:+https://www.apnic.net/]]|http://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest|
|[[LACNIC:+https://www.lacnic.net/]]|http://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest|
|[[AfriNIC:+https://www.afrinic.net/]]|http://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest|
 
スクリプトで国別IPアドレスリストが必要になり、RIRのアドレスリストを利用する事があるが、
セグメント情報がCIDR形式で記載されておらず利用する際に工夫が必要となる。
これら配布ファイルをCIDR形式に修正して一般公開しているサイトも多数存在するにせよ、
ファイルをIPv4/IPv6両方生成しつつ、デュアルスタックで配布サイト運営している所が無かったので公開しました。
~

*仮想HDDの拡張 [#e263ef17]
仮想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
* 参考サイト [#e765aeee]
- [[世界の国別 IPv4 アドレス割り当てリスト:+http://nami.jp/ipv4bycc/]]
- [[国別 IPv6アドレス割当リスト:+https://foxmaster.jp/ipv6bycc/]]
~

*仮想HDDの追加 [#k1309f2a]
仮想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をフォーマットする。
*注意事項 [#p103669b]
+ ファイル利用による損益について、&color(#ff0000){一切の責任を負いません};
+ 状況に応じて、アクセス制限・ダウンロードURLの変更・ファイルの公開停止をする場合があります
+ ファイルは一日二回、03:00,15:00頃に生成しますが、メンテナンスで更新の遅れる事があります
+ ファイルを自動取得する場合、サーバ負荷軽減の為に&color(#ff0000){圧縮ファイルをご利用下さい};
+ CC・セグメント間はタブ区切り、順序はCC・セグメントを昇順でソートしています
~

*仮想HDDの圧縮 [#w3c05102]
ゲスト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"
* ファイル [#j2e65dee]
#iframe(https://www.ns-lab.org/iplist/,style=width:100%;height:240px;,iestyle=width:100%;height:240px;)
- 展開コマンド
 $ gzip    -cd cidr_ipv4.gz  > cidr_ipv4.txt
 $ bunzip2 -cd cidr_ipv4.bz2 > cidr_ipv4.txt
 $ xzcat   -cd cidr_ipv4.xz  > cidr_ipv4.txt
----
~

*仮想HDDの固定 [#f3c997d6]
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
* 説明 [#ffcc7d6b]
IPアドレスリストをCIDR形式に整形するスクリプトについて、当サーバで利用している物を公開。
スクリプトはLinuxでの実行を前提にPerlで作成してあります。
ライセンスについて、筆者が作成したスクリプトは好きに改変して問題ありませんが、
&color(#ff0000){外部ライブラリのライセンスについてはライブラリ配布元に帰属とします。};
~

*仮想HDDの縮小 [#b319ff03]
仮想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"

* 参考サイト [#vad13917]
- [[Mark Suter:+https://zwitterion.org/software/aggregate-cidr-addresses/]]
- [[AbacusTechnologies:+https://kana.me/entry/ip-ranges-by-country]]
- [[てくにかるむ:+http://multix.jp/delegated-apnic-acl/]]
~
----
&font(b){1). 縮小後の仮想HDD作成};
[[仮想HDDの追加>#s9cac1b3]]と同じ操作を行う。
 # cd /var/libvirt/images/
 # qemu-img create -f qcow2 hdd.dec.img 100G

* スクリプト [#j2853199]
|LEFT:80|CENTER:100|LEFT:100|LEFT:200|c
|CENTER:~公開日|~FILE|RIGHT:~SIZE|CENTER:~MD5|CENTER:~更新内容|
|2019/01/02|[[iplist_20190102.zip:https://www.ns-lab.org/files/iplist/iplist_20190102.zip]]|9.9KB|a6a92accfd4b90be44a1df772f4248a0|CIDR変換時のハッシュ処理を最適化|
|2017/12/17|[[iplist_20171217.zip:https://www.ns-lab.org/files/iplist/iplist_20171217.zip]]|9.9KB|6aed24625f0aea04a4e4888a53560f7d|IPリストの圧縮処理を変更|
|2017/12/15|[[iplist_20171215.zip:https://www.ns-lab.org/files/iplist/iplist_20171215.zip]]|9.9KB|b1d878a9d2f8472891b0a24b6b779d25|初公開|
~
* 初期設定 [#od7f8eac]
実行パス・ファイル保存先は変数に直書きしている為、下記に従って実行前に該当箇所を書き換えてください。
また、スクリプトにヘルプも埋め込んであるので、必要に応じて「./script.pl --help」で確認してください。
 
&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
#region(&color(#ff0000){make-country-iplist.pl};)
 用途:スクリプト全体の統括、レポートメールの送信
 ---
 <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>
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
 $MAIL_FROM       = "メールレポートの送信元アドレス"
 $MAIL_TO         = "メールレポートの宛先アドレス"
 $SCRIPT_ROOT_DIR = "スクリプトの保存ディレクトリ"
 $SCRIPT_OPTION   = "スクリプトの共通オプション"
#endregion
#region(&color(#ff0000){make-country-getrir.pl};)
 用途:RIRのIPアドレスリスト取得
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
#region(&color(#ff0000){make-country-modify.pl};)
 用途:IPアドレスリストをCIDR形式に整形
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
#region(&color(#ff0000){make-country-output.pl};)
 用途:整形済IPアドレスリストのテキスト化、ファイル結合処理
 ---
 $CIDR_SCRIPT     = "外部ライブラリの実行パス"
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
#region(&color(#ff0000){make-country-webdir.pl};)
 用途:整形済IPアドレスリストの圧縮、WEBディレクトリへ複製
 ---
 $IPLIST_OWNER    = "WEB公開ファイルのユーザ"
 $IPLIST_GROUP    = "WEB公開ファイルのグループ"
 $IPLIST_PERMIT   = "WEB公開ファイルのパーミッション"
 $WEB_ROOT_PATH   = "WEB公開ファイルの保存先ディレクトリ"
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
~
* 実行コマンド [#vd27cd05]
スクリプト変数を下記内容に設定し、未記載の変数をデフォルトとした場合の実行例。
CPU処理速度にも左右されますが処理完了まで5分程時間が必要となります。
外部ライブラリ(aggregate-cidr-addresses)は、IPv6対応の為に1行書き換えてください。
-変数設定例
 $CIDR_ROOT_DIR   = "/var/iplist";
 $SCRIPT_ROOT_DIR = "/usr/local/bin/iplist";
 $CIDR_SCRIPT     = "/usr/local/bin/iplist/aggregate-cidr-addresses";
 $IPLIST_OWNER    = "www";
 $IPLIST_GROUP    = "www";
 $IPLIST_PERMIT   = "644";
 $WEB_ROOT_PATH   = "/var/www/htdocs";
~
-パッケージインストール
RHEL8 and Clone's
 # dnf install epel-release
 # dnf install mailx  tar wget perl-File-Path perl-Net-IP
 
&font(b){3). 仮想HDDのリサイズ};
GParted上から縮小魔仮想HDD上のパーティションをリサイズする。
GUIを見れば使い方はわかるので詳細説明は割愛。
RHEL9 and Clone's
 # dnf install epel-release
 # dnf install s-nail tar wget perl-File-Path perl-Net-IP

~
-実行準備
 # cd /usr/local/bin/iplist
 # wget "https://zwitterion.org/software/aggregate-cidr-addresses/aggregate-cidr-addresses"
 # diff aggregate-cidr-addresses.orig aggregate-cidr-addresses
   89c89
   <     print $_->prefix(), "\n";
   ---
   >     print 6 eq $_->version ? $_->print() : $_->prefix(), "\n";
 
 # mkdir /var/iplist
 # chmod 755 make-country-*.pl aggregate-cidr-addresses
 # ls
   aggregate-cidr-addresses  make-country-iplist.pl  make-country-output.pl
   make-country-getrir.pl    make-country-modify.pl  make-country-webdir.pl
~
-実行方法
ローカル用IPリストの生成(WEB公開無し)
 $ ./make-country-iplist.pl
 
&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

WEB公開用IPリストの生成
 $ ./make-country-iplist.pl --web
 
&font(b){5). 仮想HDDのリサイズ};
縮小後仮想HDD容量はダンプの都合でパーティションを少なくしている為、
縮小後仮想HDD容量の最大値まで利用出来るように、パーティションを切り直す。
パーティションを切り直した後はGPartedを終了する。
ヘルプの表示
 $ ./make-country-iplist.pl --help
~
* エラー対処 [#e24b3844]
-インタプリタエラーが出る
実行環境の文字コード次第で、スクリプト実行時に&color(#ff0000){'/usr/bin/perl^M: bad interpreter'};とエラーが出ます
行末についているLF文字(Line Feed)を消せば直るので、sedやtrあたりで消して下さい。
 # cd /usr/local/bin/iplist
 # sed -i 's/\r//' make-country-*.pl

 
&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