火曜日, 12月 19, 2006

Debian GNU/Linux で heartbeat を使う

ldirectord を使って高い可用性と拡張性をもつシステムを作りました。
あれ、でもまだひとつ足りません。
そう、LVS自体がSPOF(Single Point Of Failure、故障すると取替えがきかない部分)になってしまったんですね。
なので、これを冗長化します。

これには heartbeat を使います。
まず、aptitude install heartbeat でインストール。
次に、/usr/share/doc/heartbeat/ にある authkeys、ha.cf.gz、haresources.gz を /etc/ha.d/ にコピーします。
authkeys はパーミッションを0600に変更、残りの2つのファイルは gunzip で解凍します。

ここの設定は、それぞれがローカルネットワーク用のeth0、外部向けのeth1を持っている場合です。ひとつしかなければもっと簡単です。

ha.cf
-------------------------------------------------------------------------------------
keepalive 2
deadtime 10
warntime 10
initdead 10
mcast eth0 225.0.0.1 694 1 0
node xvm249
node xvm250
-------------------------------------------------------------------------------------
↑に書いた行のコメントを外して、値を変更します。
最初の辺りの数字は時間です。デフォルトは長すぎるので。
mcastはマルチキャストの意味。
ブロードキャストでもいいのですが、他にもheartbeatを利用した共有を行うつもりなのでマルチキャストにしました。
node はuname -nで出力される名前。参加するホスト分書きます。

haresources
-------------------------------------------------------------------------------------
xvm249 59.106.42.202/28/eth1
-------------------------------------------------------------------------------------
共有するリソースを書きます。
それぞれ、マスターのホスト名とIP、イーサネットの名前を書きます。

authkeys
-------------------------------------------------------------------------------------
auth 2
2 sha1 KYif6FQMB5XmeQT1I7CuYEEQrbQNGCsF
-------------------------------------------------------------------------------------
上のふたつの行を有効にして、パスワードは適当に決めます。
makepasswd -c 32 なんかで作れます。

IPsecを使えばここはなんでもいいです。
認証や暗号化はIPsecに統一したほうが、全体のコストは安上がりでしょう。

これでheartbeatの設定は終わりです。
でも、共有するリソースをheartbeatに開放しないといけません。
/etc/network/interfaces から59.106.42.202を削除します。
でもそうすると、割り当てるIPがなくなるので、boot時にeth1が起動しません。
iface eth1 ...
の代わりに、
up ifconfig eth1 up
を書いて、起動だけするようにしておきます。
結局IPv6のリンクローカルアドレスが割り当てられます。

さらにLVSの設定が必要です。
というのも、テーブルの内容は静的なので同期を取って置けますが、厳密にはTCPのコネクションの情報なども共有しなければいけないからです。
これには、dpkg-reconfigure ipvsadm を実行して、一方のホストをmaster、もう一方をbackupに設定すればできます。

こうすれば同期を取ることができますが、名前からわかるように双方向ではありません。
双方向のパッチもあります。でも、かなり細かい部分なので、僕は本家にマージされるのをのんびり待ちます。

ここまでやると、夜中にシステムダウンで起こされることもなくなります。

金曜日, 12月 15, 2006

Debian GNU/Linux で ldirectord を使う

ldirectord はバックエンドのサーバー群を監視して、自律的にテーブルを書き換えるLVSの拡張です。
もうちょっと具体的に言うと、バックエンドのサーバーに不具合が起きて停止すると、それを発見してリクエストをそちらに送らなくしたりします。
逆に、それまで停止していたサーバーが復帰するとまたリクエストを送るようにしたりするわけですね。

これって、高可用性の要件を満たすのに、めちゃくちゃ有効です。
しかも、ipvsadmと大して手間は変わりません。

まず、aptitude install ldirectord でインストール。
cp /usr/share/doc/ldirectord/ldirectord.cf.gz /etc/ha.d/
gunzip ldirectord.cf.gz
で設定ファイルをコピーします。

設定はこのファイルのサンプルを参考にすればマニュアル見なくても大体わかります。
とりあえずHTTPの設定はこんな感じです。
-------------------------------------------------------------------------------------
# Global Directives
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80
autoreload=yes
#logfile="/var/log/ldirectord.log"
#logfile="local0"
quiescent=yes

# A sample virual with a fallback that will override the gobal setting
virtual=59.106.42.202:80
real=192.168.0.1:80 gate
real=192.168.0.2:80 gate
fallback=127.0.0.1:80 gate
service=http
#request="index.html"
#receive="Test Page"
#virtualhost=some.domain.com.au
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
-------------------------------------------------------------------------------------

設定が終わったら、/etc/init.d/ldirectord start で起動します。

これで192.168.0.1と192.168.0.2のサーバーを監視して、動いているサーバーにHTTPリクエストを割り振ることができます。
もちろん、重みをつけたり、分散アルゴリズムを指定することもできます。

最後に dpkg-reconfigure ipvsadm を実行してOSの起動時にipvsadmが実行されないようにします。これはもういりません。

木曜日, 12月 14, 2006

LDAP の複製

LDAPの複製です。
slapd のバージョン2.2までは、slurpdを使ってデータをコピーします。
バージョン2.3からは syncrepl を使います。これが便利!

2つの方法の違いは、データの複製を行うサーバーです。
slurpdはマスターがスレーブに対してデータの送信を行います。
sycreplはスレーブからマスターのデータを取得します。
なので、slurpdの場合はマスターの設定変更が必要になるわけですね。
これは、すでに運用中の場合には結構大きな問題です。
それに対して、syncreplの場合はマスターの設定が必要ないので、すでに運用しているLDAPを拡張するのがとても簡単です。

スレーブ側の設定ファイルに、以下を追加します。

syncrepl rid=123
provider=ldap://ldap0.kumicho.net
type=refreshOnly
interval=00:00:10:00
searchbase="dc=kumicho,dc=net"
scope=sub
attrs="*"
schemachecking=off
bindmethod=simple
binddn="uid=kumicho,dc=kumicho,dc=net"
credentials=password

これだけで複製が行えます。
上の設定を見たら想像つきますが、これは普通の検索です。
なので、データの一部だけを複製することも可能です。
また、データを取得するためのユーザーでバインドする必要があります。

認証の方法は"simple"を利用しているので、IPsecを利用しましょう。
もうTLSなんて時代遅れ。

水曜日, 12月 06, 2006

証明書で認証する IPsec

前回作成したIPsecの設定を、証明書(公開鍵)認証を使うものに変更します。

まず秘密鍵を公開鍵のペアを作成します。詳しく知りたい方はSSLをどうぞ。
秘密鍵は、/etc/ssl/private、公開鍵は、/etc/ssl/certs にあるものとします。

psk.txtを書き換えます。
192.168.172.1 EKVq0c5NzjAY3mfMSN3Y4pw0utefVj7i

xm001.kumicho.net
にします。
もう事前秘密鍵は必要ありません。

次に、racoon.confのremoteセクションに、
my_identifier asn1dn;
certificate_type x509 "xm002.crt.pem" "/etc/ssl/private/xm002.key.pem";
peers_identifier asn1dn;
verify_identifier on;
verify_cert on;
を追加します。
互いの認証を証明書で行うように指示します。

さらに、proposalセクションの
authentication_method pre_shared_key;

authentication_method rsasig;
に変更します。

これで証明書による認証が行われます。

Debian GNU/Linux で IPsec を使う

IPパケットのレベルで暗号化します。
これって、結構劇的に便利な気がします。

IPsecの機能自体はカーネルに組み込まれているので、鍵交換サーバーのracoonをインストールします。
aptitude install racoon

次に、/etc/ipsec-tools.conf の編集
コメントを外して、以下のようにします。
-----------------------------------------------------
## Flush the SAD and SPD

flush;
spdflush;

## Some sample SPDs for use racoon

spdadd 192.168.172.2 192.168.172.1 any -P out ipsec
esp/transport//require;

spdadd 192.168.172.1 192.168.172.2 any -P in ipsec
esp/transport//require;
------------------------------------------------------
IPsecをどの通信に適用するかのルールを設定します。

今度は、/etc/racoon/racoon.conf を編集します。
---------------------------------------------------------------------
remote anonymous {
exchange_mode main,aggressive;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group modp1024;
}
generate_policy off;
}

sainfo anonymous {
pfs_group modp768;
encryption_algorithm 3des;
authentication_algorithm hmac_md5;
compression_algorithm deflate;
}
-----------------------------------------------------------------------
ここではIPsec通信の内容を設定しています。
すべての通信に同じ強度の暗号化を使うなら、上のようにanonymousにすると楽です。

上の設定ファイルにしたがって、ルート証明書へのパスを設定します。
ln -s /etc/ssl/certs/ /etc/racoon/

最後に、/etc/racoon/psk.txt を編集します。
192.168.172.1 EKVq0c5NzjAY3mfMSN3Y4pw0utefVj7i
てな感じに共通秘密鍵を追加します。

この鍵は、
makepasswd --chars 32
なんて風につくれます。ただし、makepasswdのインストールが必要です。

setkey と racoon を再起動すれば、ホスト間での通信がすべて暗号化されます。
プロトコル毎に暗号化したい場合には、racoon.confをもう少し丁寧に書けばいいです。

IPsecを使うと、これまでサービスごとにSSLを使って暗号化していたやりとりがすさまじく簡単になります。
ここでは使ってないですが、サーバー証明書を使った認証もできます。さらに、個人証明書も使えます。
外部向けのHTTPSなんかは無理ですが、内部で使う分にはものすごくシンプルかつ強力です。

水曜日, 11月 29, 2006

LVS の DR ( Direct Routing )

LVSの2回目です。
以前はNATを使っていましたが、今回はDR(Direct Routing)を使います。

DRを使う利点は、こちらのほうがパフォーマンスが高いことです。
NATでは返答のパケットもLVSを通ることになりますが、DRは直接返事を返すので負荷が低いわけです。
それ以外にも、設定がシンプルになるという利点もあります。
欠点はこのホストをゲートウェイに使用できなくなることです。
まあ、複数のホストがなければLVSを使う利点もないので、これはさほど欠点にもなりませんが。
以前、DRを使うにはARPテーブルを操作しなければいけないと思ったんですが、LVSとゲートウェイを別のホストにすればそれも必要ないです。

NAT用に設定していた場合は、設定を戻します。
DRの場合にはフォワードの設定は必要ありません。
/etc/sysctl.conf の変更を戻します。
net.ipv4.conf.default.forwarding=1
の行をコメントアウトして、sysctl -p を実行します。

iptables のフォワードの設定やNATテーブルの設定も必要ありません。削除します。
------------------------------
#!/bin/sh

vip='50.106.42.193'
localnet='192.168.0.0/16'
bind1='192.168.0.5'
bind2='192.168.0.6'

ipvsadm -C

ipvsadm -A -t $vip:53
ipvsadm -a -t $vip:53 -r $bind1 -g
ipvsadm -a -t $vip:53 -r $bind2 -g
ipvsadm -A -u $vip:53
ipvsadm -a -u $vip:53 -r $bind1 -g
ipvsadm -a -u $vip:53 -r $bind2 -g
-------------------------------------
新しい設定ファイルはこうなります。

でも、もうiptablesと照らし合わせる必要がないので、別の場所に保存します。
dpkg-reconfigure ipvsadm
を実行します。
起動時に保存されたテーブルの復元、終了時に現在の設定を保存するか聞かれるので、yesにします。
上の新しい設定ファイルを一度実行したら、
/etc/init.d/ipvsadm stop
/etc/init.d/ipvsadm start
を実行して、テーブルの情報が保存され、ちゃんと復元されることを確認します。
そしたら設定ファイルは削除してしまいましょう。

最後にVIP(ここでは50.106.42.193)のネットマスクを255.255.255.255にします。
このあたりは少しトリッキーですが、同じIPをもつホストを複数用意するためにこの操作が必要になります。

これでLVS側の設定は終わりです。

バックエンドの実サーバーでも同じような操作が必要になります。
ifconfig lo:0 50.106.42.193 netmask 255.255.255.255 up
を実行してループバックアドレスにLVSのアドレスを割り当てます。
次に、
route add -host 50.106.42.193 dev lo:0
で、このアドレスがループバックアドレスに送られるように設定します。

もし、これらのホストのデフォルトゲートウェイがLVSサーバーだったら、これを別のホストに変更します。

これで設定は完了です。
もしバックエンドの実サーバーが別のネットワークにある場合には、トンネルを利用します。
が、そんなことあんまりしないですよね。。

金曜日, 11月 24, 2006

Xen で 4つ以上の DomainU を起動する

Xen(aptからではなく、公式サイトから取ってきた)は普通に動作させると、4つまでしか仮想マシンが起動しません。

で、この問題について、あちこちでいろいろ書かれてますが、あまりいい方法はありませんでした。

結局のところ、menu.lstの中で、
title Xen 3.0 / XenLinux 2.6
kernel /boot/xen-3.0.3-0.gz console=vga max_loop=64
module /boot/vmlinux-syms-2.6.16.29-xen root=/dev/sda1 ro console=tty0 max_loop=64
module /boot/initrd.img-2.6.16.29-xen
のように、max_loop=をつけて起動します。
これで、カーネルがmax_loop個のループバックデバイスを利用できるようになります。

さらに、/sbin/MAKEDEV を編集して、
loop)
for part in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 \
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
do
makedev loop$part b 31 $part $disk
done
;;
の part in 以下の数字をたくさん書いて、loop デバイスを必要な数だけ作ります。
max_loopを64にしたので、63まで書くつもりでしたが、途中で力尽きました。

これで好きなだけ起動できるようになります。

でもこのやり方、aptitudeとの親和性が低いし、エレガントじゃないですね。

Bind の同期

LVSを導入して、Bind が2つになったので同期を取る必要が出てきました。

Bindで同期を取るには、マスター側とスレーブ側に設定が必要です。

まず、マスター側。
/etc/bind/named.conf.options に
allow-transfer { 2002:3b6a:2aca:0:216:3eff:fe5b:e8d9; };
などと設定します。上のはIPv6アドレスなので、普通はスレーブのIPv4アドレスを書けばいいです。

スレーブ側では、まず /etc/bind/db というディレクトリを作成します。
このディレクトリの所有者はbind.bindにしておきます。
次に、/etc/bind/named.conf.local に、zoneの設定を書きます。
zone "infology.info" {
type slave;
masters { 2002:3b6a:2aca:0:216:3eff:fe2e:b289; };
file "/etc/bind/db/infology.info";
};

これで起動すれば、ファイルが /etc/bind/db/infology.info に作られます。

最後に dig を使って確認します。
dig @slave.host infology.info

LVS (Linux Virtual Server)

LVS (Linux Virtual Server)を使ってみました。
LVSは受け取ったパケットを別のホストに転送して処理させることで、負荷分散や可用性の高い運用ができます。

具体的には、ホストごとに重み付けをして転送することによって負荷分散ができます。
ホストを追加したり、不具合の起きたホストを削除したりするのもできます。
しかもユーザーから見ると、なにも変化がないんですね。これは素敵。

僕のように、少ないIPアドレスで運用している場合には、ひとつのIPでLVSを動かして、実際の処理はサービスごとに別のホストで行うって運用もできます。
Xenと組み合わせて使うと、サービスをホスト間で簡単に移動、追加、削除ができるのでとても便利。使わない手はないですね。


で、利用するには、ipvsadmが必要です。
LVS自体はカーネルに組み込まれていますが、それを操作するツールをインストールしないといけないわけです。
aptitude install ipvsadm
でインストールします。

実はこのipvsadm、iptablesと使い方がよく似ています。
あとで書いてますが、設定する場所も同じです。
ipvsadm -L でリストを表示するのも一緒。
他に便利なのものは、
ipvsadm -L -n --stats で、転送したパケットなどが見れます。

で、とりあえず設定例
まず、/etc/sysctl.conf を変更します。
net.ipv4.conf.default.forwarding=1
のコメントを外し、sysctl -p を実行します。
これは今回の転送方法がNAT型だから必要です。

次に、
------------------------------
#!/bin/sh

vip='50.106.42.193'
localnet='192.168.0.0/16'
bind1='192.168.0.5'
bind2='192.168.0.6'

iptables -F
iptables -t nat -F
iptables -X

iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -o eth1 -s $localnet -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind1 --protocol tcp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind1 --protocol udp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind2 --protocol tcp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind2 --protocol udp --dport 53 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A POSTROUTING -s $localnet -d ! $localnet -j SNAT --to-source $vip


ipvsadm -C

ipvsadm -A -t $vip:53
ipvsadm -a -t $vip:53 -r $bind1 -m
ipvsadm -a -t $vip:53 -r $bind2 -m
ipvsadm -A -u $vip:53
ipvsadm -a -u $vip:53 -r $bind1 -m
ipvsadm -a -u $vip:53 -r $bind2 -m
-------------------------------------

これを、/etc/network/if-pre-up.d/ の中に置きます。
もともとの設定があればマージしてください。
名前は適当で構いません。ただし実行可能にしておくこと。
そうすればインターフェイスがupされる時に、テーブルが有効になります。
設定中は直接実行することで、調整も可能です。

今回は3つある転送の方法のうち、NATを利用しました。
DRやTunnelの場合はARPテーブルを操作する必要があるので、また今度。
その代わりに、net.ipv4.conf.default.forwarding=1 の設定が必要でした。

iptablesで普通にNATの設定をした後、実際に処理を行うホストへの転送を許可します。
実は、このNATの設定はLVSには必要ありません。
でも、転送先のホストのデフォルトゲートウェイをこのホストにする必要があるので、普通の通信を行うのに必要です。
ipvsadmでは-Aで転送を行うサービスを指定した後に、-aで転送先を指定します。

これで、2台のホストにDNSの処理が分散されています。
これは相当、簡単で便利です。

水曜日, 11月 22, 2006

Xen DomainU での時刻あわせ

Xenの仮想マシンをいくつもインストールしていると、ちょっと疑問に思います。
「ntpdを仮想マシンごとにインストールする必要あるの?」
でも、不安なのでインストールしてました。

で、結局のところ、ntpdをインストールしても時刻は調整されないようです。
Domain0 の時刻に同期される。
まあ、そのほうがよかったんですが。

どうしても DomainU で個々に時刻を合わせたい場合は、
/proc/sys/xen/independent_wallclock
の値を 1 にしなければいけません。

木曜日, 11月 09, 2006

Debian GNU/Linux で radvd を使う

IPv6にはIPv4でのDHCPのような機能がIPのレイヤーで実装されています。
なので設定がとても楽チンです。

まず、ルーターになるホスト(ここでは6to4トンネルの設定をしたホスト)で、パケットを通過させるようにします。
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

同じホストでこれから設定する radvd による自動設定を無効にします。
echo 0 > /proc/sys/net/ipv6/conf/all/accept_ra

次に radvd のインストール。
aptitude install radvd

/etc/radvd.conf を以下のようにします。
interface eth0
{
AdvSendAdvert on;
prefix 2002:3b6a:2aca::/64 {};
};

意味は、eth0 につながるホストに 2002:3b6a:2aca:0(/64なので) のネットワークアドレスから始まるIPv6アドレスを自動的に割り当てるようにしています。
デフォルトゲートウェイも同時に設定されます。

これで、スイッチで接続されているホストはすべてIPv6による通信が可能になっています。
ping6 www.kame.net
などと打ってみると、外部のホストと通信できているのがわかります。


ついでにWindowsも使ってみます。

Windows XP でIPv6を有効にするには、コマンドプロンプトで、
ipv6 install
を実行します。

これでIPv6が有効になります。
さきほど設定した radvd からアドレスやルーティングの情報を自動的に受信するので、すぐに使えます。
ping 2001:200:0:8000::42
で、www.kame.netと通信できているのがわかります。

さらに、firefoxのアドレスに、
http://[2001:200:0:8000::42]/
と入れると、IPv6でWebページにアクセスできます。

他にも、poderosaでもIPv6が使えます。
Webとシェルが使えれば十分な感じです。

外向けのサービス以外でIPv4を使わなくてもいいですね。

水曜日, 11月 08, 2006

Debian GNU/Linux で IPv6 を使う (6to4 トンネル)

お金も手間もかけないでIPv6を使ってみます。
kernel 2.6 以降であればネイティブでIPv6をサポートしているのでとっても簡単です。

/etc/network/interfaces に以下を追加します。
auto sit0
iface sit0 inet6 static
address 2002:3b6a:2aca::1
netmask 16
gateway ::192.88.99.1

2002:3b6a:2aca は、IPv4アドレスで決まります。
printf "2002:%02x%02x:%02x%02x\n" 59 106 42 202
とすれば計算できます。後ろの数字がv4のIPアドレス。

::192.88.99.1 は、6to4トンネルのために予約されているアドレスで、あなたから一番近い6to4トンネルに割り当てられます。

あとは、
ping6 www.kame.net
なんてpingを打ってみるとIPv6で通信できているのが確認できます。
まあ、公開されている6to4トンネルを使うので、IPv4よりは遅くなりますが。

金曜日, 10月 13, 2006

iptables の保存と復元

iptablesの保存と復元のやりかたです。

iptables-save > /etc/iptables.conf
で保存。

iptables-restore < /etc/iptables.conf
で復元できます。

なかなかスマート。

さらにすすめて、
/etc/network/if-pre-up.d/iptables

---------------------------------------
#!/bin/sh

iptables-restore < /etc/iptables.conf
---------------------------------------
を書いておく。
/etc/network/if-post-down.d/iptables
には
---------------------------------------
#!/bin/sh

iptables-save > /etc/iptables.conf
---------------------------------------
と書いておけば完全に自動化されます。

木曜日, 10月 12, 2006

Debian GNU/Linux で Bridge(ブリッジ)を使う

Xenではブリッジを使います。
まあ、インターフェースがひとつだけなら、デフォルトを使うっていう手もなくはないですが。
自分で設定するなら、一体どこに書くのか?

結論からいうと、interfacesに追加すればいいです。
--------------------------------------
auto xenbr0
iface xenbr0 inet static
address 192.168.1.254
netmask 255.255.0.0
gateway 192.168.1.1
bridge_ports eth0
--------------------------------------
こんな風に記述すると、eth0が接続されたブリッジができます。

グローバルなIPをブリッジに割り当てる必要はないと思いますが、ローカルなIPは割り当てましょう。
どっちも割り当てないと、このブリッジの役割をしてるLinuxにアクセスできなくなります。

火曜日, 10月 10, 2006

aptitude と依存関係

とても便利なaptitude。
aptと最も違うところは、インストールのときだけじゃなく、アンインストールのときも依存関係を考慮してくれるところです。

aptでもインストール時に依存しているパッケージを自動でインストールしてくれます。
aptitudeはそのときに依存関係によってインストールされた、と印をつけてくれます。
それで、アンインストールのときにはその印がついたパッケージも一緒に削除されます。
なんか記憶にないけど、このライブラリ、消してもいいのかわからない。そんなことはもうなくなります。

あと、最近知ったのですが、removeではなくpurgeを使うと設定ファイルも消去できます。まあ、これはaptでもできますが。
長いこと使ってるうちに/etcがどんどん大きくなるのを防ぐことができます。
これも便利。

また、パッケージの検索で細かな検索条件を指定できます。
このあたりも使いこなせるようになると、もうaptには戻れません。

chkrootkit でウィルスの検査

chkrootkitはオープンなウィルス検査のアプリケーション。
さすがに商売でやってるわけではないので、市販のものよりもチェックの項目なんかは少ない。
でも、ただですし、気休め程度にインストールしておいてもいいような気がして使ってます。

あちこちにある、不正侵入用のツールくらいには対応しているみたいなので、面白半分にそいうのを使う相手には効果がありそうです。
まあ、どちらにせよ、侵入された後じゃないと気がつかないんですけどね。

日曜日, 10月 01, 2006

Debian GNU/Linux で ユニークなIDの作り方

ユニークなIDが欲しいときがあります。
で、そういうときにはこれ。

uuidgen -t

これでユニークなIDが出力されます。
マニュアルによると、macアドレス(世界でユニーク)とハードウェアクロックを利用して作成しているらしいです。
CPUがひとつなら、同じ時刻というのは存在しないのがわからなくもないですが(精度にもよりますが)、最近のDual CoreなCPUでも保障されてるんでしょうか?
まあ、実用上問題ないのでとりあえず使っています。

金曜日, 9月 29, 2006

Debian GNU/Linux で Xen を使う

やっぱり、世の中は仮想化ですよ。
というわけで、Xenを使ってみました。
使おうとは前から思っていたんですが、何度インストールしてもなかなかうまくいかなかったんですね。

ところが最近DebianのTestingに入ったパッケージで簡単にインストールできました。
aptitude install xen-linux-system-2.6.17-2-xen-686
これで再起動すればXenカーネルで起動できます。今までの苦労はなんだったんだ。

ついでに、xen-toolsやxen-ioemu-3.0-unstable、libc6-xenなんかも入れておきましょう。

次に仮想サーバーのイメージファイルを作ります。
手順は以下の通り。

dd if=/dev/zero of=/home/xen/debian_image bs=1024k count=2048
mkfs.ext3 /home/xen/debian_image
mount -o loop /home/xen/debian_image /mnt/disk
debootstrap --arch i386 etch /mnt/disk http://ftp.jp.debian.org/debian

最初に2GBのからのファイルを作り、次にそのファイルの中にext3ファイルシステムを作ります。
マウントして、必要なシステムをインストールします。

最後は適当な設定ファイル(debian_image.conf など)に設定を書きます。
cp /etc/xen/xmexample1 /home/xen/debian_image.conf

kernel = "/boot/vmlinuz-2.6.17-2-xen-686"
ramdisk = "/boot/initrd.img-2.6.17-2-xen-686"
name = "Domain-1"
vif = [ 'ip=192.168.2.2,bridge=xenbr0' ]
disk = [ 'file:/home/xen/debian_image,hda1,w' ]
netmask="255.255.0.0"
gateway="192.168.2.1"
vmid=1
hostname= "vm%d" % vmid
root = "/dev/hda1 ro"

これくらい書き換えるといいです。
あとは、
xm create /home/xen/debian_image.conf -c
などと起動すればいいです。

木曜日, 9月 28, 2006

Debian GNU/Linux で文字コードの変換

改行の変換に続いて文字コードの変換。
nkfとかありますが、国際化されたiconvを使いましょう。
まあ、どっちも名前しか知りませんでしたが。

iconv [-f 入力のエンコーディング] [-t 出力のエンコーディング] [inputfile ...]
で変換できます。

変換可能な文字コード(の名前)については、-l オプションで見ることができます。
処理も早いし、便利ですね。

Debian GNU/Linux で改行コードの変換

いつもemacsで変換してたので、シェルで変換する方法を知りませんでした。
で、そういうときに使うのがこれ、trコマンド。
perlの中にほぼ同じ機能の関数がありますね。

tr -d '\r' < file.windows > file.linux
こうするとDOSの改行からLinuxの改行にできます。これはCRLFからCRを取り除いてるだけです。
CRLFをLFに変換するほうが正しいですね。
上のやり方が正しいかは文字コードに詳しくないと答えられないです。

他の場面でも使えそうな、便利なコマンドを知りました。