2012年5月16日水曜日

Arch LinuxのXenでxlコマンドが利用できない件

ノートPC(X121e)にArchLinuxを入れてXen DOM0で遊んでいるのだが、xlコマンドがうまく動作せず、 Xen4.1の時点ではdeprecatedなxmコマンドをずっと使っていた。しかし乗り換えない訳にもいかないので 原因を探ってみた。

xenstored起動スクリプトの修正

まず一つ目の、xenstoredが起動しているにも関わらずxenstoredが動いてない(?)と怒られる問題。 単純にpidファイルのパスがArchとXenとで合っていなかっただけだった。 /etc/rc.d/xencommonsのxenstored起動部分を書き換えるだけでOK。

# xenstored --pid-file=/run/daemons/xenstored.pid $XENSTORED_ARGS
xenstored --pid-file=/var/run/xenstored.pid $XENSTORED_ARGS

停止時も考慮しないといけないよなぁ、と思ってdo_stop()を見てみたが、

printhl "WARNING: Not stopping xenstored, as it cannot be restarted."

そいつは一度起動したら止められないぜ!…ということらしい。

xl consoleの不具合

xlコマンドは実行できるようになったものの、何故かxl consoleで consoleに入れない。エラー内容も「失敗した」と出るだけ。 仕方がないのでstraceしてみたら…

execve("/usr/lib64/xen/bin/xenconsole", ["/usr/lib64/xen/bin/xenconsole", "4", "--num", "0", "--type", "pv"],
 [/* 15 vars */]) = -1 ENOENT (No such file or directory)

/usr/lib64ってなんですかー。 どうやら、xenconsoleバイナリの参照先が/usr/lib64決め打ちになっている模様。どこのディストリの名残りなのやら…。 とりあえずln -s /usr/lib /usr/lib64してあっさり解決。

miku@hachune% sudo xl create -c netbsd.cfg
パスワード:
Parsing config file netbsd.cfg
xc: error: panic: xc_dom_bzimageloader.c:556: xc_dom_probe_bzimage_kernel: kernel is not a
 bzImage: Invalid kernel
Daemon running with PID 6683
                            Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 
2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 6.0_BETA (HACHUNE_U) #0: Thu Apr 26 19:16:15 JST 2012
        miku@hachune.hachune.net:/tmp/netbsd/sys/arch/amd64/compile/HACHUNE_U
total memory = 512 MB
avail memory = 486 MB
mainbus0 (root)
hypervisor0 at mainbus0: Xen version 4.1.2
vcpu0 at hypervisor0: AMD E-450 APU with Radeon(tm) HD Graphics, id 0x500f20
xenbus0 at hypervisor0: Xen Virtual Bus Interface
xencons0 at hypervisor0: Xen Virtual Console Driver
xenbus: can't get state for device/suspend/event-channel (2)
xbd0 at xenbus0 id 0: Xen Virtual Block Device Interface
xennet0 at xenbus0 id 0: Xen Virtual Network Interface
xennet0: MAC address 00:16:3e:39:03:10
balloon0 at xenbus0 id 0: Xen Balloon driver
balloon0: current reservation: 524288 KiB
xennet0: using RX copy mode
xenbus: can't get state for device/suspend/event-channel (2)
balloon0: current reservation: 131072 pages => target: 131072 pages
ignore shutdown request: 
xenbus: can't get state for device/suspend/event-channel (2)
xenbus: can't get state for device/suspend/event-channel (2)
xenbus: can't get state for device/suspend/event-channel (2)
xenbus: can't get state for device/suspend/event-channel (2)
xenbus: can't get state for device/suspend/event-channel (2)
xenbus: can't get state for device/suspend/event-channel (2)
xenbus: can't get state for device/suspend/event-channel (2)
xenbus: can't get state for device/suspend/event-channel (2)
boot device: xbd0
root on xbd0a dumps on xbd0b
root file system type: ffs
Wed May 16 09:56:39 JST 2012
Starting root file system check:
/dev/rxbd0a: file system is clean; not checking
Starting file system checks:
Setting tty flags.
Setting sysctl variables:
ddb.onpanic: 1 -> 0
Starting network.
Hostname: netbsd.hachune.net
IPv6 mode: host
Configuring network interfaces: xennet0add net default: gateway 10.39.3.1
.
Adding interface aliases:.
Building databases: dev, utmp, utmpx.
Starting syslogd.
Mounting all filesystems...
Clearing temporary files.
Updating fontconfig cache: done.
Checking quotas: done.
Starting virecover.
Checking for core dump...
savecore: /dev/rxbd0b: Device not configured
May 16 09:56:46 netbsd savecore: /dev/rxbd0b: Device not configured
Starting local daemons:.
Updating motd.
Starting powerd.
Starting sshd.
Starting inetd.
Starting cron.
Wed May 16 09:56:53 JST 2012

NetBSD/amd64 (netbsd.hachune.net) (console)

login: miku
Password:
May 16 10:23:51 netbsd login: miku on tty console
Last login: Tue Apr 24 03:50:07 2012 on console
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 6.0_BETA (HACHUNE_U) #0: Thu Apr 26 19:16:15 JST 2012

Welcome to NetBSD!

This system is running a beta release of the NetBSD operating system, aimed
at stabilizing the next formal release.  It is close to formal release quality,
but may still contain bugs, even serious ones.  Please bear this in mind and
use the system with care.

You are encouraged to test this version as thoroughly as possible.  Should you
encounter any problem, please report it back to the development team using the
send-pr(1) utility (requires a working MTA).  If yours is not properly set up,
use the web interface at: http://www.NetBSD.org/support/send-pr.html

Thank you for helping us test and improve this beta NetBSD release.

netbsd$

DOMUがNetBSDだからかInvalid kernelとか出ていたり、いろいろとエラーメッセージが出ているが、 とりあえず動いているので気にしないことにする。

Xen Documentation
http://xen.org/support/generated.html

2012年4月7日土曜日

進学、そして引越し

研究生生活も終盤の2月に、これが最後のチャンスのつもりで受験した院試に合格。 これまで二十数年住み続けた山形県酒田市を離れ、神奈川県川崎市にお引越し。

今までは「文系大学生」から「文系研究生」だった訳だが、いつの間にか「情報系大学院生」に。 大学入学した時はまさかこんなことになるとは思ってもみなかった。

いろいろと不安が無いわけでもないが、せっかくの機会、無駄にしないよう頑張っていきたい。

2012年3月3日土曜日

Arch Linuxの野良リポジトリを作る

Arch Linuxはパッケージ更新が早くて新しもの好きには嬉しいディストリなのだが、 公式リポジトリにあるものでは少々物足りない場合がよくある。 AURも含めればかなりパッケージ量は増える のだが、EeePC等でパッケージビルド作業を行うのは少々辛い。

そこで、一度他のマシンで作製したパッケージを他のマシンでも利用できるように、 自前のリポジトリを構築してみようと思う。

HTTPサーバを用意

とりあえず公開用のHTTPサーバとディレクトリを用意する。 わざわざApacheやらnginxを準備するのは面倒くさいので、rubyでパッと作ってしまう。

miku@hatsune% ruby -r webrick -e "WEBrick::HTTPServer.new(:Port=>3939,:DocumentRoot=> '/var/repo').start"

終了する時はpkill -kill rubyで。

4/15追記: ruby1.9なら、以下のようにするとCtrl-cで終了できるようになるので楽。

miku@hatsune% ruby -r webrick -e "WEBrick::HTTPServer.new(:Port=>3939,:DocumentRoot=> '/var/repo').tap{|sv| trap(:INT){sv.stop}}.start"

パッケージを作成

AURのパッケージのビルド&インストールには、 yaourtを 普段利用している。yaourtでは、ほとんどpacmanと同様の操作感でAURのパッケージを 扱うことができる。 以下の例は、通常のリポジトリとAURのリポジトリを更新し、 mozcをインストールするものである。

miku@hatsune% yaourt -Syua
refresh & upgrade...
miku@hatsune% yaourt -S mozc
build & install...

この操作でmozcがビルド&インストールされ、/tmp/yaourt-tmp-miku/aur-mozc以下にパッケージ (ibus-mozc-1.3.975.102-2-x86_64.pkg.tar.xz, mozc-1.3.975.102-2-x86_64.pkg.tar.xz)ができている。 このパッケージをインストールする前に公開するリポジトリのディレクトリ(ここでは/var/repo)にコピーしておく。

4/15追記: /etc/yaoutrcを以下のように設定しておくとパッケージがPKGDESTで指定したディレクトリに追加される模様。

EXPORT=1
PKGDEST=/var/repo

リポジトリに追加

Archのリポジトリの管理には、repo-addコマンドを用いる。操作はいたって簡単。リポジトリのDBへのパスと リポジトリに追加するパッケージへのパスを引数に与え実行するだけ。

miku@hatsune% repo-add /var/repo/hachune.db /var/repo/mozc-1.3.975.102-2-x86_64.pkg.tar.xz

DBがまだ存在しない場合は自動的に作成される。これだけで、Arch Linuxのリポジトリとして機能するようになる。

リポジトリを利用

リポジトリが作成できたので、今度は別ホストからこのリポジトリを利用する。 これも単純で、/etc/pacman.confに以下を追加すればよい。

[hatsune]
Server = http://10.39.39.39:3939/

いつも通りpacman -Ss mozcすると…

miku@hachune% pacman -Ss mozc
hatsune/ibus-mozc 1.3.975.102-2 (mozc-im)
    IBus engine module for Mozc
hatsune/mozc 1.3.975.102-2 (mozc-im)
    A Japanese Input Method for Chromium OS, Windows, Mac and Linux (the Open
    Source Edition of Google Japanese Input)

mozcをリポジトリ上のパッケージとして利用することができるようになった。

もしかしたらもっと便利な方法があるのかもしれないが、 とりあえずこれでもそれなりに楽なのでよしとしておくことにする。 またパッケージの署名も可能なようだが、今は気にしない。

2012年1月30日月曜日

NetBSDでぷららのIPv6を利用する

昨年IPv4アドレスが枯渇すると同時にふつうのプロバイダでもじわじわと対応が始まった ネイティブIPv6接続機能。我が家でサブ回線として利用していた plalaでも提供されていたが、 ようやく自宅側の環境が整いつつあるので今になって試してみた。

IPv6にはIPv6対応トンネルアダプタが 必要!」なんて書いてあるが、そんなもんいらねぇんじゃねーの?、ということの確認も兼ねて。

dhcp6cを用意

plalaのIPv6ではPPPoE接続しDHCPv6でアドレスブロックを取得する。 そこで、DHCPv6クライアントをpkgsrcからビルドする。

# cd /usr/pkgsrc/net/wide-dhcpv6
# make install clean
# megurine$ dhcp6c    
usage: dhcp6c [-c configfile] [-dDfi] [-p pid-file] interface [interfaces...]

あっさりと終了。

PPPoEを設定

PPPoE接続の設定はIPv4と同じだが、plalaのIPv6ではIPv4とは異なるログイン IDが必要になる。(詳細: http://www.plala.or.jp/ipv6/access/flow/) パスワードはIPv4と同じでよいらしい。 我が家の場合は光ホームなのでユーザID + @v6h.plala.or.jpとなる。 今回設定した/etc/ifconfig.pppoe1は以下の通り。

create
! /sbin/ifconfig re0 up
! /sbin/pppoectl -e re0 pppoe1
! /sbin/pppoectl pppoe1 myauthproto=chap \
  myauthname=ユーザID@v6h.plala.or.jp \
  myauthsecret=パスワード max-auth-failure=0
up

pppoecfg pppoe1コマンドを実行してphaseがnetworkになっていれば、 接続が確立されている。

megurine$ sudo pppoectl pppoe1
Password:
pppoe1: phase=network
        myauthproto=chap myauthname="ユーザID@v6h.plala.or.jp"
        lcp timeout: 1.000 s
        idle timeout = disabled
        max-auth-failure = 0
        max-noreceive = 15 seconds
        max-alive-missed = 3 unanswered echo requests

pf.confの編集

IPv6でもパケットフィルタは必要、ということでpf.confをIPv6用に設定し直す 必要がある。アドレスの取得にはDHCPv6を用いるので、以下のポートについて検討する 必要があるようだ。

dhcpv6-client   546/tcp    # DHCPv6 Client
dhcpv6-client   546/udp    # DHCPv6 Client
dhcpv6-server   547/tcp    # DHCPv6 Server
dhcpv6-server   547/udp    # DHCPv6 Server

細かいルールは環境や管理者のポリシーによって異なるので、dhcp6cを実行しつつtcpdumpで様子を 見ながら設定を変更すればいいんじゃないかなぁ、と思う(ぇ

21:34:20.077819 PPPoE  [ses 0x3a6f] IP6 fe80::21b:21ff:fec6:d3bc.546 > ff02::1:2.547: dhcp6 solicit
21:34:20.099950 PPPoE  [ses 0x3a6f] IP6 fe80::90:1a00:41a3:dd40.547 > fe80::21b:21ff:fec6:d3bc.546: dhcp6 advertise
21:34:21.088076 PPPoE  [ses 0x3a6f] IP6 fe80::21b:21ff:fec6:d3bc.546 > ff02::1:2.547: dhcp6 request
21:34:21.111510 PPPoE  [ses 0x3a6f] IP6 fe80::90:1a00:41a3:dd40.547 > fe80::21b:21ff:fec6:d3bc.546: dhcp6 reply

リンクローカル・マルチキャストな送信とリンクローカルなユニキャストへの送受信について、 許可が必要な感じ…だろうか。

dhcp6c.confの編集

DHCPv6クライアントは設定が必須のようなので、/usr/pkg/share/examples/wide-dhcpv6/dhcp6c.conf やgoogle先生を参考に/usr/pkg/etc/dhcp6c.confを作成する。IPv4のPPPoE接続ではpppoeデバイス自体に アドレスが割り当てられていたが、DHCPv6ではprefixを割り当てるデバイスを指定する模様。ここではwm0 とした。

interface pppoe1 {
        send ia-pd 0;
};

id-assoc pd {
        prefix-interface wm0 {
                sla-id 1;
                sla-len 0;
        };
};

設定ファイルの作成が終わりPPPoE接続が確立されているなら、 # dhcp6c pppoe1のようにDHCPv6クライアントを起動する。

ルートの設定

DHCPv6でアドレスをwm0に割り当てることができたのだが、dhcp6c.confの書き方が悪いのかルートも resolv.confも設定されなかった。仕方が無いのでpppoe1へデフォルトルートを手動で割り当てる。

sudo route add -inet6 default -iface fe80::21b:21ff:fec6:d3%pppoe1

とりあえず通信をテスト。

megurine$ ping6 -c 3 ipv6.google.com 
PING6(56=40+8+8 bytes) 2400:7800:4000:d00:21b:21ff:fec6:d3bc --> 2404:6800:4004:805::1012
16 bytes from 2404:6800:4004:805::1012, icmp_seq=0 hlim=55 time=44.717 ms
16 bytes from 2404:6800:4004:805::1012, icmp_seq=1 hlim=55 time=44.804 ms
16 bytes from 2404:6800:4004:805::1012, icmp_seq=2 hlim=55 time=44.897 ms

--- ipv6.l.google.com ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 44.717/44.806/44.897/0.090 ms

比較用に、月1000円固定IPv4アドレスの某プロバイダのほうもテスト。

megurine$ ping -c 3 www.google.com   
PING www.l.google.com (74.125.235.144): 56 data bytes
64 bytes from 74.125.235.144: icmp_seq=0 ttl=54 time=19.173 ms
64 bytes from 74.125.235.144: icmp_seq=1 ttl=54 time=19.139 ms
64 bytes from 74.125.235.144: icmp_seq=2 ttl=54 time=19.429 ms

----www.l.google.com PING Statistics----
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 19.139/19.247/19.429/0.159 ms

サーバが違うのかv6のほうが応答速度が圧倒的に遅くなってしまった。

IPv6といえばkame.net。kame.netに打ってみる。

megurine$ ping6 -c 3 orange.kame.net
PING6(56=40+8+8 bytes) 2400:7800:4000:d00:21b:21ff:fec6:d3bc --> 2001:200:dff:fff1:216:3eff:feb1:44d7
16 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7, icmp_seq=0 hlim=54 time=33.162 ms
16 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7, icmp_seq=1 hlim=54 time=36.307 ms
16 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7, icmp_seq=2 hlim=54 time=33.538 ms

--- orange.kame.net ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 33.162/34.336/36.307/1.718 ms
megurine$ ping -c 3 orange.kame.net  
PING orange.kame.net (203.178.141.194): 56 data bytes
64 bytes from 203.178.141.194: icmp_seq=0 ttl=48 time=32.123 ms
64 bytes from 203.178.141.194: icmp_seq=1 ttl=48 time=31.671 ms
64 bytes from 203.178.141.194: icmp_seq=2 ttl=48 time=31.441 ms

----orange.kame.net PING Statistics----
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 31.441/31.745/32.123/0.347 ms

ついでにipv6.2ch.netにも打ってみる。

megurine$ ping6 -c 3 ipv6.2ch.net
PING6(56=40+8+8 bytes) 2400:7800:4000:d00:21b:21ff:fec6:d3bc --> 2407:3000:6:175::12
16 bytes from 2407:3000:6:175::12, icmp_seq=0 hlim=55 time=22.456 ms
16 bytes from 2407:3000:6:175::12, icmp_seq=1 hlim=55 time=22.704 ms
16 bytes from 2407:3000:6:175::12, icmp_seq=2 hlim=55 time=22.587 ms

--- ipv6.2ch.net ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 22.456/22.582/22.704/0.124 ms
megurine$ ping -c 3 ipv6.2ch.net  
PING ipv6.2ch.net (125.6.175.12): 56 data bytes
64 bytes from 125.6.175.12: icmp_seq=0 ttl=54 time=19.327 ms
64 bytes from 125.6.175.12: icmp_seq=1 ttl=54 time=19.542 ms
64 bytes from 125.6.175.12: icmp_seq=2 ttl=54 time=19.863 ms

----ipv6.2ch.net PING Statistics----
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 19.327/19.577/19.863/0.270 ms

v4もv6もほぼ変わらない値に。6to4などに比べればやはりかなり速くなった。難点は固定IPv6アドレスではないってことだけなのだが…また固定オプションはv4同様 お高いプランになるのだろうか…。対応しているルータさえあれば実は要らなかったトンネルアダプタ といい、こういうところがあざといなぁと思わざるを得ない。