2012年9月9日日曜日

CuboxへDebian-SqueezeをNetworkInstallする


armhfなWheezyがstableになってないからSqueezeにしてみた。
…なんかタイトルといい、「アルファがベータをカッパらったらイプシロンした。なぜだろう?」に近いものがあるな…。
主に参考にしたサイトはこちら。

■SolidRun CuBox Wiki
Debian Installer netboot

■真・死して屍拾う者無しw
SolidRun CuBox を使ってみる(その1〜その7)

他にもいろいろと参考にしたサイトはあるけども、自分にとって一番勉強になったのが上記のサイト。
先人の方々、ホントにありがとうございます…m(__)m

【前提】
・インストール先のSDHCは1パーティション構成とする。
・FAT32でフォーマットしたUSBメモリからネットワークインストーラを起動する。
・インストール作業はLinux母艦と接続したシリアルコンソール上で行う。

【物理的に準備するもの】
・CuBox一式(付属のSDカードも含む)
・Linux母艦(今回はUbuntu12.04入りのEeePC901-Xを使用)
・有線LANのネット接続環境
・MicroUSBケーブル
・USBメモリ(60MB程度しか使わない)
・インストール対象のMicroSDカード(今回はSDHC32GB-CL10のものを使用)
…あとはタップリの時間、ですかね…。

【下準備】
■CuBox側
CuBoxは有線LANに接続し、電源アダプタは抜いておく。
インストール対象のMicroSDカードは、母艦での操作に使用しないのでCuBoxに差しておく。

■母艦側
(1)uboot関連のmake用に、uboot-mkimageをインストールする。
(ここで「u-boot-tools」も同時にインストールされる)
それと、ターミナルからシリアルコンソールに接続するためのcuコマンドもインストールしておく。
$ sudo apt-get install uboot-mkimage
$ sudo apt-get install cu
(2)SolidRun社のCuBox-Wiki「Debian Installer netboot」で指定されているリンクから、Debian-Squeeze(stable)のネットワークインストーラーイメージを取得。
$ wget http://ftp.debian.org/debian/dists/stable/main/installer-armel/current/images/versatile/netboot/initrd.gz
(3)取得したネットワークインストーラーイメージから、u-boot用の「uInitrd」に変換する。
$ mkimage -A arm -O linux -T ramdisk -C gzip -n "Debian netboot" -d initrd.gz uInitrd
(4)CuBox付属SDカードの先頭パーティション(容量が少ない方)から「boot」以下にあるカーネル「uImage」をコピーする。

(5)CuBox付属SDカードのセカンドパーティション(容量が多い方)から、「lib/modules」以下のカーネルドライバを全てgzipで圧縮しコピーする。
$ cd /[MountedMedia]/lib/modules
$ tar -cf - 2.6.32.9-dove-5.4.2|gzip -c - >  2.6.32.9-dove-5.4.2.tar.gz
(6)以下の内容の「boot.txt」を作成する。
CuBox付属SDカードの内容からは、起動パーティションとカーネル読み込みアドレスを変えてあります。
(読み込みアドレスはu-boot上で"printenv"した時の値から抜粋)
赤太字部分はCuBox付属SDカードの/boot/boot.scrとの差分
----------↓boot.txtの内容はここから↓----------
echo ======== Setting bootargs ========
setenv bootargs 'console=ttyS0,115200n8 vmalloc=384M root=/dev/mmcblk0p1 video=dovefb:lcd0:1920x1080-32@60-edid clcd.lcd0_enable=1 clcd.lcd1_enable=0'
echo ======== Loading kernel ========
ext2load mmc 0:1 0x2000000 /boot/uImage
echo ======== Booting kernel ========
bootm 0x2000000
----------↑boot.txtの内容はここまで↑----------

(7)上記の「boot.txt」から「boot.scr」を生成する。
$ mkimage -A arm -O linux -T script -C none -n "U-Boot script" -d boot.txt boot.scr
(8)ここまでで準備した…
・「uImage」 (u-boot用カーネル)
・「2.6.32.9-dove-5.4.2.tar.gz」(u-boot用カーネルドライバ群)
・「uInitrd」 (u-boot用ネットワークインストーラーイメージ)
・「boot.scr」(u-boot用カーネルの起動用スクリプトファイル)
…の4ファイルをUSBメモリへコピーする。

【インストール作業】
■母艦とCuBoxの接続
(1)CuBoxと母艦をUSBで接続。(CuBox側のMicroUSB-B端子に接続する)
(2)接続後、dmesgで接続先のシリアルコンソールを確認しておく。
(以下の赤太字部分が接続先。環境によって変わるので注意!)
$ dmesg

FTDI USB Serial Device converter now attached to ttyUSB0
(3)接続先のシリアルコンソールに対してアクセス権を設定しておく。
$ sudo adduser lassie dialout
$ sudo chmod a+rw /dev/ttyUSB0
(4)ターミナルからCuBoxのシリアルコンソールに接続。
$ cu -l ttyUSB0 -s 115200
"Connected."と出れば成功。

■Debianのインストール
(1)USBメモリをCuBoxのUSB#0(上段)に差し込んでCuBoxを起動する。
ターミナルに起動メッセージが流れるが、
"Hit any key to stop autoboot:  3"
の表示が出たら、3から0へカウントダウンする間に何かのキーを押す。

(2)u-bootコンソールから以下のコマンドを叩いて、USBからインストーラーを起動する。
> usb start
> mmcinfo
> setenv bootargs console=ttyS0,115200n8
> fatload usb 0:1 0x2000000 uImage
> fatload usb 0:1 0x3000000 uInitrd
> bootm 0x2000000 0x3000000
(3)インストールオプションの設定
"Select a language"
→ここではインストーラの表示言語ではなく、Linux上の"LANG"パラメータで指定するローカライズを設定する。
ここはローカライズ無しの"C"を選択。

"Select your location"
"Asia">"Japan"を選択。
この後、ネットワーク設定に入るが、DHCP環境下なら特に設定無く次へ進む。

"Configure the network"
→ホスト名を設定。次の画面ではネットワーク接続用のドメインを設定。

"Choose a mirror of the Debian archive"
"Japan">"ftp.jp.debian.org"を選択。次の画面では接続用のProxyを設定。

"Download installer components"
→「カーネルが無いよ!」と言われているが、後で「uImage」を入れるから大丈夫。
"Yes"を選択。

"Set up users and passwords"
→以下の順番でrootパスワードと一般ユーザーのアカウントを設定する。
1.rootのパスワードを設定する。確認含めて2回。
2.一般ユーザーのフルネームを設定する。
3.一般ユーザーのアカウントを設定する。
4.一般ユーザーのパスワードを設定する。確認含めて2回。

"Partition disks"
→以下の順番でMicroSDのパーティションを設定する。
1.「ソフトウェアRAIDが使えないよ!」と言われるが、使わないので無問題。
"Continue"を選択。
2.次の画面ではパーテイションの設定をガイドに任せるか手動で設定するかを選択する。
ここでは1パーティション構成にするため"Guided - use entire disk">"MMC/SD card #1 (mmcblk0)">"All files in one partition (recommended for new users)">"Finish partitioning and write changes to disk">"Yes"を選択する。
ここで、SDカードのパーティション構成は以下のように設定される。
----------↓SDHC32GBのパーティション構成↓----------
MMC/SD card #1 (mmcblk0) - 31.9 GB SD SU32G
> #1 primary 30.6 GB B F ext3 /
> #5 logical 1.3 GB F swap swap

----------↑SDHC32GBのパーティション構成↑----------

「/」がext3でフォーマットされるが、SDカード等のフラッシュメモリではext4の方が高速なので、後の作業で変換する。
※2パーティション以上の構成にする場合は、「boot.scr」も編集する必要があるので注意!

"Install the base system"
→「カーネルが無いよ!」と(以下略)
"Yes"を選択。

"Configuring popularity-contest"
→通称popcon。投票しないので"No"を選択。

"Software selection"
→必要なパッケージをチェック。ウチの構成はこんな感じ。
----------↓パッケージ設定例↓----------
[ ] Graphical desktop environment
[*] Web server
[ ] Print server
[*] DNS server
[*] File server
[ ] Mail server
[ ] SQL database
[*] SSH server
[ ] Laptop
[*] Standard system utilities
----------↑パッケージ設定例↑----------

GUIは緊急用に入れておいて、後でgdmで切る、っていう手もあるけど、まぁ勉強のために今回は入れない方向で。
Mailも悩んだけど、RaspberryPiを使い始めたらまた考えよう、ということで一旦保留。
WebServerはMuninで使うためチェック。DNSは…OCN環境下のYouTube対策に、宅内DNSも検討しとこうかな、と…。
SSHとStandard system utilitiesはほぼ必須かと。
この後はインストールするパッケージ毎に必要な設定を聞かれる。

"Continue without boot loader"
→「何か特殊なアーキテクチャだからブートローダー入らんかった」(意訳)という感じ。
後で「boot.scr」を入れればいいので"Continue"を選択。…他に選択肢なんか無いけど。

"Finish the installation"
まだ終わっちゃらめぇぇぇ!!!壊れちゃうよぉぉぉ!!!
…まぁ、「壊れちゃう」は言い過ぎだけど。
このまま再起動されても自動起動してくれないので"Go Back"を選択。
"Go Back"を選択。(大事な事なので2度)

"Debian installer main menu"
→ここから今までの選択内容の見直しができるが、今回は手作業でチョイチョイ修正するので"Execute a shell">"Continue"を選択。
さて、コマンドが打てる状態になったところで、以下を実行する。

[ext4への変換(CuBox側)]
SDカードのアクセスは、ext3よりもext4の方が高速に行えるため、インストール時にext3でフォーマットされた「/」の領域をext4に変換する。
(正確には、ext4相当の情報に書き換えておき、後で母艦側でfsckを行い実際のext4変換を行う)
# tune2fs -O extents,uninit_bg,dir_index /dev/mmcblk0p1
# nano /target/etc/fstab
→fstab中のext3となっている部分をext4に書き換えておく。
[no journaling modeにする]
パフォーマンス重視な人はこちらも。
# tune2fs -c 0 -O ^has_journal /dev/mmcblk0p1
ただ、瞬断等のデータ破壊が怖いので、ウチの場合は次の「journal_data_writeback」モードにしておいた。

[journal_data_writeback modeにする]
フルジャーナルより早くて、ノンジャーナルよりは安心、という中庸設定。
ジャーナル情報があれば、間違ってrm-rfしても、extundeleteで復活できるってのは大きなメリットだと思うので、ウチの場合はこちらを採用。
# tune2fs -c 0 -o journal_data_writeback /dev/mmcblk0p1
[USBメモリからのファイルコピー]
あとはUSBメモリの「uImage」「2.6.32.9-dove-5.4.2.tar.gz」「boot.scr」をCuBoxのSDカードに書きだしてやればひとまずOK。
このExecute Shellの段階では、CuBoxのSDカードは「/target」にマウントされている。
# mount -t vfat /dev/sda1 /mnt
# cd /mnt
# cp boot.scr uImage /target/boot/
# cd /target/lib/modules/
# gunzip -dc /mnt/2.6.32.9-dove-5.4.2.tar.gz |tar -xf -
# sync
# exit
exitでシェルを抜けると"Debian installer main menu"が出てくるので、"Finish the installation">"Continue"を選択して終了。


自動的に再起動されるのでしばらく待つと、カーネルが起動する…が、これまでの手順でext4変換を行なっていると、ここでカーネルパニックになってしまう。
これはfsckによるext4変換が完全に終了していないため。
fsckはデバイスをマウントしていない状態で行う必要があるが、Execute ShellではResourceBusyでMicroSDをアンマウントできない。そのため、母艦側でfsckを実行してやる必要があるのだ。

[ext4への変換(母艦側)]
CuBoxの電源を抜き、USBメモリとMicroSDカードを抜き取り、MicroSDカードは母艦側に挿し込む。
母艦側では「フォーマット情報がおかしいからマウントできないよ」(意訳)と言われるため、ターミナルを開いてfsckを実行する。
MicroSDカードのデバイス番号はdmesgで調べておくこと。
# sudo fsck -f /dev/[DeviceNo]
これでデバイスのext4変換が完了するので、MicroSDをCuBoxに戻し、電源を入れると、ようやくDebianが起動する。
あとはrootに入ってsudoの設定をするなり、パスを切るなりご自由に…。

今回はLinuxターミナルからのシリアルコンソール接続やら、u-bootのコマンドやら、色々勉強になって良かった。
RaspberryPiやBeagleBoard(PandaBoard)等のおかげでARMサーバも普及しつつあるみたいだし、今回の経験も今後に生きる…といいなぁ…。

2012年9月7日金曜日

Ubuntu12.04を入れたAZにUbuntu12.10用のTegra2ドライバを入れてみた


2chAZスレPart7で2012/7/18版のTegra2ドライバを入れてた人がいたので、CuBoxのためにarmhf界隈の現状を知っておこうと、早速試してみた。

■Ubuntu12.04(Precise)のインストール
12.04.1が出た今でも、ARM用のUbuntuは12.04のまま。
インストール自体は前回同様だけど、いまだに発生するクラッシュレポートにウンザリしたため以下の対処を追加した。

■クラッシュレポートを無効にする
$ sudo nano /etc/default/apport

最下行のenabledを"0"に変更。

■Tegra2ドライバの入手
ここまでの時点でubuntu_backup等でバックアップを取っておくことを推奨。
そしてここからが本番。

Launchpadの「nvidia-tegra 15.1.0-0ubuntu1 (armhf binary) in ubuntu quantal」から
「nvidia-tegra_15.1.0-0ubuntu1_armhf.deb」を、
同じくLunchpadの「“nvidia-graphics-drivers-tegra” 15.1.0-0ubuntu1 source package in Ubuntu」から
「nvidia-graphics-drivers-tegra_15.1.0.orig.tar.gz」をダウンロード。

■Tegra2ドライバのインストール
「nvidia-tegra_15.1.0-0ubuntu1_armhf.deb」インストール後、「nvidia-graphics-drivers-tegra_15.1.0.orig.tar.gz」を解凍し、ABI11用の「tegra_drv.so」を「/usr/lib/nvidia-tegra/xorg」以下にコピー。

$ sudo cp [Unzipped-tegra_drv.so] /usr/lib/nvidia-tegra/xorg/

Xを再起動すれば完了。


画面表示がキビキビするけど、たまにフリーズしたり、マウスカーソルが消失したりと、割と動作が不安定なので、デスクトップ端末として使うならQuantalに期待かなぁ…。
RaspberryPi到着までの間、このままX切って、USB-LANアダプタ使ってVPNサーバにしてみるのも手か。

そして結構頻繁にクラッシュレポートが出ることから、現状のarmhfの安定性にも不安を感じる結果となったので、CuBoxの方はarmhfなDebian-WheezyのSatble版がリリースされるまで、armelなDebian-Squeezeで運用することにするか…。
EeePC901-Xで動作してるUbuntu12.04はこんなに不安定じゃないから、新しいアーキテクチャ(例えばarmhf64とか)が出ても、対応したDebianのStable版が出るまでは本採用を見送るのが吉、ということなのかもなぁ。

2012年9月2日日曜日

CuBox到着!

Android端末等でブラウジング中に表示される広告が非常にウザい!

Proxy立てて広告フィルタリングすれば良くね?

という短絡思考で(またかよ)7/25に購入したCuBoxが、ようやく手元に到着したので、到着までの流れを記録しておく。

■7/25 購入~支払完了
SolidRunのWebStoreより購入手続きを実施。支払はPayPalで。
購入手続き前にPayPalに英語表記の住所も登録しておくと、配達トラブルを防いだり、購入先のお店で確認がスムーズに進んだりと、色々と便利なのでオススメ。
今回は、その日のうちに購入手続きと支払手続きはスムーズに完了。

■7/29 おおまかな出荷日の連絡~出荷待ち
SolidRunより「色々混雑してて大変だけど、8/15までには出荷するよ!」(超訳)との英文メールが到着。
「おおまかな出荷日」と書いたのは…8/15を過ぎても何の連絡も無かったため。
まぁ、海外のCuBox関連のフォーラムでも…
Q:出荷日を過ぎても出荷されないんだけど…。
A:みんなそうだよ!あの会社の『出荷日連絡』なんてジョークだと思って、ゆっくり待ってるといいさ!
(超訳)
…みたいなやりとりを良く見かけたので、出荷日が2~3週ズレるなんてのは当然のことだと思っておいた方が良いみたい。

■8/24 出荷連絡~行方不明
SolidRunから出荷連絡のメールが到着。
…しかし、イスラエル郵便局のページからEMS番号で追跡しても「そんな荷物知らない」とのつれないお返事。そんな状態が2日程続く。

■8/26 日本に向けて配達
EMS番号追跡でようやくヒットしたかと思ったら「日本に向けて配達したよ!」との突然の追跡結果。まぁ、無事が確認できたので何より。
ここからは日本に到着するまで、イスラエル郵便局のページでも日本郵便のページでも追跡不可能。

■8/28 日本到着
日本郵便のページからEMS番号検索をかけると、ようやく「国際交換支店に到着」のステータスに。
ここから税関通るまで待ち状態が続く…。

■8/29 通関手続~発送
思ったより早く「通関手続中」「国際交換支店から発送」のステータスに。
ここで「国際交換支店から発送」のステータスが二度表示された場合は、税関通るのに時間がかかるらしいけど、今回は難なく発送されたようで一安心。
あとは届くのを待つだけだ!

■8/30 最寄りの郵便局に到着
■8/31 手元に到着!
…というわけで、購入から到着まで一ヶ月ちょい。5週間くらいかかったけど、昨年末の受付開始から、年初にかけての注文ラッシュの頃に比べたら、ずいぶん早く届くようになったんじゃないだろうか?

ちなみに、8/12に注文したRaspberry Piの方は「Despatch expected within 16 week(s)」ということなので…まぁ、こっちはそんなに急ぐ用事で使うわけではないので、今年中に着けばいい方なんじゃないだろうか(^^;
Raspberry Piについては、今ならModMyPiのページから注文すると、RSComponentsで注文するより早く届くそうな。


しかし…見事なまでの小ささ。文庫本2冊を平積みにするスペースがあれば、CuBoxが6台置けちゃうぞ。
ちなみに、初期ロットとセカンドロット以降では、シリアルポートの位置(本体側面S/PDIF下部→背面)と、付属するSDカードの容量(2GB→4GB)が違うようだ。ウチのはセカンドロット以降のヤツだね…。

さて、今はちょっと仕事が忙しいので、落ち着いたら…

・EeePC901:内蔵無線LAN→CrystalHDに換装したら、Ubuntu上のXBMCでメディアサーバに。
・CuBox:Squid+Polipoで、スマートデバイス用のコンテンツフィルタ兼宅内Proxyサーバに。他いろいろ。
・RaspberryPi:L2TP/IPSecなVPN専用サーバに。

という構成に組み上げてみるかね。
…RspberryPiが届くまで、DynabookAZをVPNサーバーに仕立てて使ってみてもいいかもなぁ…。