muninを引っ越した

ブログを余りにも放置してたので、コンスタントに小ネタを書いていくことにした。

最近muninを動かしているサーバをリプレースしたんですが、OSが32bitから64bitに変わったんですよ。んでrrdってアーキテクチャ変わるとそのままcopyしても使えないんですよね。コンバートしないとだめ。

やり方としては、こんな感じ。一旦旧ホストでdumpしたのを新ホストに持って行ってrestore。

http://slog.carlheaton.co.uk/index.php/2009/10/converting-32bit-rrd-to-64bit-rrd-moving-cacti-between-architectures/

が、しかし今回の環境は旧ホストのdiskがかなり弱っていたというのと、容量的にも余裕が無かったので、ローカルには吐き出したくない。あとそれなりに時間がかかるので、ゴニョゴニョやってる間に値を取得出来ない時間が発生してしまうのもよろしくない。

そんなわけで、試しにrestoreに方に直接標準入力で食わせてみたらいけました。

こんな感じ。

for RRD in $(find /var/lib/munin/ -name '*.rrd')
do
    rrdtool dump $RRD | 
     ssh newhost "rrdtool restore -f - $RRD && chown munin. $RRD"
done

らくちんです。

ペパボにおける MogileFS

晒すのが流行ったようなので。id:halfrack:20111108

mysql> select fid from file order by fid desc limit 3;
+-----------+
| fid       |
+-----------+
| 530626772 |
| 530626770 |
| 530626769 |
+-----------+
3 rows in set (0.00 sec)

mysql> desc file;
+----------+----------------------+------+-----+---------+-------+
| Field    | Type                 | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| fid      | int(10) unsigned     | NO   | PRI | NULL    |       |
| dmid     | smallint(5) unsigned | NO   | MUL | NULL    |       |
| dkey     | varchar(255)         | YES  |     | NULL    |       |
| length   | int(10) unsigned     | YES  |     | NULL    |       |
| classid  | tinyint(3) unsigned  | NO   |     | NULL    |       |
| devcount | tinyint(3) unsigned  | NO   |     | NULL    |       |
+----------+----------------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql>

刺身サンが先に書いてた… http://kyanny.hatenablog.jp/entry/2011/11/08/202124

停止中のvm(kvm)のネットワーク設定を書き換える習作

もう一年以上更新してなかったのか…

virt-cloneした後にネットワーク設定を修正するのが面倒くさいので、スクリプト一発でなんとかしたくて書いてみた。

#!/usr/bin/perl
use strict;
use warnings;
use Sys::Guestfs;
use Sys::Virt;
use Data::Section::Simple qw(get_data_section);

die "Usage: $0 domain ip_addr\n" if @ARGV != 2;
my ($domain, $ip) = @ARGV;

my $vmm_addr = 'qemu:///system';
my $vmm = Sys::Virt->new(address => $vmm_addr);

grep { $_->get_name eq $domain } $vmm->list_domains
    and die "$domain is now actvie.\n";

my ($dom_obj) = grep { $_->get_name eq $domain } $vmm->list_defined_domains
    or die "No sush domain: $domain\n";

my ($image, $mac) = $dom_obj->get_xml_description =~
    qr|
        <source[  ]file='(.*?)'/>
        .*
        <mac[ ]address='(.*?)'/>
    |sxm;


my $content = sprintf get_data_section('ifcfg-eth0'), $mac, $ip;

print <<EOT;
New network configuration
---------------------------
$content
---------------------------
EOT

my $guestfs = Sys::Guestfs->new;
$guestfs->add_drive($image);
$guestfs->launch;
$guestfs->mount( '/dev/mapper/VolGroup00-LogVol00', '/' );
$guestfs->write_file( '/etc/sysconfig/network-scripts/ifcfg-eth0', $content, 0 );
$guestfs->sync;

print "Finish\n";

__DATA__

@@ ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
HWADDR=%s
IPADDR=%s
NETMASK=255.255.255.0
ONBOOT=yes

CentOS5.5で動きます。他は知らない。

やってることは、

  1. domain(vm)が停止してるか確認
  2. domainのxml定義からイメージファイルのパスとMACアドレスと抜き出す。
  3. libguestfsを使って、停止中のvmの設定ファイルを引数で指定したIPと先程のMACで上書き。

vmのrootデバイスがハードコードなのがいけてないけど、guestfishのinspectみたいなのがSys::Guestfsに見当たらなかった。いい方法ないかな。

これだとNIC一個のvmしか対応してないし、本当にやりたいことはもうちょっと込み入ってるのであくまで習作。けどこれだけでも役に立つかもと思って一応晒しときます。

追記

上のはなんか無駄なことしてることに気づいた。こうしよう。

# rpm -Uvh http://elrepo.org/elrepo-release-0.1-1.el5.elrepo.noarch.rpm
# perl -p -i -e 's/(enabled)=0/$1=1/' /etc/yum.repos.d/elrepo.repo
# yum install kmod-pata
# echo 'alias scsi_hostadapter pata_sch' >> /etc/modprobe.conf
# depmod -a
# mkinitrd /boot/initrd2.6.18-164.el5.pata.img `uname -r`
# tee /etc/grub.conf <<EOT
title CentOS (2.6.18-164.el5pata)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ hda=noprobe hda=none
        initrd /initrd-2.6.18-164.el5.pata.img
EOT
# reboot

Dell Inspiron Mini 12 で CentOS をまともに動かす

実はeeepcだけでなくmini12も持っているのだ。
こいつも例のごとく、簡単には動いてくれないです。
普通にインストールしただけだと、ディスクがhdaで認識されて、dma onに出来なくて、謎のカーネルエラーを永遠に垂れ流します。

こうすっと、sdaで認識(PATAのSCSIエミュレート?)されて、スピードも30MB/sec位は出ました。*1

# rpm -Uvh http://elrepo.org/elrepo-release-0.1-1.el5.elrepo.noarch.rpm
# perl -p -i -e 's/(enabled)=0/$1=1/' /etc/yum.repos.d/elrepo.repo
# yum install kmod-pata
# mkinitrd --preload pata_sch --preload libata /boot/initrd-2.6.18-164.el5pata.img `uname -r`
# tee /etc/grub.conf <<EOT
title CentOS (2.6.18-164.el5pata)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ hda=noprobe hda=none
        initrd /initrd-2.6.18-164.el5pata.img
EOT
# reboot

関係ないが上記teeの使い方を最近知って感動した。

*1:元は3Mほどだったかな