2014年11月11日火曜日

forked-daapdを導入して玄箱をジュークボックスにする

iTunesにはDAAPとDACPという仕組みがあり、他の端末からライブラリを閲覧して再生したり、再生させたりすることが出来る。

DAAP (Digital Audio Access Protocol)

DAAPサーバはライブラリの曲リストを提供し、クライアントがリクエストした曲をストリーミングし、クライアント側で再生することが出来る。

DACP (Digital Audio Control Protocol)

DACPサーバはライブラリの曲リストを提供し、クライアントがリクエストした曲をサーバ側で再生し、クライアントにリモコンのような機能を提供する。

forked-daapdはLinuxにDAAPサーバとDACPサーバの機能を提供する。

リポジトリの追加とインストール

wheezyではi386とamd64のバイナリしか用意されていないので、"/etc/apt/sources.list"に"wheezy-backports"を追加する。
ついでにmultimediaリポジトリも追加しておく。
/etc/apt/sources.list
deb http://ftp.jp.debian.org/debian/ wheezy main deb http://security.debian.org/ wheezy/updates main # multimedia deb http://www.deb-multimedia.org wheezy main non-free #deb-src http://www.deb-multimedia.org wheezy main non-free # backports deb http://ftp.jp.debian.org/debian/ wheezy-backports main contrib non-free
パッケージリストを更新し、GPGエラーが出る場合は公開鍵をインストールする。
# sudo aptitude update
# sudo aptitude install deb-multimedia-keyring
forked-daapdをインストールする。入れていない場合はalsa-baseなども。
# sudo aptitude install forked-daapd alsa-base

設定ファイルを編集する

DAAPとしての設定はオーディオファイルの場所を指定するだけでほぼ問題ない。
/etc/forked-daapd.conf
# Directories to index directories = { "/mnt/share/music" }
DACPとして玄箱に繋げたUSBオーディオから曲を再生する場合は音源の設定をする。
# Local audio output
audio {
        # Name - used in the speaker list in Remote
        nickname = "Computer"
        # Audio device name for local audio output
        card = "default"
        # Mixer channel to use for volume control - ALSA/Linux only
        # If not set, PCM will be used if available, otherwise Master.
#       mixer = ""
}
設定を完了したらdaemonを再起動する。
# sudo /etc/init.d/forked-daapd restart
HDDからカリカリと音をさせオーディオファイルのタグを読みに行ってデータベースを生成してくれる。

DAAPサーバ確認

PCからiTunesを起動する。

左上の家のアイコンをクリックして玄箱のライブラリが見えたら成功。
ちなみにforked-daapdがファイルスキャン中に曲を再生しようとしたりすると、クライアント側のiTunesのアルバムアートのキャッシュがまれによくぶっ壊れておかしいことになることがある。一応手動でキャッシュを削除すると治る。

DACPサーバ確認

Windows用のクライアントTunesRemoteSEを使ってみる。
起動するとDACPサーバが見える。初回起動時はクライアントごとにペアリングをする必要がある。
"pair"ボタンを押すと4桁の数字のパスコードが表示されるのでメモする。

サーバ側の"/var/log/forked-daapd.log"を開くと
/var/log/forked-daapd.log
[2014-1-1 00:00:00] remote: Discovered remote 'TunesRemote SE@192.168.1.20' (id 77903C....
クライアントの名前が確認できる。(この例では'TunesRemote SE@192.168.1.20')
次に"/etc/forked-daapd.conf"で設定したオーディオファイルの場所を指定したパスに(どこでもいい)、拡張子"remote"で適当な名前で("pokotan.remote"とか)テキストファイルを作り、一行目にクライアントの名前、二行目にパスコードを記して保存する。
(例) /mnt/share/music/pokotan.remote
TunesRemote SE@192.168.1.20 3772
うまく行けばこうなる。

他のクライアントでも同じような手続きでペアリングが出来る。
正常に動いていればdaapdの動いてる玄箱から音楽が再生される。

ちなみに確認のため何度かパッケージを入れて試してみたところ、それでも再生出来ないことがあった。
その時はユーザー"daapd"が"audio"グループに追加されておらず、グループに追加したところ正常に再生されるようになった。
# sudo gpasswd -a daapd audio
ユーザ daapd をグループ audio に追加

2014年11月10日月曜日

玄箱のkernel-2.6.28以降の電源ボタンを有効にする

電源ボタンなどを押した時の挙動は、"/etc/kuroevtd"以下のスクリプトの修正だけでは解決されないようなので、ボタンの挙動を監視している"/usr/sbin/kuroevtd"を修正する。
ソースを入手する。
コンパイルするのに必要なパッケージをインストールする。
# su
# aptitude install build-essential
ソースを展開、ファイルを修正する。
# mkdir kuroevtd
# tar xvzf kuroevtd1.1.3-pug1.0.tgz -C ./kuroevtd
# cd kuroevtd
# vi kuroevtd.c
赤字の部分を加筆修正する。
#include <time.h> 
#include <strings.h> 
#include <stdlib.h> 

#ifndef NOLOG
#include <syslog.h> 
#endif /* NOLOG */

#define BAUDRATE         B9600
#define DEVICE          "/dev/ttyS0"
#define EVT_POWER_DOWN  "/etc/kuroevtd/powerdown"
念のため同梱されている実行バイナリを削除しコンパイル。
# rm kuroevtd
# make
gcc -o kuroevtd kuroevtd.c
稼働中の"kuroevtd"を止めて新しいものに差し替え、再び稼働させて完了。
# /etc/init.d/kuroevtd stop
Stopping KURO-BOX event daemon: kuroevtd.
# cp kuroevtd /usr/sbin
# /etc/init.d/kuroevtd start
Starting KURO-BOX event daemon: kuroevtd.
試しに電源ボタンを長押ししてみて、シャットダウンされるか確認してみる。

2014年11月9日日曜日

玄箱HG用Kernel(u-boot対応)をビルドし導入する(2)

カーネルを置き換える

玄箱にログインしファイルを確認し、カーネルとモジュールを格納したアーカイブを確認する。
# su
# ls
kernel-3.16.7-kurobox.tar.gz  modules-3.16.7-kurobox.tar.gz
まずモジュールから展開する。
# tar xvzf modules-3.16.7-kurobox.tar.gz -C /
"/lib/modules/"にモジュールが展開される。
玄箱HGにDebian(Wheezy)を導入する(1)の記事より同じ手続きで環境構築していれば、カーネルは先頭のパーティションの"/dev/sda1"に格納されている。
"/mnt2"を作りマウント。bootディレクトリを確認し、念のためいきなり現行のカーネルを上書きせず、"/mnt2/boot-3.16.7"ディレクトリを作り、そこに"kernel-3.16.7-kurobox.tar.gz"を展開する。
# mkdir /mnt2
# mount /dev/sda1 /mnt2
# ls /mnt2
boot
# mkdir /mnt2/boot-3.16.7
# tar xvzf kernel-3.16.7-kurobox.tar.gz -C /mnt2/boot-3.16.7
ファイルを確認する。
# cd /mnt2
# ls
boot         boot-3.16.7
# ls boot
System.map                          kuroboxHG.dtb_V16-3.2.0.24-kurobox
System.map-3.2.0.24-kurobox         uImage
kuroboxHD.dtb                       uImage-3.2.0.24-kurobox
kuroboxHD.dtb_V16-3.2.0.24-kurobox  vmlinux.UBoot
kuroboxHG.dtb
# ls boot-3.16.7
System.map  kuroboxHD.dtb  kuroboxHG.dtb  uImage  uImage-3.16.7  vmlinux.UBoot
正常に展開されているのを確認し、"boot"を新しいものに入れ替える。
元の"boot"は名前を変更してバックアップしておく。
# mv boot boot_org
# cp -r boot-3.16.7 boot
リブートして差し替えたカーネルで起動するのを待つ。
# shutdown -r now

USBオーディオから正常に音が出るか確認する

無事起動したら必要なパッケージをインストールする。
# su
# aptitude install mplayer alsa-base udev
USBオーディオを繋げてみて"lsusb"コマンドで認識しているか確認する。
# lsusb
Bus 001 Device 002: ID 0409:0059 NEC Corp. HighSpeed Hub
Bus 003 Device 002: ID 0d8c:0001 C-Media Electronics, Inc. Audio Device
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
ちゃんと認識していたらそれっぽいのが見える。
"mplayer"に適当なオーディオファイルを読み込ませ、正常に音が出れば成功。
# mplayer tada.wav
次はforked-daapdでDAAP/DACPサーバを立ち上げてみる。

玄箱HG用Kernel(u-boot対応)をビルドし導入する(1)

USBオーディオを鳴らすためにカーネルをビルドする。


玄箱実機上でカーネルビルドすると時間がかかる。
とは言っても普段Windowsしか触っておらず、LinuxをインストールするのもCygwinでpowerpcのクロスコンパイル環境を構築するのも手間がかかりそうなので、LinuxLive USB Createrを使い、USBメモリからubuntu-14.04を立ち上げ、クロスコンパイル環境を整えてみた。
USBメモリからubuntuが起動したら試用を選び、ターミナルから必要なパッケージを導入する。
# sudo su
# apt-get install aptitude
# aptitude install build-essential ncurses-dev libc6-dev-powerpc-cross gcc-powerpc-linux-gnu u-boot-tools
"/usr/src"へ移動し、カーネルソースをダウンロードする。
今回はThe Linux Kernel Archivesより"stable 3.16.7 [EOL]"を選択した。
# cd /usr/src
# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.7.tar.xz
そのまま進めると空き容量が厳しいので、解凍したらアーカイブファイルは削除する。
# tar xvJf linux-3.16.7.tar.xz
# rm linux-3.16.7.tar.gz
# cd linux-3.16.7
玄箱/Linkstationに用意されたテンプレートから".config"を生成し、menuconfigから詳細な設定をする。
# make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- linkstation_defconfig
# make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- menuconfig

不要なドライバを外す

"Device Drivers" => "Network device support" => "Ethernet driver support"と進み"Realtek devices"の"Realtek 8169 gigabit..."以外のチェックを外す。
("Y"でチェック、"N"でチェックが外れる。)

MTDドライバ設定

"Device Drivers" => "Memory Technology Device (MTD) support" => "Mapping drivers for chip access"と進み、"Physmap compat support"にチェックを入れ、"Physical start address of flash mapping"の値を"0xffc00000"、"Physical length of flash mapping"の値を"0x400000"、"Bank width in octets"の値を"1"とする。

USBオーディオドライバ組み込み

"Device Drivers" => "Sound card support"(チェックを入れる) => "Advanced Linux Sound Architecture"(チェックを入れる) => "USB sound devices"と進み、"USB Audio/MIDI driver"にチェックを入れる。

ext4に対応させる

一応対応させてみる。
"File systems"
"The Extend 4 (ext4) filesystem"と"Ext4 POSIX Access Control Lists"にチェックを入れる。

.configに保存

"< Save >"を選択し、".config"に設定を保存。
"< Exit >"を何度か押してコンソールに戻る。

コンパイル開始

# make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- uImage modules

必要なファイルをまとめる

# mkdir ../boot/root
# cp -p System.map ../root/boot/
# cp -p .config ../root/boot/config-kurobox-3.16.7
# cp -p arch/powerpc/boot/uImage ../root/boot/uImage-3.16.7
# scripts/dtc/dtc -f -I dts -O dtb -o ../root//boot/kuroboxHD.dtb -V 16 arch/powerpc/boot/dts/kuroboxHD.dts
# scripts/dtc/dtc -f -I dts -O dtb -o ../root//boot/kuroboxHG.dtb -V 16 arch/powerpc/boot/dts/kuroboxHG.dts
# cd ../root/boot
# ln -s uImage-3.16.7 uImage
# ln -s uImage vmlinux.UBoot

tar.gzでまとめる

# tar czvf ../kernel-3.16.7-kurobox.tar.gz ./
# cd ../../linux-3.16.7/

モジュールをまとめる

# make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- INSTALL_MOD_PATH=../root  modules_install
# cd ../root
# tar czvf modules-3.16.7-kurobox.tar.gz lib

続けてそのままftpで玄箱にアップロード出来るよう玄箱側でftpdの設定を行う。
既にsambaなど設定が終わって他の手段があるのならば、ファイルキャビネットからsamba経由などで適当にファイルを玄箱にアップロードする。

玄箱にftpdをインストールし出来上がったファイルを転送出来るようにする

玄箱にログインし、ftpdをインストール、設定を行う。
# su
# aptitude install vsftpd
# vi /etc/vsftpd.conf
コメントを外し、"/etc/passwd"に記述されているユーザーをftpユーザとして利用出来るようにし、書き込みを許可する。
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
ftpdを再起動する。
# /etc/init.d/vsftpd restart
ftpで"kernel-3.16.7-kurobox.tar.gz"と"modules-3.16.7-kurobox.tar.gz"をubuntuから玄箱へアップロードする。
実際の導入は次の記事で。

LinkStation/TeraStation/玄箱/PPC/kernel/2.6.30.5 - PukiWiki
今回上記サイト様を大いに参考にさせていただきました。

2014年11月8日土曜日

玄箱HGにDebian(Wheezy)を導入する(4)

LennyからSqueeze、そしてWheezyへアップグレードする

リブートしたらtelnetでログイン。
初期状態だとユーザー:tmp-kun パスワード:tmp-kunでログイン出来る。
さっそく"su"コマンドでrootになり、環境設定を続ける。
rootのパスワードはrootとなっている。
Debian GNU/Linux 5.0
KURO-BOX login: tmp-kun
Password:
Linux KURO-BOX 3.16.7-kurobox #3 Thu Nov 6 14:13:33 JST 2014 ppc
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
tmp-kun@KURO-BOX:~$ su
Password:
KURO-BOX:/home/tmp-kun#
ルート領域をext2からext3に変換する。
# tune2fs -j /dev/sda3
"/etc/apt/sources.lst"を編集しsqueezeのアップグレードの準備をする。
/etc/apt/sources.lst
deb http://ftp.jp.debian.org/debian/ squeeze main
deb http://security.debian.org/ squeeze/updates main

#deb http://ftp.jp.debian.org/debian/ lenny main contrib non-free
#deb-src http://ftp.jp.debian.org/debian/ lenny main contrib non-free

#deb http://security.debian.org/ lenny/updates main contrib non-free
#deb-src http://security.debian.org/ lenny/updates main contrib non-free

#deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
#deb-src http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
修正したらapt-getコマンドを実行しパッケージのリストを更新する。
# apt-get update
GPGエラーが出るので以下のコマンドを実行する。
# apt-get install debian-keyring
# apt-get install debian-archive-keyring
Squeezeにアップグレードする。
選択肢が何度か出てくるが、デフォルトでだいたい問題ない。多分。
# apt-get update
# apt-get dist-upgrade
終了したら一応再起動する。
# shutdown -r now
無事起動出来たら次は"/etc/apt/sources.list"の"squeeze"を"wheezy"に書き換え、同じ手順でアップグレードを行う。
起動したら日本語環境の設定するなりして自由にいじくり回す。
# aptitude install locales manpages-ja
# dpkg-reconfigure locales
"ja_JP.EUC-JP EUC-JP"と"ja_JP.UTF-8 UTF-8"を追加し、"ja_JP.UTF-8 UTF-8"をデフォルトロケールに設定して完了。

2014年11月7日金曜日

玄箱HGにDebian(Wheezy)を導入する(3)

u-bootの設定をする

ホストPCのIPアドレスを(192.168.10.21)に設定し、netcatを実行し玄箱の起動を待ち受ける。
C:\Program Files (x86)\netcat>nc -v -v -n -u -s 192.168.10.21 -p 6666 192.168.10.145 6666[return]
(UNKNOWN) [192.168.10.145] 6666 (?) open
玄箱が起動しu-bootが読み込まれると
Boot in 09 seconds ('s' to stop)...
と、表示されカウントダウンされるので"s[enter]"でu-bootのプロンプトを開く。
=> 
"printenv[enter]"で設定されている環境変数の一覧が出力される。
bootargs=root=/dev/sda1 netconsole=6666@192.168.10.145/,@192.168.10.21/ rtc-rs5c372.probe=0,0x32
カーネルの起動オプションであるbootargsに設定されているルート領域のパーティションの位置が構築した環境と違っているので"setenv"で修正する。(/dev/sda1→/dev/sda3)
※EMモードではHDDのパーティションは/dev/hda1~/dev/hda4と言った感じで割り当てられていたが、/dev/sda1~/dev/sda4になる。
玄箱のフラッシュメモリのパーティションの設定も追記する。(Linux上からEMモードへ起動を切り替えることが出来るようになる。)
=> setenv rootdev /dev/sda3
=> setenv bootargs root=/dev/sda3 netconsole=6666@192.168.10.145/,@192.168.10.21/ rtc-rs5c372.probe=0,0x32 mtdparts=physmap-flash.0:0x300000(firmimg),0x70000(loader),0x10000(status),0x80000(loader-env)
"saveenv"で書き込んで"boot"で改めて起動する。
=> saveenv
saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Erasing Flash...
Flash erase: first = 54 @ 0xfff60000
             last  = 54 @ 0xfff60000
Flash erase: Done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
=> boot
boot
Loading 0:1:boot/vmlinux.UBoot
Debian Lennyが起動する。

玄箱HGにDebian(Wheezy)を導入する(2)

必要なファイルを準備する

u-bootを導入した玄箱にまずはDebian Lennyをセットアップする。
カーネルを3.x系を導入し、最終的にはSqueezeを経てWheezyを目指す。
最初に必要なファイルを手に入れる。
玄箱をEMモードで起動し、telnetでログイン。
(玄箱HGのEMモードのrootのパスワードはkuroadminとなってる。)
"/mnt"にHDDの下準備で作成したブート領域(/dev/hda1)をマウントする。
"/mnt2"にルート領域(/dev/hda3)をマウントする。
# mount /dev/hda1 /mnt
# mount /dev/hda3 /mnt2
ダウンロードしたファイルをftpで"/mnt2"にアップロードする。
# cd /mnt2
# ls -l
-rwxrw-r-- 1 nobody nogroup 52163601 Oct 1 00:00 debian-lenny-kuroBOX-20090317.tgz
-rwxrw-r-- 1 nobody nogroup  2430847 Oct 1 00:00 linux-image-3.2.0.24-kurobox.tar.gz
-rwxrw-r-- 1 nobody nogroup  1084564 Oct 1 00:00 linux-modules-3.2.0.24-kurobox.tar.gz

ブート領域

"/mnt"にマウントした"/dev/hda1"へカーネルを展開する。
# mkdir /mnt/boot
# tar xvzf linux-image-3.2.0.24-kurobox.tar.gz -C /mnt/boot/

ルート領域

"/mnt2"にマウントした"/dev/hda3"へdebian Lennyのシステムファイルを展開する。
# tar xvzf debian-lenny-kuroBOX-20090317.tgz -C /mnt2/
カーネルモジュールファイルを展開する。
# tar xvzf linux-modules-3.2.0.24-kurobox.tar.gz -C /mnt2/

設定ファイル修正

カーネルの2.6.28以降、AVRという電源制御チップの場所が"/dev/ttyS1"から"/dev/ttyS0"に変更されているので今回導入した3.x系カーネルに合わせて修正する。
ついでにSqueeze化に向けた設定ファイルの追記もしておく。
赤字の部分が加筆修正した部分。基本的には"ttyS1"と"ttyS0"の相互書き換え。
この修正をしないとコマンドから電源を落としたり、リブートすることが出来ない。(コンセントを引っこ抜くしかない。)
# vi /mnt2/etc/init.d/kuroevtd
#! /bin/sh

### BEGIN INIT INFO
# Provides:        kuroevtd
# Required-Start:  $network $remote_fs $syslog
# Required-Stop:   $network $remote_fs $syslog
# Default-Start:   2 4 5
# Default-Stop:    0 1 3 6
# Short-Description: Start/stop the KURO-BOX Event daemon
### END INIT INFO
# Start/stop the KURO-BOX Event Daemon.

test -f /usr/sbin/kuroevtd || exit 0

case "$1" in
start)  echo -n "Starting KURO-BOX event daemon: kuroevtd"
        start-stop-daemon --start --quiet --exec /usr/sbin/kuroevtd
        echo "."
        ;;
stop)   echo -n "Stopping KURO-BOX event daemon: kuroevtd"
        start-stop-daemon --stop --quiet --exec /usr/sbin/kuroevtd
        echo "."
        ;;
restart) echo -n "Restarting KURO-BOX event daemon: kuroevtd"
        start-stop-daemon --stop --quiet --exec /usr/sbin/kuroevtd
        start-stop-daemon --start --quiet --exec /usr/sbin/kuroevtd
        echo "."
        ;;
reload|force-reload) echo -n "Reloading configuration files for KURO-BOX event daemon: kuroevtd"
        # kuroevtd reloads automatically
        echo "."
        ;;
*)      echo "Usage: /etc/init.d/kuroevtd start|stop|restart|reload|force-reload"
        exit 1
        ;;
esac
exit 0
# vi /mnt2/etc/init.d/kuro_boot
#! /bin/sh

### BEGIN INIT INFO
# Provides:          kuro_boot
# Required-Start:    $remote_fs $all
# Required-Stop:
# Default-Start:     2 4 5
# Default-Stop:      0 1 3 6
# Short-Description: Initialize the KUROBOX AVR
### END INIT INFO

case "$1" in
start|force-reload|restart|reload)
  echo -n "ttyS0 port init : "
stty -F /dev/ttyS0 10:1:9f0d:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
  echo -n "AVR init string send"
echo -n "AAAAFFFFJJJJ>>>>VVVV>>>>ZZZZVVVVKKKK" > /dev/ttyS0
  echo "."
  ;;
stop)
  ;;
*)
  echo "Usage: /etc/init.d/$0 {start|stop|restart|reload|force-reload}"
  exit 1
esac

exit 0
# vi /mnt2/etc/kuroevtd/fanlock
#! /bin/sh
echo -n "EEEE" > /dev/ttyS0
halt
# vi /mnt2/etc/kuroevtd/resetpress
#! /bin/sh
echo -n "gggg" > /dev/ttyS0
echo -n "NGNG" > /dev/mtdblock2
shutdown -h now
# vi /mnt2/etc/kuroevtd/haltreq
#! /bin/sh
echo -n "EEEE" > /dev/ttyS0
halt
# vi /mnt2/etc/kuroevtd/powerpress
#! /bin/sh
echo -n "EEEE" > /dev/ttyS0
shutdown -h now
# vi /mnt2/etc/init.d/halt
#! /bin/sh
### BEGIN INIT INFO
# Provides:          halt
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:      0
# Short-Description: Execute the halt command.
# Description:
### END INIT INFO

NETDOWN=yes

PATH=/sbin:/usr/sbin:/bin:/usr/bin
[ -f /etc/default/halt ] && . /etc/default/halt

. /lib/lsb/init-functions

do_stop () {
 if [ "$INIT_HALT" = "" ]
 then
  case "$HALT" in
    [Pp]*)
   INIT_HALT=POWEROFF
   ;;
    [Hh]*)
   INIT_HALT=HALT
   ;;
    *)
   INIT_HALT=POWEROFF
   ;;
  esac
 fi

 # See if we need to cut the power.
 if [ "$INIT_HALT" = "POWEROFF" ] && [ -x /etc/init.d/ups-monitor ]
 then
  /etc/init.d/ups-monitor poweroff
 fi

 # Don't shut down drives if we're using RAID.
 hddown="-h"
 if grep -qs '^md.*active' /proc/mdstat
 then
  hddown=""
 fi

 # If INIT_HALT=HALT don't poweroff.
 poweroff="-p"
 if [ "$INIT_HALT" = "HALT" ]
 then
  poweroff=""
 fi

 # Make it possible to not shut down network interfaces,
 # needed to use wake-on-lan
 netdown="-i"
 if [ "$NETDOWN" = "no" ]; then
  netdown=""
 fi

 log_action_msg "Will now halt"
 echo -n "EEEE" > /dev/ttyS0
 halt -d -f $netdown $poweroff $hddown
}

case "$1" in
  start)
 # No-op
 ;;
  restart|reload|force-reload)
 echo "Error: argument '$1' not supported" >&2
 exit 3
 ;;
  stop)
 do_stop
 ;;
  *)
 echo "Usage: $0 start|stop" >&2
 exit 3
 ;;
esac

:
# vi /mnt2/etc/init.d/reboot
#! /bin/sh
### BEGIN INIT INFO
# Provides:          reboot
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:      6
# Short-Description: Execute the reboot command.
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
 # Message should end with a newline since kFreeBSD may
 # print more stuff (see #323749)
 log_action_msg "Will now restart"
 echo -n "CCCC" > /dev/ttyS0
 reboot -d -f -i
}

case "$1" in
  start)
 # No-op
 ;;
  restart|reload|force-reload)
 echo "Error: argument '$1' not supported" >&2
 exit 3
 ;;
  stop)
 do_stop
 ;;
  *)
 echo "Usage: $0 start|stop" >&2
 exit 3
 ;;
esac
# vi /mnt2/etc/inittab
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  :::
#
# 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:off:/sbin/getty 38400 tty1
2:23:off:/sbin/getty 38400 tty2
3:23:off:/sbin/getty 38400 tty3
4:23:off:/sbin/getty 38400 tty4
5:23:off:/sbin/getty 38400 tty5
6:23:off:/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
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

con:2345:respawn:/sbin/getty 57600 ttyS1

fstabの修正

パーティションのマウント位置を修正する。
パーティションをフォーマットした時のボリュームラベルで位置を示す。
# vi /mnt2/etc/fstab
# /etc/fstab: static file system information.
#
#<file system> <mount point>   <type>  <options>               <dump>  <pass>
proc             /proc           proc    defaults                0       0
LABEL=swap       none            swap    sw                      0       0
LABEL=root       /               ext3    defaults,noatime,errors=remount-ro 0 0
LABEL=mnt        /mnt            ext3    defaults,noatime        0       0

interfacesの設定

固定IPアドレス(192.168.0.100)が設定されている。
環境に合わせて修正する。DHCPに設定した。
# vi /mnt2/etc/network/interfaces
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
iface eth0 inet dhcp

iface lo inet loopback

auto eth0 lo

玄箱HGにDebian(Wheezy)を導入する(1)

HDDの下準備をする

HDDを用意し、パーティションを区切る。
ブート領域
/boot
256MB
スワップ領域
swap
1GB程度
ルート領域
/
10GB程度
Samba用
/mnt
残りの容量
EMモードでログインし"/sbin/mfdisk"を使用すればパーティションの作成など出来るようだが、見慣れないコマンドだったのでホストPCに繋げてパーティションの操作を行う。
u-bootからの起動は/bootのパーティションが大きすぎると失敗するそうなので256MB程度に抑える。

パーティションを区切って/bootの中身の無いHDDを玄箱に取り付けると勝手にEMモードで起動するので、EMモードでパーティションのフォーマットを行う。
EMモードではHDDを上で記したようにパーティションを区切ると、以下のようにデバイスファイルが割り振られている。
/dev/hda1 /dev/hda2 /dev/hda3 /dev/hda4
まずブート領域をフォーマットする。
EMモードやu-bootからはext3形式のパーティションは読み込めないようなのでext2形式でフォーマットする。
-Lオプションでボリュームラベルを設定出来る。後々便利なので設定しておく。
# mkfs -t ext2 -L boot /dev/hda1
ルート領域とスワップ領域もフォーマットする。
ext3形式でも構わないが、何故かEMモードでは読み込めなかったのでext2形式でフォーマットする。
# mkswap -L swap /dev/hda2
# mkfs -t ext2 -L root /dev/hda3
必要があればSamba用のパーティションもフォーマットする。
# mkfs -t ext2 -L mnt /dev/hda4
ひとまずHDDのパーティションの下準備完了。
ブート領域
/boot
256MB /dev/hda1
スワップ領域
swap
1GB程度 /dev/hda2
ルート領域
/
10GB程度 /dev/hda3
Samba用
/mnt
残りの容量 /dev/hda4

u-bootを導入する

玄箱は通常本体のフラッシュメモリに格納してあるkernel2.4から起動する。
debian6(sqeeze)からはkernel2.6以降が必須なので、u-bootというブートローダをフラッシュメモリに書き込んでハードディスクに格納したkernelから起動出来るようにしなくてはいけない。

フラッシュメモリのブート部分を書き換えるので失敗すると起動不能のただの箱になるので、u-bootの導入作業は充分に慎重にする必要がある。

※ 失敗したら起動不能となり復旧は困難となるため、ここを見て試してみようと奇特な方、出来ることならば他のページなども参照して頂いくことをオススメします。

u-bootのバイナリを入手する


自作する方法もあるが、u-bootのバイナリは下記のサイトのものを使わせていただいた。


LinkStation/玄箱/kernel - PukiWiki (コンパイル済みバイナリ)



u-bootを導入する


EMモードで起動し、ftpでアップロードしたバイナリイメージを書き込む。
失敗したら取り返しがつかない作業なので、慎重を期すならば玄人志向公式配布されているファームを導入するなりDebianを導入するなりして本機上でチェックサムの計算をし、自己責任のもと行う。
※EMモード時のIPアドレスはDHCPで取得される。玄人志向公式のファームウェアセットアップを実行するとIPアドレスを検索し表示してくれる。
# cat u-boot-1.2.0-hg.flash.bin > /dev/fl2
(debian化などしてkernel2.6の場合は"/dev/fl2"が"/dev/mtd1"となる)

導入確認


ネットワークコンソールでu-bootの挙動を確認する。
ホストPCのIPアドレスを(192.168.10.21)にし、netcat(windows版)を実行する。
C:\Program Files (x86)\netcat>nc -v -v -n -u -s 192.168.10.21 -p 6666 192.168.10.145 6666[return]
(UNKNOWN) [192.168.10.145] 6666 (?) open
玄箱が起動し、下記のようなステータスが表示されたら成功。
U-Boot 1.2.0 (Mar 26 2009 - 11:36:56) LinkStation HG / KuroBox HG
stdin :   nc
stdout:   nc
stderr:   nc
IDE:   Bus 0: OK

2014年11月6日木曜日

はじめに

長年玄箱HG(u-boot導入済みのDebian squeeze)に使っていたハードディスクが壊れたので、予備のディスクに入れ替えるついでに、Debian wheezyを導入していく過程の覚え書きを記す。