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 を読んだときに、初期化のために呼ばれる。ライブラリの関数のエントリポイントを返す。
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を保持している。
2.関数呼び出し
サンプルだと static void example_drv_output(ErlDrvData handle, char* buff, int bufflen) に
Port ! {self(), {command, Data}}
からメッセージを渡す。
C側では Data をbuffにセットしてoutputにセットされた関数が呼び出される。
最後に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に返す。
---------
以下はerlang側のコード
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は、起動してから解像度を変更できた。
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 ""'がないとちゃんと動作しなかった。
--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のデータベースもそれぞれの仮想サーバで稼働しています。
以下はバックアップのスクリプトです。
ネットワークから更新されるデータはデータベースのテーブルだけなので、仮想サーバを落とさずに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でスナップショットをとったあと、すぐにロックをはずし、正常稼働状態にすることができます。その後スナップショットをマウントしてゆっくりバックアップをとることができます。
仮想サーバのバックアップ(その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経由になった。
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
---つづく
仮想マシンを新規作成
インターフェースは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
マシンはサーバ入れ替えでパワーアップさせているので、他のサーバで動作している仮想マシンを移行予定
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)
以下だけ説明する
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)
データは修復する必要はないし、ディスクもない、モチベーションもないから以上で移行テスト終了。
セカンダリ側を立ち上げるが、その前にマスターとセカンダリの設定が同期がとれていないといけない。
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
これは、rc.lrpの設定ファイルになっていて/etc/init.d/rcSがこのファイルを参照する用になっている。
WebadminでLVSの設定(内部的にはkeepalivedの設定)を見ると
になっている。ha_start ha_stopは自作のshなのでパッケージには含まれてはいない。
ha_startの最後の方に
/etc/keepalived/appslistの中身はこれ
よって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に記録されているパッケージも消す。
設定保存して、再起動、動作確認
動かない。
keepalivedが起動すると、ha_startが動き、マウントするのだがディスクが古いことになっているからプライマリディスクにできないといって怒られる。
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がきちんと動作することを確認
次はスレーブ側を立ち上げて同期させる
ーーーつづく
そのまえに、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`"となっていて apps.listのサービスを起動している。
for app in $APPS
do
if [ $? -eq 0 ] ;then
/etc/init.d/$app start
else
$LOGGER "fail to start $app"
fi
done
/etc/keepalived/appslistの中身はこれ
exim44.3ではIPnutsだけで動作するのは nfs-kernel-server、bind9のふたつ。ほかはサポートする予定は無くて動作させる場合は仮想マシン(vserver)で動作させる。
mysql
dhisd
nfs-kernel-server
bind9
apache2
よって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: - hotplugminihttp,licenseは除外
not found: - dhcpcd
not found: - hotplug
not found: - less
not found: - xdelta
not found: - cipe
not found: - minihttp
not found: - license
not found: - passwd
設定保存して、再起動、動作確認
動かない。
keepalivedが起動すると、ha_startが動き、マウントするのだがディスクが古いことになっているからプライマリディスクにできないといって怒られる。
Jun 11 07:53:48 db1 kernel: drbd0: State change failed: Refusing to be Primary without at least one UpToDate diskそこで、無理やりprimaryにするおまじない
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--- }
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を上げる予定
ーーーーつづく
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の移行は -- つづく --
しかし、移行した、サービス提供中の実機でもtestingの検証を行うので、ダウンタイムが気になる。DRBD復活させるか検討する。
テストは、以前使用していたDRBD7のマシンが2台がそのまま転がっているので、検証しながらDRBDの最新版の8.3.1で動作させてみる。
いきなり、立ち上がりからDRBD関係なくアップグレードするだけで関する問題が起きて、あれやこれやバグフィックスや改良をした。
- config.lrpだけ持っていくと/systemが移行できないバグ修正
- /etc/default/ipnuts.confが設定保存されるていると、動作しなくなるのでこれを除外するように変更
- 起動パッケージのリスと古いと新規の標準パッケージを読み込まず、環境が統一されないのでこれを新規の標準パッケージをアップグレード時に読み込むように
- modprobe.confを廃止するので、/systemから削除するように変更
- /systemの移行(アップグレード)スクリプトを修正
DRBDの移行は -- つづく --
2009年6月7日日曜日
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
/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だけ対処して、今日のところは動作しているのでここまでとする。
/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と比較すると次のようになる。
今回の移行は関係ないが、最初からサーバ環境を仮想マシンで作っておくと、開発などでテスト環境や開発環境から本番環境への移行したいときにシステムごとコピーするだけでできるので楽になったりする。
スナップショットを併用するともっといいかも。
さて、今回の移行だが、使えなくなるので仮想環境に移すサービスは
testingでも使えるのは
他サーバに移行済み
である。
なので使えなくなるサービスを仮想マシンの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での動作確認
社内のファイルサーバは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が別パッチではなくなったので、これも通常どおり使用できるように考える予定。
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がなかったので作成した。
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
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は使わない
/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 なので限界でしょう。
バックアップで稼働中の仮想サーバーのアーカイブをとって新しいサーバーにリストアします。
# 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
再起動して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
ちょうどいい機会なので、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よりルーティングやフィルタリングがわかりやすくなるのかもしれない。
さきほど、コマンドをうち間違えて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の長尾さん、それから 山本さんそれからお話させていただきました皆さん、ありがとうございました。
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に保存する "までやりました。
ありがとうございます。
http://www.studio-fix.com/blog/kaoru/
非常にわかりやすくて、何もいうことはありません。
今日は"Amazon EC2のイメージファイルをS3に保存する "までやりました。
ありがとうございます。
2009年5月2日土曜日
仮想サーバ(vserver)とIPnutsの運用(1)
運用上、早速 問題が起きているのでメモ。
今回はcronでのバックアップまわりの修正
/etc/crontab
/etc/cron.dailyでバックアップをしてしているが、仮想サーバーも同じタイミングでcronが動作する。
このとき、バックアップするために仮想サーバが同時にシャットダウンしてしまうので、タイミングをずらすためにcrontabを変更した。
また、バックアップ時のcronの標準出力をメールで受けとるように/etc/cron.daily/backupを変更
sysmailはipnutsのユーティリティで、webadminで管理者のメールアドレスと、メールサーバを指定しておくと、標準入力をメールで送る。
cronでMAILTO=でメールが送られるようにssmtpをロードして/etc/ssmtp/ssmtp.confを設定
/etc/ssmtp/ssmtp.conf
ssmtpの送信テスト
大丈夫だと思う。
最後にssmtpの起動時のパッケージ追加と設定保存
今回は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が違っていたのでオーナーをセット。
debianなので /etc/mysql/debian.cnf 内のパスワードを元のものに合わせる
起動しようとすると
になる。
/var/log/syslogをみると errorになっていたので
かなり時間がかかったが、無事に終了。
相変わらずこのメッセージがでるが、これ自体は問題ないらしい
データベースはファイルを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に作って
/root/bin/backup.sh
/etc/cron.daily/backup
/etc/cron.daily/backupはcronによって/etc/crontabから実行される。
テストしてOKであれば、save_confで保存する。
保存された設定ファイルの一覧は
バックアップのスクリプトを/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でバックアップ
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にデータを保存する。
(ただし、これは正常にシャットダウンすると必ずブートディスクに保存される。)
/etc/fstabを変更し一旦設定を保存し再起動で、現行の動作を確認
---リカバー時の動作確認
本体が動作しているのであれば、/etc/fstabを書き直して設定保存してもいいが、本体が起動しない場合もある。この場合は、ブートディスクの/systemフォルダにfstabがあるのでこれを編集して起動する。
lrp_data-saveで保存されるパッケージのデータは、/varがtmpfsではない場合(ディスクにマウントされている場合)起動時にロードされないので、リカバー時には手動で
を実行し再起動する必要がある。これを避けるには、/var/lib/lrpkg/*.dataの中身をみてあらかじめバックアップ先にバックアップしておけばよい。
起動後動作確認すればOK。元にもどすときは、再度ブートディスクの/system/fstabを編集して再起動する。
バックアップ用の新しいディスクにパーティションを切って、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は
現行のディスクのパーティション:
これにUSBでディスクをつないでバックアップする。IPnutsなので、/var以外にデータは無いが復旧しやすいように、パーティションは同じ構成にする。
バックアップするのは、/var/lib/vserver/xxxの仮想環境。設定は、IPnutsの場合、常にブートディスクのUSBに保存される(しないといけない)ので、今回バックアップの必要はない。
復旧時にはfstabのラベルを
にすれば動作するように、新しいディスクにはラベルをつけておく。
仮想サーバは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日水曜日
gpxeとdnsmasq (まとめ1)
dnsmasqの設定がある程度固まりました。
/etc/dnsmasq.conf (抜粋)
/etc/dnsmasq.d/conf.d/tftpd.conf(抜粋)
/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:
パスは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
gpxemenu.scrがチェインされて、gpxemenu.scrのあるパスがカレントになるのでパスを設定するときは注意が必要です。
http://192.168.3.20/gpxe/conf/gpxemenu.cfg
/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 が必要でした。wikiにもチャンとかいてありました。
wikiと違って、dhcp3-serverで指定していたことと同等にするため、gpxeを判別するためにuser-classを指定し、最初のpxeブート時にはundionlyを読み込ませています。
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サーバだと
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の場合:
dnsmasq.confの場合
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も)に
訂正: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を使うのでこの設定をちゃんとしてやる必要がある。メニュー表示にして、コンフィグファイルは一つにしようかなと思っている。
登録:
投稿 (Atom)