2009年12月26日土曜日

erlangのR13B03から erl_nif が追加されたみたいだが、まだ、experimental
http://www.erlang.org/doc/man/erl_nif.html

これとは違うのかな?
http://www.erlang.org/eeps/eep-0007.html

2009年11月29日日曜日

erlangの非同期ドライバーのコードを追う

http://groups.google.co.jp/group/simple_index/web/091128--index23 のコピペと続き

1. 初期化
1-1. DRIVER_INIT - erl_ddll:load_driver/2

DRIVER_INIT は erl_ddll:load_driver/2 を読んだときに、初期化のために呼ばれる。ライブラリの関数のエントリポイントを返す。
DRIVER_INIT(example_drv) /* must match name in driver_entry */
{
return &example_driver_entry;
}


ErlDrvEntryには、関数ポインタがセットされている。

* init: load_driverで呼び出される。
* start: open_portで呼び出される。
* stop: close_port で呼び出される。
* output: データをportに送ったときに呼ばれる。

erlang側では Port ! {self(), {command, Data}}, または port_command/2 を使う。
-----
This is called when an erlang process has sent data to the port. The data is pointed to by buf, and is len bytes. Data is sent to the port with Port ! {self(), {command, Data}}, or with port_command/2. Depending on how the port was opened, it should be either a list of integers 0...255 or a binary. See open_port/3 and port_command/2.
----

* ready_async: C側から driver_asyncを実行するとready_asyncに結果が渡される。

参考:
http://www.erlang.org/doc/man/driver_entry.html

1-2. start - open_port

以下の例では、spawn したプロセス内でportをオープンし、ループに入っている。
Portは startで作成したErlDrvDataのhandleを保持している。

init(SharedLib) ->
register(complex, self()),
Port = open_port({spawn, SharedLib}, []),
loop(Port).

2.関数呼び出し

サンプルだと static void example_drv_output(ErlDrvData handle, char* buff, int bufflen) に

Port ! {self(), {command, Data}}

からメッセージを渡す。

C側では Data をbuffにセットしてoutputにセットされた関数が呼び出される。

static void example_drv_output(ErlDrvData handle, char* buff, int bufflen)
{
example_data* d = (example_data*)handle;
our_async_data* a = (our_async_data*)malloc(sizeof(our_async_data));
a->fn = buff[0];
a->arg = buff[1];
driver_async(d->port, NULL, example_drv_foobar, a, free);
}


最後にhandleをexample_dataにキャストし、portを取り出し、実行する関数と引数をセットしてdriver_asyncを実行している。

drive_asyncについて詳細はこちら
http://www.erlang.org/doc/man/erl_driver.html

long driver_async (ErlDrvPort port, unsigned int* key, void (*async_invoke)(void*), void* async_data, void (*async_free)(void*))

これは、erlangのエミュレータとは別のthreadで実行される。erlangはデフォルトではスレッドプールなしで起動されるので、スレッドプールの数を指定するときは、+Aの引数でスレッド数を指定してエミュレータを起動する。

key がNULLだとスレッドはラウンドロビンで使われるが、keyを指定すると同じkeyの場合は同じスレッドが使用される。

これの、async_invokeで指定された関数が終了すると、ready_async にセットした関数が呼び出される。
async_freeはasyncの処理がキャンセルされたときに呼び出される。

ready_asyncにはhandleとdataが渡されるのでそれぞれキャストしてportと結果をそれぞれ取り出しdriver_outputで結果をerlangに返す。


static void ready_async(ErlDrvData handle, ErlDrvThreadData async_data)
{
example_data* d = (example_data*)handle;
our_async_data* a = (our_async_data*)async_data;

driver_output(d->port, &(a->res), 1);
free(a);
}


---------
以下はerlang側のコード

-module(complex5).
-export([start/1, stop/0, init/1]).
-export([foo/1, bar/1]).

start(SharedLib) ->
case erl_ddll:load_driver(".", SharedLib) of
ok -> ok;
{error, already_loaded} -> ok;
_ -> exit({error, could_not_load_driver})
end,
spawn(?MODULE, init, [SharedLib]).

init(SharedLib) ->
register(complex, self()),
Port = open_port({spawn, SharedLib}, []),
loop(Port).

stop() ->
complex ! stop.

foo(X) ->
call_port({foo, X}).
bar(Y) ->
call_port({bar, Y}).

call_port(Msg) ->
complex ! {call, self(), Msg},
receive
{complex, Result} ->
Result
end.

loop(Port) ->
receive
{call, Caller, Msg} ->
Port ! {self(), {command, encode(Msg)}},
receive
{Port, {data, Data}} ->
Caller ! {complex, decode(Data)}
end,
loop(Port);
stop ->
Port ! {self(), close},
receive
{Port, closed} ->
exit(normal)
end;
{'EXIT', Port, Reason} ->
io:format("~p ~n", [Reason]),
exit(port_terminated)
end.

encode({foo, X}) -> [1, X];
encode({bar, Y}) -> [2, Y].

decode([Int]) -> Int.

2009年10月12日月曜日

IPnutsでKVM

ここの続き
http://groups.google.co.jp/group/simple_index/web/090926-index21


x86dではなくて v86dの誤り。

パッケージを作った。

# lrp_load -ab v86d

# mkdir /disk
# mount /dev/sdb1 /disk
# cd /disk/kvm
# kvm -k ja -hda winxp.img -boot c -m 512

fbsetでframebufferの解像度も変えられる。

# lrp_load -ab fbset
# fbset -xres 1024 -yres 768 -depth 24

いつもどおり設定変更
# save_conf

windowsは、起動してから解像度を変更できた。

2009年7月1日水曜日

シェルのスクリプトに--dry-runのオプションを追加

ロングオプションをシェルに追加するときのメモ

--dry-runのオプションだけつけたかったのだが、getoptに' -o ""'がないとちゃんと動作しなかった。


#!/bin/sh

args=`getopt -o "" -l dry-run -- $@`
DRYRUN=

eval set -- "$args"

until test $1 = "--"
do
case $1 in
--dry-run)
DRYRUN="--dry-run"
;;
esac
shift
done

if test "$DRYRUN" ;then
echo "starting XXXXX(y/N):"
else
echo "dry-run XXXXX(y/N):"
fi

read a
if [ "x$a" = xy -o "x$a" = xY ] ;then
:
else
exit
fi

...(実際の動作)

2009年6月30日火曜日

スナップショット使用してMySQLの動作している仮想サーバをバックアップ

以前、IPnutsでvserverを使った仮想サーバのバックアップについて、ディスクの構成を中心にして紹介しました。
仮想サーバのバックアップ(その1)
仮想サーバのバックアップ(その2)
仮想サーバのバックアップ(その3)

この時は、まだLVMを使ってなかったので、スナップショットは使わずにバックアップをとっていました。

その後、ディスクが故障したためミラーリングしたディスク上でLVMを作成し、使用するように変更しました。

ミラー上にLVMを作る

また、他のサーバも移行してきました。

Pylonsの仮想環境を仮想マシンに移行する
Pylonsの仮想環境を仮想マシンに移行する(2)

しばらく、バックアップは以前のままでしたが、これだと、バックアップのときのダウンタイムが長くなります。そこで、せっかくLVMにしているのでスナップショットを利用して、ダウンタイムがほとんどなくなるようにスクリプトを書き直しました。

vserverの仮想サーバが2台分動作しています。非効率ですが、他のサーバから単純に移行したものなのでMySQLのデータベースもそれぞれの仮想サーバで稼働しています。

以下はバックアップのスクリプトです。

#!/bin/sh
MNTSNAP=/mnt/var_snap
VARSNAP=lvvar_snap
VARSNAPDEV=/dev/vg/$VARSNAP
VARDEV=/dev/vg/lvvar

vsqllock(){
vserver $1 exec mysql $2 -e "flush tables with read lock;"
}

vsqlunlock(){
vserver $1 exec mysql $2 -e "unlock tables;"
}

if [ -d $MNTSNAP ] ;then
mountpoint $MNTSNAP && umount $MOUNTSNAP
else
mkdir $MNTSNAP
fi

lvremove -f $VARSNAPDEV
vsqllock vserver1 database1
vsqllock vserver2 database2
sync
sync
lvcreate -s -L 1g -n $VARSNAP $VARDEV
vsqlunlock vserver1 database1
vsqlunlock vserver2 database2

if mount -o ro $VARSNAPDEV $MNTSNAP ;then
nice rsync -av --delete $MNTSNAP/lib/vservers/vserver1 /var2/lib/vservers/
nice rsync -av --delete $MNTSNAP/lib/vservers/vserver2 /var2/lib/vservers/
umount $MNTSNAP
else
echo "### mount failed ###"
echo "### mount -o ro,nouuid $VARSNAPDEV $MNTSNAP"
echo "### ------------ ###"
fi

lvremove -f $VARSNAPDEV


ネットワークから更新されるデータはデータベースのテーブルだけなので、仮想サーバを落とさずにMySQLのコマンドでテーブルが更新されないようにして、スナップショットをとります。これだと、ダウンタイムはほとんど起こりません。

mysqlのコマンドは、スクリプトの中ではvsqllock,vsqlunlockのなかで行っていますが、1行だけなので、vserverのexecコマンドでホスト側から直接仮想サーバーのmysqlコマンドを実行しています。

参考
http://labs.unoh.net/2006/09/lvm_xfs_mysql.html
http://dev.mysql.com/doc/refman/5.1/ja/flush.html

スナップショットは仮想サーバー側からとれないので、.sql文のなかでsystemコマンドを使ってスナップショットをとることはできません。

LVMでスナップショットをとったあと、すぐにロックをはずし、正常稼働状態にすることができます。その後スナップショットをマウントしてゆっくりバックアップをとることができます。

2009年6月15日月曜日

Pylonsの仮想環境を仮想マシンに移行する(2)

前回の続き

mysqlの移行
データベースはファイルをコピー
/etc/mysql/debian.cnf のパスワードもコピー

apacheの移行
/# apt-get install libapache2-mod-wsgi
wsgiの設定ファイルをコピー
環境に合わせてディレクトリの作成や設定ファイルを変更


なぜか、wsgiファイルにアプリケーションへのpythonのパスを足さないとエラーになった。
同じ環境のはずなのだが、何か違うのだろう

-- 動作するようになった
データのあまり無いサービスなので仮想マシンの環境は800MB程度。サーバのディスクが7GBあるので環境を作り直してかなり節約になった。

pound より nginx がよさそうなのでIPnutsのnginxのパッケージを作って、リバースプロクシの設定をした。



従来のからある仮想マシンのサービスはSNATで動作させていたが、これもnginx経由になった。

2009年6月13日土曜日

Pylonsの仮想環境を仮想マシンに移行する

Pylonsで動作しているサービスがあり、これのPythonの仮想環境をvserverの仮想マシンに移行する。

仮想マシンを新規作成
インターフェースはdummy0
# modprobe dummy
でできる。
仮想マシン名は vm1とすると

# vserver vm1 build --hostname vm1 -m debootstrap --interface dummy0:192.168.xx.yy/24 -- -d lenny -- --arch i386


時間が少しだけかかるのでコーヒーを買いにお買い物...
-----
これで仮想マシンは出来上がり

仮想マシンの環境整備

仮想マシンを起動して仮想環境に入る。

# vserver vm1 start
Starting enhanced syslogd: rsyslogd.
simplegw.sesame.local# vserver vm1 enter

sshサーバをいれて、/etc/ssh/sshd.config のListenAddress を入れておく

パッケージをインストールしてpythonの仮想環境を作る
vm1:/#apt-get install locales python apache2 mysql-server python-setuptools

vm1:/#easy_install virtualenv
...
vm1:/#mkdir -p /usr/local/python/BASELINE
vm1:/# virtualenv --no-site-packages /usr/local/python/BASELINE
New python executable in /usr/local/python/BASELINE/bin/python
Installing setuptools............done.

ユーザーを作ってから、ユーザで環境をつくる

$ mkdir pythonenv
$ virtualenv --no-site-packages pythonenv/MYAPP
New python executable in pythonenv/MYAPP/bin/python
Installing setuptools............done.

アクティベートしてpylonsをインストール
$ . pythonenv/MYAPP/bin/activate
(MYAPP)$ easy_install pytlons

これから下はアプリケーションが依存しているのでインストール

(MYAPP)$ easy_install authkit
(MYAPP)$ easy_install easy_install -U sqlalchemy

sqlのマイグレード関係
(MYAPP)$ easy_install sqlalchemy_migrate
(MYAPP)$ easy_install mysql-python

htmlを解析するツールも使っていたようなので、コンパイルする環境をインストールする
# apt-get install gcc
# apt-get install python-dev libxml2-dev libxslt1-devzlib1g-dev
# apt-get install libxml2 libxslt1 zlib1g

ユーザーで仮想環境をアクティベートして
(MYAPP)$ easy_install lxml

アプリケーションの移行
#gitのマスターが廃止予定のサーバにあるのでサーバの仮想マシンに移す。
#作業はファイルのコピーだけ。


gitをインストール

# apt-get install git-core

(MYAPP)$ mkdir pylons-public
ディレクトリを作って、gitのリモートサイトを登録してpull
(MYAPP)$ mkdir pylons-public/XXX
(MYAPP)$ cd pylons-public/XXX
(MYAPP)$ git init
(MYAPP)$ git remote add shared user@server:path_to_git
(MYAPP)$ git pull shared master
これを必要なディレクトリで行う

普通にコピーして持ってきてもOK
---つづく

2009年6月12日金曜日

サーバを復旧したディスク上で動かす

しばらく、バックアップ先のディスクの仮想マシンを動かしていたのを、新しく準備してバックアップになっていたミラーディスク上の仮想マシンで起動し直した。

4.3a3で現在稼働中。

仮想マシン以外の、openvpn(ユーザデータベース),ssl(openvpnの証明書関係),dnsmasq(tftpデータ)は再起動のシャットダウン時に、USBに保存されているはずなので、

# lrp_data-load -f

でデータを復旧。確認のため、/var2(バックアップ元)とdiffをかけてOK

マシンはサーバ入れ替えでパワーアップさせているので、他のサーバで動作している仮想マシンを移行予定

2009年6月11日木曜日

DRBD7からDRBD8.3.1への移行テスト(4)

XML差分ファイルの設定

セカンダリ側を立ち上げるが、その前にマスターとセカンダリの設定が同期がとれていないといけない。

IPnuts4.1ベータ版から、設定ファイルの差分を指定して立ち上げることが出きるようになっている。

/system/sysdiff.conf.sample と /system/sysdiff.conf.lvs_sampleのサンプルがある

/system/sysdiff.conf.lvs_sampleは lvsのセカンダリを作るときのサンプル。今回はこれに当たる。


## sysdiff.conf sample for lvs
##
## Change IP Address of port 2
#set item = { \
"xpath":"/SYSTEM/NETWORK/IP_LIST/IP[@port='2']/@ip", \
"value":"192.168.0.11" \
}
#silent $sysdiff_update.append($item)
##
## HOSTNAME
##
#set item = { \
"xpath":"/SYSTEM/HOST/HOSTNAME", \
"value":"gw2" \
}
#silent $sysdiff_update.append($item)
## VRRP setting
## -- CAUTION:
## -- Change vrid for your system.
##
## VRRP bigger prio has high priority.
##
#set item = { \
"xpath":"/SYSTEM/NETWORK/VRRP_INSTANCE_LIST/VRRP_INSTANCE[@vrid='50']/@
priority", \
"value":"50" \
}
#silent $sysdiff_update.append($item)
##
## VRRP initial state MATER|BACKUP
##
#set item = { \
"xpath":"/SYSTEM/NETWORK/VRRP_INSTANCE_LIST/VRRP_INSTANCE[@vrid='50']/@
state", \
"value":"BACKUP" \
}
#silent $sysdiff_update.append($item)



以下だけ説明する

## Change IP Address of port 2
#set item = { \
"xpath":"/SYSTEM/NETWORK/IP_LIST/IP[@port='2']/@ip", \
"value":"192.168.0.11" \
}
#silent $sysdiff_update.append($item)

PythonのテンプレートユーティティであるCheetahのテンプレートファイルの書式になっている
## #* *#はコメントになる
#はCheetahのコマンド 
それで 上記の例は xupdateに渡すサンプルで IPnutsの設定ファイルは/etc/config/sysconfig.xmlにあるXMLファイルで、それをxpathを指定して該当する値を変更する。
これだとport 2番のIPアドレスを変更する。

設定に変更がある時は、セカンダリ側では同じように設定を変更するのではなく、マスターのconfig.lrpをブートディスクにコピーしてセカンダリ側を作ることができる。
ただし、起動パッケージのリストの/system/lrp.lstを変更した時はこれもコピーする必要がある。

今回はマスター側のブートディスクからconfig.lrpと/system/lrp.lstをコピーしてセカンダリ側を立ち上げる。sysdiff.confのカスタマイズは環境によるが、IPアドレスとホストを設定すればよいと思われる。

セカンダリの起動とDRBDの同期

起動はできて、差分の設定もされているが。DRBDのディスクの同期が始まらない

error receiving ReportState, l: 4!
とか
Split-Brain detected, dropping connection!
のエラーが出る

これには次のようなコマンドを実行する。
r0はリソース名
セカンダリ側で

drbdadm secondary r0
drbdadm -- --discard-my-data connect

プライマリ側で

drbdadm connect

が..... .... プライマリ側のディスクが壊れている ???


めげずにそのままスレーブを再起動

スレーブ側は、何事もなく、drbd,keepalivedともに起動し

drbdadm role all にで Secondary/Primaryになった。

プライマリ側は、ディスクが壊れているようなので、同期を再開しようとしたときにエラーだしまくり。

ご参考まで

Jun 11 13:45:57 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406864
Jun 11 13:45:57 db1 kernel: ide: failed opcode was: unknown
Jun 11 13:45:57 db1 kernel: end_request: I/O error, dev hdb, sector 65406864
Jun 11 13:45:57 db1 kernel: drbd0: Local IO failed. Passing error on...
Jun 11 13:45:58 db1 kernel: hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jun 11 13:45:58 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406872
Jun 11 13:45:58 db1 kernel: ide: failed opcode was: unknown
Jun 11 13:45:58 db1 kernel: end_request: I/O error, dev hdb, sector 65406872
Jun 11 13:45:58 db1 kernel: drbd0: Local IO failed. Passing error on...
Jun 11 13:46:00 db1 kernel: hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jun 11 13:46:00 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406880
Jun 11 13:46:00 db1 kernel: ide: failed opcode was: unknown
Jun 11 13:46:00 db1 kernel: end_request: I/O error, dev hdb, sector 65406880
Jun 11 13:46:00 db1 kernel: drbd0: Local IO failed. Passing error on...
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394072s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394080s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394088s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394096s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394104s.
Jun 11 13:49:00 db1 kernel: drbd0: Resync done (total 257 sec; paused 0 sec; 7140 K/sec)
Jun 11 13:49:00 db1 kernel: drbd0: 57 failed blocks
Jun 11 13:49:00 db1 kernel: drbd0: conn( SyncSource -> Connected )
Jun 11 13:49:00 db1 kernel: drbd0: cs:Connected rs_left=57 > rs_total=0 (rs_failed 0)



データは修復する必要はないし、ディスクもない、モチベーションもないから以上で移行テスト終了。

DRBD7からDRBD8.3.1への移行テスト(3)

DRBDのディスクのアップグレードは終了したので、マスター側を立ち上げてIPnuts4.3a3(testing)への環境整備をする。

そのまえに、IPnuts4.1b(ベータ版での機能をおさらい:というか今頃初公開かな)

自動起動スクリプトでディスク切り替え時にサービスの起動も制御する

自動起動の抑制
keepalivedのフックでサービスを制御するので、起動時に勝手に立ち上がらないようにする。
/etc/no_boot_rc

exim4
mysql
dhisd
nfs-kernel-server
bind9
apache2

これは、rc.lrpの設定ファイルになっていて/etc/init.d/rcSがこのファイルを参照する用になっている。

WebadminでLVSの設定(内部的にはkeepalivedの設定)を見ると

マスター時 実行コマンド/etc/keepalived/ha_start
バックアップ時 実行コマンド/etc/keepalived/ha_stop
フォルト時 実行コマンド/etc/keepalived/ha_stop

になっている。ha_start ha_stopは自作のshなのでパッケージには含まれてはいない。
ha_startの最後の方に
APPS="`cat /etc/keepalived/apps.list`"
for app in $APPS
do
if [ $? -eq 0 ] ;then
/etc/init.d/$app start
else
$LOGGER "fail to start $app"
fi
done
となっていて apps.listのサービスを起動している。
/etc/keepalived/appslistの中身はこれ
exim4
mysql
dhisd
nfs-kernel-server
bind9
apache2
4.3ではIPnutsだけで動作するのは nfs-kernel-server、bind9のふたつ。ほかはサポートする予定は無くて動作させる場合は仮想マシン(vserver)で動作させる。

よってexim,mysql,dhisd,apache2は起動パッケージのリスト(/system/lrp.lst)、no_boot_rc ,apps.listから消す。
(/etc/no_boot_rcはapps.listへのリンクになってる場合もある)

起動パッケージのリスト(/system/lrp.lst)からは他に起動時に読み込めなかった/var/lib/lrpkg/packages_fialedに記録されているパッケージも消す。

not found: - hotplug
not found: - dhcpcd
not found: - hotplug
not found: - less
not found: - xdelta
not found: - cipe
not found: - minihttp
not found: - license
not found: - passwd
minihttp,licenseは除外

設定保存して、再起動、動作確認

動かない。
keepalivedが起動すると、ha_startが動き、マウントするのだがディスクが古いことになっているからプライマリディスクにできないといって怒られる。

Jun 11 07:53:48 db1 kernel: drbd0: State change failed: Refusing to be Primary without at least one UpToDate disk
Jun 11 07:53:48 db1 kernel: drbd0: state = { cs:WFConnection ro:Secondary/Unknown ds:Outdated/DUnknown r--- }
Jun 11 07:53:48 db1 kernel: drbd0: wanted = { cs:WFConnection ro:Primary/Unknown ds:Outdated/DUnknown r--- }
そこで、無理やりprimaryにするおまじない

drbdadm -- --overwrite-data-of-peer primary all

これでOK


ha_start、ha_stop、に使っていたスクリプトも互換性の問題があり
drbdadm state all

drbdadm role all
に変更

### MEMO:また、別件だが ###
neither /etc/bind/rndc.conf nor /etc/bind/rndc.key was found
の時は rndc.confを作る
# rndc-confgen -a -r /var/cropkg/python2_5.squ
wrote key file "/etc/bind/rndc.key"

ランダムファイル渡さないと固まる
#############################

/etc/init.d/keepalivedをstart stopしてnfsサーバとbind9がきちんと動作することを確認

次はスレーブ側を立ち上げて同期させる
ーーーつづく

2009年6月10日水曜日

DRBD7からDRBD8.3.1への移行テスト(2)

前回書いている途中にもnfs-commonまわりがトラブる。

drbdはバージョンが変わって、設定ファイルが少しかわり、ディスクのメタデータも互換性がなくなっているので、パッケージ名を変えてdrbd-toolsにした。

起動後、lrp_load でパッケージを読み込もうとしたが、ネットワークの環境がことなるのでアドレスを取り直した。dhcpクライアントは udhcpcに変わっている。ボンディングを行う、ifenslaveは正常に動作していたようでbond0ができていたので、bond0にアドレスをつけ直した。

# udhcpc -i bond0
# lrp_load -b drbd-tools

drbdが自動起動して、設定ファイルの互換性が無いのでパースエラーがでる。
設定ファイルを抜き出すとこんな感じ。

resource r0 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";

startup {
wfc-timeout 180;
degr-wfc-timeout 120; # 2 minutes.
}

disk {
on-io-error pass_on;
}

net {
connect-int 10; # 10 seconds (unit = 1 second)
ping-int 10; # 10 seconds (unit = 1 second)
}

syncer {
rate 10M;
group 1;
al-extents 257;
}

on db1 {
device /dev/drbd0;
disk /dev/vg/lvother;
address 192.168.XXX.XX:7788;
meta-disk internal;
}

on db2{
device /dev/drbd0;
disk /dev/vg/lvother;
address 192.168.YYY.YY:7788;
meta-disk internal;
}
}


これの場合だと
group=1 を消す

それと
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
の行を編集して。
handlers{
pri-on-incon-degr "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
}

にする。(意味が分かっていないので自己責任で)

次に、ディスクのメタデータをアップグレードする。互換性がなくなるので、これはやらないで、新規のディスクでdrbdを動作させてデータを移行したほうがいいと思うが、これはテストなので問答無用でアップグレードする。

関係ないが、sshするので全部受信許可した
# iptables -I INPUT -j ACCEPT

drbdadmのヘルプ

# drbdadm

USAGE: drbdadm [OPTION...] [-- DRBDSETUP-OPTION...] COMMAND {all|RESOURCE...}

OPTIONS:
{--stacked|-S}
{--dry-run|-d}
{--verbose|-v}
{--config-file|-c} val
{--drbdsetup|-s} val
{--drbdmeta|-m} val
{--drbd-proxy-ctl|-p} val
{--sh-varname|-n} val
{--force|-f}

COMMANDS:
attach detach
connect disconnect
up down
primary secondary
invalidate invalidate-remote
outdate resize
syncer verify
pause-sync resume-sync
adjust wait-connect
wait-con-int role
cstate dstate
dump dump-xml
create-md show-gi
get-gi dump-md
wipe-md hidden-commands

Version: 8.3.1 (api:88)
GIT-hash: fd40f4a8f9104941537d1afc8521e584a6d3003c build by kitakura@c2duo, 2009-06-08 07:27:18

missing arguments


リソース名がr0のディスクをつくる。

# drbdadm create-md r0

--== This is a new installation of DRBD ==--
Please take part in the global DRBD usage count at http://usage.drbd.org.

The counter works anonymously. It creates a random number to identify
your machine and sends that random number, along with
DRBD's version number, to usage.drbd.org.

The benefits for you are:
* In response to your submission, the server (usage.drbd.org) will tell you
how many users before you have installed this version (8.3.1).
* With a high counter LINBIT has a strong motivation to
continue funding DRBD's development.

http://usage.drbd.org/cgi-bin/insert_usage.pl?nu=6522805258890751169&git=fd40f4a8f9104941537d1afc8521e584a6d3003c

In case you want to participate but know that this machine is firewalled,
simply issue the query string with your favorite web browser or wget.
You can control all of this by setting 'usage-count' in your drbd.conf.

* You may enter a free form comment about your machine, that gets
used on usage.drbd.org instead of the big random number.
* If you wish to opt out entirely, simply enter 'no'.
* To count this node without comment, just press [RETURN]

よく分かっていないが、インターネットにアクセスして登録っぽいことをするのか
とにかくRETURN

--== Thank you for participating in the global usage survey ==--
The server's response is:

you are the 1796th user to install this version

From now on, drbdadm will contact usage.drbd.org only when you update
DRBD or when you use 'drbdadm create-md'. Of course it will continue
to ask you for confirmation as long as 'usage-count' is at its default
value of 'ask'.

Just press [RETURN] to continue:


1796番目のユーザーらしい。さらにリターン

md_offset 5368705024
al_offset 5368672256
bm_offset 5368508416

Found ext3 filesystem which uses 5111808 kB
current configuration leaves usable 5242684 kB

Even though it looks like this would place the new meta data into
unused space, you still need to confirm, as this is only a guess.

Do you want to proceed?
[need to type 'yes' to confirm]

そして yes。

You want me to create a v08 style flexible-size internal meta data block.
There apears to be a v07 fixed-size internal meta data block
already in place on /dev/vg/lvother at byte offset 5234491392

Convert the existing v07 meta-data to v08?
[need to type 'yes' to confirm] yes

Converting meta data...
Writing meta data...
New drbd meta data block successfully created.

--== Creating metadata ==--
As with nodes, we count the total number of devices mirrored by DRBD at
at http://usage.drbd.org.

The counter works anonymously. It creates a random number to identify
the device and sends that random number, along with
DRBD's version number, to usage.drbd.org.

http://usage.drbd.org/cgi-bin/insert_usage.pl?nu=6522805258890751169&ru=8999730253493416010&rs=5368709120

* If you wish to opt out entirely, simply enter 'no'.
* To continue, just press [RETURN]
success

たぶん success

masterを落として、このアップグレードをslaveでも行う。
そして、slaveを落として masterでdrbdが起動することを確認して、
slaveを上げる予定

ーーーーつづく

DRBD7からDRBD8.3.1への移行テスト(1)

IPnuts4.1ベータ版で動かしていたDRBD+keepalivedでのサービスは他のサーバvserverで動作させるよう移行し、先日ディスクをミラーディスクした。

しかし、移行した、サービス提供中の実機でもtestingの検証を行うので、ダウンタイムが気になる。DRBD復活させるか検討する。

テストは、以前使用していたDRBD7のマシンが2台がそのまま転がっているので、検証しながらDRBDの最新版の8.3.1で動作させてみる。

いきなり、立ち上がりからDRBD関係なくアップグレードするだけで関する問題が起きて、あれやこれやバグフィックスや改良をした。

- config.lrpだけ持っていくと/systemが移行できないバグ修正
- /etc/default/ipnuts.confが設定保存されるていると、動作しなくなるのでこれを除外するように変更
- 起動パッケージのリスと古いと新規の標準パッケージを読み込まず、環境が統一されないのでこれを新規の標準パッケージをアップグレード時に読み込むように
- modprobe.confを廃止するので、/systemから削除するように変更
- /systemの移行(アップグレード)スクリプトを修正

DRBDの移行は -- つづく --

2009年6月7日日曜日

schrootのスナップショットのmountが消えないとき

mountを表示して、下から一つ一つunmount

すぐ忘れるのでメモ

2009年6月6日土曜日

sudoパッケージを作る

source debからパッケージをつくる例


/var/src/pnuts$ pnut initdeb sudo
Not found src.def.
Reading package lists... Done
Building dependency tree
Reading state information... Done
Need to get 616kB of source archives.
Get:1 http://ftp.jp.debian.org lenny/main sudo 1.6.9p17-2 (dsc) [995B]
Get:2 http://ftp.jp.debian.org lenny/main sudo 1.6.9p17-2 (tar) [594kB]
Get:3 http://ftp.jp.debian.org lenny/main sudo 1.6.9p17-2 (diff) [21.5kB]
Fetched 616kB in 0s (853kB/s)
Download complete and in download only mode
set --- src.def ---
/var/src/pnuts

source debをコンパイルする

/var/src/pnuts$ cd sudo.1_6_9p17
/var/src/pnuts/sudo.1_6_9p17$ pnut makesrc


debはsudoだけなので、そのまま、作ったdebを展開する

/var/src/pnuts/sudo.1_6_9p17$ pnut mksrctree
./
./etc/
./etc/init.d/
./etc/init.d/sudo
./etc/pam.d/
./etc/pam.d/sudo
./usr/
./usr/sbin/
./usr/sbin/visudo
./usr/bin/
./usr/bin/sudoedit
./usr/bin/sudo
./usr/share/
./usr/share/man/
./usr/share/man/man8/
./usr/share/man/man8/visudo.8.gz
./usr/share/man/man8/sudoedit.8.gz
./usr/share/man/man8/sudo.8.gz
./usr/share/man/man5/
./usr/share/man/man5/sudoers.5.gz
./usr/share/lintian/
./usr/share/lintian/overrides/
./usr/share/lintian/overrides/sudo
./usr/share/doc/
./usr/share/doc/sudo/
./usr/share/doc/sudo/copyright
./usr/share/doc/sudo/UPGRADE.gz
./usr/share/doc/sudo/HISTORY
./usr/share/doc/sudo/NEWS.Debian.gz
./usr/share/doc/sudo/changelog.Debian.gz
./usr/share/doc/sudo/PORTING.gz
./usr/share/doc/sudo/README.Debian
./usr/share/doc/sudo/examples/
./usr/share/doc/sudo/examples/sudoers
./usr/share/doc/sudo/TROUBLESHOOTING.gz
./usr/share/doc/sudo/changelog.gz
./usr/share/doc/sudo/README
./usr/share/doc/sudo/OPTIONS
./usr/share/doc/sudo/BUGS
./usr/lib/
./usr/lib/sudo/
./usr/lib/sudo/sudo_noexec.so
Search document from sudo_1.6.9p17-2_i386.src

設定ファイル,sudo.confのテンプレートをコピーする

/var/src/pnuts/sudo.1_6_9p17$ pnut cptmpl

sudo.confができるので
3行編集

pkg_configs="/etc/sudoers"
pkg_depends="libpam0g libpam-modules"
debs_copy_dirs="$deb1::usr/sbin $deb1::usr/bin $deb1::etc/pam.d $deb1::usr/lib"

次の内容で、sudo.installをつくって実行権限を与えておく

#!/bin/sh

# make sure sudoers has the correct permissions and owner/group
[ -f /etc/sudoers ] && chown root:root /etc/sudoers
[ -f /etc/sudoers ] && chmod 440 /etc/sudoers


パッケージのディレクトリツリーを作って、lrpに固める

(lenny-i386)kitakura@c2duo:/var/src/pnuts/sudo.1_6_9p17$ pnut mklrp

package: sudo
sudo: size - 284 kB
write mklrp=date to var/lib/lrpkg/sudo.info
etc/
etc/pam.d/
etc/pam.d/sudo
usr/
usr/sbin/
usr/sbin/visudo
usr/bin/
usr/bin/sudoedit
usr/bin/sudo
usr/share/
usr/share/doc/
usr/share/doc/sudo/
usr/share/doc/sudo/copyright
usr/lib/
usr/lib/sudo/
usr/lib/sudo/sudo_noexec.so
var/
var/lib/
var/lib/lrpkg/
var/lib/lrpkg/sudo.conf
var/lib/lrpkg/sudo.version
var/lib/lrpkg/sudo.info
var/lib/lrpkg/sudo.dep
var/lib/lrpkg/sudo.install
Verify etc/
Verify etc/pam.d/
Verify etc/pam.d/sudo
Verify usr/
Verify usr/sbin/
Verify usr/sbin/visudo
Verify usr/bin/
Verify usr/bin/sudoedit
Verify usr/bin/sudo
Verify usr/share/
Verify usr/share/doc/
Verify usr/share/doc/sudo/
Verify usr/share/doc/sudo/copyright
Verify usr/lib/
Verify usr/lib/sudo/
Verify usr/lib/sudo/sudo_noexec.so
Verify var/
Verify var/lib/
Verify var/lib/lrpkg/
Verify var/lib/lrpkg/sudo.conf
Verify var/lib/lrpkg/sudo.version
Verify var/lib/lrpkg/sudo.info
Verify var/lib/lrpkg/sudo.dep
Verify var/lib/lrpkg/sudo.install

Check lrpkg file: sudo.1_6_9p17-1_001-i386.lrp
package directory: sudo
Information:There is not var/lib/lrpkg/sudo.list.
CONFIG LIST:
/etc/sudoers
VERSION:
1_6_9p17-1_001-i386
Warning:There is not var/lib/lrpkg/sudo.help.
Information:There is not var/lib/lrpkg/sudo.mod.
Information:There is not var/lib/lrpkg/sudo.data.
Information:var/lib/lrpkg/sudo.info exists.
Information:var/lib/lrpkg/sudo.dep exists.
libpam0g
libpam-modules
Information:There is not var/lib/lrpkg/sudo.kdep.
Information:There is not var/lib/lrpkg/sudo.cro.
Information:There is not var/lib/lrpkg/sudo.exclude.
.//sudo.1_6_9p17-1_001-i386.lrp was made.
/var/src/work/sudo.1_6_9p17-1/pkg/sudo.1_6_9p17-1_001-i386.lrp
make /var/src/work/sudo.1_6_9p17-1/pkg/sudo.lenny for
sudo:00:sudo.1_6_9p17-1_001-i386.lrp:8efbf7871c32cad03c12b3fc55c63f83:libpam0g libpam-modules
sudo:10:sudo.1_6_9p17-1

社内ファイルサーバをtesting版にする(2)

testingで立ち上げるには、社内ではデフォルトでネットワークブートすればメニューが出るので、立ち上げ時にF12を押すとこのマシンはブートするデバイスを指定できるので、テストはすぐにできる。

/var/lib/lrpkg/packages_faildを見るとこれだけ失敗している。
not found: - dhcpcd busyboxに組み込み
not found: - dhcpd dnsmasqに移行
not found: - minihttp ?
not found: - less busyboxに組み込み
not found: - nettools ?
not found: - ipvs ?
not found: - license これはない
not found: - nfs-server ?
not found: - mrtg 消し忘れ
not found: - libxpm4 消し忘れ
not found: - sudo ?

?の minihttp,nettools,ipvs,nfs-server,sudoについて調査

nfs-server
testingでnfsserverになっていたので名前をつけなおす。

minihttp
ない。lighttpdにしようと思っていたのペンディング

ipvs
これは作らないといけない(ファイルサーバでは使わないのであとでリストから消す)

nettools
net-toolsになっていた。net-toolsに変更したいのでnettoolsは仮想パッケージをつくる

sudo
これは作らないといけない。
---
nettoolとnfs-serverだけ対処して、今日のところは動作しているのでここまでとする。

社内ファイルサーバをtesting版にする(1)

公開サーバのトラブルでペンディングされていた、社内のファイルサーバのtesting(α版)への移行をやる。
社内のファイルサーバはIPnutsのベータ版(4.1)で動作している。

社内のファイルサーバはベータ版のサーバ機能を使っているが、testing版(4.3)にはサーバ機能がない。
サーバ機能は基本的にvserverの仮想マシンに持っていって動作させるように考えているのでIPnutsホストで動作するサーバ機能は仮想マシンに移行する必要がる。vserverはベータ版でも動作している。

IPnutsの仮想マシンをESXiと比較すると次のようになる。
  • 両方ともUSBで起動できる。
  • IPnutsはオンメモリで動作する。(ESXiはおそらくUSBをマウントしてる?)
  • IPnutsの
    投稿を公開
    今回の仮想OSのvserverはホストとカーネルを共用するので、Linuxしか動かない
  • IPnutsの仮想マシンはchrootのように動作するので、メモリの負担もないし、動作はホストと変わらない。

今回の移行は関係ないが、最初からサーバ環境を仮想マシンで作っておくと、開発などでテスト環境や開発環境から本番環境への移行したいときにシステムごとコピーするだけでできるので楽になったりする。
スナップショットを併用するともっといいかも。

さて、今回の移行だが、使えなくなるので仮想環境に移すサービスは
  • apache
  • samba
  • mrtg
  • phpmyadmin
  • moinmoin

testingでも使えるのは
  • nfs-server
  • rsyncサーバ

他サーバに移行済み
  • メール関係
  • プリンタ関係
  • webalizer

である。

なので使えなくなるサービスを仮想マシンのvserverに移行する。vserverはベータ版で既に動作しているので、最初にサービスをvserverに移行して動作確認後、testingで立ち上げる。

ディレクトリを仮想マシンと共有

apache2のドキュメントはコピーしてもいいのだが、今回は/var/wwwを仮想環境にbindしてマウントした
/etc/vservers/仮想サーバー名/fstabを編集して、次の行を追加する

/var/www /var/www none bind,ro 0 0

roを指定しているので仮想環境側からは書き換えられない。
sambaの共有ディレクトリもディレクトリも設定。

/home/public /home/public none bind 0 0

roはつけない

パッケージをインストール

仮想環境でapt-getでphpmyadmin python mrtg sambaをインストール。

設定のメモ
moinmoin
moinmoinはパスを変更したので、conf/wikiconfig.pyとcgi-bin/moin.cgiを変更

mrtg
/etc/mrtg.cfgをコピー

phpmyadmin
/etc/phpmyadmin/config.ini.phpを編集

samba
/etc/samba/smb.conf はswatをいれて古いものと同じになる用にdiffで確認しながら設定
人数が少ないので、smbpasswd -a ユーザー名でユーザーを再設定

以上でvserverへの移行終了

次は testingでの動作確認

2009年6月4日木曜日

サーバ入れ替え

今回、メモリを1GBにして、ミラー構成で準備してきたサーバーに入れ替えた。

vserverの代わりにlxcを使おうとしてテストしてみたが、時間の関係で断念しvserverに戻した。
veth使えば、フィルタリングなど使えそうだったが、もう少しこなれるのを待つ。
デフォルトだとPIDがデバイス名についてしまいvethのデバイス名を固定で指定するのが難しそうだったことも諦めた原因。

今日のところは、バックアップをもどすところで終了。しばらく、バックアップディスクのまま動かす。
USBディスクだと6Mbyte/secでrsyncした。100BASE-Tより遅い。

openswanはnat-tが別パッチではなくなったので、これも通常どおり使用できるように考える予定。

2009年6月2日火曜日

lxcのパッケージを作ってみる


/var/src/pnunt$ pnut initpkg lxc-0.6.2
Not found src.def.
set --- src.def ---

src.def and lxc.conf were made in /var/src/pnuts/lxc.0_6_2.
If not need,delete it,or edit it.


src_home_urlとsrc_file_urlを編集


src_home_url="http://lxc.sourceforge.net"
src_file_url="$src_home_url/download/lxc/$src_file"


ソース取得


/var/src/pnuts/lxc.0_6_2$ pnut getsrc
--2009-05-27 03:53:29-- http://lxc.sourceforge.net/download/lxc/lxc-0.6.2.tar.gz
Resolving lxc.sourceforge.net... 216.34.181.96
Connecting to lxc.sourceforge.net|216.34.181.96|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 450189 (440K) [application/x-gzip]
Saving to: `lxc-0.6.2.tar.gz'

100%[======================================>] 450,189 165K/s in 2.7s

2009-05-27 03:53:32 (165 KB/s) - `lxc-0.6.2.tar.gz' saved [450189/450189]


ファイルを展開
/var/src/pnuts/lxc.0_6_2$ pnut setsrc

/var/src/work/lxc.0_6_2-1/build/srcに展開されます。

再度 src.defを編集。
ソースからライセンスは LGPL2.1のようなので src.defのsrc_licenseをLGPL2.1に設定
それから、SRC_makesrc()を作る

SRC_makesrc(){
##compile from source
config_opt="--prefix=/usr"
./configure $config_opt
make
}


/var/src/pnuts/lxc.0_6_2$ pnut makesrc で コンパイルするが依存ファイルがあるようだ

src.defを編集。src_build_debを設定
src_build_deb=libcap2-dev

/var/src/pnuts/lxc.0_6_2$ pnut makesrc を実行して完了

Makefileをみると $DESTDIRにインストールするっぽいので、src.def のSRC_mksrctree()の部分のコメントアウトを消す。


SRC_mksrctree(){
make -C $NUTS_WORK_BUILD/$src_file_dir install DESTDIR=$NUTS_WORK_PKG/$src_name.src
}


/var/src/pnuts/lxc.0_6_2$ pnut mksrctree を実行すると
/var/src/work/lxc.0_6_2-1/pkg/lxc.src にインストールディレクトリが作られる。

/usr/var/lib,/usr/libexec,/usr/etcが気に入らないので configureのオプションをかえて
src.defのSRC_makesrc()の config-optを変更

config_opt="--prefix=/usr --localstatedir=/var --libexecdir=/usr/lib/lxc --sysconfdir=/etc"

コンパイルが通ることは分かっているので pnut src で全部実行する
/var/src/pnuts/lxc.0_6_2$ pnut src を実行する

展開したファイル一覧:

/var/src/work/lxc.0_6_2-1/pkg$ find lxc.src/
lxc.src/
lxc.src/etc
lxc.src/etc/lxc
lxc.src/etc/lxc/lxc-phys.conf
lxc.src/etc/lxc/lxc-no-netns.conf
lxc.src/etc/lxc/lxc-veth.conf
lxc.src/etc/lxc/lxc-macvlan.conf
lxc.src/etc/lxc/lxc-complex-config
lxc.src/etc/lxc/lxc-empty-netns.conf
lxc.src/var
lxc.src/var/lib
lxc.src/var/lib/lxc
lxc.src/usr
lxc.src/usr/bin
lxc.src/usr/bin/lxc-unfreeze
lxc.src/usr/bin/lxc-monitor
lxc.src/usr/bin/lxc-ps
lxc.src/usr/bin/lxc-setcap
lxc.src/usr/bin/lxc-wait
lxc.src/usr/bin/lxc-sshd
lxc.src/usr/bin/lxc-debian
lxc.src/usr/bin/lxc-console
lxc.src/usr/bin/lxc-start
lxc.src/usr/bin/lxc-info
lxc.src/usr/bin/lxc-version
lxc.src/usr/bin/lxc-cgroup
lxc.src/usr/bin/lxc-checkconfig
lxc.src/usr/bin/lxc-fedora
lxc.src/usr/bin/lxc-checkpoint
lxc.src/usr/bin/lxc-stop
lxc.src/usr/bin/lxc-netstat
lxc.src/usr/bin/lxc-freeze
lxc.src/usr/bin/lxc-destroy
lxc.src/usr/bin/lxc-create
lxc.src/usr/bin/lxc-execute
lxc.src/usr/bin/lxc-unshare
lxc.src/usr/bin/lxc-ls
lxc.src/usr/bin/lxc-restart
lxc.src/usr/share
lxc.src/usr/share/man
lxc.src/usr/share/man/man1
lxc.src/usr/share/man/man7
lxc.src/usr/share/man/man5
lxc.src/usr/lib
lxc.src/usr/lib/liblxc.a
lxc.src/usr/lib/liblxc-0.6.2.so
lxc.src/usr/lib/liblxc.la
lxc.src/usr/lib/lxc
lxc.src/usr/lib/lxc/lxc-init
lxc.src/usr/lib/liblxc.so
lxc.src/usr/include
lxc.src/usr/include/lxc
lxc.src/usr/include/lxc/namespace.h
lxc.src/usr/include/lxc/utils.h
lxc.src/usr/include/lxc/log.h
lxc.src/usr/include/lxc/monitor.h
lxc.src/usr/include/lxc/lock.h
lxc.src/usr/include/lxc/conf.h
lxc.src/usr/include/lxc/lxc.h
lxc.src/usr/include/lxc/cgroup.h
lxc.src/usr/include/lxc/error.h
lxc.src/usr/include/lxc/state.h
lxc.src/usr/include/lxc/list.h


実行に必要なのは、/etc /var /usr/bin /usr/libのようなので
lxc.confを編集、おそらくlibcap2ライブラリも必要,
設定ファイルもあるので3行編集

pkg_configs="/etc/lxc"
...
pkg_depends="libcap2"
...
copy_dirs="etc usr/bin usr/lib var"



/var/src/pnuts/lxc.0_6_2$ pnut mkpkgtree

package: lxc
Package config is /etc/lxc
Package depends is libcap2
License is "LGPL2.1"
Package copy directory is etc usr/bin usr/lib var
/var/src/work/lxc.0_6_2-1/pkg
/var/src/work/lxc.0_6_2-1/pkg
.
./etc
./etc/lxc
./etc/lxc/lxc-phys.conf
... 省略
./usr/lib/lxc/lxc-init
./usr/lib/liblxc.so
lxc package tree was made.

パッケージの作成

/var/src/pnuts/lxc.0_6_2$ pnut mklrp

package: lxc
lxc: size - 1096 kB
write mklrp=date to var/lib/lrpkg/lxc.info
etc/
etc/lxc/
etc/lxc/lxc-phys.conf
etc/lxc/lxc-no-netns.conf
... 省略
Verify var/lib/lrpkg/lxc.dep
Verify var/lib/lrpkg/lxc.conf

Check lrpkg file: lxc.0_6_2-1_001-i386.lrp
package directory: lxc
Information:There is not var/lib/lrpkg/lxc.list.
CONFIG LIST:
/etc/lxc
VERSION:
0_6_2-1_001-i386
Warning:There is not var/lib/lrpkg/lxc.help.
Information:There is not var/lib/lrpkg/lxc.mod.
Information:There is not var/lib/lrpkg/lxc.data.
Information:var/lib/lrpkg/lxc.info exists.
Information:var/lib/lrpkg/lxc.dep exists.
libcap2
Information:There is not var/lib/lrpkg/lxc.kdep.
Information:There is not var/lib/lrpkg/lxc.cro.
Information:There is not var/lib/lrpkg/lxc.exclude.
.//lxc.0_6_2-1_001-i386.lrp was made.
/var/src/work/lxc.0_6_2-1/pkg/lxc.0_6_2-1_001-i386.lrp
make /var/src/work/lxc.0_6_2-1/pkg/lxc.lenny for
lxc:00:lxc.0_6_2-1_001-i386.lrp:91a331db165e5d58ee30f7c3f68e5602:libcap2
lxc:10:lxc.0_6_2-1


/var/src/work/lxc.0_6_2-1/pkg にパッケージが作られる。

テストしながら起動スクリプトなど考えることにする

lxcのテスト

lxcをテストしてみた。
lxcはまだ開発中でバージョンが1.0になると安定版ということのようだ。
カーネルは CONFIG_DEVPTS_MULTIPLE_INSTANCES=y にしてコンパイルしないと、ゲスト側でinit 0したときにホストが落ちることがあった。

debian環境でテスト
lxc-debianで debootstrapの環境ができる。
cgroupをマウントして

IPnuts.mydomain# mkdir /cgroup
IPnuts.mydomain# mount -t cgroup cgroup /cgroup

br0を作成。

IPnuts.mydomain# lrp_load -b bridge
IPnuts.mydomain# brctl addbr br0

テストだけなのでインターフェースを使いしなくても動作する
コンテナを起動

IPnuts.mydomain# lxc-start -n debian


sshでホストに入って、lxcを起動するとexitできなくなるので注意
/var/lib/lxc/debian/rootfs/rootfs/etc/inittab を編集して
consoleをコメントアウト

#1:2345:respawn:/sbin/getty 38400 console

これでバックグランドで動かすとよいか

IPnuts.mydomain# lxc-start -n debian &


tty1に接続。切断は ctrl-a q(qを押すときはctrlは外す)

IPnuts.mydomain# lxc-console -n debian -t 1

Type to exit the console

Debian GNU/Linux 5.0 debian tty1

debian login:


vserverから移行したイメージでは /devにttyXがなかったので作成した。

2009年5月31日日曜日

busyboxのselinux

lxc関係でテストしてみたくなり、busyboxを最新にしてselinuxのアプレットを有効にしたところ
/sbin/restorecon が /etc/init.d/udevにあってなぜかバッチを殺してくれる。

なのでやっぱり、busyboxのselinuxは使わない

2009年5月27日水曜日

壊れたマシンと入れ替える(その1)

ディスクの下準備はできたので、バックアップディスクで動作しているマシンを入れ替えます。

バックアップで稼働中の仮想サーバーのアーカイブをとって新しいサーバーにリストアします。

# find 仮想サーバのルート/ -depth -print | cpio -o -H newc > アーカイブファイル

ファイルが3GBぐらいになるので、scpやsshのシェルを使ったファイル転送を避けるため、新規側でrsyncサーバを動作させました。

新規側
# lrp_load -b rsync

/etc/rsyncd.conf を編集して /homeに受け入れるように作成
(一時的なので適当)

[home]
path=/home
read only = false
uid=root

サーバ起動
# rsync --daemon

アーカイブを作成した側から
# rsync -v アーカイブファイル rsync://サーバIP/home/

8.7M/sec(約70Mbit/sec)で転送。100BASE-T なので限界でしょう。

ミラー上にLVMを作る

前回の続き

再起動してraidを確認。/dev/md0もできているはず。
#mdadm --detail /dev/md0

lvm2をロード
# lrp_load -b lvm2

以前作っておいたユーティリティ(41ベータ版にもある) /usr/sbin/make_lvm.sh を使ってみる。
make_lvm.shは /system/make_lvm.conf からLVMを作成する。
/system/samplesにサンプルがあるのでこれをコピーしてから編集する

#cp /system/samples/make_lvm.conf /system/make_lvm.conf
#e3 /system/make_lvm.conf


LV_SWAP=1g
LV_HOME=20g
LV_VAR=20g
LV_TMP=1g
LV_OTHER=

VG_NAME=vg

LV_SWAP_NAME=lvswap
LV_HOME_NAME=lvhome
LV_VAR_NAME=lvvar
LV_TMP_NAME=lvtmp
LV_OTHER_NAME=lvother

LABEL_SWAP=SWAP
LABEL_VAR=VAR
LABEL_HOME=HOME
LABEL_TMP=TMP
LABEL_OTHER=OTHER

LV_SWAP,LV_HOME,LV_VAR,LV_TMP,LV_OTHERに容量が指定していればそのLVMをデバイス上に作成する。
swap以外のファイルシステムはext3

上の例だと
ラベル 容量 ファイルシステム
SWAP 1GB swap
VAR 20GB ext3
HOME 20GB ext3
TMP 20GB ext3

が作られる。
デバイスは/dev/md0を指定すること
# make_lvm.sh /dev/md0

/etc/fstabを編集

# /etc/fstab: static file system information.
#
#
proc /proc proc noauto 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
shm /dev/shm tmpfs defaults 0 0
/dev/cdrom /cdrom iso9660 noauto,ro
#/dev/hda2 none swap sw 0 0
LABEL=VAR /var ext3 defaults 0 2
LABEL=HOME /home ext3 defaults 0 2
LABEL=TMP /tmp ext3 defaults 0 2
LABEL=SWAP none swap sw 0 0

# You may edit only under line when you know that you do
tmpfs / tmpfs rw,size=160M
#tmpfs /tmp tmpfs rw,size=12M
#tmpfs /var tmpfs rw,size=24M


lvm2を起動時に読み込むようにして、設定を保存
# lrp_list -a lvm2
# save_conf

起動時に読み込むファイルは /system/lrp.lstにかかれている。起動していないときに変更する場合は
設定を保存しているUSBの/sysetem/lrp.lstを編集する

再起動後マウントを確認

# mount
tmpfs on / type tmpfs (rw,size=160M)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
shm on /dev/shm type tmpfs (rw)
/dev/mapper/vg-lvvar on /var type ext3 (rw)
/dev/mapper/vg-lvhome on /home type ext3 (rw)
/dev/mapper/vg-lvtmp on /tmp type ext3 (rw)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
/dev/loop0 on /lib/modules/mnt_loop type squashfs (ro)
/var/cropkg/4suite-xml.squ on /var/cropkg/mnt/4suite-xml type squashfs (ro,loop=/dev/loop1)
/var/cropkg/python2_5.squ on /var/cropkg/mnt/python2_5 type squashfs (ro,loop=/dev/loop2)
# swapon -s
Filename Type Size Used Priority
/dev/mapper/vg-lvswap partition 1048568 0 -1

2009年5月26日火曜日

久しぶりにディスクをミラー化

メインのマシンのハードディスクが壊れた。

ちょうどいい機会なので、43a3-gwでテストしてみる

http://www.s-me.co.jp/ipnuts/ipnuts41/server/ch02s02.html
 を 参照

ディスクまるごとミラーする。
fdisk で /dev/hdaと/dev/hdcの新規HDを確認

IPnuts.mydomain# fdisk -l

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/hda doesn't contain a valid partition table

Disk /dev/hdc: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/hdc doesn't contain a valid partition table

Disk /dev/sda: 128 MB, 128974848 bytes
16 heads, 32 sectors/track, 492 cylinders
Units = cylinders of 512 * 512 = 262144 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/sda1 * 1 492 125936 6 FAT16


作業でこのメモを書くためscreenをいれる
#lrp_load -b screen

screen起動
#screen

sshで作業するのでパスワードを設定
#passwd

ここからがmdの作業

mdadmをいれる
# lrp_load -b mdadm


RAIDの作成 注意:/dev/md0ではなく/dev/md/0にすること
# mdadm --create --auto=yes /dev/md/0 --level=1 --raid-devices=2 /dev/hda /dev/hdc
# mdadm -E --scan >> /etc/mdadm/mdadm.conf

/etc/mdadm/mdadm.confにDEVICEの行を追加し、
--scan で 追加された ARRAY=の行のUUIDを使って編集する

DEVICE= hda hdc
ARRAY= /dev/md/0 auto=yes UUID=39e476bc:5be27d92:c8fac465:06756b0d

mdadm-raidを実行してからraidの状況を確認

# /etc/init.d/mdadm-raid start
# mdadm --detail /dev/md0

Version : 00.90
Creation Time : Wed May 27 03:52:35 2009
Raid Level : raid1
Array Size : 78150656 (74.53 GiB 80.03 GB)
Used Dev Size : 78150656 (74.53 GiB 80.03 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Tue May 26 19:37:03 2009
State : active, resyncing
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Rebuild Status : 8% complete

UUID : 39e476bc:5be27d92:c8fac465:06756b0d
Events : 0.5

Number Major Minor RaidDevice State
0 3 0 0 active sync /dev/hda
1 22 0 1 active sync /dev/hdc

mdadmを起動時のパッケージに追加して、設定保存

# lrp_list -a mdadm
# save_conf

2009年5月24日日曜日

43a2-gw復旧と43a3-gw

先日からカーネルを2.6.29.4に変更してパッケージは43a3-gwに変更して作業している。

さきほど、コマンドをうち間違えて43a2-gwを壊してしまい、先ほどバックアップから復旧した。

43a3では、カーネルに組み込まれたsquashfsが、前のsquashfsと互換性がなくなり、圧縮ファイルを使っているpythonなどパッケージで作り直しになる。

また、IPsecのopenswanの作っているKLIPSでは新しいカーネルでNAT-Tが使えなくなって、どうもそのまま対応しそうにもないので、NETKEYに変更しようとしている。これを変更するとipsec0とかのデバイスはできなくなるので、ルーティングやフィルタリングが設定のやり直しが必要で難しくなると思う。

ついでに、仮想サーバでLXCがカーネルに組み込まれ、vserverは組み込まれそうもない。なので、LXCにも対応してみたい。

仮想イーサネットペアデバイス(Virtual ethernet pair device)を使うので、これはvserverよりルーティングやフィルタリングがわかりやすくなるのかもしれない。

2009年5月14日木曜日

テスト版のテスト

#1週間も更新していなかった。orz

IPnutsテスト版の公開をするため、テスト版のテストを IPnutsとはあまり関係の無い CMS Nightの会場の隅のほうでやりました。
パッケージを外部からとったことがなかったので心配でしたが、あまり問題なく動作できました。

Simpleの山本さんが自分の自作アクリルPCでも確認してみてくれたのですがフレームバッファが不具合で動作せず、今日確認したところ、/etc/modprobe.confがあると/etc/modprobe.dの中を見てくれてなくて、display_classが効いていなかったことがわかり修正。
あと、要望のあったユーザー名とパスワードの入力部分を改善して本日公開にいたりました。

CMS Nightの長尾さん、それから 山本さんそれからお話させていただきました皆さん、ありがとうございました。

2009年5月5日火曜日

AmazonのEC2を使ってみる

ここを、参考にさせてもらってできました。
http://www.studio-fix.com/blog/kaoru/
非常にわかりやすくて、何もいうことはありません。
今日は"Amazon EC2のイメージファイルをS3に保存する "までやりました。
ありがとうございます。

2009年5月2日土曜日

仮想サーバ(vserver)とIPnutsの運用(1)

運用上、早速 問題が起きているのでメモ。

今回はcronでのバックアップまわりの修正
/etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

/etc/cron.dailyでバックアップをしてしているが、仮想サーバーも同じタイミングでcronが動作する。
このとき、バックアップするために仮想サーバが同時にシャットダウンしてしまうので、タイミングをずらすためにcrontabを変更した。

また、バックアップ時のcronの標準出力をメールで受けとるように/etc/cron.daily/backupを変更

#!/bin/sh
/root/bin/backup.sh 2>&1 | /usr/sbin/sysmail -s "vserver backup"

sysmailはipnutsのユーティリティで、webadminで管理者のメールアドレスと、メールサーバを指定しておくと、標準入力をメールで送る。

cronでMAILTO=でメールが送られるようにssmtpをロードして/etc/ssmtp/ssmtp.confを設定
# lrp_load -b ssmtp
/etc/ssmtp/ssmtp.conf

Mailhub=メールサーバ
Hostname=自ホストのFQDNのホスト名

ssmtpの送信テスト

# echo テキスト | sendmail -v 送信先メールアドレス

大丈夫だと思う。

最後にssmtpの起動時のパッケージ追加と設定保存

# lrp_list -a ssmtp
# save_conf

2009年5月1日金曜日

MySQLサーバ移行のメモ

etchで動いていたMySQLをlenny上で動作するMySQLに移行しようとしている。

データベースはファイルをscpでコピーしてきた。
まず、ユーザーIDが違っていたのでオーナーをセット。
# chown -R mysql mysql

debianなので /etc/mysql/debian.cnf 内のパスワードを元のものに合わせる

起動しようとすると

Checking for corrupt, not cleanly closed and upgrade needing tables..
になる。
/var/log/syslogをみると errorになっていたので
Table upgrade required. Please do "REPAIR TABLE ...

mysql_upgrade -pを実行

かなり時間がかかったが、無事に終了。

相変わらずこのメッセージがでるが、これ自体は問題ないらしい
Checking for corrupt, not cleanly closed and upgrade needing tables..

仮想サーバのバックアップ(その3)

---バックアップの自動化
バックアップのスクリプトを/root/binに作った。/usr/local/binに作って# lrp_save localでパッケージを作成してもよいが、今回は/rootに作った。/root内のファイルは設定ファイルとしてconfig.lrpに保存される。

/root/bin/backup.sh

#!/bin/sh
VSERVER=仮想サーバ名

vserver $VSERVER stop
rsync -av --delete /var/lib/vservers/$VSERVER /var2/lib/vservers/
vserver $VSERVER start


/etc/cron.daily/backup

#!/bin/sh
/root/bin/backup.sh


/etc/cron.daily/backupはcronによって/etc/crontabから実行される。

テストしてOKであれば、save_confで保存する。

保存された設定ファイルの一覧は#lrp_conf -lで確認できる。

2009年4月30日木曜日

仮想サーバのバックアップ(その2)

--- バックアップを実行

バックアップ用の新しいディスクにパーティションを切って、rsyncでバックアップ

# mkdir /var2
# mount /dev/sdb1 /var2
# mkdir /var2/lib/vservers -p
# vserver サーバ名 stop
# rsync -av --delete /var/lib/vservers/サーバ名 ./
...
sent 2046517748 bytes received 526147 bytes 5873870.57 bytes/sec
total size is 2044493323 speedup is 1.00

MySQL,Apche2,PHP,Bind9とかが入っていて、データ含めて約2GBを5MB/secでコピーできた。
データファイルは1GB程度あるので、アプリケーションを含むシステムが1GBグぐらい。
USBのディスクがかなり遅いが、データの更新が無ければ、2回目は10秒程度で終了した。

---IPnuts側のデータを保存

仮想サーバではなく、IPnutsでデータとして保存すべきフォルダが/varにあり/varがtmpfsにマウントされていない(ディスクにマウントされている)とブートディスクに保存されないので、-fオプションをつけてlrp_data-saveを実行してブートディスクに保存しておく。IPnutsのデータファイルのリストは/var/lib/lrpkg/*.dataファイルにかかれている。これは、ブートディスクの/dataフォルダに保存される。sslで認証局を作ったり、証明書でOpenVPNの設定を行うと保存が必要になる。また、手動でdnsmasqのtftpを設定する場合も/var/lib/dnsmasqにデータを保存する。

# lrp_data-save -f

(ただし、これは正常にシャットダウンすると必ずブートディスクに保存される。)

/etc/fstabを変更し一旦設定を保存し再起動で、現行の動作を確認

LABEL=VAR /var ext3 defaults 0 2
LABEL=HOME /home ext3 defaults 0 2
LABEL=TMP /tmp ext3 defaults 0 2
LABEL=SWAP none swap sw 0 0

LABEL=VAR2 /var2 ext3 defaults 0 2
### for recover
#LABEL=VAR2 /var ext3 defaults 0 2
#LABEL=HOME2 /home ext3 defaults 0 2
#LABEL=TMP2 /tmp ext3 defaults 0 2
#LABEL=SWAP2 none swap sw 0 0

---リカバー時の動作確認
本体が動作しているのであれば、/etc/fstabを書き直して設定保存してもいいが、本体が起動しない場合もある。この場合は、ブートディスクの/systemフォルダにfstabがあるのでこれを編集して起動する。


#LABEL=VAR /var ext3 defaults 0 2
#LABEL=HOME /home ext3 defaults 0 2
#LABEL=TMP /tmp ext3 defaults 0 2
#LABEL=SWAP none swap sw 0 0

#LABEL=VAR2 /var2 ext3 defaults 0 2
### for recover
LABEL=VAR2 /var ext3 defaults 0 2
LABEL=HOME2 /home ext3 defaults 0 2
LABEL=TMP2 /tmp ext3 defaults 0 2
LABEL=SWAP2 none swap sw 0 0


lrp_data-saveで保存されるパッケージのデータは、/varがtmpfsではない場合(ディスクにマウントされている場合)起動時にロードされないので、リカバー時には手動で
# lrp_data-load -f
を実行し再起動する必要がある。これを避けるには、/var/lib/lrpkg/*.dataの中身をみてあらかじめバックアップ先にバックアップしておけばよい。

起動後動作確認すればOK。元にもどすときは、再度ブートディスクの/system/fstabを編集して再起動する。

仮想サーバのバックアップ(その1)

これまで、drbdでシステムを2重化し、バックアップをほかのマシンにコピーしていたシステムを、IPnuts内の仮想サーバに移行しようとしている。drbdで2台使用し、バックアップに1台、合計3台、このシステムにからんでいたが、単純に1台で運用するように変更する。

仮想サーバはvserverを使用する。これだと、パフォーマンスとかメモリとかの心配がほとんどない。

vserverはすでに/var/lib/vserver内にあってテスト的に動作しているので、これのバックアップを行うテストをする。

/etc/fstabは

#
proc /proc proc noauto 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
shm /dev/shm tmpfs defaults 0 0
/dev/cdrom /cdrom iso9660 noauto,ro
#/dev/hda2 none swap sw 0 0
LABEL=VAR /var ext3 defaults 0 2
LABEL=HOME /home ext3 defaults 0 2
LABEL=TMP /tmp ext3 defaults 0 2
LABEL=SWAP none swap sw 0 0

# You may edit only under line when you know that you do
tmpfs / tmpfs rw,size=160M
#tmpfs /tmp tmpfs rw,size=12M
#tmpfs /var tmpfs rw,size=24M

現行のディスクのパーティション:

Device Boot Start End Blocks Id System
/dev/hda1 1 38753 19531480+ 83 Linux
/dev/hda2 38754 40692 977256 83 Linux
/dev/hda3 40693 42631 977256 82 Linux swap / Solaris
/dev/hda4 42632 77520 17584056 83 Linux


これにUSBでディスクをつないでバックアップする。IPnutsなので、/var以外にデータは無いが復旧しやすいように、パーティションは同じ構成にする。
バックアップするのは、/var/lib/vserver/xxxの仮想環境。設定は、IPnutsの場合、常にブートディスクのUSBに保存される(しないといけない)ので、今回バックアップの必要はない。

復旧時にはfstabのラベルを

LABEL=VAR2 /var ext3 defaults 0 2
LABEL=HOME2 /home ext3 defaults 0 2
LABEL=TMP2 /tmp ext3 defaults 0 2
LABEL=SWAP2 none swap sw 0 0

にすれば動作するように、新しいディスクにはラベルをつけておく。

2009年4月29日水曜日

インターネット越しのpxeブート

gpxeのhttpでの呼び出しがタイムアウトを起こしやすく、現在のところ難しい。

gpxeとdnsmasq (まとめ1)

dnsmasqの設定がある程度固まりました。

/etc/dnsmasq.conf (抜粋)

interface=eth0
dhcp-option=15,"sesame.local"
dhcp-option=6,192.168.0.254

dhcp-range=net1,192.168.0.100,192.168.0.200,12h
dhcp-option=net1,3,192.168.0.254
conf-dir=/etc/dnsmasq.d/conf.d



/etc/dnsmasq.d/conf.d/tftpd.conf(抜粋)

##### default boot pxe-gpxelinux.0-bootmenu ######

# pxelinux.magic
#dhcp-option-force=208,f1:00:74:7e
# Configuration file name
dhcp-option-force=209,conf/bootmenu.cfg
# Path prefix
dhcp-option-force=210,http://192.168.3.20/gpxe/
# Reboot time. (Note 'i' to send 32-bit value)
#dhcp-option-force=211,60i

enable-tftp
dhcp-boot=gpxelinux.0
tftp-root=/var/lib/dnsmasq/tftpboot
log-dhcp

######## end default #############

### Sample: gpxelinux.0 - gpxelinux.cfg ####
#dhcp-mac = 43a2-gw, 00:0c:29:xx:xx:xx
#dhcp-option-force = 43a2-gw,209,43a2-gw.cfg

### pxe - undi - gpxe.scr ###

dhcp-userclass = gpxe , "gPXE"
dhcp-no-override

dhcp-mac = vmpxe1, 00:0c:29:xx:xx:aa
dhcp-boot = net:vmpxe1 , undionly.kpxe
dhcp-boot = net:gpxe, net:vmpxe1, "http://192.168.3.20/gpxe/43a2-gw.scr"

dhcp-mac = vmpxe2, 00:0c:29:xx:xx:bb
dhcp-boot = net:vmpxe2 , undionly.kpxe
dhcp-boot = net:gpxe, net:vmpxe2, "http://192.168.3.20/gpxe/gpxemenu.scr"

#600sc
dhcp-host = 00:11:22:33:44:55, net:600sc, 192.168.0.36
dhcp-boot = net:600sc , undionly.kpxe
dhcp-boot = net:gpxe, net:600sc, "http://192.168.3.20/gpxe/43a2-gw.scr"


########### end


/etc/dnsmasq.confから/etc/dnsmasq.d/conf.d/tftpd.confが読み込まれてネットブート関連の設定が読み込まれます。

---デフォルト---
tftpでgpxelinux.0を読み込み、http://192.168.3.20/gpxe/conf/bootmenu.cfgを読み込みます。

http://192.168.3.20/gpxe/conf/bootmenu.cfg:

DEFAULT vesamenu.c32
PROMPT 0

menu background conf/y150-1.jpg
menu title IPnuts pxe boot menu
prompt 0
timeout 1000
#allowoptions 0
menu timeoutrow 20
menu vshift 2
menu rows 8
menu color title 1;36;44 #ff8bc2ff #00000000 std
menu color unsel 37;44 #ff1069c5 #00000000 std
menu color sel 7;37;40 #ff000000 #ffff7518 all
menu color hotkey 1;37;44 #ffffffff #00000000 std
menu color hotsel 1;7;37;40 #ff000431 #ffff7518 all
menu color tabmsg 31;40 #90ffff00 #00000000 std
menu color cmdline 37;40 #c0ffffff #ff000000 std

LABEL 43a2-gw
MENU LABEL ^1. 43a-gw
KERNEL 43a2-gw/linux626.c01
APPEND initrd=43a2-gw/root626.c01

パスはhttp://192.168.3.20/gpxe/がプリフィックスでgpxelinux.0が動作しているので、vesamenu.c32はhttp://192.168.3.20/gpxe/にあり、イメージファイルのy150-1.jpgは
http://192.168.3.20/gpxe/confにあります。

---その他---

その他、macアドレスでIDを指定して、undionly.kpxeとそれぞれのスクリプトをチェインしています。

http://192.168.3.20/gpxe/gpxemenu.scr

#!gpxe
imgfree
show ip
chain vesamenu.c32 conf/gpxemenu.cfg

gpxemenu.scrがチェインされて、gpxemenu.scrのあるパスがカレントになるのでパスを設定するときは注意が必要です。

http://192.168.3.20/gpxe/conf/gpxemenu.cfg

menu background conf/y150-1.jpg
menu title IPnuts gpxe boot menu
#menu autoboot
prompt 0
timeout 1000
#allowoptions 0
menu timeoutrow 20
menu vshift 2
menu rows 8
menu color title 1;36;44 #ff8bc2ff #00000000 std
menu color unsel 37;44 #ff1069c5 #00000000 std
menu color sel 7;37;40 #ff000000 #ffff7518 all
menu color hotkey 1;37;44 #ffffffff #00000000 std
menu color hotsel 1;7;37;40 #ff000431 #ffff7518 all
menu color tabmsg 31;40 #90ffff00 #00000000 std
menu color cmdline 37;40 #c0ffffff #ff000000 std

LABEL 43a2-gw
MENU LABEL ^1. 43a-gw
KERNEL 43a2-gw/linux626.c01
APPEND initrd=43a2-gw/root626.c01

pxe - undionly.kpxe by dnsmasq 先日の訂正

昨日の訂正
pxe -> gpxe(undionly.kpxe) -> gpxeのスクリプト 
までのチェインロードが、dnsmasqのDHCPで動作しました。


dhcp-no-override
dhcp-userclass = gpxe , "gPXE"
dhcp-boot=net:#gpxe,undionly.kpxe
dhcp-boot = "http://192.168.3.20/gpxe/43a2-gw.scr"

dhcp-no-override が必要でした。wikiにもチャンとかいてありました。

wikiと違って、dhcp3-serverで指定していたことと同等にするため、gpxeを判別するためにuser-classを指定し、最初のpxeブート時にはundionlyを読み込ませています。

2009年4月28日火曜日

pxe - undionly.kpxe by dnsmasq

昨日、プロフィール入れてみました。
IPnutsの開発が遅々として進まず、動作検証できてから公開なんてとてもおぼつかないので
アルファ品質、テスト版というか、開発中環境をそのままアップしようと考えています。

しばらくは、まだそれの準備段階になるのですが、それでもまだうだうだする気配。
#ようは、チラシの裏レベル

文章を書くのが苦手でここまできてしまいましたが、続けられたらいいなと思います。
よろしくです。
------

今日のメモ:
dnsmasqというアプリケーションがあって、dnsとdhcpとtftpを全部これにやらそうとしています。
なので、開発環境ではこれまでのdhcpサーバは置き換えられています。

現在、IPnutsの開発環境でネットワークブートのテストをしていて、
dnsmasq+gpxe で動作検証しています。

vmwareで gpxeのisoイメージを立ち上げると、非常に遅いので、pxeで立ち上げて、gpxe環境を持ってこようとしている。

1 pxe(BIOS)-> gpxelinux.0
 syslinux.cfg相等のコンフィグファイルとカーネル、ルートファイルシステムがhttpで読みこめる

または
2 pxe(BIOS)-> undionly.kpxe 
 httpでgpxeのスクリプトコンフィグファイルとカーネル、ルートファイルシステムがhttpで読みこめる

が選択肢
2の場合、
pxe(BIOS)-> undionly.kpxe -> スクリプト までがチェインするので最初のpxeではdhcpでbootファイルとしてundionly.kpxeを渡し、次にはスクリプトをdhcpで渡さないといけないので、dhcp3サーバだと


if exists user-class and option user-class = "gPXE" {
filename "http://192.168.0.15/gpxe/43a2-gw.scr";
} else {
filename "undionly.kpxe";
}
のような指定をする。

dnsmasqの場合、
http://www.etherboot.org/wiki/dnsmasq
に書いてあるようにdnsmasq.confを設定しても、gpxe.pxe(undionly.kpxeも)にfilename(ブートファイル)を渡してくれない。
訂正:dnsmasqの設定ファイルに、dhcp-no-override を追加すればできました。wikiにちゃんと書いてあった。

結論:
社内&vmwareの環境だとpxeブート->gpxelinux.0で起動させることにする。
これの欠点は、httpで各ファイルを持ってこようとするとdhcpサーバでいろいろ設定をやる必要がある。
gpxeのスクリプトが読めるとdhcpサーバで複雑な設定が不要になるので、2.の方法でやりたかった。

以下その設定。httpのパスと、設定ファイルを指定できる。

dhcpd.confの場合:

option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
site-option-space "pxelinux";

...

### ホストの指定内で
option pxelinux.pathprefix "http://192.168.0.15/gpxe/";
option pxelinux.configfile "43a2-gw";


dnsmasq.confの場合

dhcp-option-force=209,43a2-gw.cfg
dhcp-option-force=210,http://192.168.3.20/gpxe/


dnsmasqを使うのでこの設定をちゃんとしてやる必要がある。メニュー表示にして、コンフィグファイルは一つにしようかなと思っている。