Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Linux
今さら glastree もどうなのかとは思うのですが、他のバックアップソフトウェアに移行しにくい(今までのハードリンクな差分バックアップを引き継げないのは辛い)ので、自宅で使っています。

で、KVM ゲストのディスクイメージをバックアップから除外したかったので、glastree に pdumpfs ライクな --exclude オプションを追加するバッチを書きました。もしよろしければどうぞ。なお、--exclude-by-size と --exclude-by-glob は(今のところ個人的に必要ないので)ありません。

使い方は、pdumpfs のそれと同等です。すなわち、
--exclude=PATTERN
PATTERN (Ruby の正規表現) にマッチするファイルまたはディレクトリをバックアップ対象から除外する。複数個を指定可能。 パターンマッチは、コマンドライン引数に渡した「対象ディレクト リ」が相対パスならそれを含んだ相対パス、絶対パスなら絶対パス に対して行われます。
の Ruby を Perl に置き換えれば良いです :-)

ちなみに… glastree は procfs をバックアップしようとするとフリーズしますので、--exclude="^/proc$" とか --exclude="^/var/named/chroot/proc$" とか書いておくとよろしいかと思います。
Category: Linux
(追記)
この問題は libvirt-0.6.3-33.el5_5.3 で解消されました(CentOS 5.x でも利用可能になっています)。

環境は CentOS 5.5 (x86_64)、libvirt-0.6.3-33.el5_5.1、bridge-utils-1.1-2。KVM と書きましたが、libvirt の問題なので Xen でも同様かと思われます。
ここでは、VM をブリッジ接続している状況 ... 例えば br0 に対して eth0 (実際のネットワークに接続するインターフェース) と vnet0 (仮想マシンのインターフェース) を enslave させているような場合 ... を前提としています。

さて、virsh でゲストを start したり destroy したりすると、ホスト側の SSH が一時的に応答しなくなる場合があります。この問題は、ブリッジに接続しているインターフェースが変更されるとブリッジの MAC アドレスが変更されてしまうことに起因します。具体的には、
  1. (Linux の)ブリッジは enslave された Ethernet インターフェースの持つ MAC アドレスのうち、一番小さいものをブリッジの MAC アドレスとして採用する
  2. libvirt は vnetX に対してランダムに MAC アドレスを付与する(*1)
  3. よって、VM が start ないし destroy され、ブリッジに参加しているインターフェースが変更されたとき、ブリッジの MAC アドレスが変更されてしまう場合がある
ということです。

これによって問題が生じるのは、そのブリッジインターフェースに割り当てた IP アドレスを使用して何らかのネットワークサービス(SSH による管理などを含む)を提供している場合です。このケースでは、MAC アドレスが頻繁に変更されるのは好ましくありません(クライアントは ARP キャッシュの期限が切れるまでアクセスできなくなってしまうため)。

この問題は既に報告されており、仮想マシンに付与する MAC アドレスの 1 オクテット目を FE にすることで対処されるようです。2010-07-26 に Fixed In Version: libvirt-0.6.3-35.el5 になっていますが、RHEL5 にもまだ出ていないようなので、CentOS で提供されるまではもうちょっとかかりそうですね(*2)。

(*1) ランダムと言っても locally administered フラグは立っているので、(実際のネットワークに接続する)Ethernet インターフェースの MAC アドレスの 1 オクテット目が 00 で始まる場合、問題は起きません(Lucky you!)。今回トラブルが起きたのは HP ML110 G5 の on-board NIC で、OUI が 78:E7:D1 となっていました。
(*2) 個人的には、とりあえず、ifcfg-eth0 に MACADDR=02:00:00:00:00:00 と書いてしまうことにしました(locally administered な MAC アドレスの中で最小なので、ブリッジ中で常に最小であることが保証される)。KVM ホストが複数ある場合は悩ましいですね...。
Category: Web
必要に迫られて作ったモノですがいい感じなので公開します。FreeStyleWiki 3.6.3複数ファイル添付を可能にするプラグイン _ex_attach (20090610) が前提です(これ以前のバージョンでは動きません)。
ライセンスは GPL version 2 or (at your opinion) any later version です。

パッチを当てると、「添付ファイルを ZIP で圧縮してまとめてダウンロードする機能」と「ZIP 圧縮したファイルをアップロードした場合、その内容を展開して添付する機能」(アップロード時に「圧縮ファイルを解凍して添付」にチェックした場合。それ以外の場合は ZIP ファイルがそのままアップロードされる)の 2 点が追加されます。Archive::Zip を使用しているため、入っていない環境では yum -y install perl-Archive-Zip や cpan などで適宜インストールしてください。また、生じうるセキュリティリスクを認識して使用してください。

需要はあんまり無さそうですが、せっかく書いたパッチが紛失すると悲しいのでここに添付しておきます :-)
気が向いたら .tar.gz とかにも対応するかもしれない。

(追記) 3.6.4 でも動作を確認しました。

(追記 2016/04/17) EUC-JP 版に Jun Futagawa さんに頂いたパッチを反映しました(コメント参照)。旧版はこちら。 fswiki-decompress-ex_atach.patch
(追記 2023/10/21) "Can't use 'defined(@array)' (Maybe you should just omit the defined()?)" に対処しました。旧版はこちら。 fswiki-decompress-ex_atach.r2.patch, fswiki-decompress-ex_atach-utf8.patch
Category: Computer
アナグラムというか、重複を考慮しない順列の全パターンを生成する。CPAN モジュールを使えば良いという話もある。頭悪い子なので非効率やも。というか、配列で作った方が良かったな。
#!/usr/bin/perl

my $word = $ARGV[0];
foreach (anagram($word)) {
print $_ . "\n";
}

sub anagram($) {
my $w = shift;
my $l = length $w;
my @result = ();

if ($l <= 1) {
@result = ($w);
} elsif ($l == 2) {
my $wr = reverse($w);
@result = ($w, $wr);
} else {
for (my $i = 0; $i < $l; $i++) {
my $f = substr($w, 0, 1);
my $r = substr($w, 1);
foreach (anagram($r)) {
push(@result, $f . $_);
}
$w = $r . $f;
}
}
return @result;
}
え、重複を考慮したい? それなら、
$ perl anagram.pl someword | sort | uniq
でできますよ :-)