2009年 6月30日

Debian で Linux Vserver を使う

カテゴリー: Linux/UNIX — Quilva @ 2009/6/30 (火曜日) 18:34:58

Debian で Linux Vserver を使ってるので、せっかくなので自分の知ってることを書いておこうと思います。

といっても、仮想サーバ技術から説明するのはどうかと思うので、かなり端折って書いてきます。

Linux Vserver とは

Linux Vserver とは、OS レベルの仮想化機能を実装した、仮想サーバソフトウェアです (Wikipedia:ja)。

FreeBSD Jail と非常に良く似ており、構造がシンプルでパフォーマンスが素の OS とほぼ変わらないので個人的にもっとも好きな仮想サーバ技術です。

欠点をあえて上げるとすれば、kernel が一つなのと、ネットワークは基本的に 0.0.0.0 で待ちうけができない点くらいでしょう。

Debian に Vserver をインストールする

Debian は公式リポジトリに Vserver が入ってるので、apt から一発で入ります。
非常に楽であり、保守も容易になるので、Vserver 使うなら Debian が一番良いと思います。

ただし、自分は kernel は最新のを使いたいので、Linux Vserver から最新のものを取得しコンパイル・インストールして使用しています。
この方法は後述します。

まずは、Debian lenny amd64 がパソコンにインストールされていることを前提に進めます。自分は amd64 以外もう使ってないので、amd64 を前提に話を進めますが、i386 やそれ以外も一緒だと思います。

# aptitude install linux-image-2.6-vserver-amd64
# aptitude install util-vserver

上の行が、linux-vserver 用の Debian 標準カーネルです。
下の行が、Vserver を使うのに必要なツール類です。

ブートローダで、上で入れたカーネルで起動するよう設定されているかを確認しておき、マシンを再起動します。
再起動して、そのカーネルで起動できているかは、uname -a 等で確認できます。

仮想 OS 用のパーティションを作る

自分は主にこちらのサイトから入ったので、そちらを推奨します。

自分の場合は仮想 OS あたり一つの LVM パーティションを与えて使用しています。
また、マウントポジションは / 直下に vserver というディレクトリを作成し、そこに仮想 OS 名のディレクトリ(usugumo とか murakumo とか) を作成して、LVM のパーティションをマウントします。
たとえば、以下のような感じです。

# lvcreate vg1 -n murakumo -L20GB
# mkfs.ext4 /dev/vg1/murakumo

# ls /vserver
usugumo kashiro
# mkdir /vserver/murakumo
# ls /vserver
usugumo kashiro murakumo

# mount -o noatime /dev/vg1/murakumo /vserver/murakumo
# emacs /etc/fstab
/dev/vg1/murakumo    /vserver/murakumo          ext4      noatime       0 2

# df -h
/dev/vg1-murakumo              100     1    99   1% /vserver/murakumo

流れは、LVM vg1 から 20GB 切り出して、murakumo というものをつくり、その murakumo を ext4 でフォーマットして、/vserver/murakumo にマウントする。
/etc/fstab に追加しないと PC 再起動時にマウントしてくれないので、忘れずに追加しておく、というだけです。

また、mkfs.ext4 を使うなら、カーネル 2.6.29 以降にしたほうが良いと思います。
Debian (lenny) 標準リポジトリの 2.6.26 は ext4dev 扱いであり、extents が有効だったり有効でなかったりしてややこしいし、
なにより 2.6.28 より前の ext4 は結構イマイチだった気がするので ext4 使わないほうがいいと思います。

2.6.29 以降なら、自分もメインマシンに ext4 使って特に大きな不具合ないので、十分実用に耐えると思います。
(btrfs がカーネルにマージされてる一番新しいファイルシステムですが、不安定なので今は使わないほうがいいでしょう。自分の環境では、1-2 日起動させっぱなしにしただけで、なぜか落ちます)

つまり、Linux Vserver 最新を追いかける必要があります。それをしたくないなら、ext3 を推奨します。
大きな容量のパーティション使うなら、XFS にすればマウントが非常に早いので便利だと思います。

仮想 OS を作る

上の作業で、仮想 OS をいれておくパーティションができて、マウントもされてる状態にあります。

ようやく OS のインストールになります。これは debootstrap を用いれば簡単にできます。
自分がよく使うテンプレートが以下なので、参考にしてみてください。

# makigumo (115)
# vserver makigumo build \
  -m debootstrap --context 115 \
  --hostname makigumo.quilva.jp \
  --interface eth0:192.168.5.115/24 \
  --rootdir /vservers \
  -- -d lenny -m http://izaemon.pw2.org/debian/

これは、makigumo という名前の仮想 OS を作ろうとしてます。
コンテキスト(仮想 OS 同士で重複しないユニークな数字を与える)は自分の場合 ip の最後の 8bit を割り与えるようにしてます。
–interface は仮想 OS 用の ip です。
http://izaemon.pw2.org/debian/ はローカルの Debian archive mirror サーバで、しかも今停止中なので、
国内なら普通は http://cdn.debian.or.jp/debian/ のほうが良いでしょう。

これをうちこんだ後は debootstrap が作業してくれるので、終わるまで少し待ちます。

仮想 OS を設定する

ここが書きたかったところでして、当たり前すぎるのか、あまりネット上では見かけませんでした。

上でインストールした直後でももちろん仮想サーバ動くのですが、ほとんど設定されてない状態なので使い物になりません。

なにより、SSH すら入ってないので、まずは SSH で入れて、文字コードを UTF-8 にしたりしましょう。

また、仮想 OS のネットがつながらない場合はホスト OS の /etc/vservers 以下の設定を見直してください。
当たり前ですが、ホスト OS でネットができない場合は仮想 OS もネット使えません。

まずは仮想 OS を起動させます。

# vserver makigumo start

これで起動しない場合はどうしようもないので、いろいろがんばってください。

そして、仮想サーバに入ります。

# vserver makigumo enter

まずは Apt のツリーを更新して、パッケージも更新しましょう。

# aptitude update
# aptitude dist-upgrade

そして、UTF-8 を使うためにロケールの設定をします。

# aptitude install locales
# dpkg-reconfigure locales
(ja_JP.UTF-8 だけを選択した状態にして、これをデフォルトとして使用する)

次に、タイムゾーンが変なので、日本の時間にします。

# dpkg-reconfigure tzdata
Asia
Tokyo
という感じだったと思う。

そして、念願の SSH を入れます。

# aptitude install ssh

ただし、先ほど書いたようなきがしますが、0.0.0.0 で待ち受けできませんので、これを変更します。
ホスト OS (仮想サーバを入れた OS) の SSH も 0.0.0.0 ではなく、192.168.5.123 等に変更してください。

そうでないと、どのアドレスにしても 0.0.0.0 のサーバが応答したりして混乱することになります。

# emacs /etc/ssh/sshd_config
 #ListenAddress 0.0.0.0

 ListenAddress 192.168.5.123

等の ip にしてください。

SSH を起動する前に、root でないユーザも作っておきましょう。
sudo もいれたほうが便利だと思います。

# adduser rootdenaiuser

これができたら、SSH の設定を PermitRootLogin yes を no に変更して、/etc/init.d/ssh start として、ssh が起動させます。
そして、他のマシンから仮想サーバに ssh でログインできるか確認します。

ここまでくれば、後はなんでもできるはず。

Linux Vserver の kernel を自分で作る

Linux Vserver の最新の kernel を使う方法です。ただし、たまに自分の環境だとうまく動かないことがあるので、注意したほうが良いです。

まずは、カーネルをコンパイルできる環境にする必要があります。
うろ覚えなので、「Debian kernel コンパイル」とかで検索してインストールしておいてください。

# aptitude install kernel-packages make gcc patch bzip2 fakeroot libncurses-dev

次に kernel ソースと、Vserver パッチをダウンロードします。
Linux Vserver の下のほうより最新のものがダウンロードできます。

追記 2009 7/23 18:52

最新がほしい場合はこの記事の最後の追記をみてください。
「この表は最新であるとは限らない」との赤字コメントが Vserver のサイトに追加されて初めて気づきました。

Linux Vserver ダウンロード

Linux Vserver ダウンロード

青いほうが、kernel.org よりダウンロードするカーネル本体で、オレンジのほうが、Vserver パッチです。

% mkdir kernel
% cd kernel

% wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.5.tar.bz2
% wget http://vserver.13thfloor.at/Experimental/patch-2.6.29.5-vs2.3.0.36.14.diff

とでもして、ダウンロードしてください。

展開して、Vserver のパッチを当てます。

% tar xjf linux-2.6.29.5.tar.bz2
% cd linux-2.6.29.5
% patch -p1 < ../patch-2.6.29.5-vs2.3.0.36.14.diff

make menuconfig で好みの設定にしてください。

% make menuconfig

そして、コンパイルします。
自分は Phenom を使ってるので、並列コンパイルを実施します。

% export CONCURRENCY_LEVEL=7
% fakeroot make-kpkg --initrd kernel_image

マシン速度に大きく左右されるので、コンパイル終わるまで待ちます。
コンパイルが正常に完了すれば、ひとつ上の階層に *.deb ができあがってるはずです。

fakeroot が以前壊れてたことがあるので、その場合は root になって実行してください。

そして、念願のインストールを実行します。

# dpkg -i 上でできあがった.deb

なんでか initrd が出来上がってないことがあるので、確認します。

% cd /boot
% ls -l
initrd.img-*****************-amd64

ない場合は、作ります。

# update-initramfs -c -k 2.6.30.1-vs2.3.0.36.14-pre3 とか。

なかった場合は /boot/grub/menu.lst の initrd もない気がするので、追加します。

title           Debian GNU/Linux, kernel 2.6.26-2-amd64
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda5 ro

となってるところを、

title           Debian GNU/Linux, kernel 2.6.26-2-amd64
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda5 ro
initrd          /boot/initrd.img-2.6.26-2-amd64

というかんじ。

できあがり。
とりあえず、自分は 2.6.29-2 を現在使用してますが、特に問題ありません。

最後のほうに書いておくと、Left 4 Dead というゲームのサーバを Vserver 上で立ててもパフォーマンス(ラグとか)問題ありません。
Xen だとオーバヘッドからか、フレームレートが若干落ちる(素OS と Vserver が 29.90 くらいのところが、27 くらいに落ちる)ので、イマイチです。

Vserver Tips
仮想 OS のパーティションの容量を増やす

自分のように LVM を用いた場合は仮想サーバ停止させずに増やせます。

# lvextend -L+1000000000000000GB /dev/vg1/murakumo
# resize2fs /vserver/murakumo

これだけ。

仮想 OS のパーティションの容量を減らす

ファイルシステムに reiser(3) を使った場合のみ縮小できます。
ext4 や XFS などは増やすことしかできません。

また、オンラインではできませんので、仮想サーバを停止させ、パーティションも umount する必要があります。

 # vserver murakumo stop
 # umount /dev/vg1/murakumo
 # resize_reiserfs -s -1000G /dev/vg1/murakumo
 # lvreduce -L-1000G /dev/vg1/murakumop
 # mount /dev/vg1/murakumo
 # vserver murakumo start

lvreduce -L-1000G だと、1000GB だけ減らす、という意味で、lvreduce -L1000G だと 1000GB にするという違いがあります。

Vserver 関係リンク
Debian/VServer いっつのメモ帳
自分の BLOG より先に見るべきです。「特定の仮想マシンにだけ別のデフォルトゲートウェイを割り当てる」とか、喉から手がでるほどほしい情報でした
追記 2009 7/23 18:54 最新の Vserver patched kernel を作る

最近 Vserver のサイトに赤字コメントが追加されました。

赤字コメント

赤字コメント

always look here and do not assume that the Table below is up to date — Vserver 管理者様より

とあるので、「表は常に最新であるとは限らないことに気をつけろ」ということです。

なるほど、たしかに Experimental Releases がリンクになってるよ…………

最新 Vserver patch をダウンロード

最新 Vserver patch をダウンロード

ということで、この場合はかこんだやつが最新の Vserver ということになります。
Kernel 2.6.27.27 を使ってる場合はそれのほうがより新しいですが、Kernel 2.6.30.1 の場合は囲んだやつがそうなります。

1件のコメント »

  1. [...] 前に Vserver のインストール記事の一番したのリンク先とほぼ同じです。 [...]

    ピンバック by 複数のゲートウェイを使い分ける « Quilva::ReJEC.NET BLOG — 2009年 7月13日 @ 23:01

このコメント欄の RSS フィード トラックバック URL

コメントをどうぞ

Powered by WordPress