2011年4月30日土曜日

freeradius rlm_pap on debian squeeze

HTML がわかっていず面倒なので <pre> と FireFox extension の It's All Text!
emacsclient & auto-fill-mode & set-fill-column 72 あたりで (C-x f)

0. インストールの前に
   直に /etc/passwd を触らせるのではなく PAM 経由。一応インストール前の
   状態を確認

       # cd /etc
       # ls -l passwd group shadow gshadow
       -rw-r--r-- 1 root root    820 Apr 30 14:03 group
       -rw-r----- 1 root shadow  679 Apr 30 14:03 gshadow
       -rw-r--r-- 1 root root   1584 Apr 30 14:03 passwd
       -rw-r----- 1 root shadow 1348 Apr 30 14:03 shadow
       # grep freerad passwd group shadow gshadowN
       # ls -l /etc/pam.d/radiusd
       ls: cannot access /etc/pam.d/radiusd: No such file or directory


1. インストール
   そのまま

       # aptitude install freeradius

   何も問われず。で、何されたか? を確認

       # ls -l passwd group shadow gshadow
       -rw-r--r-- 1 root root    849 Apr 30 15:26 group
       -rw-r----- 1 root shadow  705 Apr 30 15:26 gshadow
       -rw-r--r-- 1 root root   1630 Apr 30 15:26 passwd
       -rw-r----- 1 root shadow 1377 Apr 30 15:26 shadow
       # grep freerad passwd group shadow gshadow
       passwd:freerad:x:114:120::/etc/freeradius:/bin/false
       group:shadow:x:42:freerad
       group:ssl-cert:x:111:freerad
       group:freerad:x:120:
       shadow:freerad:*:15094:0:99999:7:::
       gshadow:shadow:*::freerad
       gshadow:ssl-cert:!::freerad
       gshadow:freerad:!::
       # ls -l /etc/pam.d/radiusd
       -rw-r--r-- 1 root root 227 Sep 28  2010 /etc/pam.d/radiusd

   グループ shadow に freerad が加えられた。イコール freerad ユーザアカ
   ウントで /etc/shadow を読むことができる。/etc/pam.d/radiusd の中身は、
   うん。特に...


3. 設定ファイル変更
   How do I use PAM with FreeRADIUS?rlm_pam の説明眺めながらファイル
三つ更新。どこかで見付けたパスワード生成ワンライナー

       # cat /dev/urandom | tr -dc '0-9A-Za-z' | fold -b16 | head -n1
       ZkPbwZ17bCDEx7Kx

   を多用しつつ。余裕があるなら? もちろん /dev/random の方が良いらしい

   
  • /etc/freeradius/users
  • # diff -uw users.dpkg-dist users --- users.dpkg-dist 2011-04-30 15:59:45.000000000 +0900 +++ users 2011-04-30 15:41:02.000000000 +0900 @@ -163,6 +163,8 @@ # Service-Type = Framed-User, # Fall-Through = Yes +DEFAULT Auth-Type = Pam + # # Default for PPP: dynamic IP address, PPP mode, VJ-compression. # NOTE: we do not use Hint = "PPP", since PPP might also be auto-detected #
  • /etc/freeradius/clients.conf
  • # diff -uw clients.conf.dpkg-dist clients.conf --- clients.conf.dpkg-dist 2011-04-30 16:03:19.000000000 +0900 +++ clients.conf 2011-04-30 15:40:26.000000000 +0900 @@ -98,7 +98,7 @@ # The default secret below is only for testing, and should # not be used in any real environment. # - secret = testing123 + secret = ZkPbwZ17bCDEx7Kx # # Old-style clients do not send a Message-Authenticator @@ -232,3 +232,14 @@ # secret = testing123 # } #} + +client 172.27.0.0/17 { + shortname = primary_site + secret = jf5O7D0FD2v4KJqH +} + +client 172.27.129.0/17 { + shortname = secondary_site + secret = wvlo17pzXHzOnLfL +} +
  • /etc/freeradius/sites-enabled/default
  • # diff -uw sites-enabled/default.dpkg-dist sites-enabled/default --- sites-enabled/default.dpkg-dist 2011-04-30 16:00:37.000000000 +0900 +++ sites-enabled/default 2011-04-30 16:00:42.000000000 +0900 @@ -263,7 +263,7 @@ # # Pluggable Authentication Modules. -# pam + pam # # See 'man getpwent' for information on how the 'unix' # 3. 再起動 # /etc/init.d/freeradius restart 4. テスト # radtest chamaken 'bl0gSP010' localhost 10 ZkPbwZ17bCDEx7Kx Sending Access-Request of id 65 to 127.0.0.1 port 1812 User-Name = "chamaken" User-Password = "bl0gSP010" NAS-IP-Address = 127.0.1.1 NAS-Port = 10 rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=65, length=20 # radtest chamaken 'invalid_passwd' localhost 10 ZkPbwZ17bCDEx7Kx Sending Access-Request of id 32 to 127.0.0.1 port 1812 User-Name = "chamaken" User-Password = "invalid_passwd" NAS-IP-Address = 127.0.1.1 NAS-Port = 10 rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=32, length=20 5. その他 freeradius とは /etc/init.d/freeradius stop した後に # freeradius -X で戦うべし。/etc/freeradius/users の DEFAULT Auth-Type = Pam の位置に気をつけて。PPP の前、先頭行でも良いくらい

    2011年4月26日火曜日

    TIPS: KVM (qemu) for debian squeeze - その 1

    小さいネタをいくつか。
    netboot
    qemu pxe をキーワードに Google 先生に尋ねたところ最初のページ日本語の
    最初のページ
    眺めると ROM-o-matic.net でブートイメージ作って。とあったの
    で早速。 1.0.1 の Image Generator で NIC type の選択に virtio-net なんて
    あったものだから、おぉと選択。フロッピーはないでしょ。もしかしたら今後
    使うカモとか思いつつ output format に USB Keychain disk image を選んで
    あとはシリアルコンソールとか。さて kvm を起動しようと、マニュアルでブー
    トデバイスの指 定を眺めると...
    -boot [order=drives][,once=drives][,menu=on|off]
    Specify boot order drives as a string of drive letters.
    Valid drive letters depend on the target achitecture. The x86 PC uses:
    a, b (floppy 1 and 2), c (first hard disk),d(first CD-ROM),
    n-p (Etherboot from network adapter 1-4),
    hard disk boot is the default.
    To apply a particular boot order only on the first startup, specify it via once.
    へっ? とお試し。

    1. tftpd のインストールと netboot イメージ
      # aptitude install tftpd-hpa
      (TFTP root directory: /srv/tftp)
      # cd /srv/tftp
      # wget http://ftp.jp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz
      # tar xzf netboot.tar.gz
      # ls -1
      debian-installer
      netboot.tar.gz
      pxelinux.0
      pxelinux.cfg
      version.info
    2. dhcpd.conf の編集
      filename に /pxelinux.0。next-server に tftpd サーバのアドレス
      subnet 172.27.201.0 netmask 255.255.255.0 {
          option routers 172.27.201.1;
          option broadcast-address 172.27.201.255;
      
          pool {
              # ignore unknown-clients;
              # deny dynamic bootp clients;
              failover peer "poolish";
              option domain-name-servers 172.27.129.1, 172.27.1.1;
              option domain-name "siesta.or.jp";
      
              filename "pxelinux.0";
              next-server 172.27.129.1;
      
              range 172.27.201.65 172.27.201.190;
          }
      }
      こんな感じ。
    3. サーバ群再起動 & kvm 起動
      # /etc/init.d/tftpd-hpa restart
      # /etc/init.d/isc-dhcp-server restart
      # cd ほにゃほにゃ
      # kvm-img create netboot.img 8G
      # kvm -net tap -net nic,model=virtio -boot n -curses netboot.img
    で例のまっ黒画面に 640x480 表示されるので、目を閉じてスペース & linux text

    ルーティング
    むやみやたらに kvm-qemu や lxc でゲスト作りまくっているとワケワカになって
    えーいままよ。と大元のホスト筆頭に
    iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    ってやっちゃったりしない? うーん、それもどうかと思うけど、コレもどうかと。
    でコレは OSPFv2 / IPv4 適当に動かしちゃう。

    1. quagga のインストール
      # aptitude install quagga
    2. /etc/quagga/daemonsの編集
      コメント除けば
      zebra=yes
      bgpd=no
      ospfd=2
      ospf6d=no
      ripd=no
      ripngd=no
      isisd=no
    3. /etc/quagga/zebra.conf/etc/quagga/ospfd.conf
      • zebra.conf
      • hostname zebra@<適当なホスト名>
        password zebra
        enable password zebra
        log file /var/log/quagga/zebra.log
        !service password-encryption
        !
        ip forwarding
        ipv6 forwarding
        !
        line vty
      • ospfd.conf
      • こんなんでも動いているらしい
        hostname ospfd@<適当なホスト名>
        password zebra
        enable password zebra
        log file /var/log/quagga/ospfd.log
        !service password-encryption
        !
        router ospf
         ospf router-id <(自分の主たる) IP アドレス - 例えば 192.168.10.1 とか>
         redistribute kernel
         redistribute static
         redistribute connected
         network 0.0.0.0/0 area 0.0.0.0
        !
        line vty
    4. パーミッション
      ちょっとウルサイらしく debian.confdaemons の他は

      quagga 所有で 0640
      # cd /etc/quagga
      # chown quagga.quagga zebra.conf ospfd.conf
      # chmod 0640 *.conf
    5. 再起動と確認
      # /etc/init.d/quagga restart
      # # (しばらく待って...)
      # ip route ls
      10.6.36.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.202.0/24 dev br2  proto kernel  scope link  src 172.27.202.1 
      172.27.129.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.68.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 30 
      172.27.193.0/24 dev wlan0  proto kernel  scope link  src 172.27.193.17 
      172.27.201.0/24 dev br1  proto kernel  scope link  src 172.27.201.1 
      192.168.27.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.1.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 30 
      111.22.3.0/22 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      default via 172.27.193.1 dev wlan0 
      この proto zebra が quagga 経由。あるいは (なっがいけど)
      # telnet localhost ospfd
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      
      Hello, this is Quagga (version 0.99.17).
      Copyright 1996-2005 Kunihiro Ishiguro, et al.
      
      
      User Access Verification
      
      Password: 
      ospfd@myhost> show ip ospf route
      ============ OSPF network routing table ============
      N    10.6.36.0/24          [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    172.27.129.0/24       [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    172.27.193.0/24       [10] area: 0.0.0.0
                                 directly attached to wlan0
      N    172.27.201.0/24       [10] area: 0.0.0.0
                                 directly attached to br1
      N    172.27.202.0/24       [10] area: 0.0.0.0
                                 directly attached to br2
      N    192.168.27.0/24       [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    111.22.3.0/22         [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      
      ============ OSPF router routing table =============
      R    172.27.129.1          [10] area: 0.0.0.0, ASBR
                                 via 172.27.193.1, wlan0
      
      ============ OSPF external routing table ===========
      N E1 172.27.1.0/24         [40] tag: 0
                                 via 172.27.193.1, wlan0
      N E1 172.27.68.0/24        [40] tag: 0
                                 via 172.27.193.1, wlan0
      ospfd@myhost> exit
      Connection closed by foreign host.
      とか
    いくつか。なんて最初に書いたけど遅くなっちゃったので、ここまで...

    2011年4月23日土曜日

    オレオレ証明書の証明書更新

    完全なる備忘録。プロバイダから付与された IP アドレス間でトランスペアレントモード
    IPSec するにあたって racoon を certificate_type x509 で動かしているんだけど、この
    証明書の更新、および更新方法を都度忘れて調べ直すので、ここにメモ。CRL のハッシュ
    がわからず「証明書を取り扱う」を多々参考にさせてもらいました。ありがとうございます
    CSR の作成
    openssl req -new -keyout server_key.pem -out server_csr.pem -nodes

    オレオレ CA で sigh
    openssl ca -config /etc/ssl/openssl.cnf -in server_csr.pem -out server_cert.pem

    CRL の発行
    openssl ca -config /etc/ssl/openssl.cnf -gencrl -out crl.pem

    証明書のハッシュ
    ln -s server_cert.pem `openssl x509 -in server_cert.pem -noout -hash`.0

    CRL のハッシュ
    ln -s crl.pem `openssl crl -in crl.pem -noout -hash`.r0

    おまけ。確認方法とか
    テキスト出力
    openssl x509 -in csr.pem -text

    verify
    openssl verify -CAfile ca.pem csr.pem

    nodes 付け忘れ
    openssl rsa -in server_key.pem -out server_nodes_key.pem

    port mirror on linux

    だいぶ以前にここに書いたと思ったら、書いていなかった... のでメモ。
    実際に使える例ではないけれど、例えば wlan0 を dummy 0 にミラーするのであれば
    root になって長いコマンド。wlan0 からの出ていく方は
    # tc qdisc add dev wlan0 root handle 10: prio
    # tc filter add dev wlan0 parent 10: prio 10 \
    > protocol all u32 match u32 0 0 flowid 10:1 \
    > action mirred egress mirror dev dummy0
    disc prio を wlan0 の最初 (root) として 10 という ID 割り当て。
    その 10 を親として 10番という順番で u32 すべてマッチのフィルタを追加。
    結果は 10:1 に流すけど 10:1 という qdisc はないのでデフォルト何もせず。
    アクションとして dummy0 にミラーを送出。確認は
    # tc qdisc ls dev wlan0
    qdisc prio 10: root refcnt 5 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    # tc filter ls dev wlan0 handle 10:
    filter parent 10: protocol all pref 10 u32 
    filter parent 10: protocol all pref 10 u32 fh 800: ht divisor 1 
    filter parent 10: protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 10:1 
      match 00000000/00000000 at 0
     action order 1: mirred (Egress Mirror to device dummy0) pipe
      index 1 ref 1 bind 1
    wlan0 に入ってくる方は
    # tc qdisc add dev wlan0 ingress
    # tc filter add dev wlan0 parent ffff: prio 10 \
    > protocol all u32 match u32 0 0 flowid ffff:1 \
    > action mirred egress mirror dev dummy0
    こちら ingress は ID が ffff と決まっている他は、入ってくる方と同じ。確認は
    # tc qdisc ls dev wlan0 ingress
    qdisc prio 10: root refcnt 5 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ---------------- 
    # tc filter ls dev wlan0 handle ffff:
    filter protocol all pref 10 u32 
    filter protocol all pref 10 u32 fh 800: ht divisor 1 
    filter protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid ffff:1 
      match 00000000/00000000 at 0
     action order 1: mirred (Egress Mirror to device dummy0) pipe
      index 2 ref 1 bind 1
    これで wlan0 を promisc モードにして dummy0 で tcpdump
    #  ip link set wlan0 promisc on
    # tcpdump -nevxi dummy0
    とか。ドキュメントとして iproute-doc にも含まれていないのでソースを
    apt-get source iproute
    とか
    git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git
    とかで持ってきた $SRC/doc/actions/mirred-usage を参照。iproute 全般はで、以下その mirred-usage の抜粋意訳、中途訳


    普通のイーサネットスイッチでのミラーやリダイレクトの違いは u32 フィ
    ルタ (classifier) でミラーするフローを選択できること。
    
    mirred アクションの使い方:
        mirred <DIRECTION> <ACTION> [index INDEX] <dev DEVICENAME>
            DIRECTION := ingreee か egress
            ACTION    := mirror か redirect
            INDEX は特定のポリシ ID
            DEVICENAME はデバイス名
    
    ACTION - mirror はコピーを指定されたデバイスに送る
    ACTION - redirect はパケットを横取りして指定されたデバイスに送る
             (なのでローカルプロセスには渡らない)
    
    * 禁止事項
      A. ループさせない 
          eth0 を eth1 にリダイレクト。更に eth1 を eth0 にリダイレクトなど
      B. IFB デバイスから別の IFB デバイスにリダイレクトしない
          ホストはクラッシュしないけどパケット全てが drop される
    
      A は再帰によるデバイスキューのロック輻輳。
      B は送信ロック (の輻輳?)
    
    
    ---- サンプル
    
    1. eth0 に入ってくるパケットを eth1 にミラー
    
           # tc qdisc add dev eth0 ingress
           # tc filter add dev eth0 parent ffff: protocol ip prio 10 u32 \
           >    match u32 0 0 flowid 1:2 action mirred egress mirror dev eth1
    
       mirror を redirect に変えるとコピーせずオリジナルパケットを eth1
       に送出する
    
    
    2. lo から eth0 に横取り
       lo の ingress に届く全てのパケットを eth0 にリダイレクト
    
           # tc qdisc add dev lo ingress
           # tc filter add dev lo parent ffff: protocol ip prio 10 u32 \
           >    match u32 0 0 flowid 1:2 action mirred egress redirect dev eth0
    
       この設定をしたホストで ping -c 127.0.0.1 としても失敗する。
       eth0 の先に接続したホストで tcpdump してみると...
       XXX
       このフィルタ内 redirect を mirror に置き換えて
    
           # tc filter add dev lo parent ffff: protocol ip u32 \
           >    match u32 0 0 flowid 1:2 action mirred egress mirror dev eth0
    
       とすると tc 設定をしたホストと、この eth0 の先にある両方のホスト
       で、パケットを見ることができる。つまりは ping が成功する
    
    
    3. もうちょっとイカしたサンプル
       lo の ingress にて 10個の内 1個のパケットがランダムに別ホストへ
       --- eth0 へ --- 送る (ランダムは netrand generator を使う)
       XXX: action drop --- 少し違う気がする...
    
           # tc filter add dev lo parent ffff: protocol ip prio 10 u32 \
           >    match u32 0 0 flowid 1:2 \
           >    action drop random determ ok 10
           >    action mirred egress mirror dev eth0
    
    
    4. 10.0.0.9 から来て eth0 に出ていくパケット
       (ローカルの IP か forwarding するか)
       が 100Kbps を超えると eth1 にリダイレクト
    
           # tc qdisc add dev eth0 handle 1:0 root prio
           # tc filter add dev eth0 parent 1:0 protocol ip prio 6 u32 \
           >    match ip src 10.0.0.9/32 flowid 1:16 \
           >    action police rate 100kbit burst 90 ok \
           >    action mirred egress mirror dev eth1
    
    5. もっと面白いサンプルとしてフローを (デフォルト全て drop する)
       dummy デバイスにミラーして tcpdump
    
       192.168.200.200/32 からのパケットをポリシングして、この送出が
       100Kbps を超えてほしくないとか
    
           # tc qdisc add dev eth0 handle 1:0 root prio
           # tc filter add dev eth0 pareht 1: protocol ip prio 10 u32 \
           >    match ip src 192.168.200.200/32 flowid 1:2 \
           >    action police rate 100kbit burst 90 drop
    
       eth0 で tcpdump を実行すると 192.168.200.200/32 からのパケット送
       出がドロップされようと、されまいと全て見ることができる (tcpdump
       は egress される全てのパケットを見せるから)。ルールを少しだけ拡張
       して make out したパケットを見るためには
    
           # tc qdisc add dev eth0 handler 1:0 root prio
           # tc filter add dev eth0 parent 1: protocol ip prio 10 u32 \
           >    match ip src 192.168.200.200/32 flowid 1:2 \
           >    action police rate 100kbit burst 90 drop \
           >    action mirred egress mirror dev dummy0
    
       dummy0 で tcpdump を動かして、make out されたパケットだけを見る
    
           # tcpdump -n -i dummy0 -x -e -t
    
       mirror を redirect に置き換えると、これらパケットは XXX 一切 make
       out できなくなる
    

    2011年4月18日月曜日

    obs600-tools.deb # utils の方が良かった?

    obs600 で debian squeeze の続編。deb パッケージにない
    • flashcfg
    • runled
    • pshd
    をやっつけ deb パッケージ化。

    バイナリはこんなイメージ


    ソースはこんなイメージ


    SSDLinux のソースから autotools 環境作成のスクリプトと言うかコマンド列挙は
    こんなイメージ


    zlib1g zlib1g-dev が必要なのでそれぞれ powerpc のdeb バイナリ
    • zlib1g_1.2.3.4.dfsg-3_powerpc.deb
    • zlib1g-dev_1.2.3.4.dfsg-3_powerpc.deb
    を持ってきて
    $ dpkg-cross --build --arch powerpc *.deb
    とするんだけど、バージョン上がった場合の確認が面倒。
    apt-cross というツールはなくなってしまい、pdebuild-cross は使い方わからず...

    2011年4月16日土曜日

    softdog / CONFIG_WATCHDOG_NOWAYOUT - 勘違い

    nowayout と Magic Close の関係を思いっきり勘違い。先日のエントリでは
    何とでも読み取り可。nowayout 指定しても Magic Close はできると思い込
    んでた。が、nowayout の方が強いと言うか、nowayout を指定してしまうと
    Magic Close すらできない。

    drivers/watchdog/softdog.c の中 MODULE_PARM で探すと
    soft_margin: int
    Watchdog soft_margin in seconds.
    (0 < soft_margin < 65536, default=60)
     
    nowayout: int
    Watchdog cannot be stopped once started
    (default= [config WATCHDOG_NOWAYOUT?])
     
    soft_noboot: int
    Softdog action, set to 1 to ignore reboots, 0 to reboot
    noboot でテスト。watchdog プログラムはこんなんに swd.sh と命名して
    #!/bin/sh
    
    exec 3> /dev/watchdog
    trap "echo 'send V'; echo -n V >&3; exit 0" INT
    
    while :; do
        echo >&3
        sleep 4
    done
    SIG_INT で止められたら Magic Close。root になってまずは nowayout なし
    で Magic Close の場合は
    # modprobe softdog soft_margin=10 nowayout=0 soft_noboot=1 # ./swd.sh ^Csend V (しばらく待った後に Ctrl-c) # dmesg | tail ... [ 3010.493992] Software Watchdog Timer: 0.07 initialized. soft_noboot=1 soft_margin=10 sec (nowayout= 0)
    Magic Close しない場合は (rmmod しないで引き続き)
    # ./swd.sh 
    ^Z (Ctrl-z)
    [1]+  Stopped                 ./swd.sh
    # (しばらく - soft_margin で指定した10 秒以上待つ)
    # dmesg | tail
    ...
    [ 3010.493992] Software Watchdog Timer: 0.07 initialized. 
        soft_noboot=1 soft_margin=10 sec (nowayout= 0)
    [ 3241.819563] SoftDog: Triggered - Reboot ignored.
    リブートだけど soft_noboot 指定したのでメッセージだけ。/dev/watchdog
    が開きっぱになっているので、続けて
    # fg
    ./swd.sh
    ^Csend V (Ctrl-c)
    # rmmod softdog
    次に nowayout 指定すると
    # modprobe softdog soft_margin=10 nowayout=1 soft_noboot=1
    # ./swd.sh 
    ^Csend V (Ctrl-c)
    # (10 秒以上待って)
    # dmesg | tail
    ...
    [ 3757.016487] Software Watchdog Timer: 0.07 initialized. 
        soft_noboot=1 soft_margin=10 sec (nowayout= 1)
    [ 3811.572991] SoftDog: Unexpected close, not stopping watchdog!
    [ 3821.580111] SoftDog: Triggered - Reboot ignored.
    'V' を /dev/watchdog に送ったけどリブート。で最初の通り nowayout 指定
    すると Magic Close も何のその。書き込みなくば再起動という結果。

    とってもシンプルだけど先の swd.sh は
    nohup ./swd.sh > /var/log/watchdog.log 2>&1 &
    でソレナリには動くらしい。nowayout 指定せず Magic Close 使ってリブート
    せずの停止は
    # killall -INT swd.sh
    # cat /var/log/swd.log
    nohup: ignoring input
    send V

    2011年4月13日水曜日

    PIL で bin2png - その 2

    昔? telnet しか許されていないホストで base64 したバイナリをコピペしたこと
    思い出した...鶏卵、ブートストラップ。ソレやるか? で昨日の
    > 超てきとーいいかげんにパディング
    を貼り付けた結果、ながいブログエントリぃー。pack / unpack の使い方もわかっ
    てないし、ムダな事ばっかじゃん。と思った方は是非メンテしてやってください。
    コピペして bin2png.py とかで保存した後は、こちらも昨日のイメージを保存して
    $ ./bin2png.py -d patch-2.6.38.2.gz.png -o patch-2.6.38.2.gz
    とかで。
    サイズ大きいファイルはシャレになりませんが、ブログに貼り付ける程度なら...
    #!/usr/bin/python
    
    import sys, os, math, struct
    import getopt, logging
    import Image
    
    log = logging.getLogger()
    
    def sqrint(n):
        r = math.ceil(math.sqrt(n) + 0.1)
        return (int(r), int(math.pow(r, 2) - n))
    
    
    def encode(srcfp, dstfp):
        # calc sizes
        fsize = os.fstat(srcfp.fileno()).st_size
        log.debug("encode size: %d" % fsize)
        qfsize = fsize / 4
        sides, padlen = sqrint(qfsize)
        tupad = struct.unpack('BBBB', struct.pack('!L', fsize))
    
        # create data
        data = [tupad]
        for i in range(qfsize):
            data.append(struct.unpack('BBBB', srcfp.read(4)))
        nremain = fsize % 4
        data.append(struct.unpack('BBBB', srcfp.read(nremain) + '\x00' * (4 - nremain)))
        data.extend(((0, 0, 0, 0),) * (padlen / 4 - 1))
    
        # write out
        im = Image.new('RGBA', (sides, sides))
        im.putdata(data)
        im.save(dstfp, 'PNG')
    
    
    def decode(srcfp, dstfp):
        im = Image.open(srcfp)
        imgcore = im.getdata() # needs checking mode?
        fsize = struct.unpack("!L", struct.pack("BBBB", *imgcore[0]))[0]
        log.debug("decode size: %d" % fsize)
    
        data = list(imgcore)[1:]
        b = bytearray()
        [b.extend(d) for d in data]
        dstfp.write(b[:fsize])
    
    
    def usage():
        print >> sys.stderr, '''%s - convert file to png image
      -e | --encode          specify encoding file 
      -d | --decode          specify decoding file
      -o | --outfile         stdout if not specified
      -h | --help            show (this) usage message
      -v | --verbose         set logging level to DEBUG [default is INFO]
    ''' % sys.argv[0]
    
    def main():
        try:
            opts, args = getopt.getopt(sys.argv[1:], 'e:d:o:hv',
                                       ['encode', 'decode', 'outfile', 
                                        'help', 'verbose'])
        except getopt.GetoptError, err:
            log.error(err)
            usage()
            sys.exit(2)
    
        isencode = False
        isdecode = False
        srcfp = None
        # 3.0: dstfp = sys.stdout.buffer?
        dstfp = os.fdopen(sys.stdout.fileno(), 'wb')
    
        for o, a in opts:
            if o in ("-h", "--help"):
                usage()
                sys.exit(0)
            elif o in ("-v", "--verbose"):
                log.setLevel(logging.DEBUG)
            elif o in ("-e", "--encode"):
                isencode = True
                srcfp = file(a, 'rb')
            elif o in ("-d", "--decode"):
                isdecode = True
                srcfp = file(a, 'rb')
            elif o in ("-o", "--outfile"):
                dstfp = file(a, 'wb')
    
        if not (isencode ^ isdecode):
            log.error("invalid action")
            usage()
            sys.exit(1)
    
        isencode and encode(srcfp, dstfp)
        isdecode and decode(srcfp, dstfp)
    
    
    if __name__ == "__main__":
        logging.basicConfig(level=logging.INFO,
                            format='%(asctime)s %(levelname)s %(message)s')
        main()
    

    PIL で bin2png

    ちょっと驚き... こちら blogger 然りでバイナリデータをブログに載せたい時って
    どうすれば良いやら。長いテキストとかであれば a2ps | enscript で PostScript
    にした後 ps2pdf とか。で PDF がアップロードできるか知らないし、やっぱイメー
    ジデータでしょう。

    と探すもステガノグラフィ (outguess steghide snowdrop) まで凝った話でもなく、
    サイズも大きくなるし a2png だって? と試すもそのまま a2ps の png 版だったり。
    sourceforge にあるも Java だったり...

    むーん libpng とか使って自作? とか思い始めたところ # 長い前置き
    Python Imaging Library (PIL) のハンドブック眺めてみたところ、ソレらしきメソ
    ッドが。でお試し
    $ python
    Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> fname = "patch-2.6.38.2.gz"
    >>> import os
    >>> os.stat(fname).st_size
    52847
    >>> f = open(fname)
    >>> b = bytearray()
    >>> b.extend(f.read())
    >>> len(b)
    52847
    >>> import Image
    >>> im = Image.new('L', (52847, 1))
    >>> im.putdata(b)
    >>> im.save("2.6.38.2.png")
    >>> (Ctrl-D)
    $ ls -l 2.6.38.2.png 
    -rw-r--r-- 1 chamaken chamaken 52921 2011-04-12 23:35 2.6.38.2.png
    PNG フォーマットとか全く知らないので new() のモードわからないし、最大約数を
    探すのも面倒がってサイズもおかしいど、もちろん可逆で
    $ python
    Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import Image
    >>> im = Image.open("2.6.38.2.png")
    >>> f = open("write.back", 'wb')
    >>> f.write(bytearray(im.getdata()))
    >>> f.close()
    >>> (Ctrl-d)
    $ cmp patch-2.6.38.2.gz write.back 
    $ 
    おどろいた。この 2.6.38.2.png を貼ると大変なことになりそうなので超てきとー
    いいかげんにパディングしたものを貼ってみるテスト

    2011年4月7日木曜日

    obs600 で 再度 debian squeeze - その 3 - で一段落

    お待ちかね。OBS600 側
    • CF 積んで
    • ETHER-0 に UTP ケーブル接続して
    • INIT ボタンをボールペンで押さえて
    電源投入。ちなみに手元にあるのは 8G の CF。root でログインした後
    1. パーティション分割 & ファイルシステム作成
    2. 8G を 6G / 2G に分割。冗長だけど全部
      # fdisk /dev/sda
      
      Command (m for help): p
      
      Disk /dev/sda: 8019 MB, 8019099648 bytes
      247 heads, 62 sectors/track, 1022 cylinders
      Units = cylinders of 15314 * 512 = 7840768 bytes
      
         Device Boot      Start         End      Blocks   Id  System
      
      Command (m for help): n
      Command action
         e   extended
         p   primary partition (1-4)
      p
      Partition number (1-4): 1
      First cylinder (1-1022, default 1):
      Using default value 1
      Last cylinder or +size or +sizeM or +sizeK (1-1022, default 1022): +6144M
      
      
      Command (m for help): n
      Command action
         e   extended
         p   primary partition (1-4)
      p
      Partition number (1-4): 2
      First cylinder (786-1022, default 786):
      Using default value 786
      Last cylinder or +size or +sizeM or +sizeK (786-1022, default 1022):
      Using default value 1022
      
      Command (m for help): p
      
      Disk /dev/sda: 8019 MB, 8019099648 bytes
      247 heads, 62 sectors/track, 1022 cylinders
      Units = cylinders of 15314 * 512 = 7840768 bytes
      
         Device Boot      Start         End      Blocks   Id  System
      /dev/sda1               1         785     6010714   83  Linux
      /dev/sda2             786        1022     1814709   83  Linux
      
      Command (m for help): w
      The partition table has been altered!
      
      Calling ioctl() to re-read partition table.
      sd 0:0:0:0: [sda] 15662304 512-byte hardware sectors: (8.01 GB/7.46 GiB)
      sd 0:0:0:0: [sda] Write Protect is off
      sd 0:0:0:0: [sda] Assuming drive cache: write through
       sda: sda1 sda2
      sd 0:0:0:0: [sda] 15662304 512-byte hardware sectors: (8.01 GB/7.46 GiB)
      sd 0:0:0:0: [sda] Write Protect is off
      sd 0:0:0:0: [sda] Assuming drive cache: write through
       sda: sda1 sda2
      Syncing disks.
      # mke2fs -j -b 4096 -L / /dev/sda1
      mke2fs 1.39 (29-May-2006)
      Filesystem label=/
      OS type: Linux
      Block size=4096 (log=2)
      Fragment size=4096 (log=2)
      752192 inodes, 1502678 blocks
      75133 blocks (5.00%) reserved for the super user
      First data block=0
      46 block groups
      32768 blocks per group, 32768 fragments per group
      16352 inodes per group
      Superblock backups stored on blocks:
              32768, 98304, 163840, 229376, 294912, 819200, 884736
      
      Writing inode tables: done
      Creating journal (32768 blocks): done
      Writing superblocks and filesystem accounting information: done
      
      This filesystem will be automatically checked every 28 mounts or
      180 days, whichever comes first.  Use tune2fs -c or -i to override.
      
    3. マウント & ファイル取得準備
    4. # mount /dev/sda1 /mnt
      kjournald starting.  Commit interval 5 seconds
      EXT3 FS on sda1, internal journal
      EXT3-fs: mounted filesystem with ordered data mode.
      # ip link ls eth0
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
      state UP qlen 1000
          link/ether 00:1a:88:0c3:12:bb brd ff:ff:ff:ff:ff:ff
          inet 192.168.253.254/24 brd 192.168.253.255 scope global eth0
      
      # ping -c 4 192.168.253.1
      PING 192.168.253.1 (192.168.253.1): 56 octets data
      64 octets from 192.168.253.1: icmp_seq=0 ttl=64 time=2.2 ms
      64 octets from 192.168.253.1: icmp_seq=1 ttl=64 time=0.3 ms
      64 octets from 192.168.253.1: icmp_seq=2 ttl=64 time=0.3 ms
      64 octets from 192.168.253.1: icmp_seq=3 ttl=64 time=0.3 ms
      
      --- 192.168.253.1 ping statistics ---
      4 packets transmitted, 4 packets received, 0% packet loss
      round-trip min/avg/max = 0.3/0.7/2.2 ms
      
    5. 開発機側のファイルツリーをごっそり取得
    6. (長いコマンドライン)
      # ssh chamaken@192.168.253.1 \
      > "cd ~/obs600/rootfs && tar -cp --numeric-owner -f - *" \
      > | tar -xpv --numeric-owner -f - -C /mnt
      The authenticity of host '192.168.253.1 (192.168.253.1)' can't be established.
      RSA key fingerprint is d1:72:98:8b:42:11:e6:a6:7b:c8:6f:8b:95:ba:a3:a8.
      Are you sure you want to continue connecting (yes/no)? yes
      Warning: Permanently added '192.168.253.1' (RSA) to the list of known hosts.
      Password:
      ...
      var/cache/debconf/
      var/spool/
      
    7. チルっと
    8. # chroot /mnt
      I have no name!@ssd-linux:/# ls -1
      bin
      boot
      debootstrap
      dev
      etc
      home
      lib
      lib64
      lost+found
      mnt
      proc
      sbin
      selinux
      sys
      tmp
      usr
      var
      I have no name!@ssd-linux:/# cd /debootstrap
      I have no name!@ssd-linux:/debootstrap# ./debootstrap --second-stage
      I: Installing core packages...
      ...
      I: Base system installed successfully.
      I have no name!@ssd-linux:/debootstrap#
      
    9. /uImage.initrd-cfboot の作成
    10. I have no name!@ssd-linux:/debootstrap# cd
      I have no name!@ssd-linux:~# ls -1
      linux-image-2.6.32_0.91_powerpc.deb
      obs600.dtb
      vmlinux.bin.gz
      
      いろいろ叱られるし、長いけど
      I have no name!@ssd-linux:~# dpkg -i linux-image-2.6.32_0.91_powerpc.deb
      Selecting previously deselected package linux-image-2.6.32.
      (Reading database ... 9174 files and directories currently installed.)
      Unpacking linux-image-2.6.32 (from linux-image-2.6.32_0.91_powerpc.deb) ...
      Done.
      Setting up linux-image-2.6.32 (0.91) ...
      
       Hmm. There is a symbolic link /lib/modules/2.6.32/build
       However, I can not read it: No such file or directory
       Therefore, I am deleting /lib/modules/2.6.32/build
      
      
       Hmm. The package shipped with a symbolic link /lib/modules/2.6.32/source
       However, I can not read the target: No such file or directory
       Therefore, I am deleting /lib/modules/2.6.32/source
      
      Running depmod.
      Examining /etc/kernel/postinst.d.
      run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.32
      /boot/vmlinux-2.6.32
      update-initramfs: Generating /boot/initrd.img-2.6.32
      df: Warning: cannot read table of mounted file systems: No such file
      or directory
      warning: can't open /etc/mtab: No such file or directory
      warning: can't open /etc/mtab: No such file or directory
      I have no name!@ssd-linux:~#
      
      また長いコマンドライン。くどいけど参照
      • $SSDSRC/usr/src/contrib/debootstrap/post-debootstrap
      • $SSDSRC/usr/src/contrib/developers/kimura/lenny_based_firmware/uimage/create_uImage.sh
      I have no name!@ssd-linux:~# mkimage -n "original.$(date +'%FT%T')" \
      > -A ppc -O linux -T multi -C gzip \
      > -d vmlinux.bin.gz:/boot/initrd.img-2.6.32:obs600.dtb \
      > /uImage.initrd-cfboot
      Image Name:   original.2011-04-01T12:34:56
      Created:      Tue Apr  1 12:34:56 2011
      Image Type:   PowerPC Linux Multi-File Image (gzip compressed)
      Data Size:    3847277 Bytes = 3757.11 kB = 3.67 MB
      Load Address: 00000000
      Entry Point:  00000000
      Contents:
         Image 0: 1925764 Bytes = 1880.63 kB = 1.84 MB
         Image 1: 1913443 Bytes = 1868.60 kB = 1.82 MB
         Image 2: 8053 Bytes = 7.86 kB = 0.01 MB
      I have no name!@ssd-linux:~#
      
    11. 普通の? 必須修正
    12. I have no name!@ssd-linux:~# passwd
      Enter new UNIX password:
      Retype new UNIX password:
      passwd: password updated successfully
      I have no name!@ssd-linux:~# cd /etc
      I have no name!@ssd-linux:/etc# cp inittab inittab.dpkg-dist
      I have no name!@ssd-linux:/etc# vi inittab
      ...
      I have no name!@ssd-linux:/etc# diff -uw inittab.dpkg-dist inittab
      --- inittab.dpkg-dist   2011-03-31 12:34:56.000000000 +0000
      +++ inittab     2011-03-31 12:34:56.000000000 +0000
      @@ -51,16 +51,16 @@
       # Note that on most Debian systems tty7 is used by the X Window System,
       # so if you want to add more getty's go ahead but skip tty7 if you run X.
       #
      -1:2345:respawn:/sbin/getty 38400 tty1
      -2:23:respawn:/sbin/getty 38400 tty2
      -3:23:respawn:/sbin/getty 38400 tty3
      -4:23:respawn:/sbin/getty 38400 tty4
      -5:23:respawn:/sbin/getty 38400 tty5
      -6:23:respawn:/sbin/getty 38400 tty6
      +# 1:2345:respawn:/sbin/getty 38400 tty1
      +# 2:23:respawn:/sbin/getty 38400 tty2
      +# 3:23:respawn:/sbin/getty 38400 tty3
      +# 4:23:respawn:/sbin/getty 38400 tty4
      +# 5:23:respawn:/sbin/getty 38400 tty5
      +# 6:23:respawn:/sbin/getty 38400 tty6
      
       # Example how to put a getty on a serial line (for a terminal)
       #
      -#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
      +T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100
       #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
      
       # Example how to put a getty on a modem line.
      I have no name!@ssd-linux:/etc#
      
      そのほか /etc/hostname/etc/network/interfaces など
      必要に応じて作成、変更 - in debian's way で

    13. オリジナルツールのコピー
    14. 後でやっつけパッケージ作るけど、とり急ぎ
      I have no name!@ssd-linux:/etc# exit
      # cd /usr/sbin
      # cp flashcfg runled pshd /mnt/usr/sbin/
      
    15. CF ブートとしてリブート
    16. # flashcfg -h
      usage: flashcfg                 Show this.
             flashcfg -b              Show current boot setting
             flashcfg -c rootdev      Change root file system [initrd|cf|sda-sdd[1-8]]
                                      initrd       - Boot from FlashROM, / on Ramdisk
                                      sda-sdd[1-8] - Boot from FlashROM, / on CF
                                      cf           - Boot from CF,       / on CF
             flashcfg -f boot_image   Load boot image to flash
             flashcfg -s list_file    Save files to Parameter area
             flashcfg -S list_file    Save files to User area
             flashcfg -x              Restore files from Parameter area
             flashcfg -X              Restore files from User area
             flashcfg -d              Delete saved files from Parameter area
             flashcfg -D              Delete saved files from User area
             flashcfg -E env_file     Save params to U-Boot Environment area
             flashcfg -L env_file     Load params from U-Boot Environment area
             flashcfg -h              Show this.
      # flashcfg -c cf
      # shutdown -r now
      
    でけた?

    2011年4月6日水曜日

    obs600 で 再度 debian squeeze - その 2

    また引用。
    OpenBlockS 600D - 開発環境の構築
    クロス開発 (VMware等のx86環境上での開発)
    1. ベースとなる環境の用意
    2. タイトル通り squeeze (amd64) で

    3. emdebian のリポジトリを追加します
    4. sources.list の準備
      /etc/apt/sources.list.d に以下 emdebian.list というファイルを追加
      # cat /etc/apt/sources.list.d/emdebian.list
      deb     http://www.emdebian.org/debian/ squeeze main
      deb-src http://www.emdebian.org/debian/ squeeze main
      
      アップデート
      $ sudo aptitude update
      
      キーリングを追加
      $ sudo aptitude install emdebian-archive-keyring
      
    5. 必要なパッケージを追加します
    6. $ sudo aptitude install \
      > build-essential u-boot libc6-powerpc-cross \
      > libc6-dev-powerpc-cross binutils-powerpc-linux-gnu gcc-4.4-powerpc-linux-gnu \
      > g++-4.4-powerpc-linux-gnu \
      > autoconf dpkg-cross linux-headers-2.6.32-5-common linux-source-2.6.32 \
      > kernel-package libncurses5-dev
      
      最後の二行は今後のモロモロのために

    7. カーネルのソースコードを展開します
    8. ありがたいことに SSDLinux のパッチもあるので上記通り linux-source-2.6.32 で。

    9. 開発用ディレクトリの作成と SSD/Linux のソース取得、展開
    10. テンポラリディレクトリ作成
      $ mkdir -p $HOME/obs600/tmp
      
      src.tgz の取得
      $ wget -nd -N -P $HOME/obs600/tmp \
      > http://ftp.plathome.co.jp/pub/ssdlinux/0.5-LATEST/source/src.tgz
      
      各種展開
      $ cd $HOME/obs600
      $ tar xzf tmp/src.tgz -C tmp
      $ tar xjf /usr/src/linux-source-2.6.32.tar.bz2 -C .
      
    11. カーネルパッケージ作成
    12. カーネルパッチあて
      SSD/Linux のソース usr/src/mkdist/kernel/2.6.32/patches/ に各種パッチあり
      $ cd linux-source-2.6.32
      $ for i in ../tmp/usr/src/mkdist/kernel/2.6.32/patches/*.patch; do
      > patch -p1 $i
      > done
      ...
      patching file Makefile
      Reversed (or previously applied) patch detected!  Assume -R? [n]
      Apply anyway? [n]
      (ここはエンター。デフォルトの n で OK)
      Skipping patch.
      4 out of 4 hunks ignored -- saving rejects to file Makefile.rej
      patching file scripts/Makefile.modinst
      
      ごめんなさい - scripts.patch
      +ifdef NOGZIP
             cmd_modules_install = mkdir -p $(2); cp $@ $(2) ;
      $(mod_strip_cmd) $(2)/$(notdir $@)
      +else
      +      cmd_modules_install = mkdir -p $(2); cp $@ $(2) ;
      $(mod_strip_cmd) $(2)/$(notdir $@) ;gzip -9 $(2)/$(notdir $@)
      +endif
      
      なので make 時に -D NOGZIP する

      .config などのコピー
      ワーキングディレクトリは $HOME/obs600/linux-source-2.6.32 のままで
      $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/dot.config.powerpc-obs600 dot.config
      $ cp dot.config .config
      $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/obs600.dts arch/powerpc/boot/dt
      $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/obs600.dts arch/powerpc/boot/dts/
      
      menuconfig
      $ make-kpkg -j4 --arch powerpc --config menuconfig configure
      
      menuconfig はお好みで gconfig とか。DRBD 使ってみるので
      • Device Drivers ---> Connector を M に
      • Device Drivers ---> Block Devices ---> DRBD も M に
      その他お好みで。個人的には cgroup と namespace veth など。diff 取ると
      $ diff -uw dot.config .config
      +CONFIG_CONNECTOR=m
      +CONFIG_BLK_DEV_DRBD=m
      
      といったあたり。削除されてる
      -CONFIG_UNION_FS=y
      http://download.filesystems.org/unionfs/unionfs-2.x/
      あたりからパッチ持ってきてあてる必要あり。でも CF ブートなので割愛。

      kernel_image
      $ MAKEFLAGS="NOGZIP=1" make-kpkg -j4 --rootcmd=fakeroot --arch=powerpc \
      > --revision 0.91 --initrd kernel_image
      
    13. その他 uImage に必要なもの
    14. dtb
      参照:
      • $SSDSRC/usr/src/contrib/debootstrap/post-debootstrap
      • $SSDSRC/usr/src/contrib/developers/kimura/lenny_based_firmware/uimage/create_uImage.sh
      $ make ARCH=powerpc obs600.dtb
      /home/chamaken/obs600/linux-source-2.6.32/scripts/dtc/dtc -O dtb -o
      arch/powerpc/boot/obs600.dtb -b 0 -p 1024
      /home/chamaken/obs600/linux-source-2.6.32/arch/powerpc/boot/dts/obs600.dts
      DTC: dts->dtb  on file
      "/home/chamaken/obs600/linux-source-2.6.32/arch/powerpc/boot/dts/obs600.dts"
      $ cp arch/powerpc/boot/obs600.dtb ../
      
      vmlinux.bin.gz
      $ powerpc-linux-gnu-objcopy -O binary vmlinux ../vmlinux.bin
      $ cd ..
      $ gzip vmlinux.bin
      $ ls -1
      linux-image-2.6.32_0.91_powerpc.deb
      linux-source-2.6.32
      obs600.dtb
      tmp
      vmlinux.bin.gz
      
      すっごい長くなった上に番外。
      ここまでやっておくと次回 obs600 側になるので

    15. (何と言えばよいのか) 開発機側で OBS600 バイナリのファイルツリー準備
    16. include のパッケージは最低限。お好みで... drbb8-utils も
      $ su
      # debootstrap --foreign --arch=powerpc \
      > --include "ssh less u-boot initramfs-tools" \
      > squeeze rootfs http://ftp.jp.debian.org/debian
      I: Retrieving Release
      I: Retrieving Packages
      I: Validating Packages
      ...
      I: Extracting xz-utils...
      I: Extracting zlib1g...
      # ls -1
      linux-image-2.6.32_0.91_powerpc.deb
      linux-source-2.6.32
      obs600.dtb
      rootfs
      tmp
      vmlinux.bin.gz
      # cp linux-image-2.6.32_0.91_powerpc.deb obs600.dtb vmlinux.bin.gz rootfs/root/
      # chmod 0755 rootfs/root
      
      最後の chmod 忘れずに

    2011年4月5日火曜日

    obs600 で 再度 debian squeeze - その 1

    まずはおかしくなった時の準備。tftp サーバを適当な debian マシンにインストールしておく
    ファームウェアアップデートを実行したら起動しなくなりました。どうすれば復旧できますか。
    からの引用

    Q. ファームウェアアップデートを実行したら起動しなくなりました。どうすれば復旧できますか。
    A. TFTP サーバを利用したファームウェアのアップデートを行うことで復旧できます。
    1. パッケージのインストール
    2. $ sudo apt-get install tftpd-hpa (ディレクトリはデフォルトの /srv/tftp)
      
      Starting HPA's tftpd: in.tftpdinvoke-rc.d: initscript tftpd-hpa,
      action "start" failed.
      dpkg: error processing tftpd-hpa (--configure):
       subprocess installed post-installation script returned error exit status 71
      configured to not write apport reports
                                            Errors were encountered while processing:
       tftpd-hpa
      E: Sub-process /usr/bin/dpkg returned an error code (1)
      IPv6 無効にしていると上記エラー。/var/log/daemon.log を眺めると
      Apr  5 21:06:29 devobs600 in.tftpd[16485]: cannot open IPv6 socket,
      disable IPv6: Address family not supported by protocol
      Apr  5 21:06:29 devobs600 in.tftpd[16485]: Cannot set nonblock flag on
      socket: Bad file descriptor
      なんて出力があるので /etc/default/tftpd-hpa を変更
      # diff -uw tftpd-hpa.dpkg-dist tftpd-hpa
      --- tftpd-hpa.dpkg-dist        2011-04-05 08:09:46.000000000 +0900
      +++ tftpd-hpa                  2011-04-05 08:09:56.000000000 +0900
      @@ -3,4 +3,4 @@
       TFTP_USERNAME="tftp"
       TFTP_DIRECTORY="/srv/tftp"
       TFTP_ADDRESS="0.0.0.0:69"
      -TFTP_OPTIONS="--secure"
      +TFTP_OPTIONS="--secure -4"
    3. ファームウェアをダウンロードしておき TFTP サーバ側で指定した場所におきます。
    4. TFTP サーバのディレクトリに置く
      $ su
      # wget -nd -N -P /srv/tftp \
      > http://ftp.plathome.co.jp/pub/OBS600/0.5-LATEST/powerpc-obs600/installation/uImage.initrd
    5. ETHER-0 と PC を添付のクロス・ケーブル (緑色) で接続します。
    6. アドレス追加。ハブやスイッチ介しても同じ L2 ドメインであればクロスケーブルじゃなくてもOK
      # ip addr ls eth0
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
      state UP qlen 1000
          link/ether 00:ed:cb:a9:87:65 brd ff:ff:ff:ff:ff:ff
          inet 10.1.2.3/16 brd 10.1.255.255 scope global eth0
      # ip addr add 192.168.253.1/24 dev eth0
      # ip addr ls eth0
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
      state UP qlen 1000
          link/ether 00:ed:cb:a9:87:65 brd ff:ff:ff:ff:ff:ff
          inet 10.1.2.3/16 brd 10.1.255.255 scope global eth0
          inet 192.168.253.1/24 scope global eth0
      
    7. 本体の ディップ・スイッチ 2 を ON にします。

    8. 電源を入れます。
    9. 待つことしばし

    10. ファームウェアのアップデートが完了しますと本体の緑色の LED が点滅します。

    11. 電源を抜き、ディップ・スイッチ 2 を OFF にします。

    12. 追記 - INIT ボタンを押しながら電源を入れる
    13. いや、CF 起動でおかしな状態にして数日放置。で tftp ブートでイメージ読み込んだ後、度々忘れるので...