Raspberry pi をちょっとしたサーバー(ntpdとかリゾルバとか)にしようと思って、FreeBSD 10-STABLE を自前ビルドして、ここ数日動かしてみた。
が、どうにも安定しない。sshdが突然signal 11で落ちる。これじゃ、使いものにならない。
SDカードが壊れてるのかなぁとも思ったけど、色々試す気力もなく、再びNetBSDに戻ってみることにする。
FreeBSD/armのビルドは追々まとめようと思う。
Raspberry pi をちょっとしたサーバー(ntpdとかリゾルバとか)にしようと思って、FreeBSD 10-STABLE を自前ビルドして、ここ数日動かしてみた。
が、どうにも安定しない。sshdが突然signal 11で落ちる。これじゃ、使いものにならない。
SDカードが壊れてるのかなぁとも思ったけど、色々試す気力もなく、再びNetBSDに戻ってみることにする。
FreeBSD/armのビルドは追々まとめようと思う。
ここのつづき.
rtcの設定を/etc/rc.localに書いてあったけど,起動時の処理が
と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のパッケージを削除してこんな感じにした.
あとはfirewallを入れれば,常時起動のサーバーとして使えそうなのでもう少し試験したら1台買い増そうかな.
家庭内LANのDHCPサーバー(IPv4)の設定を変更した.
DHCPサーバーはRTX810で動いているのでRTX810の設定.
これまでは,192.168.100.0/24 の範囲でMACアドレス指定で固定的に割り当てていたが,その範囲を有線・無線・機種等で分けて,ついでに,既知の端末と未知の端末(ゲスト)でサブネットを分けて,ゲスト用サブネットからLAN内の他のサブネットへの通信を遮断するようにした.
subnet-1 [192.168.100.0/24]:既知の端末用のネットワーク
subnet-2 [192.168.1.0/24]:ひかり電話ルーター配下のサブネット (SIP用)
subnet-3 [192.168.255.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使うしかないかな.
先日秋葉原で衝動買いした,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
このサイトを動かしているレンタルサーバーがリニューアルした.
容量UPとかいろいろうれしい変更があるけど,個人的に注目していたのはFreeBSD 9.1Rになるのと,IPv6対応.
早速,dmesgを見てみた.
(dmesgコマンド自体は封印されているけど,/var/run/dmesg.bootは見える)
UPSは電池の管理とか後々のメンテナンスが面倒なので導入をためらっていたけど,引っ越してきてからわりと頻繁に停電・瞬断が起きるので,やむなく購入した.
購入したのは,APCのBR400G-JPという製品.
USBをReadyNASにつないで,UPSとして認識するのを確認し,ACを引っこ抜いてバッテリー動作に切り替わったことを認識するのを確認した.
バックアップ電源が3系統あるので,NAS,フレッツ光ネクストのホームゲートウェイ,ルータ (RTX810)をつなぐことにした.NASは,シャットダウンの閾値を設定できて,とりあえずAUTOにしておいた.おそらく残量が少なくなったらシャットダウンが走ると思われる.
負荷電力が表示できて,上の3つをつないだ状態で30Wと表示された.これだと短時間の停電ならシャットダウンすることなく動作を維持できそう.
UPSは動作温度で寿命が結構変わってくるみたいだから要注意.
NASを導入した件を書くのを忘れていた.
結局,ここに書いた通り,
の構成で構築.
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
今のところ気づいて気になっているところ.
NASがhttpsをしゃべって,いわゆるオレオレ証明書でSSL証明書エラーが出てうっとうしいので,opensslで認証局(CA)を立てて,サーバー証明書をこのCAでサインしてあげた.
で,このCAの証明書をAndroidに入れようと思ったらすんなりといかなかったので備忘録.
このコマンドで,pkcs#12形式に変換したらうまくいった.
# openssl pkcs12 -export -in cacert.pem -inkey private/cakey.pem -out cacert.p12
これを端末に移したら登録できた.
年末にFreeBSD機が壊れてしまってさみしくなってしまったのでUbuntuを入れているPCにFreeBSDを入れた.
以前,9.1RC2をZFSに入れたけど,もう少し細かく設定したので手順を書き直し.
1GBのSDカードに10-Rの64ビット版 FreeBSD-10.0-RELEASE-amd64-memstick.img を書き込んでUSBブート.
普通にインストーラを使ってインストールを進めるが,途中のディスクの設定のところはZFSを選ばず,Shellを選ぶ.一度ZFSにしてみたが,パーティションの切り方に満足できなかったので,一度作ったZFSを参考に手動で作ることにした.
WD REDの1TB 1本のみ使う.ミラーにはしない.4kセクターなディスクなのでzfsパーティションを作るときにちょっと気を使ってあげる.swapはZFSのプール内に作る.
# 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
一旦,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
# 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
# zfs create -V 12G -o org.freebsd:swap=on -o checksum=off rpool/swap
shellをexecで抜けてインストールの続きを実行.
# echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf # echo 'zfs_load="YES"' >> /mnt/boot/loader.conf # cp /tmp/zpool.cache /mnt/boot/zfs/
これだけだとなぜか起動せず.PMBRの1番目のパーティションにアクティブフラグがついていない.
fdisk -aを実行するため,一度インストーラを抜けてもう一度USBからブートし,Live CDを選択.
# 前回のときは起動した気がするんだけどなぁ.
# fdisk -a /dev/ada0
これでおしまい.
これまでFreeBSDのサーバーのcronで実行していたMyDNSのIPv4アドレス更新動作が途絶えていたので,RTX810のluaスクリプトに移植した.
動作は
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