ラベル ArchLinux の投稿を表示しています。 すべての投稿を表示
ラベル ArchLinux の投稿を表示しています。 すべての投稿を表示

2013年12月15日日曜日

mikutter LiveDVD(NEGIX) 13.12のリリースと今後について

(ディストリビューション/パッケージマネージャー Advent Calendar 2013の記事を兼ねての投稿です.)

mikutter LiveDVD 13.12(NEGIX)リリース

ダウンロードしてDVDやUSBメモリに書き込んだらmikutter環境がすぐ使えるmikutter LiveDVD(NEGIX). その新バージョンとなる13.12をリリースしました.

http://yuzuki.hachune.net/negix/
http://repo.hachune.net/Linux/ArchLinux/iso/2013.12.15/

Arch LinuxのLiveCDと同様に毎月更新ということを銘打っていたのですが,今回はいろいろあって10月のOSC東京(秋)以来のリリースとなってしまいました.もうしわけねぇもうしわけねぇ.

mikutter LiveDVDの目標

mikutter LiveDVDの目標としては,以下の点があります.

  • Live環境を起動したら日本語環境でmikutterがすぐ使える状態にする
  • 毎月リリースする
    • Arch LinuxのLiveCDをベースに,可能な限り弄らない
    • Arch Linuxのパッケージをそのまま使う

何故かインストールが難しいと評判のmikutterを簡単に使えるようにすることを第一の目標としています. また,Arch Linuxらしさ(更新の早さ,パッケージの新しさ,簡素さ)も十分に発揮できるよう, 可能な限り毎月リリースすることも目標としています.そこで,最小限の手間でLiveDVDを作れるよう, 基本環境やパッケージには可能な限り手を入れないよう心がけています.

mikutter LiveDVDの今後

debianやubuntuの標準リポジトリにmikutterが入り導入難易度がぐーんと下がったということもあり, 若干存在意義が危ぶまれている感じもしますが, 「最新揃いのArch Linux環境でmikutterが簡単にすぐ使える」という売りもあるので, まだまだ需要は...ある?

Raspberry PiやBeagle Bone Blackとかでパッと使えるmikutter環境イメージがほしい, という意見もあったりするようで,いろいろ作ってみたいところですが,手が足りていない感じです. (今はOpenVPNとかをRPiで簡単に使えるようにする環境のようなモノを作っていたりもするので,それができたら...)

画像はイメージです

2013年4月2日火曜日

feel6でIPv6(on Arch Linux)

プロバイダがPPPoEな固定IPv6サービスを始める気配がまったく無いので、久 しぶりにfeel6(http://start.feel6.jp/)を使ってみる。 ホスト環境はいつも通りArch Linux。

dtcpclientのビルド

dtcpclientのソースをダウンロードしてきてビルドする。FreeBSD用に書かれ ておりそのままではビルドできないため、オリジナルのMakefileを参考に直接 gccを叩く。

また、libbsdがインストールされていない場合は先にインストールしておく。

% wget http://www.imasy.or.jp/~ume/ipv6/dtcpclient-20060111.tar.gz
% tar xzf dtcpclient-20060111.tar.gz
% cd dtcpclient-20060111
% gcc -lbsd -lcrypto -Wall -DPREFIX=\"/usr/dtcp\" dtcpclient.c -o dtcpclient
% ./dtcpclient
usage: dtcpclient [-dDhlnU] [-b udpport] [-B naptport] [-e nickname]
[-f pidfile] [-m mtu] [-p port] [-s script] [-t tuntype] [-u username] server

起動

とりあえずfeel6にDTCPでログインできるか試してみる。 今回はNAT下で利用するため、-nオプションを付ける。-lは切断時の自動再接 続、-dはデバッグモードとなる。

% ./dtcpclient -d -l -n -t network -u ユーザ名 dtcp.feel6.jp 
no authinfo file found
password for hachune:
logging in to dtcp.feel6.jp port 20200
>>> +OK xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx FBDC TunnelBroker (version
0.2) Ready. <578926>:4096
<<< tunnel hachune yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy network
>>> +OK 118.1.71.38 43.244.255.37 2001:03e0:0988::/48
sleep(60)
<<< ping
>>> +OK pong
sleep(60)

ネットワーク設定スクリプトを作成

ログインに成功しアドレスが取得できたことが確認できたので、早速ネットワー ク設定スクリプトを書きなおす。dtcpclientの-sオプションに渡すスクリプト は、ログイン完了時と切断時に引数に以下のように渡され起動されるので、そ れに合わせて記述する。

up dtcp.feel6.jp 10.39.39.37 network 118.1.71.38 43.244.255.37 2001:03e0:0988::/48

LinuxにてIPv6 over IPv4なトンネルを利用する場合は、sitインターフェース を利用する。

#!/bin/sh

DEV=sit0
STATUS=${1}
SERVER=${2}
NLOCAL=${3}
MODE=${4}
LOCAL=${5}
REMOTE=${6}
V6PREFIX=${7}

case ${STATUS} in
up)
        ip link add link ${DEV} type sit
        ip link set dev ${DEV} up
        ip address add `echo ${V6PREFIX} | sed -e 's|/48||'`1/64 dev ${DEV}
        ip -6 route add default via ::${REMOTE} dev ${DEV}
        ;;
down)
        ip -6 route delete default
        ip link delete ${DEV}
        ;;
esac

確認

最後に、通信が確立していることを確認する。プロバイダのDNSサーバを利用 している場合、AAAAフィルタが有効になっていてv6アドレスが引けないことが あるので注意する。

% ping6 -c 4 ipv6.google.com
PING ipv6.google.com(2404:6800:4004:802::1012) 56 data bytes
64 bytes from 2404:6800:4004:802::1012: icmp_seq=1 ttl=53 time=17.6 ms
64 bytes from 2404:6800:4004:802::1012: icmp_seq=2 ttl=53 time=29.9 ms
64 bytes from 2404:6800:4004:802::1012: icmp_seq=3 ttl=53 time=15.5 ms
64 bytes from 2404:6800:4004:802::1012: icmp_seq=4 ttl=53 time=15.8 ms

--- ipv6.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 15.518/19.732/29.904/5.929 ms

(参考)AAAAフィルタ

AAAAフィルタが存在する場合

miku@hachune% dig @10.39.39.1 AAAA www.kame.net

; <<>> DiG 9.9.2-P2 <<>> @10.39.39.1 AAAA www.kame.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58213
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.kame.net.                  IN      AAAA

;; ANSWER SECTION:
www.kame.net.           71617   IN      CNAME   orange.kame.net.

;; Query time: 16 msec
;; SERVER: 10.39.39.1#53(10.39.39.1)
;; WHEN: Tue Apr  2 11:53:43 2013
;; MSG SIZE  rcvd: 62

AAAAフィルタが存在しない場合

miku@hachune% dig @8.8.8.8 AAAA www.kame.net

; <<>> DiG 9.9.2-P2 <<>> @8.8.8.8 AAAA www.kame.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47873
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.kame.net.                  IN      AAAA

;; ANSWER SECTION:
www.kame.net.           21599   IN      CNAME   orange.kame.net.
orange.kame.net.        21599   IN      AAAA    2001:200:dff:fff1:216:3eff:feb1:44d7

;; Query time: 275 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Apr  2 11:53:53 2013
;; MSG SIZE  rcvd: 90

2013年3月21日木曜日

OpenBlocks AX3上のLXC用の最小構成Arch Linux rootfsを作る

前回構築したOpenBlocks用Arch Linuxコンテナには 不要なパッケージも多く含まれている。そこで、作成したコンテナを利用し最小構成 (systemdとsshdが上がりログインができる状態)のrootfs tarballを作成する。

基本的な構築方法は x86_64環境のArch LinuxでLXCコンテナ用rootfsを作成した時と同じであるが、 今回はpacstrap時にbaseを丸ごと入れるのではなく、systemdとopensshのみ導入する。

miku@arch% su
root@arch# pacman -S arch-install-scripts
root@arch# mkdir rootfs
root@arch# pacstrap -d rootfs pacman systemd openssh bash
root@arch# chroot rootfs /bin/bash
root@arch(chroot)# ln -s /usr/lib/systemd/system/sshd.service \
> /etc/systemd/system/multi-user.target.wants/sshd.service
root@arch(chroot)# ln -s /usr/lib/systemd/system/sshdgenkeys.service \
> /etc/systemd/system/multi-user.target.wants/sshdgenkeys.service
root@arch(chroot)# pacman -Sc
root@arch(chroot)# rm /var/cache/pacman/pkg/*
root@arch(chroot)# mkdir /dev/pts
root@arch(chroot)# passwd
root@arch(chroot)# groupadd -g 3939 miku
root@arch(chroot)# useradd -g miku -u 3939 -s /bin/bash -m miku
root@arch(chroot)# passwd miku
root@arch(chroot)# exit
root@arch# rm rootfs/root/.bash_history
root@arch# tar cJpf rootfs.tar.gz rootfs

今回作成した最小構成環境が正しく動作するか試したところ、/dev/consoleが 存在しないとのエラーが発生する。

miku@obs$ sudo /usr/miku/bin/lxc-start -n test -- /usr/lib/systemd/systemd
lxc-start: No such file or directory - stat(/proc/26644/root/dev//console)

これも/dev/ptsが存在しない問題と似た問題のようなので、/dev/consoleを作 成しておく。

root@arch(chroot)# mknod -m 600 mini/rootfs/dev/console c 5 1

LXC側で必要としている/dev/tty{1..4}等はLXC側で自動作成しているようなの で、LXC側で必要であるのに/dev/consoleを自動作成できていないのが原因だ と考えられる。

/dev/console作成後は想定通り動作するようになった。

miku@obs% sudo /usr/miku/bin/lxc-start -n test -- /usr/lib/systemd/systemd
<30>systemd[1]: Smack is not enabled in the kernel, not loading access rules.

今回作成したOpenBlocks用の最小構成のrootfs tarballは、以下からダウンロードできるよ うにしておいたので、試してみたい方はどうぞ。
http://repo.hachune.net/Linux/ArchLinux/rootfs/armv7h/2013.03.21/obs_rootfs.tar.xz

OpenBlocks AX3上のLXC内のArch Linuxにmikutter環境を構築

前回作成したOpenBlocks AX3上のLXC内のArch Linux環境にmikutterをインストールし動かしてみる。

Arch Linuxでのmikutterは、Arch User Repository(AUR)にPKGBUILDが存在するため、 環境構築が他ディストリに比べ容易である。 AURのPKGBUILDを利用する場合は、pacmanのフロントエンドyaourtが便利であ るので、それをインストールする。また、一般ユーザでPKGBUILDを元にパッケー ジを作成する場合は、fakerootコマンドが必要であるので、それも合わせてイ ンストールする。
miku@arch% sudo pacman -S yaourt fakeroot
mikutterはアーキテクチャ非依存であるハズなので、サポートアーキテクチャに i686とx86_64と指定されている部分をanyに変更する。
miku@arch% yaourt -S mikutter
PKGBUILDの
arch=('i686' 'x86_64')
を
arch=('any')
に修正しビルド、インストールする。
OpenBlocksには直接ディスプレイを接続することができないため、SSHのX forwarding経由にてmikutterを実行する。 /etc/ssh/sshd_configのX11Forwardingの項を有効にする。
X11Forwarding yes
設定を反映させるため、sshdを再起動する。
miku@arch% sudo systemctl restart sshd.service
また、LXCはIP Masqueradeの内側となるため、SSH Proxyを利用する。 OpenBlocksのIPアドレスは10.39.39.39/24、その中のコンテナのIPアドレスは 10.3.93.11/24であるので、手元の環境の~/.ssh/configに以下のように追記し ておく。
Host obs
HostName 10.39.39.39

Host obs.arch
HostName 10.3.93.11
ProxyCommand ssh -W %h:%p obs
これにより、"ssh obs.arch"だけでobsのsshdを経由しobs.archに接続可能に なる。
miku@hachune% ssh -X obs.arch
X11 forwarding request failed on channel 0
Last login: Wed Mar 20 16:41:43 2013 from 10.3.93.1
どうやら、X11 forwardingに失敗しているようだ。xauthが存在していないの が原因のようなので、xorg-xauthパッケージをインストールする。
miku@arch% yaourt -S xorg-xauth
miku@arch% sudo systemctl restart sshd.service
ようやくX forwardingができたものの、フォントがないため非常に残念なこと になる。
miku@hachune% ssh -X obs.arch
Last login: Wed Mar 20 17:06:50 2013 from 10.3.93.1
miku@arch% mikutter

VL Gothicフォントを入れてやり直し。
miku@arch% yaourt -S ttf-vlgothic
今度は無事mikutterが起動し利用できる状態になった。RUBY_PLATFORMがarmv7l-linux-eabiとなっていることが確認できる。

SSH Proxy経由のX forwardingであるため、かなり残念な表示速度と操作性と なってしまっている。ただ、CPU負荷は500アカウント程度フォローしているホー ムタイムラインのUserStream有効の状態で5%〜30%程度に落ち着いているため、 CPUの性能不足という事は無いようだ。また、Disk I/Oも余裕があるように見 受けられる。
やはりOpenBlocks上でmikutterを利用する場合は、mikutterのデーモンモード を利用するのが無難かと思う。

OpenBlocks AX3上のLXCにArch Linuxを導入

LXCはi386/amd64環境以外でも利用できる。ここでは、ARMv7なマイクロサーバ OpenBlocks AX3にインストールされているDebianにLXCを導入し、その中にArch Linuxをインストールする。ホストとコンテナの論理的な構成(ネットワーク等)は 前回の構成と同じになるよう構築する。 前回とはディストリビューションは異なるものの、設定ファイルの扱い等が少々異なる以外基本はほぼ同じであ る。

ネットワーク設定

ホスト側ブリッジインターフェースとIP Masqueradeは、先に設定したものと 全く同じになるよう設定を行う。当然ながらこの設定は再起動等で消えてしま うため、恒久化する必要があるのであれば/etc/network/interfaces等に記述 しておく。

miku@obs% sudo ip link add br0 type bridge
miku@obs% sudo ip link set br0 up
miku@obs% sudo ip address add 10.3.93.1/24 dev br0
miku@obs% sudo sysctl net.ipv4.ip_forward=1
miku@obs% sudo iptables -t nat -A POSTROUTING \
> -s 10.3.93.0/24 -o eth0 -j MASQUERADE

bootstrap

Arch Linuxのarm版は各armアーキテクチャ毎にrootfsのtarballが用意されて いるが、残念ながらOpenBlocks AX6用のものは用意されていない。そこで、最 も近いと思われるものを http://archlinuxarm.org/platforms/armv7 から選 び試す。ここでは、 http://archlinuxarm.org/os/ArchLinuxARM-cubox-latest.tar.gz を利用する。

まずはlxcパッケージを導入しcgroupをmountする。また、入手したtarballを 展開し、その中にchrootして作業できるようsysfsやproc等をmountする。

miku@obs% sudo aptitude install lxc
miku@obs% sudo mount -t cgroup cgroup /cgroup
miku@obs% sudo mkdir -p /var/lib/lxc/arch/rootfs
miku@obs% sudo tar xpf ArchLinuxARM-cubox-latest.tar.gz \
> -C /var/lib/lxc/arch/rootfs/
miku@obs% sudo mount -t proc proc /var/lib/lxc/arch/rootfs/proc
miku@obs% sudo mount -t sysfs sysfs /var/lib/lxc/arch/rootfs/sys
miku@obs% sudo mount -t devtmpfs devtmpfs /var/lib/lxc/arch/rootfs/dev
miku@obs% sudo mkdir /dev/pts
miku@obs% sudo mount -t devpts devpts /var/lib/lxc/arch/rootfs/dev/pts

コンテナ内の設定

展開したシステムディレクトリにchrootし環境設定を行う。 ここでは、パッケージの更新とssh鍵の作成、LXC環境に必要ないデーモンの無 効化を行なう。

miku@obs% sudo chroot /var/lib/lxc/arch/rootfs /bin/bash
root@obs(chroot)# echo nameserver 10.39.39.1 > /etc/resolv.conf
root@obs(chroot)# pacman -Syu
root@obs(chroot)# find /etc -name "*.pacnew" -exec sh \
> -c 'mv "{}" "`basename {} .pacnew`"' \;
root@obs(chroot)# rm /etc/ssh/ssh_host_*
root@obs(chroot)# ssh-keygen -A
root@obs(chroot)# cd /etc/systemd/system/multi-user.target.wants
root@obs(chroot)# rm {openntpd,netcfg\@ethernet-eth0}.service
root@obs(chroot)# mkdir /dev/pts

最後にユーザアカウントを設定しておく。

root@obs(chroot)# passwd
root@obs(chroot)# groupadd -g 3939 miku
root@obs(chroot)# useradd -g miku -u 3939 -s /bin/bash -m miku
root@obs(chroot)# passwd miku
root@obs(chroot)# exit

コンテナ設定ファイルの作成

今回利用するコンテナ設定ファイルは、 前回Arch Linux上のLXCコンテナ内にArch Linux環境を構築した際に作成したもの と全く同じものを利用する。

コンテナの起動

早速起動してみたところ、カーネルバージョンが3.0.6、lxc-0.7.2-1のホスト 環境ではcgroupディレクトリのrenameに失敗し、コンテナが起動できない問題 が発生した。

miku@obs% uname -a
Linux obsax3 3.0.6 #1 SMP Thu Mar 7 19:14:19 JST 2013 armv7l GNU/Linux
miku@obs% sudo lxc-start -n arch -- /usr/lib/systemd/systemd
lxc-start: No such file or directory - failed to rename cgroup
/cgroup/7787->/cgroup/arch
lxc-start: failed to spawn 'arch'
lxc-start: No such file or directory - failed to remove cgroup '/cgroup/arch'

LXCは既に新しいバージョンが出ているため、最新版を野良ビルドし試す。 今回は、 LXC-0.9.0-RC1(http://lxc.sourceforge.net/download/lxc/lxc-0.9.0.rc1.tar.gz) で試した。このソースのビルドには、gccとmake等の他、libcap-devが必要な ようだ。 設定ファイルが置かれるディレクトリは、システムにインストールされている lxcパッケージと同じところを参照するよう、–with-config-pathオプション を設定しておく。

miku@obs% wget http://lxc.sourceforge.net/download/lxc/lxc-0.9.0.rc1.tar.gz
miku@obs% tar xf lxc-0.9.0.rc1.tar.gz -C /home/miku/src
miku@obs% cd /home/miku/src/lxc-0.9.0.rc1
miku@obs% ./configure --prefix=/usr/miku --with-config-path=/var/lib/lxc
miku@obs% make && sudo make install

今回ビルドしたlxcコマンド群を利用し再度コンテナを起動。

miku@obs% sudo /usr/miku/bin/lxc-start -n arch -- /usr/lib/systemd/systemd
<30>systemd[1]: Smack is not enabled in the kernel, not loading access rules.

カーネルオプションの不足による警告メッセージが現れているが、とりあえず ssh経由でコンテナ内にアクセスすることができた。

miku@obs$ ssh 10.3.93.11                                                                            
miku@10.3.93.11's password: 
Last login: Tue Mar 19 15:41:07 2013 from 10.3.93.1
[miku@alarmcubox ~]$ telnet mikutter.hachune.net 80
Trying 115.177.182.220...
Connected to mikutter.hachune.net.
Escape character is '^]'.

次回は、この環境にてmikutterを動かしてみようと思う。

LXCにArchLinuxを入れる

Arch Linux上のLXCにArch Linuxを入れ、systemdとsshが正しく動作するか試し てみる。 大まかな流れは、
  1. ネットワーク設定
    • ブリッジインターフェースの作成
    • IP Masqueradeの設定
  2. コンテナの作成
    • コンテナ内システムのbootstrap
    • コンテナ内の設定
    • コンテナ設定ファイルの作成
  3. コンテナの起動と終了
となる。
完成時のネットワーク構成は、以下の図のようになる。

ホスト側ブリッジインターフェースの設定

LXCのvethネットワークを束ねるブリッジインターフェース(br0)を作成する。 ブリッジインターフェースの作成とアドレスの割当にはipコマンドを用いる。
miku@host% sudo ip link add br0 type bridge
miku@host% sudo ip link set br0 up
miku@host% sudo ip address add 10.3.93.1/24 dev br0
毎度手動でインターフェース設定を行うのは面倒なので、netcfgの設定を行っ ておく。まずは、/etc/network.d/examples/bridgeを参考に /etc/network.d/bridge0を記述する。
INTERFACE="br0"
CONNECTION="bridge"
DESCRIPTION="Hatsune Bridge connection"
BRIDGE_INTERFACES=""
IP="static"
ADDR="10.3.93.1"
NETMASK="24"
最後に、systemctlでnetcfg@bridge0がシステム起動時に実行されるよう設定 する。
miku@host% sudo systemctl enable netcfg@bridge0.service
一時的に手動でnetcfgを起動することもできる。
miku@host% sudo systemctl start netcfg@bridge0.service

IP Masqueradeの設定

LXCコンテナ側から外部ネットワークにアクセスできるよう、IP Masqueradeを 設定する。まず、IP Forwardingを有効である必要があるため、 /etc/sysctl.confのnet.ipv4.ip_forwardを1に設定する。
net.ipv4.ip_forward = 1
手動で一時的に有効にするには、"sudo sysctl net.ipv4.ip_forward=1"でよ い。
次に、iptablesにて10.3.93.0/24から外部ネットワークに接続されたネットワー クインターフェース(enp2s0)へのIP Masqueradeを設定する。
miku@host% sudo iptables -t nat -A POSTROUTING \
> -s 10.3.93.0/24 -o enp2s0 -j MASQUERADE
この時点のiptablesの状態をiptables-saveコマンドでdumpし、それをそのま まiptablesの恒久的なルールとして利用する。 このルールファイルを置くべきパスは、/etc/conf.d/iptablesに "IPTABLES_CONF=/etc/iptables/iptables.rules"として定義されている。
miku@host% sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'
最後に、システム起動時にこのルールが適用されるようにsystemdを設定する。
miku@host% sudo systemctl enable iptables.service

bootstrap

Arch Linuxのrootfsの構築は、Arch LinuxのLiveCDからインストールする際と 同様にarch-install-scriptsのpacstrapコマンドを用いる。合わせて、lxcパッ ケージとiproute2パッケージを導入しておく。
miku@host% sudo pacman -S lxc arch-install-scripts iproute2
/lxc/arch/rootfs以下に環境を作成する場合の操作は以下のようになる。 Arch LinuxのLXCテンプレートも存在するのだが、Arch Linux側の仕様がよく 変わり使い物にならない(すぐ使い物にならなくなる)ため、pacstrapを直接利 用する。
miku@host% sudo mkdir -m 0755 /var/lib/lxc/arch/rootfs
miku@host% sudo pacstrap -i -d /var/lib/lxc/arch/rootfs base openssh
baseパッケージグループを導入する際には、カーネルパッケージ等LXCコンテ ナ内に必要ないパッケージも多数含まれるので、必要に応じて除外する。
:: There are 52 members in group base:
:: Repository core
   1) bash  2) bzip2  3) coreutils  4) cronie  5) cryptsetup  6) device-mapper  7) dhcpcd  8) diffutils
   9) e2fsprogs  10) file  11) filesystem  12) findutils  13) gawk  14) gcc-libs  15) gettext  16) glibc
   17) grep  18) gzip  19) heirloom-mailx  20) inetutils  21) iproute2  22) iputils  23) jfsutils  24) less
   25) licenses  26) linux  27) logrotate  28) lvm2  29) man-db  30) man-pages  31) mdadm  32) nano  33) netcfg
   34) pacman  35) pciutils  36) pcmciautils  37) perl  38) ppp  39) procps-ng  40) psmisc  41) reiserfsprogs
   42) sed  43) shadow  44) sysfsutils  45) systemd-sysvcompat  46) tar  47) texinfo  48) usbutils
   49) util-linux  50) vi  51) which  52) xfsprogs
LXCパッケージのデフォルトでは各コンテナは/var/lib/lxc以下に置かれるの だが、パスが長くて面倒だという場合は以下のようにシンボリックリンクを張っ ておく。(LXC側で設定を変更することもできるが、lxcパッケージ側で /var/lib/lxcにハードコートされているものが存在するようでエラーとなるた め)
miku@host% sudo ln -s /var/lib/lxc /lxc

コンテナ内の設定

コンテナを起動しssh経由にてログインする際に必要な設定を行う。 sshdの有効化とユーザアカウントの設定が必須で、必要に応じてロケール等の 設定を行う。
miku@host% sudo chroot /var/lib/lxc/arch/rootfs /bin/bash
root@host(chroot)# ln -s /usr/lib/systemd/system/sshd.service \
> /etc/systemd/system/multi-user.target.wants/sshd.service 
root@host(chroot)# passwd
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@host(chroot)# groupadd -g 3939 miku
root@host(chroot)# useradd -g miku -u 3939 -s /bin/bash -m miku
root@host(chroot)# passwd miku
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@host(chroot)# exit
デバイスノードの管理はsystemd-udevdが行うため、後述するLXCのconfigでの 許可ルール設定のみ注意すればよい。また、/tmpのtmpfsや/devのdevtmpfs、 /sysのsysfs、/procのprocfs等もsystemdが自動でマウントを行うため、LXCの configやfstabへの記述は特に必要ない。

コンテナ設定ファイルの作成

今回設定するコンテナの設定ファイルは、"/var/lib/lxc/arch/config"である。 ここでは、コンテナに割り当てられるネットワークとファイルシステム、デバ イスのルールについて定義を行う。 設定ファイルの詳細については、lxc.conf(5)や/usr/share/doc/lxc/examples 以下のファイル、デバイス番号の一覧は以下のドキュメントを参照。 http://www.kernel.org/pub/linux/docs/device-list/devices.txt
# ホスト名とネットワークの設定
lxc.utsname                     = arch
lxc.network.type                = veth
lxc.network.name                = eth0
lxc.network.flags               = up
lxc.network.link                = br0
lxc.network.ipv4                = 10.3.93.11/24
lxc.network.ipv4.gateway        = 10.3.93.1


# ファイルシステムの設定
lxc.rootfs      = /var/lib/lxc/arch/rootfs


# デバイスの設定
lxc.pts                         = 1024
lxc.tty                         = 4

# deny all devices
lxc.cgroup.devices.deny         = a

# /dev/tty0..3
lxc.cgroup.devices.allow        = c 4:0 rwm
lxc.cgroup.devices.allow        = c 4:1 rwm
lxc.cgroup.devices.allow        = c 4:2 rwm
lxc.cgroup.devices.allow        = c 4:3 rwm

# /dev/tty
lxc.cgroup.devices.allow        = c 5:0 rwm
# /dev/console
lxc.cgroup.devices.allow        = c 5:1 rwm
# /dev/ptmx
lxc.cgroup.devices.allow        = c 5:2 rwm

# /dev/null
lxc.cgroup.devices.allow        = c 1:3 rwm
# /dev/zero
lxc.cgroup.devices.allow        = c 1:5 rwm
# /dev/random
lxc.cgroup.devices.allow        = c 1:8 rwm
# /dev/urandom
lxc.cgroup.devices.allow        = c 1:9 rwm

# /dev/pts/*
lxc.cgroup.devices.allow        = c 136:* rwm
# /dev/rtc
lxc.cgroup.devices.allow        = c 254:0 rwm
最終的に許可されたデバイスの一覧は "/sys/fs/cgroup/devices/lxc/コンテナ名/devices.list" から参照できる。

コンテナ内のArch Linuxの起動と終了

コンテナ内のinitの起動にはlxc-startを用いる。このシステムの場合はコン テナ名がarch、コマンドは/usr/lib/systemd/systemdとなる。
早速起動した所、pivot_root(2)が失敗する問題に遭遇した。
miku@host% sudo lxc-start -n arch -- /usr/lib/systemd/systemd
lxc-start: Invalid argument - pivot_root syscall failed
lxc-start: failed to setup pivot root
lxc-start: failed to set rootfs for 'arch'
lxc-start: failed to setup the container
lxc-start: invalid sequence number 1. expected 2
lxc-start: failed to spawn 'arch'
これはsystemdとLXCの組み合わせで発生する問題で、/以下をprivate mountす ることで解決できるようだ。
miku@host% sudo mount --make-rprivate /
このprivate mountの詳細については、以下のページが詳しい。
再度起動した所、今度は/dev/ptsが存在しないとのエラーが発生。どうや らLXC側で/dev/ptsにdevptsをマウントしようとして失敗しているようなので、 /lxc/arch/dev/ptsを作成しておく。
miku@host% sudo lxc-start -n arch -- /usr/lib/systemd/systemd
lxc-start: No such file or directory - failed to mount a new instance of '/dev/pts'
lxc-start: failed to setup the new pts instance
lxc-start: failed to setup the container
lxc-start: invalid sequence number 1. expected 2
lxc-start: failed to spawn 'arch'
miku@host% sudo mkdir -m 755 /var/lib/lxc/arch/dev/pts
以上2つの問題を解決し、ようやくsystemdとsshdが起動した。
miku@host% sudo lxc-start -n arch -- /usr/lib/systemd/systemd
miku@host% lxc-ps -n arch
CONTAINER   PID TTY          TIME CMD
arch       1113 ?        00:00:00 systemd
arch       1124 ?        00:00:00 systemd-udevd
arch       1132 ?        00:00:00 systemd-journal
arch       1243 ?        00:00:00 sshd
arch       1245 ?        00:00:00 dbus-daemon
arch       1246 ?        00:00:00 systemd-logind
arch       1253 ?        00:00:00 agetty
arch       1254 tty1     00:00:00 agetty
デーモンとして動作させる場合は、以下のように-dオプションとログ出力オプ ションを設定し起動する。
miku@host% sudo lxc-start -n arch  -d \
> --logfile=/var/lib/lxc/arch/lxc.log \
> --console=/var/lib/lxc/arch/console.log  -- /usr/lib/systemd/systemd
LXCコンテナを終了する場合は、lxc-stopコマンドを利用する。
miku@host% sudo lxc-stop -n arch
Arch Linux上のLXCコンテナ内でArch Linuxを動かし、基本的な操作(起動と終了)が 行えることが確認できた。

その他の問題

今回作成した環境には、lxc-consoleにてコンソールにアクセスできない問題 がある。LXCが想定する/dev以下の扱いとsystemd-udevdの挙動の問題なように 見受けられるので、そのあたりを探っておこうと思う。 (LXC側で掴んだデバイスノードと別に/devにmountされたdevtmpfs上のデバイ スノードをsystemd側でgettyしているのが原因?)

2012年9月13日木曜日

OpenSMTPDからGmailのSMTPサーバを利用する

OpenSMTPDとは

OpenSMTPDはOpenBSDプロジェクトのうちの一部として開発されているSMTPデー モンで、OpenBSDの標準システムに含まれており、またLinux等への移植性も確 保されている。

今回は、Arch Linux上のOpenSMTPDを用いて自宅ローカルネットワークからの メールをGmailのSMTPサーバを経由して送信できるようにする。

OpenSMTPDのインストール

ArchLinuxのOpenSMTPDパッケージはAURにあるので、yaourtを用いてビルドし インストールする。特にPKGBUILDの編集などは必要ないようだ。

$ yaourt -S opensmtpd

インストールされる全ファイルの一覧は以下の通りである。軽量・安全・簡単を 売りにしているだけあって、ファイル数は少なく抑えられている。

[miku@test mail]$ yaourt -Ql opensmtpd
opensmtpd /etc/
opensmtpd /etc/mail/
opensmtpd /etc/mail/smtpd.conf
opensmtpd /etc/rc.d/
opensmtpd /etc/rc.d/smtpd
opensmtpd /usr/
opensmtpd /usr/bin/
opensmtpd /usr/bin/mailq
opensmtpd /usr/bin/newaliases
opensmtpd /usr/lib/
opensmtpd /usr/lib/systemd/
opensmtpd /usr/lib/systemd/system/
opensmtpd /usr/lib/systemd/system/smtpd.service
opensmtpd /usr/libexec/
opensmtpd /usr/libexec/mail.local
opensmtpd /usr/libexec/opensmtpd-portable/
opensmtpd /usr/libexec/opensmtpd-portable/makemap
opensmtpd /usr/sbin/
opensmtpd /usr/sbin/makemap
opensmtpd /usr/sbin/smtpctl
opensmtpd /usr/sbin/smtpd
opensmtpd /usr/share/
opensmtpd /usr/share/man/
opensmtpd /usr/share/man/man5/
opensmtpd /usr/share/man/man5/smtpd.conf.5.gz
opensmtpd /usr/share/man/man8/
opensmtpd /usr/share/man/man8/makemap.8.gz
opensmtpd /usr/share/man/man8/newaliases.8.gz
opensmtpd /usr/share/man/man8/smtpctl.8.gz
opensmtpd /usr/share/man/man8/smtpd.8.gz

smtpd.confの編集

デフォルトのsmtpd.confは以下のようになっている。設定ファイルの形式は、 pf.conf等に似ている。127.0.0.1でlistenしているため、内部へのmbox形式の メール配送と外部へのメール送信のリレーのみを行うようになっている。

listenするインターフェース又はネットワークを10.0.0.0/8等に変更すれば、 LAN内のホストからの要求も受け付けるようになる。この際、accept from 〜等で ネットワーク毎にルールを設定することもできる。

# $OpenBSD: smtpd.conf,v 1.2 2009/11/03 22:32:10 gilles Exp $

# This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.

# XXX try to find a portable way to get the IP interface
#listen on lo0
listen on 127.0.0.1

map "aliases" { source db "/etc/mail/aliases.db" }

accept for local alias aliases deliver to mbox
accept for all relay

しかし、このままでは内部への配送は正しく行われるが、外部へのリレーは利 用しているプロバイダや回線の契約によってはOP25Bにより正しく行われない可 能性がある。そこで、GmailのSMTPサーバを経由し外部へのメール送信を行う ように設定を変更する。

Gmailでは、STARTTLSを用いた認証を行うことでSMTPサーバを利用できる。 サーバホスト名はsmtp.gmail.com、ポート番号は587、アカウント名は"gmail アカウント@gmail.com"、パスワードはGmailのものを用いる。

以上の変更点を適用したsmtpd.confは以下のようになった。

listen on lo

map "aliases" { source db "/etc/mail/aliases.db" }
map "secrets" { source db "/etc/mail/secrets.db" }

accept for local alias "aliases" deliver to mbox
accept from all for all relay via tls+auth://smtp.gmail.com:587 auth "secrets"

この他にも、Gmailのユーザ名とパスワードを保持刷るためのファイル /etc/mail/secrets.dbが必要になる。このファイルはプレーンテキストで以下 のように書かれた/etc/mail/secretsを、makemapコマンドを用いて変換したも のである。

smtp.gmail.com Gmailのアカウント名@gmail.com:Gmailのパスワード

このsecretsとsecrets.dbのパーミッションは640、オーナーはroot:_smtpdに 設定する。

smtpdの起動

smtpdの動作を確認するため、まずはコマンドラインから-d(Do not daemonize)と-v(verbose output)オプションを付けて起動する。

試しにメールを送信してみる。

[miku@test ~]$ telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 test.k.hachune.net ESMTP OpenSMTPD
EHLO hachune.net
250-test.k.hachune.net Hello hachune.net [IPv6:::1], pleased to meet
you
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-SIZE 18446744073709551615
250 HELP
MAIL FROM:
250 2.1.0 Sender ok
RCPT TO:
250 2.0.0 Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: SMTPD Test
From: Miku Hachune
To: Phenomer
Date: Thu, 13 Sep 2012 17:29:26 +0900

mikumiku
.
QUIT

メールが正しく届いていればOK、もし届いていないようであればmailqや端末 上のログを確認する。 このままOpenSMTPDを使い続ける場合は、/etc/rc.confのDAEMONSにsmtpdを追 加しておく。

参考

OpenSMTPD
http://www.opensmtpd.org/

その他のメール クライアントの設定 - Gmail ヘルプ
https://support.google.com/mail/bin/answer.py?hl=ja&answer=78799

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年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をリポジトリ上のパッケージとして利用することができるようになった。

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