FreeBSD/arm

投稿日: Leave a comment

Raspberry pi をちょっとしたサーバー(ntpdとかリゾルバとか)にしようと思って、FreeBSD 10-STABLE を自前ビルドして、ここ数日動かしてみた。

が、どうにも安定しない。sshdが突然signal 11で落ちる。これじゃ、使いものにならない。

SDカードが壊れてるのかなぁとも思ったけど、色々試す気力もなく、再びNetBSDに戻ってみることにする。

FreeBSD/armのビルドは追々まとめようと思う。

 

Raspberry PiのRTCを設定

投稿日: Leave a comment

ここのつづき.

rtcの設定を/etc/rc.localに書いてあったけど,起動時の処理が

  1. fake_hwclock
  2. ntpdate (時間がかかる)
  3. ntpd (ntpdateが動いていると待たされる)
  4. rc.localでRTCを設定

とntpdateが動いてRTCの意味がない感じがするので,最初の方でhwclock.shが走るように改造した.

まずはhwclock.shの改造.I2Cバス上のRTCを認識させて時刻をとれるようにする.

root@raspberry:/etc/init.d# diff -u hwclock.sh.orig hwclock.sh
--- hwclock.sh.orig     2014-05-10 09:41:36.171639671 +0900
+++ hwclock.sh  2014-05-10 10:31:32.134145549 +0900
@@ -61,8 +61,15 @@
                printf "0.0 0 0.0\n0\nUTC" > /etc/adjtime
            fi

-           if [ -d /run/udev ] || [ -d /dev/.udev ]; then
-               return 0
+           #load i2c and RTC kernel modules
+           modprobe rtc-m41t80
+           echo m41t62 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
+
+           if [ -e /dev/$HCTOSYS_DEVICE ]
+           then
+               log_action_msg "RTC device found"
+           else
+               echo 0x68 > /sys/class/i2c-adapter/i2c-1/delete_device
            fi

            if [ "$HWCLOCKACCESS" != no ]; then

hwclock.shを有効化

# update-rc.d hwclock.sh enable

ついでに,ntpdateのパッケージを削除してこんな感じにした.

  1. fake_hwclock (RTCをつながなかったときのための保険)
  2. hwclock.sh
  3. ntpd

あとはfirewallを入れれば,常時起動のサーバーとして使えそうなのでもう少し試験したら1台買い増そうかな.

DHCPの設定を変更

投稿日: Leave a comment

家庭内LANのDHCPサーバー(IPv4)の設定を変更した.

DHCPサーバーはRTX810で動いているのでRTX810の設定.

これまでは,192.168.100.0/24 の範囲でMACアドレス指定で固定的に割り当てていたが,その範囲を有線・無線・機種等で分けて,ついでに,既知の端末と未知の端末(ゲスト)でサブネットを分けて,ゲスト用サブネットからLAN内の他のサブネットへの通信を遮断するようにした.

subnet-1 [192.168.100.0/24]:既知の端末用のネットワーク

  • 192.168.100.1: RTX810のLAN1ポート (プライマリアドレス)
  • 192.168.100.2-16: サーバー用 (固定割り当て)
  • 192.168.100.17-32: 実験用 (固定割り当て)
  • 192.168.100.33-64: DHCP (有線)
  • 192.168.100.65-128: DHCP (無線)
  • 192.168.100.129-192: DHCP (その他家電など)
  • 192.168.100.193-254: DHCP (半固定用*1)
    *1) DHCPサーバーからネットワークアドレスだけ取得して下位1octetを固定でふるやつ.最近増えてきた.

subnet-2 [192.168.1.0/24]:ひかり電話ルーター配下のサブネット (SIP用)

  • 192.168.1.1: ひかり電話のルーター
  • 192.168.1.254: RTX810のLAN2ポート

subnet-3 [192.168.255.0/24]:ゲスト用ネットワーク

  • 192.168.255.1: RTX810のLAN1ポート (セカンダリアドレス)
  • 192.168.255.2-16: 固定 (192.168.{1,100}.0/24アクセス不可)
  • 192.168.255.17-32: DHCP (192.168.{1,100}.0/24アクセス不可)

configはこんな感じ.

※100003を入れ忘れてLANからRTX810に入れなくなり,途中からシリアルコンソールで設定.
※あとからIPv6でつなげば設定できることを思い出した...

ip lan1 address 192.168.100.1/24
ip lan1 secondary address 192.168.255.1/24
ip lan2 address 192.168.1.254/24
ip filter 100001 reject-nolog 192.168.255.0/24 192.168.100.0/24 * * *
ip filter 100002 reject-nolog 192.168.255.0/24 192.168.1.0/24 * * *
ip filter 100003 pass * * * * *
ip lan1 secure filter in 100001 100002 100003
dhcp scope lease type 1 bind-only fallback=2
dhcp scope 1 192.168.100.33-192.168.100.254/24
dhcp scope bind 1 192.168.100.33 XX:XX:XX:XX:XX:XX
 : (略)
dhcp scope bind 1 192.168.100.254 XX:XX:XX:XX:XX:XX
dhcp scope 2 192.168.255.33-192.168.255.254/24

ipv4はこれでいいが,ipv6はブロードキャストされているraを拾って設定するので通信できてしまって,なんかすっきりしない.少し考えてみるか.VLAN使うしかないかな.

RTC M41T62 を Raspberry Pi につなぐ

投稿日: Leave a comment

先日秋葉原で衝動買いした,M41T62が載ったRTCボードをRaspberry piにつないでみた.

データシートを見るとレジスタの仕様がDS1307と違っていてどうしたものかと思ったが,カーネルモジュールのリストを眺めてみたらm41txxが使えそう.

% ls /lib/modules/3.10.25+/kernel/drivers/rtc
rtc-bq32k.ko   rtc-ds3232.ko    rtc-m41t80.ko   rtc-pcf8523.ko  rtc-rv3029c2.ko
rtc-ds1305.ko  rtc-ds3234.ko    rtc-m41t93.ko   rtc-pcf8563.ko  rtc-rx4581.ko
rtc-ds1307.ko  rtc-em3027.ko    rtc-m41t94.ko   rtc-pcf8583.ko  rtc-rx8025.ko
rtc-ds1374.ko  rtc-fm3130.ko    rtc-max6900.ko  rtc-r9701.ko    rtc-rx8581.ko
rtc-ds1390.ko  rtc-isl12022.ko  rtc-max6902.ko  rtc-rs5c348.ko  rtc-s35390a.ko
rtc-ds1672.ko  rtc-isl1208.ko   rtc-pcf2123.ko  rtc-rs5c372.ko  rtc-x1205.ko

データシートを見ると,M41T93とM41T94はSPIで,M41T80はI2CでM41T62と時刻レジスタの仕様はほぼ同じ.

で,rtc-m41t80.koのソースコードを見るとM41T62もサポートされているようなので,さくっと使えそう.

 72 static const struct i2c_device_id m41t80_id[] = {
 73 { "m41t62", M41T80_FEATURE_SQ | M41T80_FEATURE_SQ_ALT },
 74 { "m41t65", M41T80_FEATURE_HT | M41T80_FEATURE_WD },
 75 { "m41t80", M41T80_FEATURE_SQ },
 76 { "m41t81", M41T80_FEATURE_HT | M41T80_FEATURE_SQ},
 77 { "m41t81s", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 78 { "m41t82", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 79 { "m41t83", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 80 { "m41st84", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 81 { "m41st85", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 82 { "m41st87", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ },
 83 { }
 84 };

早速やってみた.

% sudo su
# modprobe rtc-m41t80
# echo m41t62 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

これでM41T62が認識されてdmesgにログが出力される.

% dmesg | tail
[ 13.109501] i2c /dev entries driver
[ 13.378915] Driver for 1-wire Dallas network protocol.
[ 21.233753] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
[ 21.234343] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 22.855768] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 22.857117] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
[ 35.406699] Adding 102396k swap on /var/swap. Priority:-1 extents:1 across:102396k SSFS
[ 36.812102] rtc-m41t80 1-0068: chip found, driver version 0.05
[ 36.813680] rtc-m41t80 1-0068: rtc core: registered m41t62 as rtc0
[ 36.814748] i2c i2c-1: new_device: Instantiated device m41t62 at 0x68

時刻もしっかりとれる.

# hwclock -r; date
Tue 06 May 2014 08:11:49 AM JST -0.906676 seconds
Tue May 6 08:11:49 JST 2014

レンタルサーバー リニューアル

投稿日: Leave a comment

このサイトを動かしているレンタルサーバーがリニューアルした.

容量UPとかいろいろうれしい変更があるけど,個人的に注目していたのはFreeBSD 9.1Rになるのと,IPv6対応.

早速,dmesgを見てみた.
(dmesgコマンド自体は封印されているけど,/var/run/dmesg.bootは見える)

続きを読む レンタルサーバー リニューアル

UPS導入

投稿日: Leave a comment

UPSは電池の管理とか後々のメンテナンスが面倒なので導入をためらっていたけど,引っ越してきてからわりと頻繁に停電・瞬断が起きるので,やむなく購入した.

購入したのは,APCのBR400G-JPという製品.

USBをReadyNASにつないで,UPSとして認識するのを確認し,ACを引っこ抜いてバッテリー動作に切り替わったことを認識するのを確認した.

バックアップ電源が3系統あるので,NAS,フレッツ光ネクストのホームゲートウェイ,ルータ (RTX810)をつなぐことにした.NASは,シャットダウンの閾値を設定できて,とりあえずAUTOにしておいた.おそらく残量が少なくなったらシャットダウンが走ると思われる.

負荷電力が表示できて,上の3つをつないだ状態で30Wと表示された.これだと短時間の停電ならシャットダウンすることなく動作を維持できそう.

UPSは動作温度で寿命が結構変わってくるみたいだから要注意.

ReadyNAS312

投稿日: Leave a comment

NASを導入した件を書くのを忘れていた.

結局,ここに書いた通り,

  • ReadyNAS 312 2ベイ Diskless RN31200-100AJS
  • 3.5インチ内蔵HDD 2TB SATA6.0Gb/s WD20EFRX-R 2台

の構成で構築.

DebianベースのOSが入っているけど,別のところに設定ファイルが置かれているようで,OSの設定はほとんどいじれない.

IPv6の匿名アドレスを作らせるための/etc/sysctl.conf(実際に作ったのは,/etc/sysctl.d/99-ipv6-ra.conf)は有効だったので,そこだけはいじった.

$ cat /etc/sysctl.d/99-ipv6-ra.conf
net.ipv6.conf.eth0.accept_ra = 1
net.ipv6.conf.eth0.autoconf = 1
net.ipv6.conf.eth0.use_tempaddr = 2
net.ipv6.conf.eth0.accept_ra_defrtr = 0

今のところ気づいて気になっているところ.

  • ユーザーフォルダではWebDAVは使えない.
  • httpsのサーバー証明書は自己署名したものなので,クライアントで証明書エラーが出る.
  • SSHを有効にするとサポートが受けられなくなる場合があるとのことだったが,有効にした.
  • IPv6のアドレスを固定で振ってsysctl.confでRAを受けるようにすれば,匿名アドレスと固定アドレスを併用可

Android用CA証明書

投稿日: Leave a comment

NASがhttpsをしゃべって,いわゆるオレオレ証明書でSSL証明書エラーが出てうっとうしいので,opensslで認証局(CA)を立てて,サーバー証明書をこのCAでサインしてあげた.

で,このCAの証明書をAndroidに入れようと思ったらすんなりといかなかったので備忘録.

このコマンドで,pkcs#12形式に変換したらうまくいった.

# openssl pkcs12 -export -in cacert.pem -inkey private/cakey.pem -out cacert.p12

これを端末に移したら登録できた.

FreeBSD-10RELEASE on ZFS

投稿日: Leave a comment

年末にFreeBSD機が壊れてしまってさみしくなってしまったのでUbuntuを入れているPCにFreeBSDを入れた.

以前,9.1RC2をZFSに入れたけど,もう少し細かく設定したので手順を書き直し.

1. インストーラの起動

1GBのSDカードに10-Rの64ビット版 FreeBSD-10.0-RELEASE-amd64-memstick.img を書き込んでUSBブート.

普通にインストーラを使ってインストールを進めるが,途中のディスクの設定のところはZFSを選ばず,Shellを選ぶ.一度ZFSにしてみたが,パーティションの切り方に満足できなかったので,一度作ったZFSを参考に手動で作ることにした.

2. ZFSの設定

WD REDの1TB 1本のみ使う.ミラーにはしない.4kセクターなディスクなのでzfsパーティションを作るときにちょっと気を使ってあげる.swapはZFSのプール内に作る.

GPTパーティションを作る.

# gpart destroy -F ada0
# gpart create -s gpt ada0
# gpart add -s 512k -a 4k -t freebsd-boot -l boot0 ada0
# gpart add -a 4k -t freebsd-zfs -l disk0 ada0

4kセクタ対応ZFSパーティション(ashift=12)を作る.

一旦,gnopで作ったラッパーデバイスでzfsを作り,export,nop削除,importする.

# gnop create -S 4096 /dev/gpt/disk0
# kldload zfs
# zpool create -o altroot=/mnt -O canmount=off -m none rpool /dev/gpt/disk0.nop
# zpool export rpool
# gnop destroy /dev/gpt/disk0.nop
# zpool import -o altroot=/mnt -o cachefile=/tmp/zpool.cache rpool

3. ファイルシステムの詳細設定

# zfs set checksum=fletcher4 rpool
# zfs set atime=off rpool

ルート

# zfs create -o mountpoint=none rpool/ROOT
# zfs create -o mountpoint=/ rpool/ROOT/default

各ディレクトリ

/直下のフォルダにはmountpointプロパティを設定し,それ以下は単に作るだけ.必要に応じて圧縮とsetuidなどを設定する.

# zfs create -o mountpoint=/tmp -o compression=lz4 -o setuid=off rpool/tmp
# chmod 1777 /mnt/tmp
# zfs create -o mountpoint=/usr rpool/usr
# zfs create rpool/usr/local
# zfs create rpool/usr/obj
# zfs create -o compression=lz4 -o setuid=off rpool/usr/ports
# zfs create -o compression=off -o exec=off -o setuid=off rpool/usr/ports/distfiles
# zfs create -o compression=off -o exec=off -o setuid=off rpool/usr/ports/packages
# zfs create -o compression=lz4 -o exec=off -o setuid=off rpool/usr/src

# zfs create -o mountpoint=/home rpool/home

# zfs create -o mountpoint=/var rpool/var
# zfs create -o compression=lz4 -o exec=off -o setuid=off rpool/var/crash
# zfs create -o compression=lz4 -o exec=off -o setuid=off rpool/var/log
# zfs create -o compression=lz4 -o atime=on rpool/var/mail
# zfs create -o compression=lz4 -o exec=on -o setuid=off rpool/var/tmp
# chmod 1777 /mnt/var/tmp

ブート設定

# zpool set bootfs=rpool/ROOT/default rpool

Swap作成

# zfs create -V 12G -o org.freebsd:swap=on -o checksum=off rpool/swap

4. インストールの続き

shellをexecで抜けてインストールの続きを実行.

5. インストール後の設定(1)

# echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
# echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
# cp /tmp/zpool.cache /mnt/boot/zfs/

6. インストール後の設定(2)

これだけだとなぜか起動せず.PMBRの1番目のパーティションにアクティブフラグがついていない.
fdisk -aを実行するため,一度インストーラを抜けてもう一度USBからブートし,Live CDを選択.

# 前回のときは起動した気がするんだけどなぁ.

# fdisk -a /dev/ada0

これでおしまい.

MyDNS更新用luaスクリプト

投稿日: Leave a comment

これまでFreeBSDのサーバーのcronで実行していたMyDNSのIPv4アドレス更新動作が途絶えていたので,RTX810のluaスクリプトに移植した.

動作は

  1. syslogからNetVolante DNSの更新を検出したらMyDNSにも更新に行く
  2. NetVolante DNSの更新が一定時間なくてもMyDNSに更新をする.

2の方は,一定時間更新がないとアカウントを消されてしまうので,そのための対処.基本的なアドレスの変更通知は1の方になる.

以下,そのスクリプト.

-- update_mydns.lua
-- polling Netvolante DNS update log with timeout

-- parameters for HTTP request
http_req = {
  url = "http://ipv4.mydns.jp/login.html",
  method = "GET",
  auth_type = "basic",
  auth_name = "mydnsxxxxxx",
  auth_pass = "xxxxxxxxxxx"
}

-- monitoring eventlog pattern
SYSLOG_PATTERN = "%[DDNS%] Update succeeded"
SYSLOG_NMATCH = 1
SYSLOG_TIME = 2 * 24 * 60 * 60

-- entry point (main)
while true do
  -- polling netvolante dns update log
  rtn, str = rt.syslogwatch(SYSLOG_PATTERN, SYSLOG_NMATCH, SYSLOG_TIME)

  -- http request for update IP address after:
  -- (1) netvolante dns update log detected
  -- (2) syslogwatch timer timed out
  rtn_http = rt.httprequest(http_req)
  rt.syslog("info", "[LUA][MyDNS] HTTP request for update IP address done")

  -- logging
  if rtn_http.code == 200 then
    if rtn > 0 and str then
      rt.syslog("info", "[LUA][MyDNS] Update succeeded (Netvolante DNS update detected)")
    else
      rt.syslog("info", "[LUA][MyDNS] Update succeeded (Force update)")
    end
  else
    rt.syslog("info", "[LUA][MyDNS] Update failed")
  end
end

これをsftpでRTX810に転送する.ユーザー権限だとファイルの書き込みができず少し悩んだが,通常のユーザー名を指定しつつも,ログインパスワードを管理者パスワードにすれば管理者権限付でログインできることが分かった.

時間間隔は以前と同様2日間隔とするが,cronと違って正確に2日間隔にはならない.が,サーバー側の負荷軽減を考えると少しずれてるくらいの方がいいと思うので,ここは特にこだわらないことにする.

このファイルを / 直下に置いて,実行してみる.

# lua /update_mydns.lua

これでPPPoEを切断してNetvolante DNSの更新をさせてみる.で,以下のようなログが記録された.

2014/01/17 12:10:42: PPPOE[01] PPPoE Connect
2014/01/17 12:10:43: PP[01] PPP/IPCP up  (Local: 125.30.x.x, Remote: x.x.x.x)
2014/01/17 12:10:43: [DDNS] netvolante-dns go PP[01] (auto)
2014/01/17 12:10:43: [DDNS] Update succeeded
2014/01/17 12:10:50: [LUA][MyDNS] HTTP request for update IP address done
2014/01/17 12:10:50: [LUA][MyDNS] Update succeeded (Netvolante DNS update detected)

あとは,起動時にスクリプトを実行するように設定して終わり.

schedule at 1 startup * lua /update_mydns.lua