tag:blogger.com,1999:blog-35867329853216793042024-02-09T03:49:33.301+09:00こんなところにでも書いとくかgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.comBlogger48125tag:blogger.com,1999:blog-3586732985321679304.post-68218105759771410042010-10-22T14:50:00.003+09:002010-10-22T16:13:05.586+09:00Mercurialでパッチの管理分散バージョン管理システムのMercurialでパッチの管理を行うときは、mq を使う。<br />使い方のメモ<br /><br /><span style="font-weight: bold;">拡張を登録する<br /></span><br />~/.hgrc に拡張機能を登録する。<br /><blockquote><br />[extensios]<br />mq=</blockquote><br />元のソースファイルを展開し、 mq を初期化する。<br /><blockquote>hg init<br />hg commit --addremove -m "initial commit"<br />hg qinit</blockquote>編集する前にパッチの名前をつける<br /><blockquote>hg qnew -m "説明文" pathc_no_namae</blockquote><br />編集後パッチを作成<br /><blockquote>hg qrefresh<br /></blockquote><br /><br />パッチファイルがある場合は<br /><br /><blockquote>hg qimport patch_file</blockquote><br />ちなみに今回はカーネルにvserverとaufsのパッチを当てた。<br /><br /><blockquote>hg qimport patch-2.6.35.4<br />hg qimport patch-2.6.35.2-vs2.3.0.36.31.diff<br />hg qimport aufs2-base.patch<br />hg qimport aufs2-kbuild.patch<br />hg qimport aufs2-standalone.patch<br /><br />hg qnew aufs2-files<br /></blockquote>include/linux/Kbuild に<br /><br />header-y = aufs_type.h<br /><br />を追加。README にはコピーするように書いてあったが、コピーするのはaufs_type.hだけ。<br /><br />aufs2-standalone/include/linux/aufs_type.h , aufs2-standalone/fs, aufs2-standalone/Documentation をコピー<br /><br />リポジトリに追加<br /><br /><blockquote>hg add .</blockquote>パッチをリフレッシュ<br /><br /><blockquote>hg qrefresh</blockquote><br /><br />.hg/patchesの中身<br /><blockquote>$ ls .hg/patches/ -1<br />aufs2-base.patch<br />aufs2-files<br />aufs2-kbuild.patch<br />aufs2-standalone.patch<br />patch-2.6.35.2-vs2.3.0.36.31.diff<br />patch-2.6.35.4<br />series<br />status<br /></blockquote><br /><br />aufsについては、クローンを作って、READMEを読む。<br /><br />git clone git://aufs.git.sourceforge.net/gitroot/aufs/aufs2-standalone.gitgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-15951916559759946552010-10-02T16:57:00.004+09:002010-10-02T17:23:08.359+09:00CDイメージを作ってそれをオンメモリで起動する方法タイトルのとおり、Linuxのroot イメージを作ってそれをオンメモリにマウントして起動するためのアイディア。<br /><br />-- USBなどの内容物 --<br /><br />/カーネル<br />/ルートファイルシステム(initramfs)<br /><br />-- ルートファイルシステムの内容 --<br /><br />/init <br />/bin/busybox<br />/cdrom-image.iso<br /><br />-- cdrom-image.iso に必要なもの --<br />/linuxrc<br /><br />起動方法<br /><br />1. syslinux とかでカーネルとルートファイルをロードして、ルートファイルの initが実行される。<br /><br />2. init で busybox を使って CD イメージをマウントし、switch_root で CD イメージ中の linuxrc を動かす。<br /><br />3. CD イメージ中のlinuxrc で proc や sys をマウントする。<br /><br />4. 最後に /sbin/init を実行する。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-36427661095602251702010-08-28T17:17:00.004+09:002010-08-28T17:51:55.045+09:00Debianカーネルパッケージの再構築debianのカーネルを再構築をしたいのだが、これまで make-kpkg を使った再構築方法しか知らずちょっと調べたのでメモ<br /><br />make-kpkg を使ったカーネルパッケージの作成方法はここに書いてある。<br /><br /><a href="http://www.debian.org/releases/stable/i386/ch08s06.html.ja">http://www.debian.org/releases/stable/i386/ch08s06.html.ja</a><br /><br />なにをやりたいかというと、今あるカーネルパッケージと同じパッケージを再構築すること。<br />もしくは、もとから少しだけ変えたい。<br /><br />make-kpkg を使った方法だと、自分でカーネルのコンフィグレーションをやるようになる。<br /><br />それの方法は、"Debian Linux Kernel Handbook" にちゃんと書いてあった。<br /><a href="http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official">http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official</a><br /><br /><span style="font-weight: bold;"><br />準備</span><br /><br />カーネルパッケージをインストール<br /><br />$ apt-get source linux-2.6<br /><br />再構築に必要なパッケージをインストール<br /><br /># apt-get install build-essential fakeroot<br /># apt-get build-dep linux-2.6<br /><br /><span style="font-weight: bold;">パッチの適用</span><br /><br />展開したディレクトリに移動してパッチを当てる。<br /><br />ソースを展開<br />$ dpkg-source -x linux-2.6.......dsc<br /><br />$ fakeroot debian/rules source<br />$ fakeroot debian/rules setup<br /><br /><span style="font-weight: bold;">お目当てのパッケージを作る</span><br /><br />$ fakeroot debian/rules source<br />$ fakeroot make -f debian/rules.gen binary-arch_i386_none_686<br /><br />rules.gen の後ろの引数は rules.gen の中身を見て決める。<br />お目当ては、 binary-arch_i386_vserver_686-bigmem<br /><br />変更したいときは、url の続きをやるのだが、今日はここまでgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-56081948526050717752010-08-10T10:18:00.003+09:002010-08-10T10:36:03.068+09:00squeeze でフォルダ名を日本語にする$ sudo apt-get install xdg-user-dirs-gtk<br />$ LANG=C xdg-user-dirs-gtk-update<br />(vi .config/user-dirs.dirs が編集される)<br />ログインしなおす。<br /><br />フォルダをリネームしてくれるわけではないみたい。<br />日本語フォルダ内にファイルがあるとそのままになっているのであとで自分で移動する。<br /><br />再ログイン後、ファルダ名を日本語にするか聞かれるが、古いままにする。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-17756744897262803672010-08-10T07:54:00.005+09:002010-08-10T14:07:44.985+09:00squeeze amd64 環境内で i386 の環境を schrootで作成開発環境を squeeze に入れ替えた。<br />build は i386 なので、schroot の環境を作成<br /><br /><blockquote><br />$ sudo aptitude install cdebootstrap schroot<br /></blockquote><br /><br /><blockquote><br />$ sudo cdebootstrap --arch=i386 --flavour=build squeeze squeeze-i386 \ http://ftp.jp.debian.org/debian<br /></blockquote><br /><br /><blockquote><br />$ sudo groupadd pnuts<br /></blockquote><br />自分をpnuts グループに追加<br /><br /><blockquote><br />[sarge-i386]<br /># Optional. The chroot with alias 'default' is used if you just type<br /># 'schroot' without the -c option.<br />aliases=testing,default<br /># Whatever you like<br />description=Debian sarge<br /># Relative to what was /mnt until a moment ago<br />location=/sarge-i386<br /># Below here is standard for all the chroots<br /># Adjust according to the space available and size of builds you'll do<br />lvm-snapshot-options=--size 2G<br />device=/dev/デバイス<br />type=lvm-snapshot<br />priority=3<br />groups=pnuts,root<br />root-groups=pnuts,root<br />source-groups=pnuts,root<br />source-root-groups=root<br /></blockquote><br /><blockquote><br />$ sudo schroot -c squeeze-i386-source<br />(squeeze-i386-source)root@debian:~# apt-get upgrade<br />(squeeze-i386-source)root@debian:~# apt-get install devscripts vim-tiny sudo \ fakeroot aptitude build-essential<br />(squeeze-i386-source)root@debian:~# apt-get clean<br /></blockquote><br /><br />ここから、pnut 用の環境作成<br /><br />デフォルトの設定をコピー<br /><blockquote><br />$ cd /etc/schroot<br />$ sudo cp -a defaults pnut<br /></blockquote><br />schroot.conf を編集して、<br /><br />script-config=pnut/config<br /><br />を追加。<br />pnut/config を編集<br /><blockquote><br />FSTAB="/etc/schroot/pnut/fstab"<br />COPYFILES="/etc/schroot/pnut/copyfiles"<br /></blockquote><br /><br />pnut/fstab に次の行を追加<br /><blockquote><br />/mnt/src /mnt/src none rw,rbind 0 0<br /></blockquote><br />(適当にbind でマウントする.)<br /><br />pnut/copyfiles も適当に追加gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-72623029698239633312010-03-13T14:00:00.003+09:002010-08-10T09:03:39.381+09:00Amazon AWS また 最初から新しいノートパソコンがきたので、AWS用の環境設定のやり直し<br /><br />ElasticFox を再インストールgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-36134253291104928862010-01-10T16:59:00.003+09:002010-01-10T17:25:35.754+09:00erlangの非同期ドライバーでのタームの扱い非同期ドライバーは非同期スレッドで使いたくてやっているわけだが、<br />erl_interfaceは使えない。<br /><br />すべて、eiライブラリだけでやりとりする必要がある。よって、ETERMも使えない。<br />この結論にいたるまでずいぶんと無駄をした。<br /><br />それで、前回のコードをeiを使用して書いてみた。<br /><br />まずは、erlang側のコード<br /><br />注意点や前回との違いは<br /><br />erl_ddll:load_driver(".", SharedLib) はspawn してから行う<br />open_portは binary でオープンする(use_stdioがあるとデバックに便利)<br />データを渡すときは、term_to_binary、受けとるときは、binary_to_termを使う<br />サンプルは、整数を扱っているのでリストではなくタプルで渡す。<br />(サンプルの場合、リストで渡すと、C側で-1と255の区別ができない)<br /><br /><pre><br />start(SharedLib) -><br /> spawn(?MODULE, init, [SharedLib]).<br /><br />init(SharedLib) -><br /> register(complex, self()),<br /> erl_ddll:load_driver(".", SharedLib),<br /> Port = open_port({spawn_driver, SharedLib}, [binary, use_stdio]),<br /> loop(Port).<br /><br />stop() -><br /> complex ! stop.<br /><br />foo(X) -><br /> call_port({foo, X}).<br />bar(Y) -><br /> call_port({bar, Y}).<br /><br />call_port(Msg) -><br /> complex ! {call, self(), Msg},<br /> receive<br /> {complex, Result} -><br /> Result<br /> end.<br /><br />loop(Port) -><br /> receive<br /> {call, Caller, Msg} -><br /> %Port ! {self(), {command, encode(Msg)}},<br /> Port ! {self(), {command, term_to_binary(encode(Msg))}},<br /> receive<br /> {Port, {data, Data}} -><br /> Caller ! {complex, decode(Data)}<br /> end,<br /> loop(Port);<br /> stop ->decode([Int]) -> IC側のコードnt;<br />decode(Res) when is_binary(Res)-><br /> binary_to_term(Res).<br /><br /> Port ! {self(), close},<br /> receive<br /> {Port, closed} -><br /> exit(normal)<br /> end;<br /> {'EXIT', Port, Reason} ->C側のコード<br /> io:format("~p ~n", [Reason]),<br /> exit(port_terminated)<br /> end.<br /><br />encode({foo, X}) -> {1, X};<br />encode({bar, Y}) -> {2, Y}.<br /><br />decode([Int]) -> Int;<br />decode(Res) when is_binary(Res)-><br /> binary_to_term(Res).<br /></pre><br /><br />examplebar.cも変更<br /><br /><span style="font-weight: bold;">C側のコード</span><br /><pre><br />long bar(int a) {<br /> return a+1;<br />}<br /><br />long foo(int b) {<br /> return b*2;<br />}<br /></pre><br />ドライバーの方は抜粋。<br />いろいろ大変だったが、何とか動いた。<br />ei_decode_XXX を行う度にindexが書き換わる。<br /><br /><pre><br />...<br /><br />typedef struct {<br /> char fn;<br /> int arg;<br /> long res;<br />} our_async_data;<br /><br />...<br /><br />static void example_drv_foobar(void * async_data)<br />{<br /> our_async_data* d = (our_async_data*)async_data;<br /><br /> if (d->fn == 1) {<br /> d->res = foo(d->arg);<br /> } else if (d->fn == 2) {<br /> d->res = bar(d->arg);<br /> }else{<br /> d->res = 0;<br /> }<br />}<br /><br />static void example_drv_error(void * async_data){<br /> our_async_data* d = (our_async_data*)async_data;<br /> d->res = 255;<br />}<br /><br />static void example_drv_output(ErlDrvData handle, char* buff, int bufflen)<br />{<br /> example_data* d = (example_data*)handle;<br /> our_async_data* a = (our_async_data*)malloc(sizeof(our_async_data));<br /> int i, ver, size, type, arity;<br /> int val;<br /> long long_val;<br /> unsigned char str[3];<br />// indexの初期化を忘れないように<br /> i = 0;<br /> if(0 != ei_decode_version(buff, &i, &ver))printf("error\n\r");<br />// printf("version is %d.\n\r", ver);<br /> ei_get_type(buff, &i, &type, &size);<br /> printf("term type is %d,(%c).\n\r", type,type);<br /> printf("size is %d.\n\r", size);<br /><br /> if( type == ERL_SMALL_TUPLE_EXT ){<br /> ei_decode_tuple_header(buff, &i, &arity);<br /> printf("list size is %d .\n\r", arity);<br /> ei_get_type(buff, &i, &type, &size);<br /> printf("i1 type is %d,(%c).\n\r", type,type);<br /> if( type == ERL_SMALL_INTEGER_EXT){<br /> ei_decode_char(buff, &i, str);<br /> printf("function is %d\n\r",str[0]);<br /> a->fn = str[0];<br /> ei_get_type(buff, &i, &type, &size);<br /> printf("i2 type is %d,(%c).\n\r", type,type);<br /> if( type == ERL_SMALL_INTEGER_EXT){<br /> ei_decode_char(buff, &i, str);<br /> a->arg = (unsigned int)*str;<br /> printf("arg is %d\n\r",a->arg);<br /> driver_async(d->port, NULL, example_drv_foobar, a, free);<br /> }else if( type == ERL_INTEGER_EXT){<br /> ei_decode_long(buff, &i, &val);<br /> a->arg = val;<br /> printf("arg is %d\n\r",val);<br /><br /> driver_async(d->port, NULL, example_drv_foobar, a, free);<br /> }else{<br /> driver_async(d->port, NULL, example_drv_error, a, free);<br /> }<br /> }else{<br /> driver_async(d->port, NULL, example_drv_error, a, free);<br /> }<br /> }<br /><br />static void ready_async(ErlDrvData handle, ErlDrvThreadData async_data)<br />{<br /> ei_x_buff x_buff;<br /> ei_x_new_with_version(&x_buff);<br /> example_data* d = (example_data*)handle;<br /> our_async_data* a = (our_async_data*)async_data;<br /><br /> if( a->res <>res >= 0 ){<br /> ei_x_encode_char(&x_buff, a->res);<br /> }else{<br /> ei_x_encode_long(&x_buff, a->res);<br /> }<br /><br /> driver_output(d->port, x_buff.buff, x_buff.index);<br />/* not thread safe */<br />// driver_output_term(d->port, bin, sizeof(bin)/sizeof(bin[0]));<br /> ei_x_free(&x_buff);<br /><br /> free(a);<br />}<br /><br />...<br /></pre>gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com1tag:blogger.com,1999:blog-3586732985321679304.post-61135275685441773722009-12-26T12:21:00.002+09:002010-08-10T09:02:27.215+09:00erlangのR13B03から erl_nif が追加されたみたいだが、まだ、experimental<br /><a href="http://www.erlang.org/doc/man/erl_nif.html">http://www.erlang.org/doc/man/erl_nif.html</a><br /><br />これとは違うのかな?<br /><a href="http://www.erlang.org/eeps/eep-0007.html">http://www.erlang.org/eeps/eep-0007.html</a>gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-31208894412790662132009-11-29T13:58:00.007+09:002009-11-29T16:24:40.679+09:00erlangの非同期ドライバーのコードを追う<a href="http://groups.google.co.jp/group/simple_index/web/091128--index23">http://groups.google.co.jp/group/simple_index/web/091128--index23</a> のコピペと続き<br /><br /><span style="font-weight: bold;">1. 初期化<br />1-1. DRIVER_INIT - erl_ddll:load_driver/2</span><br />DRIVER_INIT は erl_ddll:load_driver/2 を読んだときに、初期化のために呼ばれる。ライブラリの関数のエントリポイントを返す。<br /><blockquote><pre>DRIVER_INIT(example_drv) /* must match name in driver_entry */<br />{<br />return &example_driver_entry;<br />}<br /></pre></blockquote><br /><br />ErlDrvEntryには、関数ポインタがセットされている。<br /><br />* init: load_driverで呼び出される。<br />* start: open_portで呼び出される。<br />* stop: close_port で呼び出される。<br />* output: データをportに送ったときに呼ばれる。<br /><br />erlang側では Port ! {self(), {command, Data}}, または port_command/2 を使う。<br />-----<br />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.<br />----<br /><br />* ready_async: C側から driver_asyncを実行するとready_asyncに結果が渡される。<br /><br />参考:<br />http://www.erlang.org/doc/man/driver_entry.html<br /><br /><span style="font-weight: bold;">1-2. start - open_port</span><br /><br />以下の例では、spawn したプロセス内でportをオープンし、ループに入っている。<br />Portは startで作成したErlDrvDataのhandleを保持している。<br /><blockquote><pre><br />init(SharedLib) -><br /> register(complex, self()),<br /> Port = open_port({spawn, SharedLib}, []),<br /> loop(Port).<br /></pre></blockquote><br /><span style="font-weight: bold;">2.関数呼び出し</span><br /><br />サンプルだと static void example_drv_output(ErlDrvData handle, char* buff, int bufflen) に<br /><br />Port ! {self(), {command, Data}}<br /><br />からメッセージを渡す。<br /><br />C側では Data をbuffにセットしてoutputにセットされた関数が呼び出される。<br /><blockquote><pre><br />static void example_drv_output(ErlDrvData handle, char* buff, int bufflen)<br />{<br /> example_data* d = (example_data*)handle;<br /> our_async_data* a = (our_async_data*)malloc(sizeof(our_async_data));<br /> a->fn = buff[0];<br /> a->arg = buff[1];<br /> driver_async(d->port, NULL, example_drv_foobar, a, free);<br />}<br /></pre></blockquote><br /><br />最後にhandleをexample_dataにキャストし、portを取り出し、実行する関数と引数をセットしてdriver_asyncを実行している。<br /><br />drive_asyncについて詳細はこちら<br /><a href="http://www.erlang.org/doc/man/erl_driver.html">http://www.erlang.org/doc/man/erl_driver.html</a><br /><br />long driver_async (ErlDrvPort port, unsigned int* key, void (*async_invoke)(void*), void* async_data, void (*async_free)(void*))<br /><br />これは、erlangのエミュレータとは別のthreadで実行される。erlangはデフォルトではスレッドプールなしで起動されるので、スレッドプールの数を指定するときは、+Aの引数でスレッド数を指定してエミュレータを起動する。<br /><br />key がNULLだとスレッドはラウンドロビンで使われるが、keyを指定すると同じkeyの場合は同じスレッドが使用される。<br /><br />これの、async_invokeで指定された関数が終了すると、ready_async にセットした関数が呼び出される。<br />async_freeはasyncの処理がキャンセルされたときに呼び出される。<br /><br />ready_asyncにはhandleとdataが渡されるのでそれぞれキャストしてportと結果をそれぞれ取り出しdriver_outputで結果をerlangに返す。<br /><br /><blockquote><pre><br />static void ready_async(ErlDrvData handle, ErlDrvThreadData async_data)<br />{<br /> example_data* d = (example_data*)handle;<br /> our_async_data* a = (our_async_data*)async_data;<br /><br /> driver_output(d->port, &(a->res), 1);<br /> <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;" >free</span>(a);<br />}<br /></pre></blockquote><br /><br />---------<br />以下はerlang側のコード<br /><blockquote><pre><br />-module(complex5).<br />-export([start/1, stop/0, init/1]).<br />-export([foo/1, bar/1]).<br /><br />start(SharedLib) -><br />case erl_ddll:load_driver(".", SharedLib) of<br /> ok -> ok;<br /> {error, already_loaded} -> ok;<br /> _ -> exit({error, could_not_load_driver})<br />end,<br />spawn(?MODULE, init, [SharedLib]).<br /><br />init(SharedLib) -><br />register(complex, self()),<br />Port = open_port({spawn, SharedLib}, []),<br />loop(Port).<br /><br />stop() -><br />complex ! stop.<br /><br />foo(X) -><br />call_port({foo, X}).<br />bar(Y) -><br />call_port({bar, Y}).<br /><br />call_port(Msg) -><br />complex ! {call, self(), Msg},<br />receive<br /> {complex, Result} -><br /> Result<br />end.<br /><br />loop(Port) -><br />receive<br /> {call, Caller, Msg} -><br /> Port ! {self(), {command, encode(Msg)}},<br /> receive<br /> {Port, {data, Data}} -><br /> Caller ! {complex, decode(Data)}<br /> end,<br /> loop(Port);<br /> stop -><br /> Port ! {self(), close},<br /> receive<br /> {Port, closed} -><br /> exit(normal)<br /> end;<br /> {'EXIT', Port, Reason} -><br /> io:format("~p ~n", [Reason]),<br /> exit(port_terminated)<br />end.<br /><br />encode({foo, X}) -> [1, X];<br />encode({bar, Y}) -> [2, Y].<br /><br />decode([Int]) -> Int.<br /></pre></blockquote>gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-67043511510044309772009-10-12T17:58:00.004+09:002009-10-12T18:07:17.285+09:00IPnutsでKVMここの続き<br /><a href="http://groups.google.co.jp/group/simple_index/web/090926-index21">http://groups.google.co.jp/group/simple_index/web/090926-index21</a><br /><br /><br />x86dではなくて v86dの誤り。<br /><br />パッケージを作った。<br /><br /># lrp_load -ab v86d<br /><br /># mkdir /disk<br /># mount /dev/sdb1 /disk<br /># cd /disk/kvm<br /># kvm -k ja -hda winxp.img -boot c -m 512<br /><br />fbsetでframebufferの解像度も変えられる。<br /><br /># lrp_load -ab fbset<br /># fbset -xres 1024 -yres 768 -depth 24<br /><br />いつもどおり設定変更<br /># save_conf<br /><br />windowsは、起動してから解像度を変更できた。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-87443782867417675742009-07-01T16:24:00.007+09:002009-07-01T16:34:02.230+09:00シェルのスクリプトに--dry-runのオプションを追加ロングオプションをシェルに追加するときのメモ<br /><br />--dry-runのオプションだけつけたかったのだが、getoptに' -o ""'がないとちゃんと動作しなかった。<br /><br /><pre style="background-color:silver;color:black;"><br />#!/bin/sh<br /><br />args=`getopt -o "" -l dry-run -- $@`<br />DRYRUN=<br /><br />eval set -- "$args"<br /><br />until test $1 = "--"<br />do<br /> case $1 in<br /> --dry-run)<br /> DRYRUN="--dry-run"<br /> ;;<br /> esac<br /> shift<br />done<br /><br />if test "$DRYRUN" ;then<br /> echo "starting XXXXX(y/N):"<br />else<br /> echo "dry-run XXXXX(y/N):"<br />fi<br /><br />read a<br />if [ "x$a" = xy -o "x$a" = xY ] ;then<br /> :<br />else<br /> exit<br />fi<br /><br />...(実際の動作)<br /></pre>gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-61496443749789086932009-06-30T19:45:00.012+09:002009-07-01T16:17:06.275+09:00スナップショット使用してMySQLの動作している仮想サーバをバックアップ以前、IPnutsでvserverを使った仮想サーバのバックアップについて、ディスクの構成を中心にして紹介しました。<br /><a href="http://nackedape.blogspot.com/2009/04/1.html">仮想サーバのバックアップ(その1)</a><br /><a href="http://nackedape.blogspot.com/2009/04/blog-post.html">仮想サーバのバックアップ(その2)</a><br /><a href="http://nackedape.blogspot.com/2009/05/3.html">仮想サーバのバックアップ(その3)</a><br /><br />この時は、まだLVMを使ってなかったので、スナップショットは使わずにバックアップをとっていました。<br /><br />その後、ディスクが故障したためミラーリングしたディスク上でLVMを作成し、使用するように変更しました。<br /><br /><a href="http://nackedape.blogspot.com/2009/05/lvm.html">ミラー上にLVMを作る</a><br /><br />また、他のサーバも移行してきました。<br /><br /><a href="http://nackedape.blogspot.com/2009/06/pylons.html">Pylonsの仮想環境を仮想マシンに移行する</a><br /><a href="http://nackedape.blogspot.com/2009/06/pylons2.html">Pylonsの仮想環境を仮想マシンに移行する(2)</a><br /><br />しばらく、バックアップは以前のままでしたが、これだと、バックアップのときのダウンタイムが長くなります。そこで、せっかくLVMにしているのでスナップショットを利用して、ダウンタイムがほとんどなくなるようにスクリプトを書き直しました。<br /><br />vserverの仮想サーバが2台分動作しています。非効率ですが、他のサーバから単純に移行したものなのでMySQLのデータベースもそれぞれの仮想サーバで稼働しています。<br /><br />以下はバックアップのスクリプトです。<br /><pre><br />#!/bin/sh<br />MNTSNAP=/mnt/var_snap<br />VARSNAP=lvvar_snap<br />VARSNAPDEV=/dev/vg/$VARSNAP<br />VARDEV=/dev/vg/lvvar<br /><br />vsqllock(){<br /> vserver $1 exec mysql $2 -e "flush tables with read lock;"<br />}<br /><br />vsqlunlock(){ <br /> vserver $1 exec mysql $2 -e "unlock tables;"<br />}<br /><br />if [ -d $MNTSNAP ] ;then<br /> mountpoint $MNTSNAP && umount $MOUNTSNAP<br />else<br /> mkdir $MNTSNAP<br />fi<br /><br />lvremove -f $VARSNAPDEV<br />vsqllock vserver1 database1<br />vsqllock vserver2 database2<br />sync<br />sync<br />lvcreate -s -L 1g -n $VARSNAP $VARDEV<br />vsqlunlock vserver1 database1<br />vsqlunlock vserver2 database2<br /><br />if mount -o ro $VARSNAPDEV $MNTSNAP ;then<br /> nice rsync -av --delete $MNTSNAP/lib/vservers/vserver1 /var2/lib/vservers/<br /> nice rsync -av --delete $MNTSNAP/lib/vservers/vserver2 /var2/lib/vservers/<br /> umount $MNTSNAP<br />else<br /> echo "### mount failed ###"<br /> echo "### mount -o ro,nouuid $VARSNAPDEV $MNTSNAP"<br /> echo "### ------------ ###"<br />fi<br /><br />lvremove -f $VARSNAPDEV<br /></pre><br /><br />ネットワークから更新されるデータはデータベースのテーブルだけなので、仮想サーバを落とさずにMySQLのコマンドでテーブルが更新されないようにして、スナップショットをとります。これだと、ダウンタイムはほとんど起こりません。<br /><br />mysqlのコマンドは、スクリプトの中ではvsqllock,vsqlunlockのなかで行っていますが、1行だけなので、vserverのexecコマンドでホスト側から直接仮想サーバーのmysqlコマンドを実行しています。<br /><br />参考<br /><a href="http://labs.unoh.net/2006/09/lvm_xfs_mysql.html">http://labs.unoh.net/2006/09/lvm_xfs_mysql.html</a><br /><a href="http://dev.mysql.com/doc/refman/5.1/ja/flush.html">http://dev.mysql.com/doc/refman/5.1/ja/flush.html</a><br /><br />スナップショットは仮想サーバー側からとれないので、.sql文のなかでsystemコマンドを使ってスナップショットをとることはできません。<br /><br />LVMでスナップショットをとったあと、すぐにロックをはずし、正常稼働状態にすることができます。その後スナップショットをマウントしてゆっくりバックアップをとることができます。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-39967831733365735702009-06-15T19:22:00.000+09:002009-06-15T19:58:45.048+09:00Pylonsの仮想環境を仮想マシンに移行する(2)前回の続き<br /><br /><span style="FONT-WEIGHT: bold">mysqlの移行</span><br />データベースはファイルをコピー<br />/etc/mysql/debian.cnf のパスワードもコピー<br /><br /><span style="FONT-WEIGHT: bold">apacheの移行</span><br />/# apt-get install libapache2-mod-wsgi<br />wsgiの設定ファイルをコピー<br />環境に合わせてディレクトリの作成や設定ファイルを変更<br /><br /><br />なぜか、wsgiファイルにアプリケーションへのpythonのパスを足さないとエラーになった。<br />同じ環境のはずなのだが、何か違うのだろう<br /><br />-- 動作するようになった<br />データのあまり無いサービスなので仮想マシンの環境は800MB程度。サーバのディスクが7GBあるので環境を作り直してかなり節約になった。<br /><br />pound より nginx がよさそうなのでIPnutsのnginxのパッケージを作って、リバースプロクシの設定をした。<br /><br /><br /><br />従来のからある仮想マシンのサービスはSNATで動作させていたが、これもnginx経由になった。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-54067172548527829252009-06-13T12:58:00.004+09:002009-06-13T19:04:15.412+09:00Pylonsの仮想環境を仮想マシンに移行するPylonsで動作しているサービスがあり、これのPythonの仮想環境をvserverの仮想マシンに移行する。<br /><br /><span style="font-weight: bold;">仮想マシンを新規作成</span><br />インターフェースはdummy0<br /># modprobe dummy<br />でできる。<br />仮想マシン名は vm1とすると<br /><br /># vserver vm1 build --hostname vm1 -m debootstrap --interface dummy0:192.168.xx.yy/24 -- -d lenny -- --arch i386<br /><br /><br />時間が少しだけかかるのでコーヒーを買いにお買い物...<br />-----<br />これで仮想マシンは出来上がり<br /><br /><span style="font-weight: bold;">仮想マシンの環境整備</span><br /><br />仮想マシンを起動して仮想環境に入る。<br /><br /># vserver vm1 start<br />Starting enhanced syslogd: rsyslogd.<br />simplegw.sesame.local# vserver vm1 enter<br /><br />sshサーバをいれて、/etc/ssh/sshd.config のListenAddress を入れておく<br /><br />パッケージをインストールしてpythonの仮想環境を作る<br />vm1:/#apt-get install locales python apache2 mysql-server python-setuptools<br /><br />vm1:/#easy_install virtualenv<br />...<br />vm1:/#mkdir -p /usr/local/python/BASELINE<br />vm1:/# virtualenv --no-site-packages /usr/local/python/BASELINE<br />New python executable in /usr/local/python/BASELINE/bin/python<br />Installing setuptools............done.<br /><br />ユーザーを作ってから、ユーザで環境をつくる<br /><br />$ mkdir pythonenv<br />$ virtualenv --no-site-packages pythonenv/MYAPP<br />New python executable in pythonenv/MYAPP/bin/python<br />Installing setuptools............done.<br /><br />アクティベートしてpylonsをインストール<br />$ . pythonenv/MYAPP/bin/activate<br />(MYAPP)$ easy_install pytlons<br /><br />これから下はアプリケーションが依存しているのでインストール<br /><br />(MYAPP)$ easy_install authkit<br />(MYAPP)$ easy_install easy_install -U sqlalchemy<br /><br />sqlのマイグレード関係<br />(MYAPP)$ easy_install sqlalchemy_migrate<br />(MYAPP)$ easy_install mysql-python<br /><br />htmlを解析するツールも使っていたようなので、コンパイルする環境をインストールする<br /># apt-get install gcc<br /># apt-get install python-dev libxml2-dev libxslt1-devzlib1g-dev<br /># apt-get install libxml2 libxslt1 zlib1g<br /><br />ユーザーで仮想環境をアクティベートして<br />(MYAPP)$ easy_install lxml<br /><br /><span style="font-weight: bold;">アプリケーションの移行</span><br />#gitのマスターが廃止予定のサーバにあるのでサーバの仮想マシンに移す。<br />#作業はファイルのコピーだけ。<br /><br /><br />gitをインストール<br /><br /># apt-get install git-core<br /><br />(MYAPP)$ mkdir pylons-public<br />ディレクトリを作って、gitのリモートサイトを登録してpull<br />(MYAPP)$ mkdir pylons-public/XXX<br />(MYAPP)$ cd pylons-public/XXX<br />(MYAPP)$ git init<br />(MYAPP)$ git remote add shared user@server:path_to_git<br />(MYAPP)$ git pull shared master<br />これを必要なディレクトリで行う<br /><br />普通にコピーして持ってきてもOK<br />---つづくgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-64041207035093619142009-06-12T08:59:00.005+09:002009-06-30T20:33:24.777+09:00サーバを復旧したディスク上で動かすしばらく、バックアップ先のディスクの仮想マシンを動かしていたのを、新しく準備してバックアップになっていたミラーディスク上の仮想マシンで起動し直した。<br /><br />4.3a3で現在稼働中。<br /><br />仮想マシン以外の、openvpn(ユーザデータベース),ssl(openvpnの証明書関係),dnsmasq(tftpデータ)は再起動のシャットダウン時に、USBに保存されているはずなので、<br /><br /># lrp_data-load -f<br /><br />でデータを復旧。確認のため、/var2(バックアップ元)とdiffをかけてOK<br /><br />マシンはサーバ入れ替えでパワーアップさせているので、他のサーバで動作している仮想マシンを移行予定gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-29922885518849107812009-06-11T11:51:00.005+09:002009-06-11T14:24:02.699+09:00DRBD7からDRBD8.3.1への移行テスト(4)<span style="font-size:130%;"><span style="font-weight: bold;">XML差分ファイルの設定</span></span><br /><br />セカンダリ側を立ち上げるが、その前にマスターとセカンダリの設定が同期がとれていないといけない。<br /><br />IPnuts4.1ベータ版から、設定ファイルの差分を指定して立ち上げることが出きるようになっている。<br /><br />/system/sysdiff.conf.sample と /system/sysdiff.conf.lvs_sampleのサンプルがある<br /><br />/system/sysdiff.conf.lvs_sampleは lvsのセカンダリを作るときのサンプル。今回はこれに当たる。<br /><div class="code"><br /><small><br />## sysdiff.conf sample for lvs<br />##<br />## Change IP Address of port 2<br />#set item = { \<br />"xpath":"/SYSTEM/NETWORK/IP_LIST/IP[@port='2']/@ip", \<br />"value":"192.168.0.11" \<br />}<br />#silent $sysdiff_update.append($item)<br />##<br />## HOSTNAME<br />##<br />#set item = { \<br />"xpath":"/SYSTEM/HOST/HOSTNAME", \<br />"value":"gw2" \<br />}<br />#silent $sysdiff_update.append($item)<br />## VRRP setting<br />## -- CAUTION:<br />## -- Change vrid for your system.<br />##<br />## VRRP bigger prio has high priority.<br />##<br />#set item = { \<br />"xpath":"/SYSTEM/NETWORK/VRRP_INSTANCE_LIST/VRRP_INSTANCE[@vrid='50']/@<br />priority", \<br />"value":"50" \<br />}<br />#silent $sysdiff_update.append($item)<br />##<br />## VRRP initial state MATER|BACKUP<br />##<br />#set item = { \<br />"xpath":"/SYSTEM/NETWORK/VRRP_INSTANCE_LIST/VRRP_INSTANCE[@vrid='50']/@<br />state", \<br />"value":"BACKUP" \<br />}<br />#silent $sysdiff_update.append($item)<br /></small><br /></div><br /><br />以下だけ説明する<br /><br /><blockquote>## Change IP Address of port 2<br />#set item = { \<br />"xpath":"/SYSTEM/NETWORK/IP_LIST/IP[@port='2']/@ip", \<br />"value":"192.168.0.11" \<br />}<br />#silent $sysdiff_update.append($item)<br /></blockquote><br />PythonのテンプレートユーティティであるCheetahのテンプレートファイルの書式になっている<br />## #* *#はコメントになる<br />#はCheetahのコマンド <br />それで 上記の例は xupdateに渡すサンプルで IPnutsの設定ファイルは/etc/config/sysconfig.xmlにあるXMLファイルで、それをxpathを指定して該当する値を変更する。<br />これだとport 2番のIPアドレスを変更する。<br /><br />設定に変更がある時は、セカンダリ側では同じように設定を変更するのではなく、マスターのconfig.lrpをブートディスクにコピーしてセカンダリ側を作ることができる。<br />ただし、起動パッケージのリストの/system/lrp.lstを変更した時はこれもコピーする必要がある。<br /><br />今回はマスター側のブートディスクからconfig.lrpと/system/lrp.lstをコピーしてセカンダリ側を立ち上げる。sysdiff.confのカスタマイズは環境によるが、IPアドレスとホストを設定すればよいと思われる。<br /><br /><span style="font-weight: bold;">セカンダリの起動とDRBDの同期</span><br /><br />起動はできて、差分の設定もされているが。DRBDのディスクの同期が始まらない<br /><br />error receiving ReportState, l: 4!<br />とか<br />Split-Brain detected, dropping connection!<br />のエラーが出る<br /><br />これには次のようなコマンドを実行する。<br />r0はリソース名<br />セカンダリ側で<br /><br />drbdadm secondary r0<br />drbdadm -- --discard-my-data connect <br /><br />プライマリ側で<br /><br />drbdadm connect<br /><br />が..... .... プライマリ側のディスクが壊れている ???<br /><br /><br />めげずにそのままスレーブを再起動<br /><br />スレーブ側は、何事もなく、drbd,keepalivedともに起動し<br /><br />drbdadm role all にで Secondary/Primaryになった。<br /><br />プライマリ側は、ディスクが壊れているようなので、同期を再開しようとしたときにエラーだしまくり。<br /><br />ご参考まで<br /><div class="code"><br />Jun 11 13:45:57 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406864<br />Jun 11 13:45:57 db1 kernel: ide: failed opcode was: unknown<br />Jun 11 13:45:57 db1 kernel: end_request: I/O error, dev hdb, sector 65406864<br />Jun 11 13:45:57 db1 kernel: drbd0: Local IO failed. Passing error on...<br />Jun 11 13:45:58 db1 kernel: hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }<br />Jun 11 13:45:58 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406872<br />Jun 11 13:45:58 db1 kernel: ide: failed opcode was: unknown<br />Jun 11 13:45:58 db1 kernel: end_request: I/O error, dev hdb, sector 65406872<br />Jun 11 13:45:58 db1 kernel: drbd0: Local IO failed. Passing error on...<br />Jun 11 13:46:00 db1 kernel: hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }<br />Jun 11 13:46:00 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406880<br />Jun 11 13:46:00 db1 kernel: ide: failed opcode was: unknown<br />Jun 11 13:46:00 db1 kernel: end_request: I/O error, dev hdb, sector 65406880<br />Jun 11 13:46:00 db1 kernel: drbd0: Local IO failed. Passing error on...<br />Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394072s.<br />Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394080s.<br />Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394088s.<br />Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394096s.<br />Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394104s.<br />Jun 11 13:49:00 db1 kernel: drbd0: Resync done (total 257 sec; paused 0 sec; 7140 K/sec)<br />Jun 11 13:49:00 db1 kernel: drbd0: 57 failed blocks<br />Jun 11 13:49:00 db1 kernel: drbd0: conn( SyncSource -> Connected )<br />Jun 11 13:49:00 db1 kernel: drbd0: cs:Connected rs_left=57 > rs_total=0 (rs_failed 0)<br /></div><br /><br /><br />データは修復する必要はないし、ディスクもない、モチベーションもないから以上で移行テスト終了。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-77949966333287049422009-06-11T08:06:00.005+09:002009-06-11T14:55:00.446+09:00DRBD7からDRBD8.3.1への移行テスト(3)DRBDのディスクのアップグレードは終了したので、マスター側を立ち上げてIPnuts4.3a3(testing)への環境整備をする。<br /><br />そのまえに、IPnuts4.1b(ベータ版での機能をおさらい:というか今頃初公開かな)<br /><br />自動起動スクリプトでディスク切り替え時にサービスの起動も制御する<br /><br />自動起動の抑制<br />keepalivedのフックでサービスを制御するので、起動時に勝手に立ち上がらないようにする。<br />/etc/no_boot_rc<br /><br /><blockquote>exim4<br />mysql<br />dhisd<br />nfs-kernel-server<br />bind9<br />apache2<br /></blockquote><br />これは、rc.lrpの設定ファイルになっていて/etc/init.d/rcSがこのファイルを参照する用になっている。<br /><br />WebadminでLVSの設定(内部的にはkeepalivedの設定)を見ると<br /><br /><table class="conf"><tbody id="main_dic/list_main_record0"><tr id="main_dic/list_main_record0_tr17:tr"><th id="main_dic/list_main_header17:th" nowrap="nowrap">マスター時 実行コマンド</th><td id="main_dic/list_main_record0_nMaster:td">/etc/keepalived/ha_start<br /></td></tr><tr id="main_dic/list_main_record0_tr18:tr"><th id="main_dic/list_main_header18:th" nowrap="nowrap">バックアップ時 実行コマンド</th><td id="main_dic/list_main_record0_nBackup:td">/etc/keepalived/ha_stop</td></tr><tr id="main_dic/list_main_record0_tr19:tr"><th id="main_dic/list_main_header19:th" nowrap="nowrap">フォルト時 実行コマンド</th><td id="main_dic/list_main_record0_nFault:td">/etc/keepalived/ha_stop</td></tr></tbody></table><br />になっている。ha_start ha_stopは自作のshなのでパッケージには含まれてはいない。<br />ha_startの最後の方に<br /><blockquote>APPS="`cat /etc/keepalived/apps.list`"<br />for app in $APPS<br />do<br /> if [ $? -eq 0 ] ;then<br /> /etc/init.d/$app start<br /> else<br /> $LOGGER "fail to start $app"<br /> fi<br />done<br /></blockquote>となっていて apps.listのサービスを起動している。<br />/etc/keepalived/appslistの中身はこれ<br /><blockquote>exim4<br />mysql<br />dhisd<br />nfs-kernel-server<br />bind9<br />apache2<br /></blockquote>4.3ではIPnutsだけで動作するのは nfs-kernel-server、bind9のふたつ。ほかはサポートする予定は無くて動作させる場合は仮想マシン(vserver)で動作させる。<br /><br />よってexim,mysql,dhisd,apache2は起動パッケージのリスト(/system/lrp.lst)、no_boot_rc ,apps.listから消す。<br />(/etc/no_boot_rcはapps.listへのリンクになってる場合もある)<br /><br />起動パッケージのリスト(/system/lrp.lst)からは他に起動時に読み込めなかった/var/lib/lrpkg/packages_fialedに記録されているパッケージも消す。<br /><br /><blockquote>not found: - hotplug<br />not found: - dhcpcd<br />not found: - hotplug<br />not found: - less<br />not found: - xdelta<br />not found: - cipe<br />not found: - minihttp<br />not found: - license<br />not found: - passwd</blockquote>minihttp,licenseは除外<br /><br />設定保存して、再起動、動作確認<br /><br />動かない。<br />keepalivedが起動すると、ha_startが動き、マウントするのだがディスクが古いことになっているからプライマリディスクにできないといって怒られる。<br /><br /><blockquote>Jun 11 07:53:48 db1 kernel: drbd0: State change failed: Refusing to be Primary without at least one UpToDate disk<br />Jun 11 07:53:48 db1 kernel: drbd0: state = { cs:WFConnection ro:Secondary/Unknown ds:Outdated/DUnknown r--- }<br />Jun 11 07:53:48 db1 kernel: drbd0: wanted = { cs:WFConnection ro:Primary/Unknown ds:Outdated/DUnknown r--- }</blockquote>そこで、無理やりprimaryにするおまじない<br /><br />drbdadm -- --overwrite-data-of-peer primary all<br /><br />これでOK <br /><br /><br />ha_start、ha_stop、に使っていたスクリプトも互換性の問題があり<br />drbdadm state all<br />を<br />drbdadm role all<br />に変更<br /><br />### MEMO:また、別件だが ###<br />neither /etc/bind/rndc.conf nor /etc/bind/rndc.key was found<br />の時は rndc.confを作る<br /># rndc-confgen -a -r /var/cropkg/python2_5.squ<br />wrote key file "/etc/bind/rndc.key"<br /><br />ランダムファイル渡さないと固まる<br />#############################<br /><br />/etc/init.d/keepalivedをstart stopしてnfsサーバとbind9がきちんと動作することを確認<br /><br />次はスレーブ側を立ち上げて同期させる<br />ーーーつづくgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-81606552300757089172009-06-10T20:44:00.004+09:002009-06-10T21:31:37.452+09:00DRBD7からDRBD8.3.1への移行テスト(2)前回書いている途中にもnfs-commonまわりがトラブる。<br /><br />drbdはバージョンが変わって、設定ファイルが少しかわり、ディスクのメタデータも互換性がなくなっているので、パッケージ名を変えてdrbd-toolsにした。<br /><br />起動後、lrp_load でパッケージを読み込もうとしたが、ネットワークの環境がことなるのでアドレスを取り直した。dhcpクライアントは udhcpcに変わっている。ボンディングを行う、ifenslaveは正常に動作していたようでbond0ができていたので、bond0にアドレスをつけ直した。<br /><br /># udhcpc -i bond0<br /># lrp_load -b drbd-tools<br /><br />drbdが自動起動して、設定ファイルの互換性が無いのでパースエラーがでる。<br />設定ファイルを抜き出すとこんな感じ。<br /><div class="code"><br />resource r0 {<br /> protocol C;<br /> incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";<br /> <br /> startup {<br /> wfc-timeout 180;<br /> degr-wfc-timeout 120; # 2 minutes.<br /> }<br /> <br /> disk {<br /> on-io-error pass_on;<br /> } <br /><br /> net {<br /> connect-int 10; # 10 seconds (unit = 1 second)<br /> ping-int 10; # 10 seconds (unit = 1 second)<br /> } <br /><br /> syncer {<br /> rate 10M;<br /> group 1;<br /> al-extents 257;<br /> }<br /><br /> on db1 {<br /> device /dev/drbd0;<br /> disk /dev/vg/lvother;<br /> address 192.168.XXX.XX:7788;<br /> meta-disk internal;<br /> }<br /><br /> on db2{<br /> device /dev/drbd0;<br /> disk /dev/vg/lvother;<br /> address 192.168.YYY.YY:7788;<br /> meta-disk internal;<br /> }<br />} <br /></div><br /><br />これの場合だと<br />group=1 を消す<br /><br />それと<br /> incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";<br />の行を編集して。<br /> handlers{<br /> pri-on-incon-degr "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";<br /> }<br /><br />にする。(意味が分かっていないので自己責任で)<br /><br />次に、ディスクのメタデータをアップグレードする。互換性がなくなるので、これはやらないで、新規のディスクでdrbdを動作させてデータを移行したほうがいいと思うが、これはテストなので問答無用でアップグレードする。<br /><br />関係ないが、sshするので全部受信許可した<br /># iptables -I INPUT -j ACCEPT<br /><br />drbdadmのヘルプ<br /><div class="code"><br /># drbdadm <br /><br />USAGE: drbdadm [OPTION...] [-- DRBDSETUP-OPTION...] COMMAND {all|RESOURCE...}<br /><br />OPTIONS:<br /> {--stacked|-S}<br /> {--dry-run|-d}<br /> {--verbose|-v}<br /> {--config-file|-c} val<br /> {--drbdsetup|-s} val<br /> {--drbdmeta|-m} val<br /> {--drbd-proxy-ctl|-p} val<br /> {--sh-varname|-n} val<br /> {--force|-f}<br /><br />COMMANDS:<br /> attach detach <br /> connect disconnect <br /> up down <br /> primary secondary <br /> invalidate invalidate-remote <br /> outdate resize <br /> syncer verify <br /> pause-sync resume-sync <br /> adjust wait-connect <br /> wait-con-int role <br /> cstate dstate <br /> dump dump-xml <br /> create-md show-gi <br /> get-gi dump-md <br /> wipe-md hidden-commands <br /><br />Version: 8.3.1 (api:88)<br />GIT-hash: fd40f4a8f9104941537d1afc8521e584a6d3003c build by kitakura@c2duo, 2009-06-08 07:27:18<br /><br />missing arguments<br /></div><br /><br />リソース名がr0のディスクをつくる。<br /><div class="code"><br /># drbdadm create-md r0<br /><br /> --== This is a new installation of DRBD ==--<br />Please take part in the global DRBD usage count at http://usage.drbd.org.<br /><br />The counter works anonymously. It creates a random number to identify<br />your machine and sends that random number, along with <br />DRBD's version number, to usage.drbd.org.<br /><br />The benefits for you are:<br /> * In response to your submission, the server (usage.drbd.org) will tell you<br /> how many users before you have installed this version (8.3.1).<br /> * With a high counter LINBIT has a strong motivation to<br /> continue funding DRBD's development.<br /><br />http://usage.drbd.org/cgi-bin/insert_usage.pl?nu=6522805258890751169&git=fd40f4a8f9104941537d1afc8521e584a6d3003c<br /><br />In case you want to participate but know that this machine is firewalled,<br />simply issue the query string with your favorite web browser or wget.<br />You can control all of this by setting 'usage-count' in your drbd.conf.<br /><br />* You may enter a free form comment about your machine, that gets<br /> used on usage.drbd.org instead of the big random number.<br />* If you wish to opt out entirely, simply enter 'no'.<br />* To count this node without comment, just press [RETURN]<br /></div><br />よく分かっていないが、インターネットにアクセスして登録っぽいことをするのか<br />とにかくRETURN<br /><div class="code"><br /> --== Thank you for participating in the global usage survey ==--<br />The server's response is:<br /><br />you are the 1796th user to install this version<br /><br />From now on, drbdadm will contact usage.drbd.org only when you update<br />DRBD or when you use 'drbdadm create-md'. Of course it will continue<br />to ask you for confirmation as long as 'usage-count' is at its default<br />value of 'ask'.<br /><br />Just press [RETURN] to continue: <br /><br /></div><br />1796番目のユーザーらしい。さらにリターン<br /><div class="code"><br />md_offset 5368705024<br />al_offset 5368672256<br />bm_offset 5368508416<br /><br />Found ext3 filesystem which uses 5111808 kB<br />current configuration leaves usable 5242684 kB<br /><br />Even though it looks like this would place the new meta data into<br />unused space, you still need to confirm, as this is only a guess.<br /><br />Do you want to proceed?<br />[need to type 'yes' to confirm] <br /></div><br />そして yes。<br /><div class="code"><br />You want me to create a v08 style flexible-size internal meta data block.<br />There apears to be a v07 fixed-size internal meta data block<br />already in place on /dev/vg/lvother at byte offset 5234491392<br /><br />Convert the existing v07 meta-data to v08?<br />[need to type 'yes' to confirm] yes<br /><br />Converting meta data...<br />Writing meta data...<br />New drbd meta data block successfully created.<br /><br /> --== Creating metadata ==--<br />As with nodes, we count the total number of devices mirrored by DRBD at<br />at http://usage.drbd.org.<br /><br />The counter works anonymously. It creates a random number to identify<br />the device and sends that random number, along with <br />DRBD's version number, to usage.drbd.org.<br /><br />http://usage.drbd.org/cgi-bin/insert_usage.pl?nu=6522805258890751169&ru=8999730253493416010&rs=5368709120<br /><br />* If you wish to opt out entirely, simply enter 'no'.<br />* To continue, just press [RETURN]<br />success<br /></div><br />たぶん success<br /><br />masterを落として、このアップグレードをslaveでも行う。<br />そして、slaveを落として masterでdrbdが起動することを確認して、<br />slaveを上げる予定<br /><br />ーーーーつづくgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-28870826915765803762009-06-10T19:26:00.005+09:002009-06-11T10:46:47.940+09:00DRBD7からDRBD8.3.1への移行テスト(1)IPnuts4.1ベータ版で動かしていたDRBD+keepalivedでのサービスは他のサーバvserverで動作させるよう移行し、先日ディスクをミラーディスクした。<br /><br />しかし、移行した、サービス提供中の実機でもtestingの検証を行うので、ダウンタイムが気になる。DRBD復活させるか検討する。<br /><br />テストは、以前使用していたDRBD7のマシンが2台がそのまま転がっているので、検証しながらDRBDの最新版の8.3.1で動作させてみる。<br /><br />いきなり、立ち上がりからDRBD関係なくアップグレードするだけで関する問題が起きて、あれやこれやバグフィックスや改良をした。<br /><br />- config.lrpだけ持っていくと/systemが移行できないバグ修正<br />- /etc/default/ipnuts.confが設定保存されるていると、動作しなくなるのでこれを除外するように変更<br />- 起動パッケージのリスと古いと新規の標準パッケージを読み込まず、環境が統一されないのでこれを新規の標準パッケージをアップグレード時に読み込むように<br />- modprobe.confを廃止するので、/systemから削除するように変更<br />- /systemの移行(アップグレード)スクリプトを修正<br /><br />DRBDの移行は -- つづく --gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-45852712161074560092009-06-07T20:49:00.001+09:002009-06-07T20:51:29.610+09:00schrootのスナップショットのmountが消えないときmountを表示して、下から一つ一つunmount<br /><br />すぐ忘れるのでメモgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-623799435516488862009-06-06T19:31:00.005+09:002009-06-06T20:41:13.950+09:00sudoパッケージを作るsource debからパッケージをつくる例<br /><br /><div class="code"><br />/var/src/pnuts$ pnut initdeb sudo<br />Not found src.def.<br />Reading package lists... Done<br />Building dependency tree <br />Reading state information... Done<br />Need to get 616kB of source archives.<br />Get:1 http://ftp.jp.debian.org lenny/main sudo 1.6.9p17-2 (dsc) [995B]<br />Get:2 http://ftp.jp.debian.org lenny/main sudo 1.6.9p17-2 (tar) [594kB]<br />Get:3 http://ftp.jp.debian.org lenny/main sudo 1.6.9p17-2 (diff) [21.5kB]<br />Fetched 616kB in 0s (853kB/s)<br />Download complete and in download only mode<br />set --- src.def ---<br />/var/src/pnuts<br /></div><br />source debをコンパイルする<br /><div class="code"><br />/var/src/pnuts$ cd sudo.1_6_9p17<br />/var/src/pnuts/sudo.1_6_9p17$ pnut makesrc<br /></div><br /><br />debはsudoだけなので、そのまま、作ったdebを展開する<br /><div class="code"><br />/var/src/pnuts/sudo.1_6_9p17$ pnut mksrctree<br />./<br />./etc/<br />./etc/init.d/<br />./etc/init.d/sudo<br />./etc/pam.d/<br />./etc/pam.d/sudo<br />./usr/<br />./usr/sbin/<br />./usr/sbin/visudo<br />./usr/bin/<br />./usr/bin/sudoedit<br />./usr/bin/sudo<br />./usr/share/<br />./usr/share/man/<br />./usr/share/man/man8/<br />./usr/share/man/man8/visudo.8.gz<br />./usr/share/man/man8/sudoedit.8.gz<br />./usr/share/man/man8/sudo.8.gz<br />./usr/share/man/man5/<br />./usr/share/man/man5/sudoers.5.gz<br />./usr/share/lintian/<br />./usr/share/lintian/overrides/<br />./usr/share/lintian/overrides/sudo<br />./usr/share/doc/<br />./usr/share/doc/sudo/<br />./usr/share/doc/sudo/copyright<br />./usr/share/doc/sudo/UPGRADE.gz<br />./usr/share/doc/sudo/HISTORY<br />./usr/share/doc/sudo/NEWS.Debian.gz<br />./usr/share/doc/sudo/changelog.Debian.gz<br />./usr/share/doc/sudo/PORTING.gz<br />./usr/share/doc/sudo/README.Debian<br />./usr/share/doc/sudo/examples/<br />./usr/share/doc/sudo/examples/sudoers<br />./usr/share/doc/sudo/TROUBLESHOOTING.gz<br />./usr/share/doc/sudo/changelog.gz<br />./usr/share/doc/sudo/README<br />./usr/share/doc/sudo/OPTIONS<br />./usr/share/doc/sudo/BUGS<br />./usr/lib/<br />./usr/lib/sudo/<br />./usr/lib/sudo/sudo_noexec.so<br /> Search document from sudo_1.6.9p17-2_i386.src<br /></div><br />設定ファイル,sudo.confのテンプレートをコピーする<br /><div class="code"><br />/var/src/pnuts/sudo.1_6_9p17$ pnut cptmpl<br /></div><br />sudo.confができるので<br />3行編集<br /><br />pkg_configs="/etc/sudoers"<br />pkg_depends="libpam0g libpam-modules"<br />debs_copy_dirs="$deb1::usr/sbin $deb1::usr/bin $deb1::etc/pam.d $deb1::usr/lib"<br /><br />次の内容で、sudo.installをつくって実行権限を与えておく<br /><div class="code"><br />#!/bin/sh<br /><br /># make sure sudoers has the correct permissions and owner/group<br />[ -f /etc/sudoers ] && chown root:root /etc/sudoers<br />[ -f /etc/sudoers ] && chmod 440 /etc/sudoers<br /></div><br /><br />パッケージのディレクトリツリーを作って、lrpに固める<br /><div class="code"><br />(lenny-i386)kitakura@c2duo:/var/src/pnuts/sudo.1_6_9p17$ pnut mklrp <br /><br />package: sudo<br />sudo: size - 284 kB<br />write mklrp=date to var/lib/lrpkg/sudo.info<br />etc/<br />etc/pam.d/<br />etc/pam.d/sudo<br />usr/<br />usr/sbin/<br />usr/sbin/visudo<br />usr/bin/<br />usr/bin/sudoedit<br />usr/bin/sudo<br />usr/share/<br />usr/share/doc/<br />usr/share/doc/sudo/<br />usr/share/doc/sudo/copyright<br />usr/lib/<br />usr/lib/sudo/<br />usr/lib/sudo/sudo_noexec.so<br />var/<br />var/lib/<br />var/lib/lrpkg/<br />var/lib/lrpkg/sudo.conf<br />var/lib/lrpkg/sudo.version<br />var/lib/lrpkg/sudo.info<br />var/lib/lrpkg/sudo.dep<br />var/lib/lrpkg/sudo.install<br />Verify etc/<br />Verify etc/pam.d/<br />Verify etc/pam.d/sudo<br />Verify usr/<br />Verify usr/sbin/<br />Verify usr/sbin/visudo<br />Verify usr/bin/<br />Verify usr/bin/sudoedit<br />Verify usr/bin/sudo<br />Verify usr/share/<br />Verify usr/share/doc/<br />Verify usr/share/doc/sudo/<br />Verify usr/share/doc/sudo/copyright<br />Verify usr/lib/<br />Verify usr/lib/sudo/<br />Verify usr/lib/sudo/sudo_noexec.so<br />Verify var/<br />Verify var/lib/<br />Verify var/lib/lrpkg/<br />Verify var/lib/lrpkg/sudo.conf<br />Verify var/lib/lrpkg/sudo.version<br />Verify var/lib/lrpkg/sudo.info<br />Verify var/lib/lrpkg/sudo.dep<br />Verify var/lib/lrpkg/sudo.install<br /><br />Check lrpkg file: sudo.1_6_9p17-1_001-i386.lrp<br />package directory: sudo<br />Information:There is not var/lib/lrpkg/sudo.list.<br />CONFIG LIST:<br />/etc/sudoers<br />VERSION:<br />1_6_9p17-1_001-i386<br />Warning:There is not var/lib/lrpkg/sudo.help.<br />Information:There is not var/lib/lrpkg/sudo.mod.<br />Information:There is not var/lib/lrpkg/sudo.data.<br />Information:var/lib/lrpkg/sudo.info exists.<br />Information:var/lib/lrpkg/sudo.dep exists.<br />libpam0g<br />libpam-modules<br />Information:There is not var/lib/lrpkg/sudo.kdep.<br />Information:There is not var/lib/lrpkg/sudo.cro.<br />Information:There is not var/lib/lrpkg/sudo.exclude.<br />.//sudo.1_6_9p17-1_001-i386.lrp was made.<br />/var/src/work/sudo.1_6_9p17-1/pkg/sudo.1_6_9p17-1_001-i386.lrp<br />make /var/src/work/sudo.1_6_9p17-1/pkg/sudo.lenny for<br />sudo:00:sudo.1_6_9p17-1_001-i386.lrp:8efbf7871c32cad03c12b3fc55c63f83:libpam0g libpam-modules<br />sudo:10:sudo.1_6_9p17-1<br /></div>gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-19209619883084162642009-06-06T18:27:00.002+09:002009-06-06T20:39:19.487+09:00社内ファイルサーバをtesting版にする(2)testingで立ち上げるには、社内ではデフォルトでネットワークブートすればメニューが出るので、立ち上げ時にF12を押すとこのマシンはブートするデバイスを指定できるので、テストはすぐにできる。<br /><br />/var/lib/lrpkg/packages_faildを見るとこれだけ失敗している。<br />not found: - dhcpcd busyboxに組み込み<br />not found: - dhcpd dnsmasqに移行<br />not found: - minihttp ?<br />not found: - less busyboxに組み込み<br />not found: - nettools ?<br />not found: - ipvs ?<br />not found: - license これはない<br />not found: - nfs-server ?<br />not found: - mrtg 消し忘れ<br />not found: - libxpm4 消し忘れ<br />not found: - sudo ?<br /><br />?の minihttp,nettools,ipvs,nfs-server,sudoについて調査<br /><br />nfs-server<br />testingでnfsserverになっていたので名前をつけなおす。<br /><br />minihttp<br />ない。lighttpdにしようと思っていたのペンディング<br /><br />ipvs<br />これは作らないといけない(ファイルサーバでは使わないのであとでリストから消す)<br /><br />nettools<br />net-toolsになっていた。net-toolsに変更したいのでnettoolsは仮想パッケージをつくる<br /><br />sudo<br />これは作らないといけない。<br />---<br />nettoolとnfs-serverだけ対処して、今日のところは動作しているのでここまでとする。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-46173843505846647802009-06-06T12:32:00.007+09:002009-06-06T18:17:43.327+09:00社内ファイルサーバをtesting版にする(1)公開サーバのトラブルでペンディングされていた、社内のファイルサーバのtesting(α版)への移行をやる。<br />社内のファイルサーバはIPnutsのベータ版(4.1)で動作している。<br /><br />社内のファイルサーバはベータ版のサーバ機能を使っているが、testing版(4.3)にはサーバ機能がない。<br />サーバ機能は基本的にvserverの仮想マシンに持っていって動作させるように考えているのでIPnutsホストで動作するサーバ機能は仮想マシンに移行する必要がる。vserverはベータ版でも動作している。<br /><br />IPnutsの仮想マシンをESXiと比較すると次のようになる。<br /><ul><li>両方ともUSBで起動できる。</li><li>IPnutsはオンメモリで動作する。(ESXiはおそらくUSBをマウントしてる?)</li><li>IPnutsの<a id="publishButton" class="cssButton" href="javascript:void(0)" target="" onclick="if (this.className.indexOf("ubtn-disabled") == -1) {var e = document['stuffform'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}"><div class="cssButtonOuter"><div class="cssButtonMiddle"><div class="cssButtonInner">投稿を公開</div></div></div></a>今回の仮想OSのvserverはホストとカーネルを共用するので、Linuxしか動かない</li><li>IPnutsの仮想マシンはchrootのように動作するので、メモリの負担もないし、動作はホストと変わらない。</li></ul><br />今回の移行は関係ないが、最初からサーバ環境を仮想マシンで作っておくと、開発などでテスト環境や開発環境から本番環境への移行したいときにシステムごとコピーするだけでできるので楽になったりする。<br />スナップショットを併用するともっといいかも。<br /><br />さて、今回の移行だが、使えなくなるので仮想環境に移すサービスは<br /><ul><li>apache</li><li>samba</li><li>mrtg</li><li>phpmyadmin</li><li>moinmoin</li></ul><br />testingでも使えるのは<br /><ul><li>nfs-server</li><li>rsyncサーバ</li></ul><br />他サーバに移行済み<br /><ul><li>メール関係</li><li>プリンタ関係</li><li>webalizer</li></ul><br />である。<br /><br />なので使えなくなるサービスを仮想マシンのvserverに移行する。vserverはベータ版で既に動作しているので、最初にサービスをvserverに移行して動作確認後、testingで立ち上げる。<br /><br /><span style="font-weight: bold;font-size:130%;" >ディレクトリを仮想</span><span style="font-weight: bold;font-size:130%;" >マシンと共有</span><br /><br />apache2のドキュメントはコピーしてもいいのだが、今回は/var/wwwを仮想環境にbindしてマウントした<br />/etc/vservers/仮想サーバー名/fstabを編集して、次の行を追加する<br /><br />/var/www /var/www none bind,ro 0 0<br /><br />roを指定しているので仮想環境側からは書き換えられない。<br />sambaの共有ディレクトリもディレクトリも設定。<br /><br />/home/public /home/public none bind 0 0<br /><br />roはつけない<br /><br /><span style="font-weight: bold;font-size:130%;" >パッケージをインストール</span><br /><br />仮想環境でapt-getでphpmyadmin python mrtg sambaをインストール。<br /><br /><span style="font-weight: bold;">設定のメモ</span><br /><span style="font-weight: bold;">moinmoin</span><br />moinmoinはパスを変更したので、conf/wikiconfig.pyとcgi-bin/moin.cgiを変更<br /><br /><span style="font-weight: bold;">mrtg</span><br />/etc/mrtg.cfgをコピー<br /><br /><span style="font-weight: bold;">phpmyadmin</span><br />/etc/phpmyadmin/config.ini.phpを編集<br /><br /><span style="font-weight: bold;">samba</span><br />/etc/samba/smb.conf はswatをいれて古いものと同じになる用にdiffで確認しながら設定<br />人数が少ないので、smbpasswd -a ユーザー名でユーザーを再設定<br /><br />以上でvserverへの移行終了<br /><br />次は testingでの動作確認gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-19104049327955821602009-06-04T21:16:00.003+09:002009-06-04T21:24:25.040+09:00サーバ入れ替え今回、メモリを1GBにして、ミラー構成で準備してきたサーバーに入れ替えた。<br /><br />vserverの代わりにlxcを使おうとしてテストしてみたが、時間の関係で断念しvserverに戻した。<br />veth使えば、フィルタリングなど使えそうだったが、もう少しこなれるのを待つ。<br />デフォルトだとPIDがデバイス名についてしまいvethのデバイス名を固定で指定するのが難しそうだったことも諦めた原因。<br /><br />今日のところは、バックアップをもどすところで終了。しばらく、バックアップディスクのまま動かす。<br />USBディスクだと6Mbyte/secでrsyncした。100BASE-Tより遅い。<br /><br />openswanはnat-tが別パッチではなくなったので、これも通常どおり使用できるように考える予定。gomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0tag:blogger.com,1999:blog-3586732985321679304.post-79561199659399375512009-06-02T12:50:00.002+09:002009-06-02T12:50:01.226+09:00lxcのパッケージを作ってみる<div class="code"><br />/var/src/pnunt$ pnut initpkg lxc-0.6.2 <br />Not found src.def.<br />set --- src.def ---<br /><br />src.def and lxc.conf were made in /var/src/pnuts/lxc.0_6_2. <br />If not need,delete it,or edit it.<br /></div><br /><br />src_home_urlとsrc_file_urlを編集<br /><br /><div class="code"><br />src_home_url="http://lxc.sourceforge.net"<br />src_file_url="$src_home_url/download/lxc/$src_file"<br /></div><br /><br />ソース取得<br /><br /><div class="code"><br />/var/src/pnuts/lxc.0_6_2$ pnut getsrc<br />--2009-05-27 03:53:29-- http://lxc.sourceforge.net/download/lxc/lxc-0.6.2.tar.gz<br />Resolving lxc.sourceforge.net... 216.34.181.96<br />Connecting to lxc.sourceforge.net|216.34.181.96|:80... connected.<br />HTTP request sent, awaiting response... 200 OK<br />Length: 450189 (440K) [application/x-gzip]<br />Saving to: `lxc-0.6.2.tar.gz'<br /><br />100%[======================================>] 450,189 165K/s in 2.7s <br /><br />2009-05-27 03:53:32 (165 KB/s) - `lxc-0.6.2.tar.gz' saved [450189/450189]<br /></div><br /><br />ファイルを展開<br />/var/src/pnuts/lxc.0_6_2$ pnut setsrc<br /><br />/var/src/work/lxc.0_6_2-1/build/srcに展開されます。<br /><br />再度 src.defを編集。<br />ソースからライセンスは LGPL2.1のようなので src.defのsrc_licenseをLGPL2.1に設定<br />それから、SRC_makesrc()を作る<br /><div class="code"><br />SRC_makesrc(){<br />##compile from source<br /> config_opt="--prefix=/usr"<br /> ./configure $config_opt<br /> make<br />}<br /></div><br /><br />/var/src/pnuts/lxc.0_6_2$ pnut makesrc で コンパイルするが依存ファイルがあるようだ<br /><br />src.defを編集。src_build_debを設定<br />src_build_deb=libcap2-dev <br /><br />/var/src/pnuts/lxc.0_6_2$ pnut makesrc を実行して完了<br /><br />Makefileをみると $DESTDIRにインストールするっぽいので、src.def のSRC_mksrctree()の部分のコメントアウトを消す。<br /><br /><div class="code"><br />SRC_mksrctree(){<br /> make -C $NUTS_WORK_BUILD/$src_file_dir install DESTDIR=$NUTS_WORK_PKG/$src_name.src<br />}<br /></div><br /><br />/var/src/pnuts/lxc.0_6_2$ pnut mksrctree を実行すると<br />/var/src/work/lxc.0_6_2-1/pkg/lxc.src にインストールディレクトリが作られる。<br /><br />/usr/var/lib,/usr/libexec,/usr/etcが気に入らないので configureのオプションをかえて<br />src.defのSRC_makesrc()の config-optを変更<br /><br /> config_opt="--prefix=/usr --localstatedir=/var --libexecdir=/usr/lib/lxc --sysconfdir=/etc"<br /><br />コンパイルが通ることは分かっているので pnut src で全部実行する<br />/var/src/pnuts/lxc.0_6_2$ pnut src を実行する<br /><br />展開したファイル一覧:<br /><div class="code"><br />/var/src/work/lxc.0_6_2-1/pkg$ find lxc.src/<br />lxc.src/<br />lxc.src/etc<br />lxc.src/etc/lxc<br />lxc.src/etc/lxc/lxc-phys.conf<br />lxc.src/etc/lxc/lxc-no-netns.conf<br />lxc.src/etc/lxc/lxc-veth.conf<br />lxc.src/etc/lxc/lxc-macvlan.conf<br />lxc.src/etc/lxc/lxc-complex-config<br />lxc.src/etc/lxc/lxc-empty-netns.conf<br />lxc.src/var<br />lxc.src/var/lib<br />lxc.src/var/lib/lxc<br />lxc.src/usr<br />lxc.src/usr/bin<br />lxc.src/usr/bin/lxc-unfreeze<br />lxc.src/usr/bin/lxc-monitor<br />lxc.src/usr/bin/lxc-ps<br />lxc.src/usr/bin/lxc-setcap<br />lxc.src/usr/bin/lxc-wait<br />lxc.src/usr/bin/lxc-sshd<br />lxc.src/usr/bin/lxc-debian<br />lxc.src/usr/bin/lxc-console<br />lxc.src/usr/bin/lxc-start<br />lxc.src/usr/bin/lxc-info<br />lxc.src/usr/bin/lxc-version<br />lxc.src/usr/bin/lxc-cgroup<br />lxc.src/usr/bin/lxc-checkconfig<br />lxc.src/usr/bin/lxc-fedora<br />lxc.src/usr/bin/lxc-checkpoint<br />lxc.src/usr/bin/lxc-stop<br />lxc.src/usr/bin/lxc-netstat<br />lxc.src/usr/bin/lxc-freeze<br />lxc.src/usr/bin/lxc-destroy<br />lxc.src/usr/bin/lxc-create<br />lxc.src/usr/bin/lxc-execute<br />lxc.src/usr/bin/lxc-unshare<br />lxc.src/usr/bin/lxc-ls<br />lxc.src/usr/bin/lxc-restart<br />lxc.src/usr/share<br />lxc.src/usr/share/man<br />lxc.src/usr/share/man/man1<br />lxc.src/usr/share/man/man7<br />lxc.src/usr/share/man/man5<br />lxc.src/usr/lib<br />lxc.src/usr/lib/liblxc.a<br />lxc.src/usr/lib/liblxc-0.6.2.so<br />lxc.src/usr/lib/liblxc.la<br />lxc.src/usr/lib/lxc<br />lxc.src/usr/lib/lxc/lxc-init<br />lxc.src/usr/lib/liblxc.so<br />lxc.src/usr/include<br />lxc.src/usr/include/lxc<br />lxc.src/usr/include/lxc/namespace.h<br />lxc.src/usr/include/lxc/utils.h<br />lxc.src/usr/include/lxc/log.h<br />lxc.src/usr/include/lxc/monitor.h<br />lxc.src/usr/include/lxc/lock.h<br />lxc.src/usr/include/lxc/conf.h<br />lxc.src/usr/include/lxc/lxc.h<br />lxc.src/usr/include/lxc/cgroup.h<br />lxc.src/usr/include/lxc/error.h<br />lxc.src/usr/include/lxc/state.h<br />lxc.src/usr/include/lxc/list.h<br /></div><br /><br />実行に必要なのは、/etc /var /usr/bin /usr/libのようなので<br />lxc.confを編集、おそらくlibcap2ライブラリも必要,<br />設定ファイルもあるので3行編集<br /><div class="code"><br />pkg_configs="/etc/lxc" <br />...<br />pkg_depends="libcap2"<br />...<br />copy_dirs="etc usr/bin usr/lib var" <br /></div><br /><br /><div class="code"><br />/var/src/pnuts/lxc.0_6_2$ pnut mkpkgtree<br /><br />package: lxc<br />Package config is /etc/lxc<br />Package depends is libcap2<br />License is "LGPL2.1"<br />Package copy directory is etc usr/bin usr/lib var<br />/var/src/work/lxc.0_6_2-1/pkg<br />/var/src/work/lxc.0_6_2-1/pkg<br />.<br />./etc<br />./etc/lxc<br />./etc/lxc/lxc-phys.conf<br />... 省略<br />./usr/lib/lxc/lxc-init<br />./usr/lib/liblxc.so<br />lxc package tree was made.<br /></div><br />パッケージの作成<br /><div class="code"><br />/var/src/pnuts/lxc.0_6_2$ pnut mklrp<br /><br />package: lxc<br />lxc: size - 1096 kB<br />write mklrp=date to var/lib/lrpkg/lxc.info<br />etc/<br />etc/lxc/<br />etc/lxc/lxc-phys.conf<br />etc/lxc/lxc-no-netns.conf<br />... 省略<br />Verify var/lib/lrpkg/lxc.dep<br />Verify var/lib/lrpkg/lxc.conf<br /><br />Check lrpkg file: lxc.0_6_2-1_001-i386.lrp<br />package directory: lxc<br />Information:There is not var/lib/lrpkg/lxc.list.<br />CONFIG LIST:<br />/etc/lxc<br />VERSION:<br />0_6_2-1_001-i386<br />Warning:There is not var/lib/lrpkg/lxc.help.<br />Information:There is not var/lib/lrpkg/lxc.mod.<br />Information:There is not var/lib/lrpkg/lxc.data.<br />Information:var/lib/lrpkg/lxc.info exists.<br />Information:var/lib/lrpkg/lxc.dep exists.<br />libcap2<br />Information:There is not var/lib/lrpkg/lxc.kdep.<br />Information:There is not var/lib/lrpkg/lxc.cro.<br />Information:There is not var/lib/lrpkg/lxc.exclude.<br />.//lxc.0_6_2-1_001-i386.lrp was made.<br />/var/src/work/lxc.0_6_2-1/pkg/lxc.0_6_2-1_001-i386.lrp<br />make /var/src/work/lxc.0_6_2-1/pkg/lxc.lenny for <br />lxc:00:lxc.0_6_2-1_001-i386.lrp:91a331db165e5d58ee30f7c3f68e5602:libcap2<br />lxc:10:lxc.0_6_2-1<br /></div><br /><br />/var/src/work/lxc.0_6_2-1/pkg にパッケージが作られる。<br /><br />テストしながら起動スクリプトなど考えることにするgomahttp://www.blogger.com/profile/11145321556845057408noreply@blogger.com0