- SNSの運用開始したのは2008年だが、サーバも安定しており、この2年間はたいした更新もしないで過ごした。しかし、何か少しでも新しい事を!という発想で物色してたら、行き当たったのが『仮想サーバ』という話である。
- 一方、AKIさんにそそのかされて(^^;)Ubuntuを入れた予備機のDELL8200も、しばらく遊んだ後は使い道がなくなっていた。
- そこで、これを使って、今年初めにCentOS5.4で仮想サーバを試してみたら、いけそうな見通しがついた。すぐに切替えても良かったのだが、同時に自宅LANのGb化も進めており、5.4版ではGbカードのドライバ対応が遅れており、CentOSの次期updateを待つ形になった。
- 5月18日にCentOS ver5.5 final がリリースされたのだが、実は、カーネル自体は変わらずドライバの完全対応は実現しなかった。やや不満は残るのだが、思い立った以上と、そのままサーバ機移行に突っ走ったのは5月26日である。
- 仮想サーバ構築とコンテンツ移行及びバックアップ環境の整理等の記録である。(2010年6月4日記)
【目次】
#contents
* 仮想サーバとは [#n2ddaa8e]
- 仮想サーバについて調べたことや試したことは、SNSコミュニティ[[『サーバの仮想化・実験室』>https://kurarinet.com/sns/?m=pc&a=page_c_home&target_c_commu_id=3]]でひとりさみしく(^^;)あれこれ展開したので省略する。ここは、システム構築の具体的な記録として整理していくつもり。
** 仮想サーバの構成 [#de77b682]
- とはいえ、仮想サーバ構成の基本的なことだけ整理しておく。
&ref(xen_platform.jpg,,50%,Xenの仕組み);&br;
-- ふつうのOSインストールとの違いは、OSが2層構造になるということ。下層がホストOSで上層がゲストOSとなる。従来のサーバ機にあたるのは、ゲストOS側である。
-- したがって、ホストOSに何を使うのかが問題になる。製品版としてはVMware等が有名で、この上で、LinuxでもWindowsでもいろんなOSが走るということになる。
-- なぜ、Xenにしたか?!その答えは簡単(^^) CentOS自体が、ホストOSとしての機能を持っているからだ。まさに同じOSの2階建てでかっこうは悪いが、まぁインストールが簡単で、相性が良いし、取っつき易いという理由だった。
-- なぜ、同じOSを2階建てで使うのか? せっかくの仮想化なのに、もっとシンプルなホストOSはないのか!という疑問はあるのだが、実はドライバの問題らしい。ホストOSは仮想マシーンを動かすだけの機能的には極めてシンプルなはずだから、わざわざ既存のOSを使わなくても良いのだが、あらたに専用のOSを開発するとなると、しれはそれで、特にデバイスドライバ関連がたいへんらしい。したがって、できあいのOSを最小限構成で使えば、そこが簡単にクリアできるという発想らしい。
-- そのへんは、この記事[[「仮想化道場」>http://enterprise.watch.impress.co.jp/cda/virtual/2009/04/13/15256.html]]を読んで目からウロコ!だったので再録。
* 仮想サーバのインストール [#y5709eb8]
** サーバ機のハードスペック [#t7c0d2e8]
- 使ったハードは、以前UbuntuをインストールしたDELL8200、主なハードスペックは
CPU: Pentium 4(2GHz)
MEM: 768MB (256MBx2+128MBx2)
HDD: 80GB(メイン)+30GB(バックアップ用に増設)
- メモリーは当初512MB(128MB×4枚)だった。CentOSのサーバ単体なら十分すぎる容量なのだが、仮想化構成ではやはり少し不安があった。将来の拡張も考えて追加することにしたが、オークションでRIMM256MBx2枚を探し出した。いまさらRIMMなどと思っていたが、予想外に価格競争は厳しくて 512MB物は手が出なかったというのは余談。
** ホストOSのインストール [#db959c63]
- まず、ホストOSのインストールから始まる。例によってネットインストールする。この手順を整理すると、
++ 最新版OSのnetinstall版を入手し、 これをCD-RWに焼く
http://ftp.riken.jp/Linux/centos/5.5/isos/i386/
CentOS-5.5-i386-netinstall.iso 30-Apr-2010 09:27 9.5M
何せ、サイズが小さいからダウンロードも焼くのも速くてよろしい
++ CD起動するとCUIのインストーラーが起動するが、まずは、ネットワークの設定に続いて、接続先の項目の設定が必要になる。後者は、「HTTPインストールの設定」を選び、ダウンロード先のサイト情報を入力する
[web site name:] ftp.riken.jp
[CentOS directory:] /Linux/centos/5.5/os/i386/
++ 一般的なことだが、時計の設定で注意。いい加減に進めたらあとで時計が9時間進んでいて大騒ぎになった。結局インストールをやり直すことになった。最初が肝心ということで(^^;)
地域選択の画面で 「□システムクロックで UTC を使用する」のチェックを外しておく。
++ 一番のポイントは、「インストールタイプ」である。パッケージの選択で、
◎カスタマイズ を選び、
□仮想化 のみチェックする(残り項目はすべてチェックを外す)
&ref(xen_package.jpg,,50%,仮想サーバの選択);&br;
*** 起動確認 [#td9c63ba]
- ここから約10分程度でインストール完了となる。再起動でXenは自動起動するが、その確認コマンドは、
[root@kuraric55 ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 656 1 r----- 47.5
- 「Domain-0」とはホストOSのことである。ゲストはまだないので、これだけ表示される。
** ゲストOSのインストール [#b0ee129d]
- さて、いよいよ実際のサーバに相当するOSをインストールする。ところが、手順は少し異なる。
- つまり、実機は、今構築したXenサーバしかない。そもそも物理的なリソースはXenサーバだから、そこからメモリーやらHDD容量を分けて貰う形で、仮想マシーンの構成を設定する必要がある。
- ここから先の作業は、実機の前でも出来るのだが、スッピンのCUIで操作性も悪い。いつものように、ノートパソコンからのputtyを使ってリモート操作とする。
- 何せ、インターネットという参考文献を何時でも検索できるし、自作メモを参照したり、コマンド類のコピペも簡単だから!
- 実際の構築コマンドを実行する前に、仮想的なハード構成を決めておく。
・仮想マシン名 「kuraric55v1」
・RAM割り当て 「400」MB
・ディスク用パス 「/var/lib/xen/images/kuraric55v1.img」
・ディスク容量 「20」GB
・インストール元 「http://ftp.riken.jp/Linux/centos/5.5/os/i386/」
- メモリーとHDDの容量を決めておくというのが、いかにも仮想サーバである。当然だが、ホストサーバのハードの範囲内で割り当てるが、メモリは大きすぎるとインストール時にエラーになって中断してしまうので要注意。余裕があれば、他にも仮想サーバをいくつでも立てることができるのだが、今回は無理だ。なお、リソースの割当は後でも動的に変更できるらしい。
- ディスク用パスとは、仮想サーバのホストサーバ上の保存先である。OS含めて1つのイメージファイル(拡張子も .img)化される。インストール元は、ネットインストールの場合と同じである。
- さて、いよいよ構築コマンドを実行する。画面の指示に従って、先の条件を入力していく。
[root@kuraric55 ~]# /usr/sbin/virt-install --prompt
What is the name of your virtual machine? kuraric55v1
How much RAM should be allocated (in megabytes)? 400
What would you like to use as the disk (file path)? /var/lib/xen/images/kuraric55v1.img
How large would you like the disk (/var/lib/xen/images/kuraric55v1.img) to be (in gigabytes)? 20
What is the install URL? http://ftp.riken.jp//Linux/centos/5.5/os/i386/
*** VNCの利用 [#a9b40607]
- ここから先は、通常のインストールと同じ。CUIベースのインストール画面が延々と続くのだが、CentOS 5.5ではVNCサーバを利用して、GUIで作業を続けることができるようになる。
- IPアドレス等のネットワーク設定が終わったところで、画面にこんな文字が現れた。
Would you like to use VNC?
- 実は、前回試した時は見かけなかったので、びっくりしたのだが! やはり新バージョンのメリットだ。とはいえ、パソコンにはVNCソフトがインストールしてなかった(^^;)
- あわてて[[「RealVNC日本語インストール版」>http://www.vector.co.jp/soft/win95/net/se324464.html]] をダウンロードしてインストールする。
- VNCの接続先はサーバ:「192.168.1.221:1」 (最後に「:1」を付けるのがポイント)自分で決めたVNCのパスワードを入力すれば、おぉ!!、グラフィックのセットアップ画面だ!!&br;
&ref(VNC_start.jpg,,30%,VNCでインストール);&br;
- と言っても、設定自体に変わりはない。あとは、淡々と進めるが注意は2つほど。
++ 地域選択の画面で 「□システムクロックで UTC を使用する」のチェックを忘れずに。
++ インストールパッケージ選択では、「開発」パッケージグループの「開発ツール」と「ベースシステム」の 「ベース」のみ選択で残りはすべからくチェックを外しておく。
- もし足りないものは、yumで簡単に追加インストールできるので、まずは小さなサーバ構成にしておく。
毎度ながら、この記事[[「CentOS5インストール」>http://centossrv.com/centos5.shtml]]が参考になる。
- インストールは10数分で完了して、再起動する。と言っても、実機はそのままで、仮想マシンだけ。
** サーバの追加設定とコンテンツのリカバリー [#o9ab859d]
- 再起動後の本格的な構築作業だが、毎度やってることなので、実際はコマンド群をリスト化したメモ[&ref(kuraricSV_command.txt);]を用意してある。それを順に「コピー & ペースト」で実行し、結果を確認しながら進めて行く。
-ここでは、主な項目だけを記す。
++ ユーザ追加、FWの停止、OS自体のアップデート(yum-update)等を行う
++ 追加パッケージのインストール:php関連、postfix、MySQL、mod_ssl、rsync等
++ サーバの起動設定:httpd、mysqld、postfix
++ mysql の設定と Databaseの作成
- 続いて、現サーバで毎朝実施しているバックアップのデータをサーバ間で転送し、コンテンツをリカバリーする。
- 続いて、現サーバで毎朝実施しているバックアップ[&ref(backup_sh.txt);]のデータをサーバ間で転送し、コンテンツをリカバリーする。
++ scpコマンドで、バックアップファイルを一括転送
++ あらかじめ作成してあるシェルコマンドで、データのリカバリー
++ あらかじめ作成してあるシェルコマンド[&ref(recovery_sh.txt);]で、データのリカバリー
- ここで再度仮想サーバを再起動して、ブラウザで接続試験などを行って最終的な動作を確認する。この作業は、仮想サーバであるかどうかは全く関係ない。ホストもゲストも同じハード上だが、IPアドレスは完全に独立しており、別マシーンと言った風情である。
** ゲストOSの自動起動 [#ja309b6a]
- あらためて、ホスト側からXenサーバの構成状況を確認する。仮想サーバが動いている。
[root@kuraric55v0 ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 348 1 r----- 794.7
kuraric55v1 1 399 1 -b---- 2356.9
- ゲストOSは個々にリブート可能である。複数の仮想マシンの場合はメリットがあるのだろうが、一つだけだから関係はない。むしろ、逆に、ホストOSを再起動した時が問題だ。ゲストOSの自動起動設定しておかないと、ホストだけが立ち上がっても意味がない。
- ホストOSと同時起動には、以下のコマンドを1回実行しておく。
# chkconfig xendomains on
- 起動するゲストOSの指定は、参照ディレクトリーに、ゲストOSのシンボリックリンクを作成しておけばよい。
[root@kuraric55 ]# cd /etc/xen/auto
[root@kuraric55 auto]# ln -s /etc/xen/kuraric55v1
[root@kuraric55 auto]# ls -l
合計 0
lrwxrwxrwx 1 root root 20 5月 20 23:01 kuraric55v1 -> /etc/xen/kuraric55v1
- なお、ホストOSからは、ゲストOSのコンソールログインするコマンドもある。これはこれで便利そうなのだが、コンソールの二重起動のせいか表示制限等が出てきて実際は使い勝手が良くなかった。また、ホストかゲストか、どちらにいるのか迷うこともある。puttyで個々にloginするのがわかりやすいと思う。
- 以上で、サーバ構築は完了!!
* バックアップ環境の整理 [#t239e751]
- 仮想サーバのメリットの一つはバックアップである。今回の仮想化も、目的の一つはそこだったのだから。
- 仮想化の過程でわかったように、ゲストOSはホストOS上にイメージファイルの形で存在する。少し大きいけれど、いわばこれがバックアップデータそのものである。
- OSにアプリにデータまで含んだものが、単一ファイルなのである。したがって、このファイルをそのまま定期的に保存しておけばよいことになる。
- 仮想マシンの再構築は、Xenサーバを構築後に、このファイルを戻せば実質的に完成なのだ。
- しかも、実機を変更した場合もあまり悩まなくて良い。ハード構成がいろいろ変更しても、その差異はホストOS側に吸収されており、仮想マシン側から見ればXenサーバという同じ土台上にいる。
** バックアップの対象は [#m857bba3]
- 実際の手順を整理しておく。まず、ホストOSからみた仮想サーバのデータは2つある
++ ゲストOS全体のイメージファイル
++ ゲストOSの設定情報(connfig)
- それぞれの所在ディレクトリは以下のとおり、DomainNameは仮想サーバのホスト名。今回は「kuraric55v1」である。
imagファイル:/var/lib/xen/images/DomainName.img
configファイル:/etc/xen/DomainName
- 実際のサーバを調べてみると
[root@kuraric55v0 ~]# ls -l /var/lib/xen/images/
合計 4704732
-rwxr-xr-x 1 root root 21474836480 6月 2 14:47 kuraric55v1.img ★
[root@kuraric55v0 ~]# ls -l /etc/xen/
合計 112
drwxr-xr-x 2 root root 4096 5月 22 12:10 auto
-rw------- 1 root root 331 5月 22 09:38 kuraric55v1 ★
-rwxr-xr-x 1 root root 156 5月 18 2007 qemu-ifup
drwxr-xr-x 2 root root 4096 5月 22 09:32 scripts
-rw-r--r-- 1 root root 6458 4月 3 21:15 xend-config.sxp
-rw-r--r-- 1 root root 1256 4月 3 21:15 xend-pci-permissive.sxp
-rw-r--r-- 1 root root 4129 4月 3 21:15 xend-pci-quirks.sxp
-rw-r--r-- 1 root root 7264 4月 3 21:15 xmexample.hvm
-rw-r--r-- 1 root root 5315 4月 3 21:15 xmexample.vti
-rw-r--r-- 1 root root 5463 4月 3 21:15 xmexample1
-rw-r--r-- 1 root root 6746 4月 3 21:15 xmexample2
- この2つがあれば、サーバは簡単に再構築できる。
- ちなみに、後者のconfigファイルはテキストだから、設定情報がわかっていれば自分で作り直すことも不可能ではない。
[root@kuraric55v0 ~]# vi /etc/xen/kuraric55v1
---
name = "kuraric55v1"
uuid = "18d3bc8c-1425-a1c6-6112-b38cd6e7713b"
maxmem = 400
memory = 400
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
disk = [ "tap:aio:/var/lib/xen/images/kuraric55v1.img,xvda,w" ]
vif = [ "mac=00:16:36:1c:1c:c5,bridge=xenbr0,script=vif-bridge" ]
- この2つを別ドライブにでも保存するだけだ。保存先としては、①本体に増設したHDDや ②LANディスク等が考えられる。ただし、イメージファイルはサイズが20GBもあるから、多少時間はかかることになる。Gb-LAN化を図った狙いもこのあたりにある。
** 増設HDDをマウントするまで [#d239bbbd]
- まずは、①案で、余った30GBのHDDをサーバに増設して、ここに保存することにした
- 増設ドライブのマウントは、以前のサーバでもやっているので、同じ手順で進む
***ハード認識確認 [#r69ab229]
- 増設HDDのは /dev/hdb として認識される。 dmesg コマンドで構成を確認しておく。hdb:で始まる行を探すと、ドライブの詳細が確認できる。少なくともハード的には認識されているということである。
# dmesg
Linux version 2.6.18-194.el5xen (mockbuild@builder16.centos.org)
(gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 16:16:54 EDT 2010
hdb: 58633344 sectors (30020 MB) w/1024KiB Cache, CHS=58168/16/63, UDMA(100)
(前後略)
*** 領域を削除 [#n1a378ca]
- まず、増設ドライブの既存領域を削除する。コマンドは fdisk だが、まずは、何やら警告を表示した後、サブコマンド待ちとなる。
# fdisk /dev/hdb
このディスクのシリンダ数は 58168 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
(例. DOS FDISK, OS/2 FDISK)
コマンド (m でヘルプ): d
領域番号 (1-4): 1
- 領域削除は 'd' (delete)で、続いて領域番号'1'を入力し実行する。Linuxで使ったドライブ等の場合は、複数のパーティッションがあるので、続けて'd’,'2' と繰り返す。
- 最後に、変更の結果を書き込んで終了
コマンド (m でヘルプ): w
領域テーブルは交換されました!
*** 領域の確保 [#qc4d7406]
- 同じく、fdiskコマンドを起動し、領域作成は 'n'(new partitionか?)を使う。続けて、領域種別'p'(プライマリー)、領域番号'1'を入力し、実行後は 'w'書き込んで終了。
# fdisk /dev/hdb
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-58168, default 1):
Using default value 1
終点 シリンダ または +サイズ (1-58168, default 58168):
Using default value 58168
コマンド (m でヘルプ): w
- 領域作成時に、「最初シリンダ」と「終了シリンダ」の入力を求めてくるが、単一パーティッションの場合は、そのまま [enter]すればよい
*** 領域の確認 [#d928dc7a]
- 領域が確保されたか、念のため確認しておく。fdisk の 'p' (print)コマンドである。
# fdisk /dev/hdb
コマンド (m でヘルプ): p
Disk /dev/hdb: 30.0 GB, 30020272128 bytes
16 heads, 63 sectors/track, 58168 cylinders
Units = シリンダ数 of 1008 * 512 = 516096 bytes
デバイス Boot Start End Blocks Id System
/dev/hdb1 1 58168 29316640+ 83 Linux
- 確認だけなので、 'q'(quit) で抜ける。
コマンド (m でヘルプ): q ( 変更を保存せずに終了する)
*** フォーマットする [#baf3bbb1]
- 領域確保だけでは使い物にならない。Windowsでも忘れがちなのだが、フォーマットが必要。数分で終わる。
# mke2fs -j /dev/hdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
3670016 inodes, 7329160 blocks
366458 blocks (5.00%) reserved for the super user
(略)
*** マウントする [#e2223153]
- ドライブをマウントし、構成を確認する
# mkdir /kuraric55bak
# mount /dev/hdb1 /kuraric55bak
# df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
76241920 6870744 65435740 10% /
/dev/hda1 101086 19903 75964 21% /boot
tmpfs 335624 0 335624 0% /dev/shm
none 335536 120 335416 1% /var/lib/xenstored
/dev/hdb1 28855964 176200 27213932 1% /kuraric55bak ★
*** 自動mount設定 [#s2056562]
- 再起動時に自動的にマウントできるようにしておく
# vi /etc/fstab
---この1行を追加
/dev/hdb1 /kuraric55bak ext3 defaults 1 3
** バックアップコマンドの作成 [#i2b9be5c]
- 増設ドライブの準備ができたので、バックアップコマンドを作成し、定期的に自動実行できるようにする。
*** 入力待ちが壁に [#j4f087b3]
- 対象ファイルは2つだけなので簡単、しかも同じサーバ内なので、cpコマンドでいけるはず。
cp -ap /var/lib/xen/images/kuraric55v1.img /kuraric55bak/xen
cp -ap /etc/xen/kuraric55v1 /kuraric55bak/xen
- ところが、困った問題が。コピー先には同じ名前のファイルが存在するので、確認コマンドが出る
# cp -apf /etc/xen/kuraric55v1 /kuraric55bak/xen
cp: `/kuraric55bak/xen/kuraric55v1' を上書きしてもよろしいですか(yes/no)?
- 入力待ち状態でに止まってしまうので自動化にならない。 -f オプション(強制上書き)を付けているのに、なんで??
- 調べてみたら、なんと! aliasのせいだった。cp コマンド自体に、最初から -i オプション(上書き確認)がつけられていた。
# alias
alias cp='cp -i'
*** エイリアスの回避 [#t8a0a0dc]
- では、aliasを解除してしまえばよいのだが、、、やはり、直接コマンド操作する際の不安も残る。
そういう時どうするかを調べたら、一時的な回避方法が見つかった。[[エイリアスを回避する方法の根拠>http://d.hatena.ne.jp/DOSEI/20100330/p1]]だ。
- コマンドの頭に '\' (バックスラッシュ)をつけてやればよいことがわかった。これで、ピュアな cp コマンドが実行できるので、-f オプションを有効にできる。
- 最終的にまとめると、毎朝 6:00AMに、コピーを実行する設定は以下のようになる
# crontab -e
ーー
00 05 * * * \cp -apf /var/lib/xen/images/kuraric55v1.img /kuraric55bak/xen
00 05 * * * \cp -apf /etc/xen/kuraric55v1 /kuraric55bak/xen
- まぁ、コピー先のファイルを事前に削除しておくのも一つの方法ではあるかな。他にも、expect コマンドを使って、上書き承認の yes を入力補完させる手もあることがわかったのだが、ローカルコピーの時は、これが簡単でスマート。
* 終わりに [#m0f1d2d3]
- 仮想サーバと言っても、毎日の運用状態に入ってしまえば、これまでと全然変わりはない。
- 真価を発揮するのは、ハードを全面更改したり、OSが大きく変わった時かもしれない。どちらもしばらくなさそうではあるが。
- 増設ドライブの処理の話が長くなってしまったが、昨日トラブったばかりで、そのトラウマかも(^^;)