FreeBSD

Asus EeePC で自宅サーバ

これまでの総投資
Asus EeePC 4G-X 中古 2008/09/04 29,260
2GB DDR2-667 SO-DIMM
transcend JM667QSU-2G バルク
2008/09/07 3,880
16GB USB メモリ
A-DATA PD16-16GB
2008/09/07 4,980
合計 38,120

Asus の EeePC って、よく考えてみたら、 SS10 よりも速くて、ディスプレイもキーボードもマウスも UPS も付いてるマシンだ。 無線 LAN も付いてる。 しかもストレージは半導体。 これを自宅サーバにしない手はない。

FreeBSD の人々も色々と努力してるみたい。

でもみんな端末にする視点だなぁ。

上記サイトによると‥‥‥内蔵の Ethernet も無線 LAN もそのままでは動かないらしい。 でも動かす方法はもう有るようだ。

インストール

用意するもの

新宿の小田急別館のソフマップで中古の EeePC 4G-X を購入。 約 3 万円。 安くなったもんだなぁ、計算機‥‥‥

早速 FreeBSD をインストール。 手元にあった 6.0-RELEASE の CD で USB 接続の CD-ROM からブート‥‥何の問題もなくインストーラが起動。

Custom インストールを選択。 内蔵 SSD は ad2 になってる。 どうせサーバ用だから X なし、カーネルのソースのみのストイックな構成だ。 ディスクは 4G しか無いから、スワップ無し・すべて a パーティション

‥‥‥内蔵 SSD への書き込みのスピードがいつものハードディスクへの感じとなんか違う??? やや時間がかかる感じだ。

インストール終了。

次に、別マシンであらかじめ USB ハードディスク上に展開しておいた RELENG_7(2008/09/04 時点で 7.1-PRERELEASE)のソースツリーで make world。 何と 5 時間近くかかった。 630MHz 動作の Celeron-M だから仕方ないか‥‥‥

いつもの手順でシステムがすっかり RELENG_7 になったところで、内蔵 Ethernet や無線 LAN なんかを動かすために必要なものを入れる。 上記 http://wiki.freebsd.org/AsusEee で紹介されている

だ。 さっきと同様に別マシンで持ってきて USB ハードディスクに入れる。

カーネルを作り直したりモジュールを追加したりして再起動すると、どれもあっさり認識した。 ae が ethernet、無線 LAN は ath。

...
pci3: <ACPI PCI bus> on pcib2
ae0: <Attansic Technology Corp, L2 FastEthernet> mem 0xfbfc0000-0xfbffffff irq 17 at device 0.0 on pci3
ae0: pci device revision: 0xa0
ae0: chip id: 0x3
ae0: MSI count: 1.
ae0: Using MSI messages.
miibus0: <MII bus> on ae0
atphy0: <Atheros F2 10/100 PHY> PHY 0 on miibus0
atphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
ae0: Ethernet address: MAC-address
ae0: [FILTER]
pcib3: <ACPI PCI-PCI bridge> irq 18 at device 28.2 on pci0
pci1: <ACPI PCI bus> on pcib3
ath0: <Atheros 5424/2424> mem 0xfbef0000-0xfbefffff irq 18 at device 0.0 on pci1
ath0: [ITHREAD]
ath0: WARNING: using obsoleted if_watchdog interface
ath0: Ethernet address: MAC-address
ath0: mac 14.2 phy 7.0 radio 10.2
uhci0: <Intel 82801FB/FR/FW/FRW (ICH6) USB controller USB-A> port 0xe400-0xe41f irq 23 at device 29.0 on pci0
...
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
eeemon0: <Asus Eee PC Hardware Monitor> on isa0
Timecounter "TSC" frequency 632588549 Hz quality 800
...

なんか WARNING があるけど気にしないことにしよう。

acpi_asus.ko のロードも含めて /boot/loader.conf に以下のように書いた。

#
# loader.conf
#
acpi_asus_load="YES"
acpi_video_load="YES"
eeemon_load="YES"
i915_load="YES"
snd_hda_load="YES"
ichsmb_load="YES"
#
hw.pci.do_power_nodriver=1

マウントオプション

SSD は書き込みによって寿命が縮むって話を聞くので、soft-update にした上で noatime オプションを付けた。

/var/mail もこの中だからメールに関する finger(1) やらの出力がおかしくなるかもしれないけど、そこら辺には目をつぶろう。

#
# /etc/fstab
#
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad2s1a             /               ufs     rw,noatime      1       1
/dev/cd0                /cdrom          cd9660  ro,noauto       0       0

/tmp

noatime マウントオプション同様 SSD への書き込みを減らすために、/tmp をメモリファイルシステムにする。

/etc/rc.conf に以下を設定。

tmpmfs="YES"
tmpsize="256m"
tmpmfs_flags="-S -M -o async,noatime"

B フレッツのルータ化

以前他のマシンでもやっていたので ppp(8) を使う方法を採用。 まず /etc/ppp/ppp.conf に以下を設定。

default:
 set log Phase Chat LCP IPCP CCP tun command
 ident user-ppp VERSION (built COMPILATIONDATE)

asahi-net:
 set device PPPoE:ae0
 set MRU 1454
 set MTU 1454
 set authname my-auth-name
 set authkey my-auth-password
 enable lqr echo
 accept CHAP
 add default HISADDR

asahi-net は接続先がアサヒネットなので付けた名前。 別に何でもいい。

次に、ファイヤウォールのルールを /etc/firewall.conf に書く。

最後に /etc/rc.conf に以下の設定を加える。

ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="asahi-net"         # PPPoE->ae0. nat is also done by ppp(8).
firewall_enable="YES"
firewall_type="/etc/firewall.conf"
firewall_quiet="YES"
gateway_enable="YES"

EeePC を無線 LAN アクセスポイントに

無線 LAN のデバイスによってはできないものもあるみたいだけど、 ath(4) はアクセスポイントになれるらしい。

じゃあ EeePC を無線 LAN のアクセスポイントにしてみよう。 もしできれば、ルータ・アクセスポイント・外向けサーバを全部一台でできる‥‥‥ 5 万円以下で!

WEP のみだと危ないという話をちらほら見かけるので、とりあえず設定が簡単そうな WPA-PSK にしてみよう。

WEP の設定例は google で山ほど出てくるけど WPA の例はあんまり無い。 でも hostapd(8) を使えばいいらしいことはわかった。 念のために MAC アドレスのアクセス制限もしておこう。

試行錯誤の結果、以下のような /etc/hostapd.conf に落ち着いた。

#
# hostapd.conf
#
interface=ath0
debug=0
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
#
ssid=network-ssid
hw_mode=g
macaddr_acl=1   # MAC address-based ACL
accept_mac_file=/etc/hostapd.accept
auth_algs=3
wpa=1
wpa_key_mgmt=WPA-PSK
wpa_passphrase=pre-shared passphrase

network-ssidpre-shared passphrase は ASCII 文字列。

pre-shared key に ASCII 文字列ではなく 16 進の数値を使う場合は、 wpa_passphrase の代わりに wpa_psk を使う。 クライアント側で設定する wpa_supplicant.conf(5) とは書きかたが違うので注意。

また、これらが正しく動作するためには wlan_acl.ko と wlan_xauth.ko が必要なので、忘れずに /boot/loader.conf に以下を書き加えておく。

wlan_acl_load="YES"
wlan_xauth_load="YES"

しばらく使ってみた感じでは、buffalo の USB LAN アダプタ (LUA-U2-KTX) よりも快適。 このアダプタは axe(4) で認識するけど、実際に使ってみると何だか時々パケットがつまるような感じで息つぎする。 Windows だとそんなこと無いから、FreeBSD のデバイスドライバの問題なのかな。

で、無線 LAN のインターフェイスで DHCP サーバも動かすことにして、ports から isc-dhcp3-server-3.0.5_2 を入れて /usr/local/etc/dhcpd.conf を適宜用意し、/etc/rc.conf に以下を加えた。 内側 LAN は private IP だ。

ifconfig_ath0="inet private-ip-addr mediaopt hostap" # see also: hostapd.conf
hostapd_enable="YES"
dhcpd_enable="YES"

メインメモリ増設

増設というより、正確には取り替え。 標準で 512MB のメモリが付いていて、スロットが 1 つしかないので、より大きな容量の DDR2 SO-DIMM を買ってきて取り替えることになる。

スワップ無しで web サーバ・DNS サーバ・メールサーバを運用しつつ emacs なんかも使うかもしれないって考えると、ちょっと贅沢だけどやっぱりメモリは増やしておいた方が安心。

調べてみると、今や 2GB で 4,000 円前後‥‥‥ PC-9801VX に数 MB の RAM を増設するのに何万円も払った時代が懐かしいなぁ。

秋葉原のとある店でトランセンドの JM667QSU-2G というメモリのバルク品を 3,880 円で購入。 取り替えてみたら何の問題もなく認識した。

Copyright (c) 1992-2008 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 7.1-PRERELEASE #1: Thu Sep  4 23:52:22 JST 2008
    root@moon.infolab.ne.jp:/backup/obj/backup/src/sys/EEE
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Celeron(R) M processor          900MHz (632.59-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0x6d8  Stepping = 8
  Features=0xafe9fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,TM,PBE>
  AMD Features=0x100000<NX>
real memory  = 2138570752 (2039 MB)
avail memory = 2087587840 (1990 MB)
ACPI APIC Table: <A M I  OEMAPIC >
...

USB メモリ追加

ports ツリーとか考えると、やっぱり内蔵の 4GB SSD だけでは足りない。 足すとしたら、ハードディスクは電気食うし熱くなるからやっぱり半導体かなぁ‥‥‥

Web には EeePC に CompactFlash を増設する改造記事がけっこうあるけど、持ち歩かないんだしそこまでやるのは面倒。 それに大きな容量が必要なのは ports のソースの tar ファイルとか、/usr/src とか、アクセス頻度の低いデータだ。 だったら遅くてもビット単価が安いやつ‥‥ USB メモリとかでいいじゃん。

とりあえず、Windows Ready Boost 対応とうたってるのを買えば極端に遅くはなさそう。

結局、A-DATA の PD16 Sport シリーズの 16GB にした。 約 5,000 円。

性能は期待してなかったんだけど、試してみると結構速い。 メモリがふんだんにあるし soft-updates なので正確じゃないかもしれないけど、書き込みでだいたい 6MB/sec. くらいは出てる感じ。

128MB のシーケンシャル書き込み

moon# dd if=/dev/random of=testfile bs=1024k count=128
128+0 records in
128+0 records out
134217728 bytes transferred in 20.667710 secs (6494078 bytes/sec)
moon#

悪くないじゃん。

とりあえず、/usr/src, /usr/obj, /usr/ports をこっちに入れることにした。

moon# df
Filesystem  1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad2s1a   3783078  415238  3065194    12%    /
devfs               1       1        0   100%    /dev
devfs               1       1        0   100%    /var/named/dev
/dev/md0       253678      12   233372     0%    /tmp
/dev/da0s1a  15352832 1041588 13083018     7%    /usbflash
moon#

問題点

液晶が消灯しない

普段は画面を使わないつもりなので、液晶画面が OFF になってくれないかなと思って green_saver を設定したけど、画面が黒くなるだけで消灯はせず。

バックライトの寿命にものすごく影響しそうだけど、追求するの面倒なので輝度最小にして放置。

コンソールでビープ音が鳴らない

コンソールで ^G とか叩いても何の音も出ない。 でも snd_hda の初期化の時にはブチッって音がするからハードの故障ではなさそう。

これも、端末としては使わないから放置。

SSD に対して smartmontools が使えない

Asus のサイトなんかだと内蔵 SSD は S.M.A.R.T. に対応してることになってるけど、実際に smartctl(8) を使ってみると正しく動かない。

moon# smartctl -a /dev/ad2
smartctl version 5.38 [i386-portbld-freebsd7.1] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF INFORMATION SECTION ===
Device Model:     SILICONMOTION SM223AC
Serial Number:    45369759954326938408
Firmware Version: [No Information Found]
User Capacity:    4,001,292,288 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   4
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Mon Sep  8 02:00:12 2008 JST
SMART support is: Ambiguous - ATA IDENTIFY DEVICE words 85-87 don't show if SMART is enabled.
A mandatory SMART command failed: exiting. To continue, add one or more '-T permissive' options.
moon#

メッセージ通りに '-T permissive' オプションを使うと一応各パラメタは出るけど値が何だか変。 おまけに変なログが /var/log/messages に出る。

Sep  8 02:01:16 moon kernel: ad2: FAILURE - SMART status=51<READY,DSC,ERROR> error=4<ABORTED> LBA=12734209
Sep  8 02:01:16 moon kernel: ad2: FAILURE - SMART status=51<READY,DSC,ERROR> error=4<ABORTED> LBA=12734214

LBA= とかあるから、もう不良セクタができたのかと思って一瞬びっくり。 SSD のコントローラが S.M.A.R.T. を正しく実装していないみたい。

これはどうしようもないので、あきらめることにする。

起動時に繋がっているかどうかでデバイスの順番が変わる

内蔵 SDHC カードスロットは USB 接続のカードリーダとして認識される。 つまり da(4) に見える。

けど、USB に外部ストレージが繋がっているかどうかで /dev/dan の番号が変わってしまう。

SD メモリカードに書き込もうとすると止まる

上記 Wiki でも触れられているとおり、SDHC カードスロットに刺してあるカードに書き込もうとすると、結構高い確率で止まる。

Wiki には「BIOS 画面で OS Installation: start と設定すると問題が起きにくくなる」と書いてあるけど、こうすると ehci(4) が見えなくなって USB 1.1 のみになってしまうので、 SDHC カードリーダだけでなく USB に接続されるすべてのデバイスが遅くなってしまう。

結局、SDHC カードスロットは常用しないことにした。