はじめに

PC Engines 社製の WRAP( Wireless Router Application Platform ) に Bering-uClibc をインストールしルータを作ってみます。WRAP は WRAP.1D-1 (LAN X 2 miniPCI X 2 ) で Bering-uClibc は 2004 年 6 月にリリースされた 2.1.3 を使います。

WRAP に関しての情報はこちらかまたはこちらをご覧ください。

Bering-uClibc についてはこちらこちらをご覧ください。

wrap-router
ルータの構成は左図のようになります。ADSL モデムを介して pppoe で ISP に接続します。

wrap1s

WRAP シングルボードコンピュータ

wrap2-swrap3-s
左の写真は WRAP.1D-1 の全景です。
ブート用のコンパクトフラッシュスロット、miniPCIスロット、シリアルポート、LANポート、DC ジャックがみえます。

右は WRAP.1D-1 の CPU National Semiconductor Geode SC1100 266 MHz です。

wrap4-s wrap5-s wrap6-s
コンパクトフラッシュスロット シリアルポート と LANポート( eth1 ) LANポート( eth0 ) と DC ジャック
Bering-uClibc をコンパクトフラッシュにインストールします。 シリアルポートをクロス RS232C ケーブルで繋ぎ
リモートコンソールを実装します。
外部電源は、12V 1A スイッチング AC アダプタを利用します。

ホスト環境の準備

Bering-uClibc をコンパクトフラッシュにインストールしテストする環境を作ります。今回は Windows XP Professional (Service Pack 1) をホスト OS とします。

コンパクトフラッシュに書き込み読み込みを行なうためのコンパクトフラッシュアダプタをホストのIDEに接続します。PC Engines 社製の CFDISK.2E を今回利用しました。CFDISK.2E はホットスワップには対応していないので、CFDISK.2E にコンパクトフラッシュを着脱する場合、ホスト環境の電源を切っておく必要があります。

Windows XP 上、コンパクトフラッシュアダプタに装着されたコンパクトフラッシュは以下のようにリムーバブルディスクとして認識されます。

win-cf-e

この他にホスト環境には、zip 形式、tar.gz 形式を解凍する為のソフトが必要です。WinZip 9.0 がお勧めです。
Bering-uClibc には、Dropbear と言う SSH Server のパッケージがあります。これを使って WRAP と Windows をネットワークで接続する場合、Windows に Telnet/SSHクライアントが必要です。 Windows 上で動作する Telnet/SSH クライアント PuTTY が便利です。hdk 氏 が公開されている日本語に対応したPuTTYをここからダウンロードしておきます。PuTTY の公式ホームページには SCP client (コマンドラインベースのセキュア ファイルコピー ツール) があるのでこれもダウンロードページから落としておきます。

Bering-uClibc の インストール

Bering-uClibc 2.1.3 をここからダウンロードし、適当なフォルダに置きます。
ダウンロードするファイルは Bering-uClibc_2.1.3_img_bering-uclibc-1680.exe です。

extract-s
Bering-uClibc_2.1.3_img_bering-uclibc-1680.exe を実行すると左図 の WinImage Self Extractor が表示されます。File extraction をチェックし、伸張先フォルダを指定して OK ボタンを押し伸張します。

伸張先フォルダに展開された Bering-uClibc にはフロッピー起動用の initrd ( initrd.lrp ) が含まれています。このままでは起動時にIDEを認識できませんので、フロッピー起動用の initrd を IDE (HDD, CDROM) 起動用の initrd に差し替えます。

IDE 起動用の initrd は追加パッケージとして Bering-uClibc packages 2.x に initrd_ide_cd.lrp と言うファイルで用意されています。これを先ほどの伸張先フォルダにダウンロードし、フロッピー起動用の initrd.lrp を initrd_fd.lrp に、initrd_ide_cd.lrp を initrd.lrp にリネームします。

次に伸張先フォルダにある syslinux.cfg を以下の内容に書き換えます。1 行目とカーネルパラメータの console=ttyS0,38400 はリモードコンソールの設定です。WRAP の シリアルポートの baud rate は 38400 になっています。boot と PKGPATH のデバイスノードは最終的に /dev/hda1 に書き換えますが、今はホスト環境のコンパクトフラッシュアダプタのデバイスノードを指定してください。syst_size は root ramdisk のサイズを指定しています。ディフォルトでは 6M ですが 10M に増やしておきます。

serial 0 38400
display syslinux.dpy
timeout 0
< 以下のappendからPKGPATH=/dev/hdc1の行は1行です >
append console=ttyS0,38400 initrd=initrd.lrp syst_size=10M log_size=2M
  init=/linuxrc rw root=/dev/ram0 boot=/dev/hdc1:msdos PKGPATH=/dev/hdc1
default linux

伸張先フォルダにあるファイル( initrd_fd.lrp を除く )をすべてコンパクトフラッシュにコピーします。

Bering-uClibc を起動するブートローダは syslinux です。kernel.org から最新版の syslinux-2.10.zip をダウンロードし適当なフォルダに伸張します。コマンドプロンプトで伸張したフォルダに移動し、以下のようにしてコンパクトフラッシュにブートローダを書き込みます。拡張子なしで syslinux -s e: とキーインすると syslinux.com ( 16 ビット ) が起動するので注意してください。ブートローダを書き込むドライブはホスト環境によって変わるので適宜読み替えてください。

>cd "syslinux を伸張したフォルダ"
>syslinux.exe -s e:

以上でコンパクトフラッシュからブートできるようになりました。ホスト環境でブートしてみます。BIOS の First Boot Device を コンパクトフラッシュ ( HDD-1 ) にして再起動します。以下のようなメッセージが現れればインストールは成功しています。

..( 略 )
Loading linux...........
Loading initrd.lrp........
Ready.

LEAF Bering-uClibc V2.1.3 uClibc-0.9.20 firewall tty1
firewall login:

ここで root でログインします。この時、root のパスワードはありません。シリアルコンソールを有効にするように /etc/inittab を修正します。

wrap-sys1s

 

 

 

 

 

 

 

 

 

 

ログインすると LEAF Configuration menu が表示されます。
2 ) System configuration を選択します。ここで inittab を修正します。

wrap-sys2s

 

 

 

 

 

 

 

 

 

 

System configuration menu では 4) Lowest level boot-up configuration を選択します。

wrap-sys3s

 

 

 

 

 

 

 

 

 

 

inittab がエディターで開かれるので 51 行目と 52 行目をコメントアウトし、60 行目を左図のように書き換えます。修正が終わったら Ctrl キーと Q キーを同時に押し、Y キーを押すことで inittab を保存してからエディターが終了します。System configuration menu に戻り LEAF Configuration menu まで戻ります。

wrap-sys4s

 

 

 

 

 

 

 

 

 

 

/etc/inittab を修正したのでこれを etc.lrp に反映させます。LEAF Configuration menu の b) Back-up a package を選択し、Back-up menu の 4) etc で etc.lrp にバックアップします。

これでシリアルコンソールからのログインが可能になります。

Bering-uClibc の 調整

LEAF Guide Collection Bering-uClibc Bering-uClibc User’s Guide ( Chapter 14. LEAF for the pcengines WRAP ) で、LEAF Bering-uClibc を WRAP で使う場合の問題点(2点)が記されています。

  • Linux 起動時に キーボードコントローラが動かないと言うメッセージが多量に表示される。
  • shutdown コマンドの後、システムがハングする。

最初の問題点については、カーネルへのパッチがあるようですが cvs repository of Leaf Bering-uClibc にキーボードを使えなくした WRAP 用のカーネル linux-2.4.24-pcengines.upx があります。リーモートコンソールまたは SSH Client から WRAP に接続するわけなのでキーボード機能がなくても大丈夫です。linux-2.4.24-pcengines.upx を cvs からダウンロードし、コンパクトフラッシュの linux と言うファイルと入れ替えます。ホスト環境のコマンドプロンプトから以下のようにします。

>cd "linux-2.4.24-pcengines.upx をダウンロードしたフォルダ"
>copy linux-2.4.24-pcengines.upx e:linux

二つ目の問題点は、 Chapter 14. LEAF for the pcengines WRAP に記されているように SC1100 専用の Watchdog を使うことで解決するようです。SC1100 専用の Watchdog は wd1100.o で、これは http://prdownloads.sourceforge.net/leaf/ の Bering-uClibc_2.1.1_modules_2.4.24.tar.gz に含まれています。Bering-uClibc_2.1.1_modules_2.4.24.tar.gz をダウンロードし伸張すると kerneldriverschar に wd1100.o を見つけることができます。wd1100.o の WRAP 側への転送は、WRAP が Bering-uClibc で立ち上がりネットワーク接続が可能になった時点で SCP client でコピーすることにします。

Chapter 14. LEAF for the pcengines WRAP には書かれていませんが、WRAP ではシステム上の日付が 2000年 1月 1日 00:00:00 になってしまいます。 date コマンドで日付時間を設定しても WRAP の電源を切って再起動した時点で システム日付 は 2000年 1月 1日 00:00:00 に戻ってしまいます。Bering-uClibc のパッケージには ntp サーバにアクセスし時刻を同期させる ntpdate.lrp があるのでこれを追加します。Additional packages for Bering-uClibc 2.x から ntpdate.lrp をダウンロードしコンパクトフラッシュにコピーします。そして、同じくコンパクトフラッシュにある lrpkg.cfg と言うファイルを以下の内容に修正します。

root,config,etc,local,modules,iptables,ppp,pppoe,keyboard,shorwall,ulogd,dnscache,dropbear,ntpdate,weblet

syslinux.cfg もわすれずに以下のようにデバイスノードを /dev/hda1 に修正しておきます。

serial 0 38400
display syslinux.dpy
timeout 0
< 以下のappendからPKGPATH=/dev/hda1の行は1行です >
append console=ttyS0,38400 initrd=initrd.lrp syst_size=10M log_size=2M
         init=/linuxrc rw root=/dev/ram0 boot=/dev/hda1:msdos PKGPATH=/dev/hda1
default linux

以上で コンパクトフラッシュから Bering-uClibc を WRAP で起動させる調整が終わりました。

WRAP をエンクロージャー (ケース)に収める

wrap-serial-s
WRAP.1D-1 を専用のエンクロージャーに入れる場合、シリアルポートのカバーを外しておきます。こうしないとエンクロージャーに収まりません。

 

 

 

 

 

 

wrap-cf-s
ホスト環境からコンパクトフラッシュを抜き、WRAP のスロットに挿入します。
WRAP をエンクロージャーに収め、シリアルポートのカバーを取り付けます。

 

 

 

 

 

 

 

wrap-enc1-swrap-enc2-s

 

エンクロージャーのカバーを取り付けた様子。

 

 

 

 

enc1-senc1-s

WRAP を起動する

WRAP を起動する前に、WRAP のシリアルポートとホスト環境のシリアルポートをクロス・シリアルケーブルで繋ぎます。ホスト環境 (Windows XP) で[プログラム]→[アクセサリ]→[通信]からハイパーターミナルを立ち上げておきます。以下がハイパーターミナルの設定です。

 

 

hypert1 hypert2 hypert3
接続の設定 接続の設定 接続方法 シリアルポートのプロパティ
適当な名前を入力します。 接続方法には、クロス・シリアルケーブルを繋いだ
シリアルポートを指定します。
シリアルポートの速度は 38400 にします。

 

 

ハイパーターミナルの設定が済んだら、WRAP に電源を投入します。メモリチェックの後、以下のように LEAF Bering-uClibc が立ち上げリます。

hyt-bering

ハイパーターミナルの[ファイル]→[プロパティ]の設定タブで、エミュレーションを VT100 にしておきます。

hyt-prop

LEAF Bering-uClibc の設定

ハイパーターミナルから root でログインします。(まだパスワードはありません) 以下の LEAF Configuration menu が立ち上がります。

bering-conf1s

 

 

 

 

 

 

 

 

 

 

 

 

この LEAF Configuration menu の Network configuration、System configuration、Packages configuration で設定を行います。

  • Network configuration
      LEAF Bering-uClibc のネットワーク設定を行ないます。
  • System configuration
      LEAF Bering-uClibc のシステム設定。既に Lowest level boot-up configuration を行なっています。
  • Packages configuration
      LEAF Bering-uClibc の各々のパッケージの設定を行ないます。

ここで忘れてはならないのは、設定を変更したら必ず b) Back-up a package でパッケージの保存を行なうことです。b) Back-up a package では Network configuration、System configuration を変更したらパッケージ etc.lrp を保存し、Packages configuration で設定変更した各々のパッケージを保存します。

それから、root のパスワードも設定しておきましょう。LEAF Configuration menu で q キーを押せばコマンドプロンプトになるので、passwd でパスワードを設定しておきます。LEAF Configuration menu に戻るには、コマンドプロンプトで lrcfg と入力します。

以下では、最低限の設定例を示します。

System configuration menu

  • System wide profile (任意)
      # /etc/profile: system-wide .profile file for sh.
      
      PATH="/usr/local/bin:/usr/bin:/bin"
      LD_LIBRARY_PATH="/usr/local/lib:/usr/lib:/lib"
      
      HOSTNAME="$(hostname)"
      
      #Set the prompt
      PS1="$HOSTNAME$ " 
      
      #Set the desired editor (e3ne, e3em, e3pi, e3vi, e3ws)
      #EDITOR=e3ne
      EDITOR=e3vi <-- 好みのエディタに変更する。
  • Local timezone TZ setup (任意)
      JST-9 <-- ローカルタイムゾーンを日本にする。

Network configuration menu

  • interfaces file
      Step 1 Option 1.3: PPP/PPPOE (modem connected to eth0) を有効にする。 

      # /etc/network/interfaces -- configuration file for LEAF network
      #
      # Loopback interface.
      auto lo
      iface lo inet loopback
      
      # Step 1: configure external interface
      #         uncomment/adjust one of the following 4 options
      # Option 1.1 (default): eth0 / dynamic IP from pump/dhclient
      #auto eth0
      #iface eth0 inet dhcp
      #iface eth0 inet static
      #
      # Option 1.2: eth0 / Fixed IP (assumed to be 1.2.3.4).
      # 		(broadcast/gateway optional)
      #auto eth0
      #iface eth0 inet static
      #	address 1.2.3.4
      #	netmask 255.255.255.0
      #	broadcast 1.2.3.255
      #	gateway 1.2.3.1
      #
      # Option 1.3: PPP/PPPOE (modem connected to eth0)
      auto ppp0
      iface ppp0 inet ppp
      	pre-up ip link set eth0 up
      	provider dsl-provider eth0
      #
      # Option 1.4: PPP modem
      #auto ppp0
      #iface ppp0 inet ppp
      #	provider provider
      
      # Step 2: configure  internal interface
      # Default: eth1 / fixed IP = 192.168.1.254
      auto eth1
      iface eth1 inet static
      	address 192.168.1.254
      	netmask 255.255.255.0
      	broadcast 192.168.1.255
      
      ... (略)
  • network options file
      ip_forward=yes
      ipv6_forward=no
      spoofprotect=yes
      syncookies=yes
  • resolv.conf
      ISP のネームサーバに変更する。以下はディフォルト。 

      nameserver 127.0.0.1
      nameserver 192.168.1.254
  • networks
      localnet	192.168.1.0

Packages configuration

  • modules
      # Some modules need this, like 8139, natsemi, 8139too
      crc32 <-- natsemi に必要。
      
      # ISA ethernet cards
      #3c509
      #eepro io=0x300
      
      # 8390 based ethernet cards
      #8390
      #ne2k-pci
      #      card1,card2
      #ne io=0x300,0x350
      
      # Those realtek based NICs need mii module
      mii <-- natsemi に必要。
      #8139cp
      #8139too
      #eepro100
      #epic100
      #pcnet32
      #viarhine
      #winbond-840 
      
      # PCI ethernet cards
      #3c59x
      natsemi <-- WRAP のネットワークインターフェイス。
      #tulip
      
      # Modules needed for PPP connection
      #slhc
      #ppp_generic
      #ppp_async
      # The three following modules are not always needed
      #zlib_inflate
      #zlib_deflate
      #ppp_deflate
      
      # Modules needed for PPP/PPPOE connection
      slhc <-- 以下は ppp/pppoe 接続に必要。
      n_hdlc
      ppp_generic
      ppp_synctty
      pppox
      pppoe
      
      # Modules needed for PPTP connection
      #slhc
      #ppp_generic
      #ppp_async
      #ppp_mppe 
      
      # Modules needed for ISDN
      # Look for type, io and irq settings at help page of isdn.lrp documentation
      #slhc
      #isdn
      #hisax type= io= irq=
      
      # Masquerading 'helper' modules
      # Other modules available in kernel/net/ipv4/netfilter
      ip_conntrack_ftp
      ip_conntrack_irc
      ip_nat_ftp
      ip_nat_irc
      
      # Watchdog support, always choose one
      # standard software watchdog
      softdog
      # .. or ..
      # wd1100 module available in kernel/drivers/char
      #wd1100 <-- wd1100 を準備してから有効にする。
      
      ... (略)
  • dropbear
      コマンドラインから gendropbearkeys を実行し キーの生成を行ないます。
    gendropbearkeys
      この後、LEAF Configuration menu の b) Back-up a package で modules と dropbear を保存してから
      WRAP の電源を OFF/ON して再起動させます。
  • ネットワーク設定の確認と wd1100.o の転送
      ホスト環境で PuTTY を立ち上げ下図のように入力し、保存ボタンを押してから開くボタンを押します。
      putty1
      PuTTY から Security Alert が表示されるので OK ボタンを押します。これで Telnet/SSH クライアント からの接続ができました。
      putty2 

      次にホスト環境から wd1100.o を WRAP に転送します。ホスト環境のコマンドプロンプトから以下のコマンドを実行します。

       >pscp wd1100.o root@192.168.1.254:/lib/modules

      パスワードを聞いてくるので、root のパスワードを入力します。wd1100.o は /lib/modules にコピーされます。次に ハイパーターミナルで lrcfg を立ち上げ、Packages configuration の modules を以下のように修正し、b) Back-up a package で modules を保存します。

      ... (略)
      
      # Watchdog support, always choose one
      # standard software watchdog
      #softdog
      # .. or ..
      # wd1100 module available in kernel/drivers/char
      wd1100 gcb=0x9000
      
      ... (略)
  • ppp (pap secret)
      ISP のユーザ ID とパスワードをダブルコーテーションで囲んで記述する。 

      # This is a pap-secrets file
      #
      #papname * papsecret
      "ISP のユーザ ID" * "パスワード"
  • pppoe (DSL pppd options)
      ISP のユーザ ID をダブルコーテーションで囲んで記述する。 

      # Configuration file for PPP, using PPP over Ethernet
      # to connect to a DSL provider.
      #
      plugin /usr/lib/pppd/rp-pppoe.so
      
      # MUST CHANGE: Uncomment the following line, replacing the user@provider.net
      # by the DSL user name given to your by your DSL provider.
      # (There should be a matching entry in /etc/ppp/pap-secrets with the password.)
      name "ISP のユーザ ID"
      
      ... (略)
  • shorwall
    • Zones
        #ZONE	DISPLAY		COMMENTS
        net	Net		Internet
        loc	Local		Local networks
        #LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
    • Ifaces
        #ZONE	 INTERFACE	BROADCAST	OPTIONS
        net     ppp0            -              routefilter,norfc1918
        loc     eth1            detect
        #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
    • Policy
        #SOURCE		DEST		POLICY		LOG		LIMIT:BURST
        #						LEVEL
        loc		net		ACCEPT
        net		all		DROP		ULOG
        # If you want open access to the Internet from your Firewall
        # remove the comment from the following line.
        fw             net             ACCEPT
        
        #
        # THE FOLLOWING POLICY MUST BE LAST
        #
        all		all		REJECT		ULOG
        #LAST LINE -- DO NOT REMOVE
    • Rules
        #ACTION  SOURCE		DEST      	PROTO	DEST    SOURCE	   ORIGINAL	RATE		USER
        #                       	        	PORT    PORT(S)    DEST		LIMIT
        #      Accept DNS connections from the firewall to the network
        #
        ACCEPT          fw              net             tcp     53
        ACCEPT          fw              net             udp     53
        #       Accept SSH connections from the local network for administration
        #
        ACCEPT          loc             fw              tcp     22
        #       Allow Ping To And From Firewall
        #
        ACCEPT          loc             fw              icmp    8
        #ACCEPT          net             fw              icmp    8
        ACCEPT          fw              loc             icmp    8
        ACCEPT          fw              net             icmp    8
        #
        # Bering specific rules:
        # allow loc to fw udp/53 for dnscache to work
        # allow loc to fw tcp/80 for weblet to work
        #
        ACCEPT          loc       fw            udp     53
        ACCEPT          loc       fw            tcp     80
        #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
    • Masq
        #INTERFACE	        SUBNET		ADDRESS
        ppp0                    eth1
        #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
    • Config
        #
        # MSS CLAMPING
        #
        # Set this variable to "Yes" or "yes" if you want the TCP "Clamp MSS to PMTU"
        # option. This option is most commonly required when your internet
        # interface is some variant of PPP (PPTP or PPPoE). Your kernel must
        # have CONFIG_IP_NF_TARGET_TCPMSS set.
        #
        # [From the kernel help:
        #
        #    This option adds a `TCPMSS' target, which allows you to alter the
        #    MSS value of TCP SYN packets, to control the maximum size for that
        #    connection (usually limiting it to your outgoing interface's MTU
        #    minus 40).
        #
        #    This is used to overcome criminally braindead ISPs or servers which
        #    block ICMP Fragmentation Needed packets.  The symptoms of this
        #    problem are that everything works fine from your Linux
        #    firewall/router, but machines behind it can never exchange large
        #    packets:
        #        1) Web browsers connect, then hang with no data received.
        #	 2) Small mail works fine, but large emails hang.
        #	 3) ssh works fine, but scp hangs after initial handshaking.
        # ]
        #
        # If left blank, or set to "No" or "no", the option is not enabled.
        #
        CLAMPMSS=Yes
  • weblet (shell-script web server configuration)
      # Who are we - used for CGI scripts
      #SERVER_NAME=192.168.1.254
      SERVER_ADDR=192.168.1.254
      SERVER_PORT=80
      
      # Who can access the server?
      #CLIENT_ADDRS="192.168.1."
  • ntpdate (ntp servers definition list)
      # Defines below the relevant time server(s) list for your area
      # See http://www.eecis.udel.edu/~mills/ntp/servers.htm
      # Uncomment and save ntpdate.lrp !
      #
      NTPSERVERS="clock.nc.fukuoka-u.ac.jp" <-- ntp サーバの URL を記述する。

以上で LEAF Bering-uClibc の設定は完了です。

最後に

PC Engines 社製の WRAP.1D-1 は、サイズが 15.24cm (6″) X 15.24cm (6″) と Mini-ITX よりひと回り小さく、低消費電力プロセッサ である Geode SC1100 266 MHz を搭載しており、完全ファンレスで動作可能です。 LM77 サーマルモニタも搭載されていて、lm_sensors で温度監視もできそうです。

ネットワーク機器用に最適化されたシングル・ボード・コンピュータ ですが、工夫によってはいろいろな用途に使える ボードではないでしょうか。

参考 URL