実践報告

仮想環境を利用した「サーバ構築実習」環境の構築

― 仮想OSのUML(User Mode Linux)活用報告 ―

九州ポリテクカレッジ 生産情報システム技術科

(九州職業能力開発大学校) 

後野 隆

1.はじめに

 1台のパーソナルコンピュータ(以下,PCと記す)で複数のオペレーティングシステム(以下,OSと記す)を切り替えて使用できる,マルチOSを実現するアプリケーションにはいくつかあります。市販のものやフリーのもの,異なる複数のOSを同時に使用できるものや同じOSでしか使用できないものまでさまざまです。いずれにしても,これらはOSの起動テスト,ネットワーク実験,クロスコンパイル環境,リモート管理などが主な目的です。今回はこれらの目的とは異なりますが,仮想OS環境を実現するフリーのUser Mode Linuxをサーバ構築授業に取り入れましたので,活用事例としてここに報告します。

2.User Mode Linux活用の動機と実施環境

 コストをかけずに現状の実習環境にPCを増設する方法として,仮想環境を利用し「サーバ構築実習」環境を構築しました。

.1 実習環境の現状

 PCを使用したサーバ構築実習では,「訓練生おのおののPCでサーバを構築する」というのが一般的です。これらは,OSのインストールを含めたサーバ構築実習の場合においては効果的方法であると思います。当校では,1台のPCにサーバ構築用(Linux OS)のハードディスクを準備しクライアント(Windows OS)のハードディスクと交換して実習しています。

 しかし,クライアントからサーバへの挙動などを即座に確認する場合や,複数ネットワーク間のサーバ同士の挙動およびクライアント接続実習となると,理想的には複数のLANと1人2台以上のPCが必要になります。このように,LAN間接続機器や訓練生1人にクライアント用のPCとサーバ用のPC一式を準備するとなるとかなりのコストがかかってしまいます。

.2 仮想環境の利用

 複数のLANを確保する方法としては,レイヤ3スイッチを利用するのが手軽です。しかし,現状の実習環境にはレイヤ3スイッチはありません。そこで,異なるLAN間のサーバ設定とクライアントの挙動確認については,物理的に分割されたLAN間ではありませんが,同一ネットワーク上で異なるIPアドレスを混在させることで仮想的に異なるLAN間に見立てました。また,サーバ構築用のPCとして仮想OS環境を実現できるフリーのUser Mode Linuxを利用して,1台のPCに複数のサーバ構築環境を準備することにしました。

.3 実施環境

 今回の実施は,高度1年アビリティコース(情報技術エキスパート科)で,図1に示すようにクライアントとなる16台の訓練生PCに対して1台のサーバ用PCをマルチホームホストに設定し,User Mode Linuxを導入しました。そして,FTPサーバの設定とDNSサーバの設定,およびMailサーバの設定実習などを実施しました。また,訓練生のPCを4台ずつ4つのサブネットワークに属するようにIPアドレスを割り振っておきます。

3.仮想環境の準備

 便宜上,マルチホームホストiをルータとして同一ネットワーク上に実現しているサブネットワークを「仮想サブネットワーク環境」と呼び,User Mode Linuxによって実現している仮想的なマシンを「仮想OS環境」と呼ぶことにします。

.1 IPアドレスの割り振り

 準備する実習環境のIPアドレスは,クラスCのプライベートアドレス192.168.5.0/24を8つのサブネットに分割して,表1に示すようにグループ①~グループ④にそれぞれのサブネットワークを割り当てました。

 ここで表1のアドレス範囲に示す数字は,192.168.5.XXのXXの部分です。また,サブネットマスクは255.255.255.224となります。さらに,それぞれのサブネットワークアドレス範囲内でのクライアントとそのクライアントが使用する仮想OS環境のIPアドレスを表2のように割り振ります。これで訓練生1人に対して2台のPCを所有することができるようになります。

.2 マルチホームホストの設定

 実習環境における(図1)サーバにはRed Hat Linux 8 iiを使用しています。1つのLANカードに複数のIPアドレスを割り振るには,Linuxの場合,一行で次のように設定します。netmaskの書式に続いて今回設計したサブネットマスク値を記述します。

ifconfig eth0:1 IPアドレス netmask 255.255.255.224

broadcast ブロードキャストアドレス

 ここで,書式のIPアドレスの部分には表2で示すゲートウェイのIPアドレスが該当します。broadcastに続けて表1に示すようにそれぞれのサブネットのブロードキャストアドレスを指定します。次のグループにおけるゲートウェイの設定では,IPアドレスの前に記述しているeth0:1の記述がeth0:2,eth0:3,eth0:4と順次増やして設定することになります。

 (1) 仮想サブネットワーク環境のルータ設定

 サーバに対してマルチホームホストの設定ができたところで,それぞれのサブネット間でのIP転送(IP Packet forwarding)ができるようにカーネルパラメータであるnet.ipv4.ip_forwardの値を1に設定します。/etc/sysctl.confファイルの中に先に述べたカーネルパラメータの部分を変更します。

net.ipv4.ip_forward=1

 コマンドで変更する場合には,sysctlコマンドを使用します。指定設定ファイル読み込みオプション-pを付けて次のように指定します。ファイルを省略した場合には,/etc/sysctl.confが読み込まれます。

sysctl -p /etc/sysctl.conf

.3 User Mode Linuxの導入

 User Mode Linuxは,Linux上に仮想的なLinux環境を作るソフトウェアです。

(1) 前準備(サーバPCのアカウント登録)

 仮想OS環境を準備するサーバPCに訓練生のアカウントを作成しておきます。訓練生は,クライアントからサーバPCに遠隔接続(telnetやssh接続など)して仮想OS環境を利用します。ユーザが16名ですが,作業を半自動化するためにuser00~user16までのユーザ登録の簡単なスクリプト(uml-user.sh)を作成しました(リスト1)。パスワード設定は,リスト2に示すようにこのスクリプト実行中に生成されるsetpasswd.txtをテキストエディタviで編集してnewusersコマンドで一括設定します。

(2) User Mode Linuxのインストール

 User Mode Linuxのインストールは,リスト3に示すようにrpmコマンドでインストールします。rpmファイル iii は,「The User-mode Linux Kernel Home Page」iv からダウンロードします。

(3) User Mode Linuxの実行

 仮想OSを起動(ブート)するには,リスト4に示すように1行の書式で実行します。ここで指定するIPアドレスは,仮想OSのものでなくUser Mode Linuxをインストールしているサーバ用PCのIPアドレスを指定します v 。このIPアドレスは仮想OSと実際のサーバPCとの仮想ゲートウェイのために使われます。

 書式におけるroot_filesystemとは,仮想OSのイメージファイルになります。また,COW_filesystemとはCopy On Write_filesystemのことで,仮想OSのイメージファイルに対する変更の差分ファイルのことです。実際には,root_filesystemにdiff-abilityを指定し,COW_filesystemに/home/uml/rootfs-ability vi を指定しています。一度COWファイルが作成されると次回からはroot_filesystemを省略することができます。このイメージファイルを複数の訓練生(16名)おのおのに準備して使用することもできますが,イメージファイルは,かなり大きなサイズ(679MB)です。ハードディスクの節約のためにも複数の差分ファイルを使用して,1つのイメージファイルを複数の仮想OSとして使用することにしています。また,差分ファイルを削除することで実習前の初期の状態へ速やかに戻すことができます。そのためにもこの共有イメージファイルには実習に即した設定準備が必要です(4.1イメージファイル(rootfs-ability)の準備調整)。クライアントから仮想OSへの接続にはtelnet接続またはssh接続で行います。User Mode Linuxはデフォルトでxtermを仮想コンソールにしています。そこで,起動オプションにcon=pty con=

fd:0,fd:1を指定します。これまでの手順をまとめると,クライアントは,User Mode Linuxの準備してあるサーバ用PCに遠隔接続し,ログイン後に仮想OSをブートさせるためのコマンドを入力することになります。次にこの作業を省略して,遠隔接続しログインすると同時に仮想OSのログインプロンプトが出力されるようにします。

(4) 最終準備(仮想OSの起動スクリプト)

 仮想OSの起動はuml-start.shスクリプト(リスト5)によってログイン後,直ちに起動できるようにします。そのために,各アカウントのホームディレクトリにある.bashrcにリスト6のように記述します。

※下線部分は1行で記述します。

4.仮想環境における実習項目

 訓練生が実習の中で手動によるネットワーク設定を行うことができるようにrootfs-abilityのイメージファイルにはネットワーク設定が未設定にしてあります。したがって,最初の仮想OSの起動では,自動起動にしてあるxinetdは起動しません。

 ネットワークの設定が完了し,再起動後にxinetdは正常に起動します。また,訓練生は,sshで仮想OSに接続します。接続ユーザは,user01~user16の16名,指導員用にuser00が用意してあります。パスワードは,user01がpass01のようにpassの次にユーザ名と同じ番号を付けます。仮想OSのrootのパスワードは,passrootに設定しています。

 rootfs-abilityのイメージファイルにはTELNET,FTP,DNS,メール(qmail,qpopper)の実習ができるように準備しています。rpmによるインストールやソースコードのダウンロードは不要です。qpopperについては,前もってシャドウパスワード対応と~/Mailboxを読み込むようにコンパイルしておきます(/usr/sbinのpopper)。

.1 イメージファイル(rootfs-ability)の準備調整

 イメージファイル(rootfs-ability)は,おのおのの訓練生が共有するので,基本構成としてネットワーク設定の初期化や実習に必要なアプリケーションをインストールするなどして準備調整しておかなければなりません。ダウンロードしたイメージファイルは,管理者であるrootのパスワードはrootに設定してあります。まず,3.3「User Mode Linuxの実行」のリスト4に示したように仮想OSを起動してrootでログインします。ログイン後は通常のLinuxの操作と同様です。サーバ構築実習に必要なアプリケーションの設定ファイルなどの準備をしておきます。この作業終了後,仮想OS環境からログアウトすると差分ファイルが生成されていますから,リスト7に示すように差分ファイルをuml_mooコマンド vii でイメージファイルに書き戻します。

 ここで,Cow fileは差分ファイルを指定します。また,new backing fileには新たなイメージファイル名を指定します。uml_mooコマンドで生成されたイメージファイルが基本イメージファイルとなります。おのおのの訓練生(user01~user16)に対して読み込み専用属性に設定しておきます。

 ダウンロードしたイメージファイル内へのファイルの削除やファイルのコピーは,ループバックデバイスを利用して,イメージファイルをデバイスとして扱えるようにします。

 リスト8のように/mntにrootfs_abilityを/mntディレクトリにマウントすることで,通常のファイルシステムのように/mntを介してrootfs_abilityの内部にアクセスすることができます。

.2 実習項目

 今回の実習で実施した主な項目は次ページの6項目です。

1.rootのパスワードの変更とユーザ登録

2.TELNETが使えるようにxinetdの設定

3.sshのパスワード認証と公開鍵認証接続のための

 設定

4.FTPの設定および動作確認

5.DNSサーバ設定および動作確認

   マスター,スレーブ,サブドメイン

6.メールサーバ

   SMTPサーバ(qmail)設定

   メールのリレー中継

   POPサーバ(qpopper)設定

5.まとめ

 仮想OS環境を実現するためには,ハードディスクドライブ(HDD)が2GB以上,メモリが256MB程度を必要とします。これらの条件は現在の一般的なPCのスペックならば十分に対応できます。今回使用した,マルチホームホストと仮想OS環境を提供するサーバPCのスペックは,表3に示すとおりです。

.1 実習結果

 実習を始めるに当たってクライアント(訓練生)16名が一斉に仮想OS環境に接続することになります。このとき,仮想OSのログイン画面がクライアントの端末に表示されるまで時間がかかってしまいます。差分ファイルが大きくなるほど気になります。接続の順番にもよりますが,最終的には3~5分程度でも体感的にかなり待たされる気持ちになります。そのためログインを一斉にするのでなく時間差を付けることで,ある程度対処することができました。しかし,ログイン後は,訓練生おのおのの作業ペースはまちまちなので仮想OSからのレスポンスが悪いと感じることは少ないことが確認できました。

.2 今後の課題

 仮想OSへのログインに時間差を付けることは,スムーズなログインへの根本的な解決になっていません。コストはなるべくかけたくはありませんが,仮想OSを提供するサーバPCを増やすなどの処置も考えられます。

<注・参照>

 i 1つのインタフェース(LANカード)に複数のIPアドレスが割り振られているホストのこと。

 ii サーバ構築研究会:「Red Hat Linux 8で作るネットワークサーバ構築ガイド8.0対応」,秀和システム,第1版第1刷,2003.2.15.

iii (2004年2月現在)user_mode_linux-2.4.19.5um-0.i386.rpm

iv 「The User-mode Linux Kernel Home Page」http://user-mode-linux.sourceforge.net/

v   ホスト側の/dev/tap0に割り当てるIPアドレスは,仮想OS内部のイーサネットに割り当てるIPアドレスと異なっていなければなりません。しかし,サーバPCの実際のイーサネットカードに割り当てたアドレスと同じでもかまいません(User Mode Linux HOWTO:Setting up the network)。

vi http://user-mode-linux.sourceforge.net/からroot_fs.md-8.2-full.pristine.20020324.bz2をダウンロードし,展開後にrootfs-abilityにリネームして/home/umlディレクトリに格納しています。

vii  User Mode Linux Core Team,「User Mode Linux HOWTO」,『7.5 uml_moo:Merging a COW file with its backing file』.

 

リスト1 ユーザ登録スクリプト(uml-user.sh)

#! /bin/sh

groupadd uml

useradd -g uml user00

useradd -g uml user01

useradd -g uml user02

useradd -g uml user03

useradd -g uml user04

useradd -g uml user05

useradd -g uml user06

useradd -g uml user07

useradd -g uml user08

useradd -g uml user09

useradd -g uml user10

useradd -g uml user11

useradd -g uml user12

useradd -g uml user13

useradd -g uml user14

useradd -g uml user15

useradd -g uml user16

#

cat /etc/passwd | grep user > setpasswd.txt

#

vi setpasswd.txt

#

newusers setpasswd.txt

#

echo "Create user00-user16"

リスト2   setpasswd.txtの編集例

user00:pass00:511:511::/home/user00:/bin/bash

user01:pass01:512:511::/home/user01:/bin/bash

user02:pass02:513:511::/home/user02:/bin/bash

user03:pass03:514:511::/home/user03:/bin/bash

user04:pass04:515:511::/home/user04:/bin/bash

user05:pass05:516:511::/home/user05:/bin/bash

user06:pass06:517:511::/home/user06:/bin/bash

user07:pass07:518:511::/home/user07:/bin/bash

user08:pass08:519:511::/home/user08:/bin/bash

user09:pass09:520:511::/home/user09:/bin/bash

user10:pass10:521:511::/home/user10:/bin/bash

user11:pass11:522:511::/home/user11:/bin/bash

user12:pass12:523:511::/home/user12:/bin/bash

user13:pass13:524:511::/home/user13:/bin/bash

user14:pass14:525:511::/home/user14:/bin/bash

user15:pass15:526:511::/home/user15:/bin/bash

user16:pass16:527:511::/home/user16:/bin/bash

リスト3 rpmコマンドによるインストール

# rpm -ihv user_mode_linux-2.4.19.5um-0.i386.rpm

リスト4 仮想OSの起動(ブート)

linux ubd0=COW_filesystem ,root_filesystem eth0=tuntap,,,192.168.5.35

リスト5 uml-start.shスクリプト

#/bin/sh

## New Image File

if [ -f ~/diff-ability ]; then

# Exist diff-ability File

linux con=pty con=fd:0,fd:1 ubd0=diff-ability eth0=tuntap,,,192.168.5.35

else

# No Diff-ability File

linux con=pty con=fd:0,fd:1 ubd0=diff-ability,/home/uml/rootfs-ability eth0=tuntap,,,192.168.5.35

fi

stty sane

リスト6 .bashrcの内容

# .bashrc

# User specific aliases and functions

# Source global definitions

if [ -f /etc/bashrc ]; then

        . /etc/bashrc

fi

sh ./uml-start.sh

リスト7 差分ファイルの書き戻し

uml_moo <Cow file> <new backing file>

リスト8 ループバックデバイスによるマウント

mount  -o  loop  -t  ext2  rootfs_ability  /mnt