（このクラウド時代に）OSインストール後の設定とKVMで仮想サーバを立てる話

# いつもの

皆様こんにちは、はじめましての方ははじめまして。
（一応）インフラ担当の @asuky です。

前回は [OSインストールする話](http://qiita.com/asuky/items/c529091036f7936c19c1) でBIOSとOSインストールだけで投稿1つ終わってしまいました。
今回はKVMで仮想サーバを立てるところまでやります…が、それを**コピー可能なところまで持っていくのはもうちょっと手間がかかる**のでまた次回にします。

今回はコマンドだらけで大変分かりづらい感じになります、ごめんなさい…。

# 実際の手順

前提ですが…。**CentOS 6.x 64bit が導入済みで手元で直接コンソールが叩けるサーバがあること**とします。

## 再起動が後で必要なのを先にやっておく

### ファームやドライバ類の導入or更新

ベンダによってはちょくちょくファームウェアやドライバ類の更新を出しているので、最初のうちに導入しておきます。
基本的に**OS上で更新可能**です。**CentOSの場合はRedhat Enterprise Linux (RHEL)用のドライバを用いる**ようにしてください（それがiDRACやiLOのようなリモートコンソールであっても）。

…なお前々回に書きましたが、**CentOSはAtheros系のドライバを備えていません**ので、AtherosチップがNICに使われているようならドライバ導入が必要です。
[ELRepo](http://elrepo.org/)にCentOSが備えていないようなドライバがあるので使わせて頂きましょう（多分自作で一番使用率の高そうなRealtekはサポートしてるのかは不明です、ごめんなさい)。

>\# curl -LO http://elrepo.org/linux/elrepo/el6/x86_64/RPMS/kmod-alx-0.0-8.el6.elrepo.x86_64.rpm
>\# yum install kmod-alx-0.0-8.el6.elrepo.x86_64.rpm

インストール後に、追加されるNIC分の設定を /etc/sysconfig/network-scripts/ 以下に追加しておきましょう（既にある ifcfg-eth0 をコピーして ifcfg-eth1 とか作るのが楽です）。

なおNIC名が em1, em2とかなっている方、**biosdevnameパッケージを抜くと戻ります**。

>\# rpm -qa | grep biosdevname
>\# rpm -e --nodeps （上で出てきたパッケージ全部記述）

### selinuxを落とす

selinuxは扱えればよりセキュアな環境を作れますが…思わぬ詰まりの原因になるので（普通に使う分には）切っておいたほうが無難です。
（OSサイドでのセキュリティ向上のために深堀りするのは良いと思うのですが、今回の目的には沿わないので…）

>\# vi /etc/sysconfig/selinux
>（SELINUX=disabledとしておく）

### IPv6の停止

IPv6もまだ普及しているとは言いがたい状況ですし、プロバイダに依存するところが大きいので避けます（使える人は使ったほうが良いと思いますが）。

>\# vi /etc/sysconfig/network
>（下記追記）
> NETWORKING_IPV6=no
> VLAN=yes
>
>（modprobeに書いて二度と起きないようにしておく）
>\# vi /etc/modprobe.d/disable-ipv6.conf
>（下記追記）
> options ipv6 disable=1

### iptablesの停止

自宅環境でも、普通はルータがあるので外からそう簡単に侵入されることは無いと思います（中から外に指示を仰ぐようなマルウェアもあるんですが）。
セキュリティ上問題はありますが、これも後々で詰まりの原因になることがあるので切ったほうが無難です。
…フォワードやDNAT/SNAT等が使いたいという方は、そもそもこんな記事読まなくていいですよね…？

>\# service iptables stop
>\# service ip6tables stop
>\# chkconfig iptables off
>\# chkconfig ip6tables off

## 再起動後にやるもの

ここまで来たら、とりあえず一度再起動しておくほうが良いと思います。

### 普段使いのユーザ追加

これ最初にやっても良いのですが、ここまでの作業がほぼroot必須なので後でも良いかなと思います。

>\# useradd {ユーザ名}
>\# passwd {ユーザ名}
>\# visudo
>　（sudoerの99行目あたりに{ユーザ名} ALL=(ALL) NOPASSWD:ALLとかやっとく）

### KVM導入

ようやくKVM導入です、長かった…。

>【仮想化支援機構の確認】
>（無い場合はBIOSで有効にしてください）
>（下記コマンドでずらずらっと結果が表示されるならOKです）
>\# cat /proc/cpuinfo | grep vmx
>
>【zlib, glibの導入】
>\# yum -y install zlib zlib-devel glib*
>
>【KVMのダウンロードとインストール】
>（yum使うと0.1.2とか超古いのが入るので新しいのを持ってくる）
>\# curl -LO http://sourceforge.net/projects/kvm/files/qemu-kvm/1.2.0/qemu-kvm-1.2.0.tar.gz/download qemu-kvm.tar.gz
>\# tar -zxvf qemu-kvm.tar.gz
>\# cd qemu-kvm-1.2.0
>\# ./configure
>\# make
>\# make install
>
>【必要なユーティリティ類のインストール】
>（libvirt…仮想サーバ管理、virt-manager…仮想サーバ作成等、libguestfs…ディスクイメージ操作）
>\# yum -y install libvirt virt-manager libguestfs libguestfs-devel libguestfs-tools
>
>【仮想サーバを管理するlibvirtdの起動】
>\# service libvirtd start
>\# chkconfig libvirtd on

## ネットワーク周りの設定

一番面倒なところですが…、とりあえず最も簡単なブリッジ構成（実NICと仮想NICを直接ひもづけるパターン）を記載します。詳細は別途ググって下さい。

まず実NICを仮想NICと繋ぐためのブリッジを作成します。
**既存のifcfg-eth〜をコピーしてベースを作っておきます**、ブリッジ名は適当にbr0とでも…。

>\# cd /etc/sysconfig/network-scripts/
>\# cp -p ifcfg-eth0 ifcfg-br0

ここから先ですが…。

### ブリッジ側の設定

上記の場合だと /etc/sysconfig/network-scripts/ifcfg-br0　を編集します。

* タイプをブリッジ (TYPE=Bridge) を書く
* MACアドレス (HWADDR) は書かない
* IPアドレス(IPADDR)、ネットマスク(NETMASK)は書く
* 1本足ならGATEWAYをここに書いてもいいです（/etc/sysconfig/networkの方が良いとは思いますが）
* NetworkManager (NM_CONTROLLED) はnoにしたほうが…
* 起動時にON (ONBOOT) はyesへ

実際の設定は下記のような感じです。
IPアドレスとかは適当決めです、ネットワーク構成は（趣味の範囲なら）適当に/24を適当に切り出せば良いでしょう。

>DEVICE=br0
>TYPE=Bridge
>ONBOOT=yes
>NM_CONTROLLED=no
>BOOTPROTO=static
>IPADDR=192.168.0.180
>NETMASK=255.255.255.0
>GATEWAY=192.168.0.1

### 実NIC側の設定

同様に /etc/sysconfig/network-scripts/ifcfg-eth0　を編集します。
既にあるファイルを下記の方針に沿って修正します。

* MACアドレスは残す
* IPアドレス、ネットマスクは消す
* ブリッジ名 (Bridge) を書いておく

>DEVICE=eth0
>HWADDR=FC:AA:14:75:56:A3
>TYPE=Ethernet
>UUID=d7561122-d6b1-4937-90e5-77193f5ce5e6
>ONBOOT=yes
>NM_CONTROLLED=no
>BOOTPROTO=none
>BRIDGE=br0

上記の修正が終わったら、ネットワーク再起動しましょう。

>\# service network restart
>\# ip a | grep br0（ifconfig br0とかでも何でも確認出来ればいいでしょう）

## 仮想ディスクイメージの作成

**仮想サーバにもハードディスクは必要**です。
これは実際には空のファイルをディスク代わりに使います。

作り方も「予め容量を全部確保する (Thick-Provisioning)」と、「必要な分だけとりあえず容量確保する (Thin-Provisioning)」というのがあるのですが、前者の方が一般的にパフォーマンスが出やすい（後者は追加容量確保時にパフォーマンスが劣化する）ので前者にします。

ddコマンドで無理やり0を書き込んで初期化したファイルを作ります。
あとディスクイメージの置き場所は適当に作ります。

>\# mkdir /images
>\# cd /images
>\# dd if=/dev/zero of=/images/tmplt.img bs=4096 count=2500000

countの値を適当に変更してサイズを調整してください。
上記はBlockSizeが4KBを250万個で10GBほど確保しています。

## 導入ISOイメージの確保

OSインストールには、**利用するOSのメディアが必要**になります（当たり前？）。
仮想サーバの場合は、単純にISOファイルをそのまま使います。
[CentOSの公式サイト](http://www.centos.org/)から、使うバージョンの**DVD版を落としましょう、net-install版やminimalだと失敗します**。

ISOファイルもどこか適当に置き場所作って置いておく方が楽で良いです。

## （ようやく）実際の仮想サーバ作成

virt-installで作ります。

>\# virt-install --connect qemu:///system -n {作成する仮想サーバ名} --vcpus {CPU数} --ram={確保するメモリ量} --disk {仮想ディスクイメージへのパス},format=raw --network bridge={ブリッジ名} --graphics vnc,port=5900,listen=0.0.0.0,keymap=ja,password={VNCへの接続パスワード} --location {CentOSのisoイメージへのパス}

これで仮想サーバが起動しますので、**VNCでホストOSのIPアドレス (br0で指定したIPアドレス) とポート番号 (上記例なら5900)を指定して接続**しましょう（パスワードも上記「VNCへの接続パスワード」を指定）。

VNCについてはMacの場合はFinder上から「サーバへの接続 (Command+kキー)」でvnc://{ホストOSのIPアドレス}:{ポート番号} で接続可能です。WindowsならVNC Viewer等を使って下さい。
また、ホスト側のiptablesを止めるか、tcpの5900番を許可していないと接続できないので注意です。

# 終わりに

正しく出来ていればVNCで繋ぐとCentOSのOSインストール画面が見えているはずです。
ホストOSのインストール時と同様にOSをインストールしてください。

…なお仮想サーバの運用上、大体は**最小インストールを施したベースとなる仮想サーバのイメージを用意し、都度クローンして使う**形を取るのですが、このベースとなるような設定を施すのもまた一手間かかります。

* 運用で必要な事項を考える (MACアドレスとかIPアドレスの付け方考えたり、パーティションどう切るか等）
* 必要なパッケージ (acpid) は入れ、共通で使えるところ (DNS,NTP等) は値を書き込む
* virt-cloneでコピー、virt-copy-in等を使い中身を書き換える
* スクリプト書いてこの辺りコマンド一発で出来るようにする（手でやると非常に面倒な上にミスるので）

このような設定については、また別の機会にしたく思います。