2009年6月30日火曜日

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

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

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

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

ミラー上にLVMを作る

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

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

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

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

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

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

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

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

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

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

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

lvremove -f $VARSNAPDEV


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

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

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

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

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

2009年6月15日月曜日

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

前回の続き

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

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


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

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

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



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

2009年6月13日土曜日

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

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

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

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


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

仮想マシンの環境整備

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

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

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

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

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

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

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

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

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

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

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

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

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

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


gitをインストール

# apt-get install git-core

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

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

2009年6月12日金曜日

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

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

4.3a3で現在稼働中。

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

# lrp_data-load -f

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

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

2009年6月11日木曜日

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

XML差分ファイルの設定

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

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

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

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


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



以下だけ説明する

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

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

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

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

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

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

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

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

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

プライマリ側で

drbdadm connect

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


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

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

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

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

ご参考まで

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



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

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

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

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

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

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

exim4
mysql
dhisd
nfs-kernel-server
bind9
apache2

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

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

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

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

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

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

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

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

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

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

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

これでOK


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

drbdadm role all
に変更

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

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

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

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

2009年6月10日水曜日

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

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

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

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

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

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

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

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

disk {
on-io-error pass_on;
}

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

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

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

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


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

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

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

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

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

drbdadmのヘルプ

# drbdadm

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

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

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

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

missing arguments


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

# drbdadm create-md r0

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

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

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

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

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

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

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

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

you are the 1796th user to install this version

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

Just press [RETURN] to continue:


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

md_offset 5368705024
al_offset 5368672256
bm_offset 5368508416

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

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

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

そして yes。

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

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

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

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

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

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

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

たぶん success

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

ーーーーつづく

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

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

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

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

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

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

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

2009年6月7日日曜日

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

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

すぐ忘れるのでメモ

2009年6月6日土曜日

sudoパッケージを作る

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


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

source debをコンパイルする

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


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

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

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

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

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

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

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

#!/bin/sh

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

である。

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

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

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

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

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

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

roはつけない

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

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

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

mrtg
/etc/mrtg.cfgをコピー

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

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

以上でvserverへの移行終了

次は testingでの動作確認

2009年6月4日木曜日

サーバ入れ替え

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

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

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

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

2009年6月2日火曜日

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


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

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


src_home_urlとsrc_file_urlを編集


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


ソース取得


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

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

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


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

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

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

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


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

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

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

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


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


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

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

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

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

展開したファイル一覧:

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


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

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



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

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

パッケージの作成

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

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

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


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

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

lxcのテスト

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

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

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

br0を作成。

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

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

IPnuts.mydomain# lxc-start -n debian


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

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

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

IPnuts.mydomain# lxc-start -n debian &


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

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

Type to exit the console

Debian GNU/Linux 5.0 debian tty1

debian login:


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