アーカイブ ‘Linux/UNIX’ Category



Debian でオリジナル kernel 用に iscsi target のモジュールをコンパイルしてインストールする

木曜日, 9月 3rd, 2009

タイトルがもうダメすぎる。

自分は kernel の Timer Frequency を 1000Hz にしたいので kernel はできる限り手動でコンパイルしたいと思ってます。(デフォルトは 250Hz) 正直 Timer frequency はどういうときに使われるのかとかわかってないのですが、なんとなくリアルタイム OS は割り込みが 1ms だった気がするので 1000Hz にしたいというただそれだけ。

(Timer Frequency は日本語だと naoya さんのこの記事がいいですよね。というよりこの記事以外しらない)

まぁ、単に最新の kernel 使いてぇという理由が大半かも。

また、自分は Linux Vserver を使ってるので Vserver patch を当てた kernel を構築した後 iscsi-target のモジュールをコンパイルしてインストールする形をとります。
調べて無いので予想ですが Vserver と iscsi-target は競合しないと思うので共存可能と思います。(Debian にも標準で Linux-Vserver kernel 用の iscsi-target のモジュールがあるし)

Vserver パッチを適用した kernel を作る

たしか Vserver の記事でこれのやりかたは書いたので割愛します。

この記事作成時点での Vserver patch の最新が patch-2.6.30.5-vs2.3.0.36.14-pre7.diff(直リンク) であり、これに対応する Kernel は 2.6.30.5 です。2.6.30.5 は 2.6.30 がリリースされてから結構時間が経ってるよう感じるので安定している気がします。

ただし、これはまだ調べてませんが 2.6.30.4 で XFS  を使ってるマシンがあったのですが稼働中に XFS のパーティションが破損し起動不可能になってしまいました。原因は他にある可能性も高いですがなんとなく XFS が破損して、それを repair して再起動かけてそれが起動成功して数時間後に落ちたので XFS が原因な気がします。ただ、C’n'Q (powernowd) を有効にしてまして、コイツが原因でフリーズすることも過去に何度も経験あるのでこいつかもしれない)

話がそれましたが、まぁ普通に作ってインストールしてその kernel で OS を起動させてください。

iscsi target モジュールをコンパイル&インストールする

これは当たり前かもれませんが、知らなければハマるので書く。というよりこれが書きたかった。

自分は最初この記事を見てコンパイルを試行したわけですが、iscsi target の iet_procfs_init とかいう関数でエラーがでてしまうんですよね。

これは iscsi target の sourceforge から tar.gz をダウンロードした古いバージョンなのが原因のようです。ちなみにバージョンは 2008/11/30 リリースの 0.4.17 です。

なので検索してみると他のディストリで同様のエラーでコンパイルが失敗するので patch を作って公開してくれてる人が居ました。なら、iscsi target の開発版バージョンならもうそのバグを修正したものがあるだろうと iscsi target の開発版バージョンを探すと、iscsi target のトップページDeveloper version があったのでこれを利用します。subversion でソース管理してるようです。

また、iscsi target のコンパイルは OpenSSL のソースが必要なようなので subversion と合わせて導入します。

# aptitude install libssl-dev subversion

そして書いてあるとおり iscsi target の trunk をダウンロードします。

% svn checkout svn://svn.berlios.de/iscsitarget/trunk

コンパイルします。

# make KSRC=/home/quilva/kernel/linux-2.6.30.5

インストールします。

# make KSRC=/home/quilva/kernel/linux-2.6.30.5 install

そして、マシンをリブートさせて iscsi target が動けば OK 。
ただし iscsi target のモジュールが Debian (squeeze) の iscsi target のフロントエンド(?) よりバージョンが新しいという Warning (以下) が出ますが動いてるからいいでしょう。

quilva@usugumo:~% sudo /etc/init.d/iscsitarget start
Starting iSCSI enterprise target service: WARNING: All config files need .conf: /etc/modprobe.d/alsa-base-blacklist, it will be ignored in a future release.
WARNING: All config files need .conf: /etc/modprobe.d/libsane, it will be ignored in a future release.
WARNING: All config files need .conf: /etc/modprobe.d/alsa-base, it will be ignored in a future release.
WARNING: All config files need .conf: /etc/modprobe.d/libpisock9, it will be ignored in a future release.
succeeded.

当たり前ですが iscsi target 動いてる状態で Vserver も動いてます。
久々に記事書いた。

Twitter 始めようとおもうので、始めたらまた報告します。よかったら登録してください。

Debian tar.gz のソフトウェアを deb にしてインストールする

金曜日, 7月 24th, 2009

この記事は誤ったことがかかれていた為、削除しました。

Ruby::cgi で multipart 送信のときのフォームの値の取得方法

日曜日, 7月 19th, 2009

久々にハマった。デバッグに数十分もかかってしまった。

後から思えば簡単なことなのになんで気が付かないんだろ。

たとえば、以下のようなファイルをアップロードする CGI を作ろうとすると、コードは多分こんなかんじになる。

#!/usr/bin/ruby

require 'cgi'

cgi = CGI.new
filename = ""
text = ""
if cgi.has_key?("upload")
  filename = cgi['file'].original_filename
  text = cgi['text']
end

puts <<EOM
<form action="KORE.rb" method="POST" enctype="multipart/form-data">
 <input type="file"   name="file" />
 <input type="text"    name="aaaa"  />
 <input type="submit" name="upload" value="送信" />
</form>

<p>
#{CGI.escapeHTML(filename)}<br />
#{CGI.escapeHTML(aaaa)}
</p>
EOM

ソースどおりですが、アップロードしたファイル名とテキストボックスのデータを <p> のところに表示させる、という CGI です。
ところが、これは希望通りに動作しません。

具体的にはテキストボックスのデータ表示が「#<String…」のように OBJ.class の値しかかえってきません。
これは multipart で送信しているからなので、以下のようにしないといけない。multipart でなければ上のソースで OK 。

#!/usr/bin/ruby

require 'cgi'

cgi = CGI.new
filename = ""
text = ""
if cgi.has_key?("upload")
  filename = cgi['file'].original_filename
  text = cgi['text'].read
end

puts <<EOM
<form action="KORE.rb" enctype="multipart/form-data" method="POST">
 <input name="file" type="file" />
 <input name="aaaa" type="text" />
 <input name="upload" type="submit" value="送信" />
</form>

<p>
#{CGI.escapeHTML(filename)}<br />
#{CGI.escapeHTML(aaaa)}
</p>
EOM

はい、read を付けるだけです。リファレンスいいかげんにしか見てないからこんなことになるんでしょうね…。

bind9 の設定例

土曜日, 7月 18th, 2009

あってるかはわからない。

Bind って個人的にはあまり参考になるサイトは多くなかった気がするから書いておく。

コンテンツサーバとキャッシュはたしかに分けたほうがいいとは思う、と先に書いておく。分けれる環境なら分けたほうがいいと思う。

環境

結構よくあるパターンだと思う。
実際は DMZ とかでもうちょっと工夫してたりすることもあるけど、暫定的にこの構成で立てるということはよくやると思う。

この記事での環境

この記事での環境

ちょっとめんどくさかったですが、一応画像を書いてみました。まぁ、Router が PPPoE 話して NAPT する日本ではおなじみの環境です。

あと、192.168.55.5 用にルータは DNS 用のポート 53 にパケットがきたら 192.168.55.5 へもってくよう設定されてるとします。
(当たり前ですが、TCP も使うので TCP 53 も 192.168.55.5 にもっていくこと)

画像に書き忘れましたが、対象の ZONE は target.zone.com. とします。

server.zone.com. が 192.168.55.5 としておきます。ここも server.local.zone.com. として切ることも多いと思いますが、ここではあえて server.zone.com. の正引きがグローバル IP を返したり、DNS キャッシュ使いたいマシンからではプライベート IP を返す構成とします。

Bind9 の基本的な設定

まず、ZONE ではなく Bind の基本的なことに関して設定します。

Bind はたまにメモリを食いつぶすから危ないとかかかれてますが、バグによるもの以外では特にないので問題ないはず。(調べとくべきですねぇ)

Bind のインストールですが、Debian の場合は # aptitude install bind9 でインストールできます。
Bind8 のほうが速いからそっちを使うというのは Bind を理解できていなければやめたほうがいいと思います。

/etc/bind/named.conf.options にずらずら基本的なことを書いていきます。

options {
   directory "/var/cache/bind";

/*
   forward first;
   forwarders {
       123.45.67.88;
       123.45.67.89;
   };
*/
   auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { none; };
    listen-on {
     127.0.0.1;
     192.168.55.5;
   };

    max-cache-size    64000000;
   allow-recursion {
     127.0.0.0/8;
     192.168.0.0/16;
   }

まぁこんなかんじです。

上から簡単に説明します。

directory はデフォルトのままです。

forward を使えとかありますが、自分の場合 ISP の DNS が気に食わないから自分で DNS キャッシュ立てるというこが主です。
常時稼動させるなら forward ないほうが快適な場合があります。

forward はオライリーの Bind 第四版を持ってるのでそれで知りました。

first の場合はクエリがきたとき、自分(bind)が知らないものはまず最初に forwarders に問い合わせて、forwarders も知らない(応答しない)場合は自分でルートサーバから再帰的に検索をして解決するという動作になります。

only の場合は first の動作のうち、自分で解決せず forwarders で解決できなかったらそこで終了となります。
つまり ISP の DNS を forwarders に指定する場合は first でも only でも動作はいっしょです。
理由は ISP の DNS は再帰的に検索するからです。
むしろ、first を指定すると解決できないものを自分で解決しようとするので余計に時間がかかります。

no の場合は全部自分で解決する、となります。bind 起動直後だとキャッシュがまったくない状況ですので遠くヨーロッパの DNS サーバに問い合わせたりすることがあるので、
体感速度は最悪になります。常時稼動のサーバなら特に問題にならないはず。
ただし DNS キャッシュサーバを使うマシンが少ない(問い合わせクエリが少ない)場合はそのたびごとにそのドメインの解決をルートサーバから開始するので ISP の DNS を使ったほうがいいでしょう。
自分で DNS をたてたときのメリットは ISP の DNS が調子いいのであれば、同じ問い合わせを何度も繰り返すような環境で RTT が ISP の DNS より短くなる点だけです。

説明がヘタクソなのでわかりづらいですが、ISP の DNS はたいてい東京にあるので、大阪や石川に居る自分の場合は ISP の DNS にキャッシュがある状態で 15ms から 40ms もかかります。もし、このクエリをキャッシュしている自分の DNS があれば 1ms 以下で問い合わせ完了することになります。10ms で帰ってくるとして 1000クエリの問い合わせがあれば 10000ms =  10 秒にもなります。
(リバースプロキシ使う場合は自分の DNS ないと不便ということもあると思います)

話を戻して、listen-on が Bind が bind する IP です。ホント、Bind って名前ダメですよねぇ。

max-cache-size というのはキャッシュする上限です。
これを設定しない場合は bind はメインメモリが足りなくなってもキャッシュし続けます。
TTL が先に切れる場合が多いのでそんな状況にはめったになりませんが、内側からの攻撃でなる可能性があるので設定しといたほうがいいでしょう。
この場合 64MB を上限としています。
また、max-cache-size はどうやって削除するキャッシュを選別しているかというのはオライリーの Bind の本にかいてあったと思います。
(たしか古いキャッシュの TTL を勝手に削減して削除する、というやり方だったと思います。)

allow-recursion は再帰問い合わせを許可するネットワークという設定です。これは非常に重要です。
再帰問い合わせというのは要は DNS キャッシュのことです。
server.zone.com はインターネットからの問い合わせに答えるので、
これを設定しない場合は zone.com 以外の zone (www.yahoo.com とか) の問い合わせに対しても再帰的に検索して結果を返してしまいます。
(ISP によっては自分の ISP 以外のクライアントからも再帰問い合わせを許可している場合が結構ありますが、
あれはちゃんと DNS サーバの管理者が居るということだとおもいます。)

Bind9 View の設定

やっとここまできた。これが書きたかったところで、内側(192.168.55.0/24)からの問い合わせとそれ以外の外側からの問い合わせで返す結果を変えるところです。
これもオライリーの Bind の本に書いてあったとおりです。

まずは /etc/bind/named.conf を設定します。

include "/etc/bind/named.conf.options";

acl localnet {
  127.0.0.0/8;
  192.168.0.0/16;
};

view "internal" {
   match-clients { localnet; };

   // prime the server with knowledge of the root servers
   zone "." {
     type hint;
     file "/etc/bind/db.root";
   };
   zone "localhost" {
     type master;
     file "/etc/bind/db.local";
   };
   zone "127.in-addr.arpa" {
     type master;
     file "/etc/bind/db.127";
   };

 zone "168.192.IN-ADDR.ARPA" {
 type master;
 file "/etc/bind/db.192.168";
 };
 zone "zone.com" {
 type master;
 file "/etc/bind/db.zone.com";
 };

}
view "external" {
  match-clients  { any; };
  zone "zone.com" {
    type master;
    file "/etc/bind/external.db.zone.com";
    allow-transfer {
      92.243.14.172; 195.234.42.1; 87.98.164.164; 88.191.64.64;
    };
  };
};

view “internal” ちょっとはちょっと端折ってるので、注意してください。なくても動作に問題なかったと思いますが一応。

acl で localnet という内側からの問い合わせようのアクセスコントロールリストを作ります。

View は便利でして、このように match-clients でそれぞれ zone の使い分けができる、という機能です。

この場合、 /etc/bind/db.zone.com には server IN A 192.168.55.5 というレコードが、/etc/bind/external.db.zone.com には server IN A 123.45.67.89 といったグローバル IP が書かれているとすれば、内側からの問い合わせは 192.168.55.5 、外側からの問い合わせは 123.45.67.89 という結果になります。

また、セカンダリ DNS 用に allow-transfer を設定しています。xname.org. をセカンダリで使う場合は上記のようになるはずです。
これがないとセカンダリ DNS の AXFR 等の問い合わせに応答しなくなるのでセカンダリ DNS 側が困ってしまいます。

手抜きでごめんなさい。

複数のゲートウェイを使い分ける

月曜日, 7月 13th, 2009

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

自分の場合は以下のようにゲートウェイが 3 つあるので、これを使い分けたい。

その前に備忘録として 6/17 落雷での障害についても書いておく。

摂津国ネットワーク

摂津国ネットワーク

6/17 の落雷の際、上記ネットワークの設備とサーバにしていたパソコンすべて停止してしまいました。
一番重要なゲートウェイ maro と ReJEC.NET のマシン CO2 は幸い素直ち立ち上がり、現在も異常なく稼動中です。

ところが、ゲートウェイ・chirokichi とゲートウェイ F100 の起動および動作は確認できたものの、
SUZUME が一晩経過しても SSH や HTTP 等に反応せず、OS 起動時点かハードウェア的にトラブルが発生したと思われます。
(RAID5 のリビルドに失敗したのかもしれない)

落雷が起きた 2 週間ほど前(~5/31)に VALUE-DOMAIN 提供の DNS が非常に調子が悪く(ns[1-3].value-domain.com の 3 台同時に応答しないことが多々発生していた)、
ReJEC.NET にも相当影響があったので SUZUME 上に構成していた内向け DNS サーバを ReJEC.NET の DNS サーバとして利用を開始しました。
(セカンダリ DNS は xname.org を使用してます)
したがって、CO2 復旧直後に再度 DNS サーバを ns[1-3].value-domain.com に書き換えたものの、
反映にはしばらく時間がかかると思われたので加賀国のフレッツを用いて障害発生のメッセージを出すことにしました。

時間はマシン起動をしてもらった頃に戻ります。

固定 IP なのは chiyokichi のみであり、maro と F100 が迷子になった時は chiyokichi 経由で CO2 へ、そして maro へアクセスして対応する予定でした。
maro と F100 は落雷で停止して 6 時間以上も経過したので非常に高い確率で落雷前と異なる IP が割り当てられたと予想されました(実際にそうだったようです。
今回 SUZUME が停止してしまったので、どうにかして maro の IP を知る必要がでてきました。

そもそも maro の IP を知ることができても CO2 も SUZUME のように立ち上がってない可能性があります。
幸い CO2は「(HDD アクセスを示す)赤いランプがさっき(起動後数分)消えた」という情報が入ったので CO2 は正常に立ち上がった可能性が多少ありました。
(SUZUME は電源が入るが HDD アクセス中のランプが常時店頭状態でなおかつ HDD のアクセス音が聞こえず回転音しかしない状態)

CO2 から外部のサーバに定期的に通信しているプログラムがいくつかあったと思うのですが、
IP アドレスがわかりそうなものは SUZUME に対するヘルスチェックくらいだったので、とりあえず IP アドレス総当りでプログラムを走らせておくことにしました。
(経験的に eo 1Gbps(GE-PON) は 58.188.0.0/16 の範囲で IP が割り振られるので最悪でも 65536 で IP がわかる予定だった。
ところが、eo の GE-PON エリア拡大により、IP が足りなくなったのか 119.230.0.0/16 が今後 1Gbps 用に変化したらしいことに気づいてなかったので意味内。)

とりあえず、Gmail に cron ジョブの一部を転送するようにしていたのでこのヘッダを見てみたらよかった、ちゃんと maro の IP が記録されてた。
Co2 は復旧後せっせとメールを一生懸命いつものように Gmail へ転送してくれてたようだ。

Gmail メールのヘッダ

Gmail メールのヘッダ

maro の IP

maro の IP

ということで、ようやく本題である複数のゲートウェイを使い分けるに入る。

SUZUME は起動しないので遠隔から復旧作業をするのは非常に面倒というか困難なので早々にこれはあきらめた。
なので DNS だけを CO2 上にもってくる。

もうわかってると思うが、Gigabit ハブが足りないので、セキュリティ上イマイチだとはおもったがすべてのゲートウェイとサーバは同じハブ上につながっている。
なので、一番上の画像と異なり CO2 から chiyokichi や F100 を使うことが可能である。
(まぁ SUZUME が停止するという自体を想定していた、というのもあるけどむしろ逆で年齢的に CO2 (推定 6 歳)が停止することはあっても SUZUME(2 歳) が停止することはないだろう、と思ってこうしていた)

CO2 を Vserver 化してしまうのが一番の方法であるが、kernel が立ち上がらない最悪の状況は避けたいので eth0 の Alias を手動でつくって対応する。

ということで、/etc/network/interfaces に eth0:1 (chiyikichi と DNS 用。192.168.3.0/24)を作成する。
なお事前に iproute2 をインストールしておくこと。

auto eth0:1
iface eth0:1 inet static
  address 192.168.3.30
  netmask 255.255.255.0
  up ip route add 192.168.3.0/24 dev eth0 table 100
  up ip route add default via 192.168.3.32 dev eth0 table 100
  up ip rule  add from 192.168.3.30 table 100

これで ifup eth0:1 として立ち上げる。
/sbin/ifconfig 、ip route show 、route 、ip rule show 等で確認する。

また、ついでに F100(192.168.6.0/24) の転送量無制限回線も使いたいのでこれも使用する。
この BLOG はまさに F100 を経由して通信してたりする。

auto eth0:2
iface eth0:2 inet static
  address 192.168.6.30
  netmask 255.255.255.0
  up ip route add 192.168.6.0/24 dev eth0 table 110
  up ip route add default via 192.168.6.1 dev eth0 table 110
  up ip rule  add from 192.168.6.30 table 110

auto eth0:3
iface eth0:3 inet static
  address 192.168.6.31
  netmask 255.255.255.0
  up ip rule  add from 192.168.6.31 table 110

auto eth0:4
iface eth0:4 inet static
  address 192.168.6.29
  netmask 255.255.255.0
  up ip rule  add from 192.168.6.29 table 110

これもまぁ見たとおりだけど、eth0:2 がリバースプロキシ、eth0:3 が画像用サーバ(未完成)のIP、eth0:4 がコンテンツサーバ(停止中)のIP である。

うーん。やっぱり自分の文章意味わからんなぁ。

Debian で iSCSI Target を作って Windows XP で利用する

金曜日, 7月 10th, 2009

以前 Opensolaris で同様のことをしたときは書き込みが遅く、NIC が落ちるということで実用にはちょっと遠いものでした。
書き込みが遅いのは設定不足の可能性が高いですが、調べるのが大変なので OS を変えて試してみることにします。

マシンは前と同じ USUGUMO 君です。OS は Debian amd64 の Lenny です。
そろそろ Squeeze に移行したいところですが、7/6 版前の版の Squeeze インストーラは LVM 上のボリュームのフォーマットができなかったり、
7/6 版(最新)のインストーラでも ext4 は選択肢にあるのにフォーマットできずに使えないなどまだインストーラーはイマイチ感があります。
また、Lenny インストール後に Squeeze にする方法が一般的ですが、新規ディレクトリが作成しようとすると「空き容量が足りません」(新しくファイルは作成できます)という奇妙な状況になるので Lenny で辛抱します。

Kernel は Vserver patch を適用した Debian 標準 Linux Vserver kernel (2.6.26-2) です。
2.6.30.1 の手動コンパイルだと iscsitarget モジュールのコンパイルがなんだかうまくいかなかったのであきらめた。

iscsitarget モジュールとツールを入れる

これは簡単です。さすが Debian というところでしょう。

# aptitude install iscsitarget iscsitarget-modules-2.6-vserver-amd64
iscsitarget を作る

これも簡単です。さすが iSCSI というところでしょう。
Opensolaris の時は気づいてなった CHAP 認証をしたほうがよさそうなのでそうします。

ちょっと見づらいですが、こちらの記事を参考にしました。

パーティションのほうは md ドライバの RAID5 の 240GB(/dev/md0 => /dev/vgraid/lvraid) と、残りの空き容量をつめこんだ 830GB(/dev/largepool/pool1) の単純な LVM があるのでそれを使います。

できあがった /etc/ietd.conf は以下です。

iSNSServer 192.168.5.10
#iSNSAccessControl No

#IncomingUser joe secret
IncomingUser daredemoii 123456789012
OutgoingUser daredemoii 123456789012

#Target iqn.2001-04.com.example:storage.disk2.sys1.xyz
Target iqn.2009-07.usugumo.quilva.jp:storage.disk1
Lun 0 Path=/dev/largepool/pool1,Type=fileio

Target iqn.2009-07.usugumo.quilva.jp:vgraid.lvraid
Lun 1 Path=/dev/vgraid/lvraid,Type=fileio

IncomingUser と OutgoingUser のパスワードは 12 文字必要なようです。

Target は適当です。iqn.西暦-月.ホスト名:わかりやすいように物理的なパーティション名 というかんじにしました。
そして、Target の次の行に書く Lun で実際のパーティションと結びつけるようです。

Lun [0-9] Path=パーティション,Type=fileio
Windows XP でマウント

前の記事と同じなので割愛します。
ただし、今回は CHAP 認証するので Discovery の Add の Advanced で以下のように IncomingUser と OutgoingUser で設定したものを指定します。

WindowsXP iSCSI-Initiator CHAP

WindowsXP iSCSI-Initiator CHAP

ベンチマーク

前の記事のベンチマークと比較します。

まずは、RAID5 でない普通のパーティションの HdTune を。

ISCSI 普通のパーティション

ISCSI 普通のパーティション

普通ですね。これなら実用十分です。Opensolaris のときはシークが異常に早く、LAN の RTT とほぼ同等になっていたのが、今回 HDD のシーク時間とほぼ同じになってます。
よくわかりませんが、ZFS はすごいってことかもですねぇ。

次にシーケンシャルライト速度目的の CrystalDiscMark を。

largepool CrystalDiscMark

largepool CrystalDiscMark

速いですねぇ。実際の HDD より速いので、やはりメモリに載ってしまってるので読み込みは単なる netperf 状態です。
ただし、書き込みはZFS のときは書き込み速度が遅すぎであまり起こらなかった pdflush しまくるので、実際の速度に近いです。それでもメモリにだいぶ載ってるので実際に使ったときより数値良いです。

実際に使ってる状況では pdflush がぜんぜん間に合わないので、LA が 7 近く行きます。
この状態で書き込み速度は 30MByte/s くらいです。(=追記7/11 3:43= MDraid5 のほうのパーティションは 38MB/s と速い。内外周の影響かな?)

メモリに載り切らないと LA 跳ね上がる

メモリに載り切らないと LA 跳ね上がる

もちろん io だけの話なので、LA の数値ほどマシンが重くはありません。むしろ CPU はあまりまくってるので io 使わない場合は普通の状態といっしょです。

おまけとして、md ドライバで作った RAID5 パーティションのベンチものせます。

md-driver RAID5 iscsi Hdtune

md-driver RAID5 iscsi Hdtune

Hdtune は読み込みのみなので、さきほどの普通のシングルパーティションとかわりありません。
シークが早くなってるのは、シークがベンチ上では遅い P7K500 の影響が減ってるからでしょう。

CrystalDiskMark は以下です。やはり、md5 のパリティ演算とその pdflush に相当足をひっぱられてます。

mdraid5

mdraid5

結論として、チューニングなし状態であれば Opensolaris の iscsitarget よりは Debian の iscsitarget のほうがよさそうです。
特に書き込みが起こったときはさっさと pdflush してしまうっぽいので安心感あります。

また、2.6.26.2 の RTL8111C@R8169driver は20 分ほどダラダラ 200Mbps ほどで通信させてますが特に不具合ないです。まぁ多分そのうち落ちる気がする。

Opensolaris(2009.6) x86(amd64) のインストールと ZFS + iscsi Target を作って Windows XP で使用する

土曜日, 7月 4th, 2009

USUGUMO 君に Opensolaris 2009.6 amd64 を入れる。
日本語が変だし、単なる作業ログなので読んでも全く面白くないと思います。

USUGUMO の性能は以下です。

名前 USUGUMO.quilva.jp
CPU Phenom 9950@2.8GHz
Memory DDR2 PC-6400 2GB*2=4GB 5-5-5-15
M/B Jetway HA7-ULTRA
NIC on-board RTL8111C
HDD WesternDigital WD32000AAKS-B3A (7200rpm 320GB)
HDD2 HGST P7K500
HDD3 Seagate Barracuda 7200.10 ST3500320AS (7200rpm 500GB)

このマシンの致命的な欠点は NIC でして Linux の場合は kernel のバージョンに関係なく負荷をかけると落ちます。 (NIC を認識しなくなります)
ドライバが R8169 なのでこれが原因の可能性がありますが、Realtek が提供している R8168 はインストール方法がイマイチわからなかったのであきらめた。

大学院は Linux よりも Solaris [8,9,10] のほうが触れる機会が多いので、今回は Opensolaris をインストールしてみる。
Opensolaris のバージョンは最新の 2009.6 です。

Opensolaris 2009.6 のダウンロード

自分のマシンは amd64 なので amd64 のイメージを探しましたがないようです。
どうやら、x86 のイメージは amd64 としても使えるようなので x86 のイメージを使用します。

ここからダウンロードできます。

Opensolaris 2009.6 Live iso ダウンロード

Opensolaris 2009.6 Live iso ダウンロード

CD-R に焼き付けます。

boot させると自動で X が立ち上がります。

USER jack PASSWORD jack、ROOT root PASSWORD opensolaris だったと思うので、それでログインして、デスクトップにある「install solaris」みたいなアイコンからインストールします。

できれば、ZFS の raidz 上にインストールしたかったのですが GUI のインストールからはできなさそうなのと、CUI のインストール方法が全くわからないのであきらめました。

IP アドレスを固定する

X と gnome が勝手に入ってしまうのですが、これは入っててもパフォーマンスが悪くなるくらいなのでとりあえずあきらめる。

IP アドレスは DHCP で取ってきてくれるようです。
SSH はデフォルトで有効になっています。

DHCP では困るので、IP アドレスを固定化します。

OpenSolaris 固定IP – @//メモ を参考にさせてもらいました。

nwam とかいうデーモンがネットワーク関係を管理してるようなのでこれを停止させて手動で設定できるようにします。

また、「svcadm disable svc:/network/physical:nwam」を実行したときネットワークが使えなくなるので SSH から作業しないほうがいいと思います。

# svcs svc:/network/physical
STATE          STIME    FMRI
disabled        0:00:00 svc:/network/physical:default
online          0:00:00 svc:/network/physical:nwam

# svcadm disable svc:/network/physical:nwam
# svcadm enable svc:/network/physical:default

# svcs svc:/network/physical
STATE          STIME    FMRI
disabled        0:00:00 svc:/network/physical:nwam
offline          0:00:00 svc:/network/physical:default

名前解決を DNS でさせる為に以下を実行します。

# cp /etc/nsswitch.conf /etc/nsswitch.conf.bak
# cp /etc/nsswitch.dns /etc/nsswitch.conf

DNS サーバを設定します。Linux と同じです。
自分の場合はルータが DNS キャッシュサーバなので 192.168.5.1 にしました。

エディタは vi か nano が入ってるようなので、これを使用します。この程度だったら nano のほうが楽かも。

# vi /etc/resolv.conf
domain quilva.jp
search quilva.jp
dnsserver 192.168.5.1

IP アドレスを指定します。
このファイルは自分の場合存在しなかったので、新規作成になります。

# vi /etc/hostname.rge0
192.168.5.10

この最後の rge0 というのはネットワークデバイスの名前です。
当たり前かもしれませんが以下より調べれます。

# /sbin/ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
rge0: flags=1000843 mtu 1500 index 2
        inet 192.168.5.10 netmask ffffff00 broadcast 192.168.5.255
        ether 0:30:18:**:**:**

ネットマスクを設定します。自分の場合は書き換え不要でした。

# vi /etc/netmasks
192.168.5.0 255.255.255.0

デフォルトゲートウェイを設定します。

# vi /etc/defaultrouter
192.168.5.1

これで、IP アドレスは固定になった。

ZFS pool を作る

Linux と比較してですが、パーティションの作成が非常に面倒に感じました。

現在 HDD は以下のようになってます。

c7t0d0 |     40GB(system)    |  260GB 開き領域   |
c7t1d0 |                  500GB 開き領域         |
c7t2d0 |                  500GB 開き領域         |

これを以下のようにします。

c7t0d0 | p1 40GB(system)  |  p2 80GB raidz 用         |  p3 残り全部 largepool 用  |
c7t1d0 | p1 80GB raidz 用 |  p2 残り全部 largepool 用                              |
c7t2d0 | p1 80GB raidz 用 |  p2 残り全部 largepool 用                              |

コマンドは format コマンドからやるのが良いようです。
まず、c7t0d0 (320GB) からやります。ここは現在 OS 動いている HDD であるので特に慎重に作業します。

format コマンドを打つと以下のようなものがでてくるので 0 を選択します。

# format
earching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c7t0d0
          /pci@0,0/pci1002,4391@11/disk@0,0
       1. c7t1d0
          /pci@0,0/pci1002,4391@11/disk@1,0
       2. c7t2d0
          /pci@0,0/pci1002,4391@11/disk@2,0

Specify disk (enter its number): 0

すると、以下のようなメニューがでてきます。ここで fdisk と入力します。

selecting c7t0d0
[disk formatted]
/dev/dsk/c7t0d0s0 is part of active ZFS pool rpool. Please see zpool(1M).

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !     - execute , then return
        quit
format> fdisk

こんな画面になります。

             Total disk size is 38913 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    Solaris2          1  5222    5222     13

SELECT ONE OF THE FOLLOWING:
   1. Create a partition
   2. Specify the active partition
   3. Delete a partition
   4. Change between Solaris and Solaris2 Partition IDs
   5. Exit (update disk configuration and exit)
   6. Cancel (exit without updating disk configuration)
Enter Selection:

新しくパーティションを作るので、1 を選択して、あとは表示されてるメッセージを読みながら進めます。

Enter Selection: 1

Select the partition type to create:
   1=SOLARIS2  2=UNIX        3=PCIXOS     4=Other
   5=DOS12     6=DOS16       7=DOSEXT     8=DOSBIG
   9=DOS16LBA  A=x86 Boot    B=Diagnostic C=FAT32
   D=FAT32LBA  E=DOSEXTLBA   F=EFI        0=Exit?1
c
5223
8913

なんとか raidz 用の 80GB くらいのパーティション作成できました。

             Total disk size is 38913 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1                  Solaris2          1  5222    5222     13
          2       Active    Solaris2       5223  14135    8913     23

続いて、largepool 用の残り全部を partition 3 に割り当てます。

特に「残り全部」という割り当て方がわからなかったので、シリンダサイズ(38913)から 14135 を引いた値よりさらに 1 ひいたものにしました。
完了するとこんなかんじになります。

             Total disk size is 38913 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1                 Solaris2          1  5222    5222     13
          2                 Solaris2       5223  14135    8913     23
          3     Active    Solaris2       14136  38912    24777     64

ここが重要なところで、Active がPartition 3 に来ているので、
このまま fdisk を終了させると次回 Solaris が起動しないという悲しいことになりますので、
2. Specify the active partition を選択して、Partition 1 が Active になりようにします。

             Total disk size is 38913 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    Solaris2          1  5222    5222     13
          2                 Solaris2       5223  14135    8913     23
          3                 Solaris2       14136  38912    24777     64

これでようやくパーティショニング完了です。この記事で一番めんどくさいところでした。

ZFS pool を作る

_・)Keep Smiling -微弱電波-: ZFSでRAID-Zを構築 を参考にさせてもらいました。

まず、raidz の ZFS pool を作ります。c7t1d0 というのが HDD で、p[0-9] がパーティションの番号です。

# zfs create raid raidz c7t0d0p2 c7t1d0p1 c7t2d0p1

完了です。ただし今回の記事で raidz のパーティションは使わないのでこれにて終了。

次に iscsi target 用の ZFS pool の largepool を作ります。

# zfs create largepool c7t0d0p3 c7t1d0p2 c7t2d0p2

zfs list や zpool list で確認して完了です。

ZFS で iscsi Target を作る

Solaris iSCSI Target/Initiator : やっぱり Sun がスキ! を参考にしました。
かなり丁寧にわかりやすく書かれてます。

まず、iscsi target が動いてるか確認します。

# svcs -a | grep iscsi
disabled       21:20:36 svc:/network/iscsi_initiator:default
disabled       21:20:48 svc:/system/iscsitgt:default

となるそうですが、自分の場合は以下のように何もでませんでした。
つまり、iscsi target が動いていないどころか iscsi target がインストールされてません。

# svcs -a | grep iscsi

なので、iscsitadm をインストールします。
このブログの記事より、iscsitgt というのがそれっぽいので、そのパッケージをあてずっぽうでやったらインストールされたので、合っているようです。

# pkg install SUNWiscsitgt
かなり時間かかる

インストールすると、以下のようになりました。

# svcs -a | grep iscsi
disabled       21:20:48 svc:/system/iscsitgt:default

まだ、iscsi-initiator がないので、これもインストールします。
これもあてずっぽうで SUNWiscsi とやったら入ったので正解のようです。

# pkg install SUNWiscsi
かなり時間かかる

ようやく、以下の状況になりました。

# svcs -a | grep iscsi
disabled       21:20:36 svc:/network/iscsi_initiator:default
disabled       21:20:48 svc:/system/iscsitgt:default

これで、先ほどの丁寧にかかれている記事と Target 作成までは全く一緒なので割愛します。

ただし「1. 2G バイトのファイルを作成し、zfs 領域を作成」とありますが、
自分の場合は先ほど作成した largepool がそれにあたるので、こから 900GB 切り出して使用しました。

# zfs create -V 900gb largepool/vol
# zfs list
NAME                       USED  AVAIL  REFER  MOUNTPOINT
largepool                  900G  65.7G    19K  /largepool
largepool/vol              900G   957G  8.25G  -
iscsi Initiator を立ち上げる

Solaris iSCSI Target/Initiator : やっぱり Sun がスキ! の続きです。

iscsi initiator を有効化します。

# svcs -a | grep iscsi
disable       16:58:57 svc:/network/iscsi_initiator:default
online         16:59:11 svc:/system/iscsitgt:default

# svcadm enable iscsi_initiator
# svcs -a | grep iscsi
maintenance   16:58:57 svc:/network/iscsi_initiator:default
online            16:59:11 svc:/system/iscsitgt:default

なんじゃこりゃ、online にならずに maintenance という状態になりました。

iscsiadm list initiator-node を実行するとエラーになるので、困りました。

とりあえず再起動したら、online になりました。
再起動は shutdown -g0 -i6 -y とするそうです。shutdown -r now だとダメだった。

残りは先のわかりやすい記事どおりです。

Windows XP から iSCSI を使う

夜更かし日記 – iSCSIターゲット作成 , iSCSIイニシエータで接続テスト この記事を参考にさせてもらいました。

microsoft より iSCSI Initiator をダウンロードしてインストールします。
ダウンロードで手間取ることが個人的に結構あるので SS 載せます。

Windows iSCSI Initiator ダウンロード 1

Windows iSCSI Initiator ダウンロード 1

Windows iSCSI Initiator ダウンロード 1

Windows iSCSI Initiator ダウンロード 1

XP 32bit を使ってるので、x86 をダウンロードします。

Windows iSCSI Initiator ダウンロード 3

Windows iSCSI Initiator ダウンロード 3

あとは記事どおりやればすんなり iSCSI target を認識します。
なんだかすごい。

ベンチマーク

共有 HDD で NTFS は大丈夫なのか心配ですが、Windows からなら仕方ないので、NTFS でフォーマットします。

フォーマット

フォーマット

フォーマットして、ファイルを書き込んでたらやはりNIC が認識しなくなりました
RTL8111C やっぱりだめだねぇ。
ついでに書いておくと、コイル鳴きもかなりひどいです。ピシィピシィという音ががんがん響いてます。

一応遅いけど、各種ベンチマークを載せておく。

HdTune は以下。 SUN SOLARIS と出るのはかっこいいっす。
まぁ、ベンチ結果はアテになりません。実測書き込み 22MByte/s、実測読み込み 40MByte/s が上限っぽいので、HdTune のバーストレートは正しい気がする。

HDTune 1 回目

HDTune 1 回目

HDTune 2 回目

HDTune 2 回目

Crystal DiskMark は以下。これはもっとダメダメです。
テストがメインメモリのディスクキャッシュに納まるサイズなので、ほんとに意味ないです。
まぁ、書き込みはより悪くなってる。

iscsi-bench-crystaldiskmark

iscsi-bench-crystaldiskmark

まぁこんなもんですかねぇ。RTL8111C はどうしようもない。

Linux Samba だと RTL8111C が落ちるのを除いて、書き込み読み込みとも 500Mbps くらいは出たので性能で行くなら Samba ですねぇ。
iSCSI だとローカルディスクと全く同等に使えるのは非常に良いんですけどねぇ。

とりあえず、Opensolaris さっぱりわかなくて大変です。

ルートファイルシステムに ext4 を使うときの GRUB の設定

水曜日, 7月 1st, 2009

うーんタイトルが…。自分の日本語能力に嫌気がしますねぇ。

ファイルシステムの構造は以下のような場合を想定します。

/boot
ext3
/
ext4

この場合、GRUB が「/」(ルートパーティション) のファイルタイプを識別できず、OS が立ち上がらない問題があります。

記憶では、GRUB 2.0 だと ext4 も認識するので、問題ありませんが、Debian の GRUB は古い(安定してる)ので、
手動で「/」のファイルタイプを与える必要があります。

あまり最近調べてないので状況がわかりませんが、設定してても問題ない気がするので書いておく。

また、lenny で入ってる GRUB は以下です。おそらく、この記事の設定が必要です。

% dpkg --list | grep grub
ii  grub                                0.97-47lenny2
ii  grub-common                         1.96+20080724-16

設定方法は簡単で、GRUB の kernel の行に rootfstype=ext4 を追加するだけです。

# emacs /boot/grub/menu.lst
title           Debian GNU/Linux, kernel 2.6.30-amd64
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.30-amd64 root=/dev/sda5 ro
initrd          /boot/initrd.img-2.6.30-amd64

ほとんどの場合、こんなかんじになってるはずなのでこれを以下のようにします。

# emacs /boot/grub/menu.lst
title           Debian GNU/Linux, kernel 2.6.30-amd64
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.30-amd64 root=/dev/sda5 ro rootfstype=ext4
initrd          /boot/initrd.img-2.6.30-amd64

これだけ。

また一つ注意する注意することがあります。
Debian の場合、grub-update か update-grub が走ったとき(どっちか忘れた)、rootfstype=ext4 が消えるので、
update-grub か grub-update が走ったときは毎回 rootfstype=ext4 を追加しないといけません。

これは、どうしたらいいんでしょうね。

Debian で Linux Vserver を使う

火曜日, 6月 30th, 2009

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 の場合は囲んだやつがそうなります。