2011/04/09日

玄箱HGをlennyからsqueezeにアップグレードする(powerpc)


注意

U-Bootの設定はネットコンソールを使用する。
その為シリアルコンソールはなくても良い。
しかしネットコンソールには表示されない情報がある。
ネットコンソールでは起動しない場合の原因の追究がシリアルコンソールより困難になる。

玄箱 HGのシリアルコンソールを使用する場合の設定は以下のようにする。

通信設定
ボー・レート57600
データ8bit
パリティnone
ストップビット1bit
フロー制御none
配線
1GND
2VCC
3RxD
4TxD

RxDは基盤の裏面にショートさせなければいけない場所がある。
これを行わないと入力を受け付けない。
モニタするだけなら必要ない。
またsqueezeにアップグレード後はシリアルコンソールの入力反応が悪くなる。

カーネルのコンパイルを行うが時間がかかるので注意する。
またu-bootでカーネルが読込めない状況が発生する可能性がある。
発生条件はつかめていない。
多分ディスクのサイズ、パーティションのサイズが関係してるようだ。
また試してはしないがGPTディスクも読めないと思う。
第3パーティションの/bootに置いたカーネルが読み込めない場合は第1パーティションの/bootに置いて試してみる。
それでも読めない場合はEMモードの/sbin/mfdiskを使用しパーティションをすべて削除する。
EMモードの/sbin/mkfilesystem.shでパーティション分割とフォーマットを行う。
これで第1パーティションの/bootに置いたカーネルは読めるようにると思う。
パーティションの削除を行う必要が生じた場合に備えて玄箱HG以外でハードディスクを読める手段を用意したほうが良い。
うまく出来ない場合に備えディスク待避は行っていた方が安全だ。

起動確認済みディスク

loader.oの設定が/dev/hda3側もしてあると再起動のたびに/dev/hda1側と/dev/hda3側が切り換る。
事前に/dev/hda3側の設定をやめ常に/dev/hda3側が起動するようしておく。

フラッシュの書込みを行うが失敗すると玄箱HGが起動しなくなる可能性が高い。
フラッシュに書込むときは十分注意する。
またフラッシュの読出しを行う時に間違って書込んでしまわないように注意する。

環境

移行前

移行後

PC側

方針

作業(PC側)

netcatのインストール

netcatはネットコンソール用通信ソフトとして使える。
netcatの説明は オンラインソフトを使え! 「第12回 Netcat」が詳しい。

PC側のOSがWindowsの場合はwin32版のnetcatをインストールする。
netcat win32で検索すれば見つかる。
Jesse's Website - Downloadsからダウンロードできる。
GenBako Kernel Collection u-boot_loaderからもダウンロードできる。
こちらはソースファイルも入っていてファイル名はnc111nt.zipだ。
Jesse's Website - DownloadsとGenBako Kernel Collectionのバイナリは同一のものだ。

PC側がdebianならパッケージがある。

$ sudo aptitude install netcat

sshクライアントのインストール

アップグレードはsshで接続して行う。
sshクライアントをインストールしていなければ、インストールする。
sshクライアントの設定は「sshクライアントの使い方と設定(Windows TeraTerm + Pageant + PuTTYgen)」に記述してある。
PC側がdebianの場合は「sshクライアントの使い方と設定(debian lenny,squeeze)(CentOS 5.5 x86_64)」に記述してある。

ネットコンソール用のIPアドレスを追加する

PC側のIPアドレスにネットコンソール用のIPアドレス192.168.10.21を追加する。
DHCPでアドレスを設定するようになっていると追加のアドレスを設定できないので固定の設定に変更する。
現在のネットワークアドレスに属するアドレスを設定し、その上で追加でネットコンソール用のアドレスを追加する。
DHCPから固定のアドレスに切替えた場合はDHCPが割振る範囲外のアドレスを使用する必要がある。

今回使用するU-Bootバイナリのデフォルトで設定されているアドレスは以下である。

ネットコンソール用アドレス
マシンIPアドレスポート番号
玄箱HG192.168.10.1456666
PC 192.168.10.216666

作業(玄箱HG側)

sshを使用する。
設定していなければ設定する。
設定方法は「sshサーバを設定する(debian lenny,squeeze)(CentOS 5.5 x86_64)」に記述してある。

フラッシュのバックアップを行う

ルートになりホームディレクトリに移動。

$ su
# cd

フラッシュをファイルにバックアップする。

# cp /dev/mtd0 mtd0
# cp /dev/mtd1 mtd1
# cp /dev/mtd2 mtd2
# cp /dev/mtd3 mtd3

/dev/mtdの設定をしていなければEMモードで行う。
EMモードでは/dev/fl1、/dev/fl2、dev/fl3のバックアップを行う。

バックアップファイルは別マシンにもコピーする。

必要なパッケージのインストール

カーネルのソースを入手するのにwgetを使用する。
カーネルのソースはbzip2で圧縮されているので展開するのに使用する。
u-bootイメージをコンパイルする為にuboot-mkimageを使用する。
menuconfigを行うのにncurses-devが必要。

# aptitude install wget bzip2 screen gcc uboot-mkimage ncurses-dev

カーネルのコンパイルを行う

カーネルのコンパイルは「 玄箱HG Debian 自宅サーバ化総編 最新カーネルに挑戦」を参考にさせていただいた。
またカーネルのコンパイル以外に関しても参考にさせていただいている。

# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz2
# tar jxpvf linux-2.6.32.2.tar.bz2
# cd linux-2.6.32.2
# make ARCH=powerpc linkstation_defconfig
# cp -p ./.config ./.config.org

# nano ./.config

crtl-wで単語の検索ができる。
CONFIG_SYSFS_DEPRECATEDを検索する。
有効になっているのでコメントアウトし無効にする。
CONFIG_SYSFS_DEPRECATED_V2もコメントアウトし無効にする。
以下の2つの項目がこの通りになっているか確認する。
CONFIG_INOTIFY_USERが有効
CONFIG_SIGNALFDが有効

# make menuconfig

nanoでコメントアウトした項目が正式のコメントアウトの形式に変換される。

# make uImage
# make modules
# make modules_install
# cp -p System.map /boot/System.map
# cp -p arch/powerpc/boot/uImage /boot/vmlinux.UBoot
# scripts/dtc/dtc -f -I dts -O dtb -o /boot/kuroboxHG.dtb -V 16 arch/powerpc/boot/dts/kuroboxHG.dts

カーネルに依存しないアップグレード

エラー状態のパッケージがあるか確認。

# dpkg --audit

hold状態のパッケージがあるか確認。

# aptitude search "~ahold" | grep "^.h"
# dpkg --get-selections | grep hold

ソースリスト修正。

# nano /etc/apt/sources.list

有効行をすべてコメントアウトし以下を追加。

deb http://ftp.jp.debian.org/debian/ squeeze main contrib non-free
deb http://security.debian.org/ squeeze/updates main contrib non-free
deb http://ftp.jp.debian.org/debian/ squeeze-updates main contrib non-free

screenでセッションを張る。

# screen -S upgrade

パッケージリストの更新。

# apt-get update

アップグレード1段階目。

# apt-get upgrade

カーネルを切替える準備をする

/bootの内容を第1パーティションの/bootにもコピーする。

# mount /dev/hda1 /mnt
# cp /boot/* /mnt/boot/

fstabを編集し/dev/hdaを/dev/sdaに変更する。
少なくとも/とswapの2箇所は変更する。

シリアルコンソールがttyS0からttyS1に変更になっているのでinittabを修正する。

# nano /etc/inittab
シリアルコンソール用 con:2345:respawn:/sbin/getty 57600 ttyS1 にする
# depmod -a

U-Bootのインストール

LinkStation/TeraStation/玄箱/PPC/Debian/Squeeze DTC対応U-Bootの作成 コンパイル済みバイナリ」からu-boot-1.2.0-hg.flash.binを取得する。
玄箱用、玄箱HG用に分かれ、さらにRAM版、FLASH版に分かれている。
間違わないようにする。
間違えたら起動不能になる可能性が高い。
wgetではダウンロードできないアドレスになっているので別の方法でダウンロードする必要がある。
lynxを使用すれば玄箱HGからダウンロード出来る。
PCでダウンローロードしてscpで玄箱HGにコピーしても良い。
2011/04/09に取得したファイルのmd5sumはc3ae10f906db089213978b71c2a8f3f1。
ファイルサイズは187488バイト。

# cat u-boot-1.2.0-hg.flash.bin > /dev/mtdblock1
# cat /dev/mtd1 > tmp
# cmp u-boot-1.2.0-hg.flash.bin tmp
cmp: ファイルu-boot-1.2.0-hg.flash.binの末尾

u-boot-1.2.0-hg.flash.binファイルの最後まで同じであることが確認できた。

/dev/mtdの設定をしていなければEMモードで行う。
EMモードでは書込む場所は/dev/fl2だ。

再起動しU-Bootの設定を行う

PC側でnetcatを動かす。
windowsの場合はスタートメニューからコマンドプロンプトを起動する。
netcatを置いたフォルダに移動する。
netcatを起動する。

>nc -v -v -n -u -s 192.168.10.21 -p 6666 192.168.10.145 6666

以下のように表示される。

(UNKNOWN) [192.168.10.145] 6666 (?) open

玄箱HGを再起動させる

# reboot

玄箱HGが再起動している間にWindowsのnetcatが起動しているコマンドプロンプトでEnterを何回か押す。
設定が間違えていなければ接続できる。
以下のような表示がでる。
表示内容はハードディスクのモデルやシリアル番号の部分もあるので同じ内容にはならない。


stdin :   nc
stdout:   nc
stderr:   nc
IDE:   Bus 0: OK
  Device 0: Model: WDC WD15EADS-00P8B0 Firm: 01.00A01 Ser#: WD-WMAVU0779377
            Type: Hard Disk
            Supports 48-bit addressing
            Capacity: 1430799.3 MB = 1397.2 GB (-1364690128 x 512)
Boot in 10 seconds ('s' to stop)...avr_input: Unexpected code: 0x25

's'を押すとU-Bootのコンソールに入る。
ネットコンソールを使用している場合は's'を押した後Enterキーを押す必要がある。

第3パーティションから起動するようにする。

=> setenv hdpart 0:3
=> setenv bootargs root=/dev/sda3
=> setenv bootmhd bootm ${ldaddr} - 7f0000
=> setenv hdboot run hdload bootmhd

カーネルの読込みテストを行う。

=> run hdload

以下のエラーはハードディスクが接続されていない、ハードディスクに電源ケーブルが接続されていない等の状況で起きる。


** Bad partition 1 **
** Bad partition 1 **

多分このエラーは容量が大きなハードディスクを使用した場合起きる可能性があると思われる。


 ** ext2fs_devread() read outside partition sector -1979448616

** Unable to read "boot/vmlinux.UBoot" from ide 0:3 **
 ** ext2fs_devread() read outside partition sector -1979448616

** Unable to read "boot/kuroboxHG.dtb" from ide 0:3 **

このエラーも容量が大きなハードディスクで起こると思われる。


Error (no IRQ) dev 0 blk 1851250109: status 0x51
 ** ext2fs_devread() read error - last part

** Unable to read "boot/vmlinux.UBoot" from ide 0:3 **
Error (no IRQ) dev 0 blk 1851250109: status 0x51
 ** ext2fs_devread() read error - last part

** Unable to read "boot/kuroboxHG.dtb" from ide 0:3 **

エラーが起きた場合は第1パーティションから読み込むようにする。

=> setenv hdpart 0:1
=> run hdload

第1パーティションで読込みが成功したら以下のように表示される。


Loading 0:1:boot/vmlinux.UBoot

1921101 bytes read

2371 bytes read

成功した場合は起動させる。

=> boot

このU-Bootの設定は保存しておかないと消えてしまう。
起動できる設定を見つけたらsaveenvコマンドで保存しておく。

成功しない場合はパーティションの分割から行う必要がある。

udevのアップグレード

$ su
# screen -S upgrade
# apt-get install udev

再起動。

# reboot

残りのアップグレード

$ su
# screen -S upgrade
# apt-get dist-upgrade

起動スクリプトがLSB(Linux Standard Base)を満たしていない警告が出る。
起動スクリプトをすべてLSBを満たすようにしてsysv-rcを設定しなおすと起動シーケンスをイベント起動に変更できる。
しかしこの変更を行わない。
イベント起動に変更した場合haltで電源が切れなくなり、rebootも出来なくなる。
LSBに対応させてもsysv-rc再設定を行わなければhaltやrebootは正常動作する。
LinkStation/TeraStation/玄箱/PPC/Debian/Squeeze Debian由来でない LinkStation?/TeraStation?/玄箱 独自のファイルに玄箱独自のファイルをLSBに対応させる方法が記述されている。

再起動。

# reboot

完了。


U-Bootのコマンド

U-Bootの組込みコマンド抜粋

help
コマンドの一覧を表示する
printenv
環境変数を表示する
setenv 環境変数 値
環境変数に値を設定する
setenv 環境変数
環境変数を削除する
saveenv
設定されている環境変数を保存する(プロテクトが掛かっていると保存できない)
protect
プロテクト/アンプロテクトのトグル動作
run 環境変数
環境変数をコマンドとして実行する
boot
ブートする(環境変数しだいだがOSをブートする)
bootm アドレス
アドレスをプログラムとし実行する
reset
CPUリセット
dhcp
DHCPサーバから情報を取得し設定する
flinf
フラッシュに情報を表示する
ping IPアドレス
pingを打つ
;
コマンドのセパレータ

環境変数設定済みコマンド抜粋

run writeng
NGNGをフラッシュ(/dev/fl2)に書込む
run flboot
フラッシュのカーネルを起動する
run writengに続いて実行することでEMモードになる
run emboot
1回だけEMモードでブートする
EMモードのIDはroot、PWはkuroadmin
run writeok
OKOKをフラッシュ(/dev/fl2)に書込む
EMモードを抜ける
run ser
入力(stdin)、出力(stdout)、エラー出力(stderr)をシリアルコンソールに変更する
run nc
入力(stdin)、出力(stdout)、エラー出力(stderr)をネットコンソールに変更する
run hdload
カーネルを読込む

環境変数抜粋

hdpart
カーネルの存在するディスクを指定する。
bootargs
カーネルに渡すオプションを指定する。
デフォルトの状態では起動時に上書きされてしまうのでここの内容は反映されない。
このページの設定を行えば上書きをやめるのでこの設定値をオプションとして渡すようになる。
stdin
入力デバイスを指定する。
指定できる値はnc(ネットコンソール)、serial(シリアルコンソール)。
設定値は即座に反映される。
stdout
出力デバイスを指定する。
指定できる値はnc(ネットコンソール)、serial(シリアルコンソール)。
設定値は即座に反映される。
stderr
エラー出力デバイスを指定する。
指定できる値はnc(ネットコンソール)、serial(シリアルコンソール)。
設定値は即座に反映される。
ipaddr
玄箱HGのIPアドレス。
設定値は即座に反映される。
ncip
ネットコンソールの相手側のIPアドレス。
設定値は即座に反映される。

警告の回避

起動ログの警告

Files under mount point '/lib/init/rw' will be hidden. ... (warning).
/lib/init/rwをマウントポイントにしているのでそのフォルダに下からあるファイル(フォルダ)が隠れてしまっている。
一旦アンマウントし下にあるファイル(フォルダ)を削除すればよい。
.udev/ already exists on the static /dev! ... (warning).
udevが/dev/.udevを作成しようとしたとき既に/dev/.udevが存在している。
ディスクを一旦別のシステムにマウントし削除する。
/etc/network/options still exists and it will be IGNORED! Read README.Debian of netbase. ... (warning).
/etc/network/optionsが存在していると出る警告なのでこのファイルをリネームするか削除すれば良い。
Will now mount local filesystems:mount: none already mounted or /dev/pts busy
mount: according to mtab, devpts is already mounted on /dev/pts
failed!
fstabでnoneを/dev/ptsにマウントしているのでこの行をコメントアウトする。
/etc/init.d/mountdevsubfs.shでマウントしているのでfstabの方はコメントアウトしてよい。

起動スクリプトの警告

insserv: warning: script 'S01kuro_load_wd' missing LSB tags and overrides
loader.o用のスクリプトなので不要。
削除する。
insserv: warning: script 'K20kuroevtd' missing LSB tags and overrides
LinkStation/TeraStation/玄箱/PPC/Debian/Squeeze /etc/init.d/ 配下のスクリプトの LSB 4.0 対応を参考に修正する。
insserv: warning: script 'K99kuro_boot' missing LSB tags and overrides
LinkStation/TeraStation/玄箱/PPC/Debian/Squeeze /etc/init.d/ 配下のスクリプトの LSB 4.0 対応を参考に修正する。

起動できない場合の可能性

起動できるディスクを別の玄箱HGに入れたら起動できなくなった。
(通信できなくて起動できたか分からない。)
前の玄箱HGのMACアドレスの情報が残っているので無効なeth0になってしまう。
/etc/udev/rules.d/にあるルールのなかでeth0を設定するルールを削除する。
/etc/udev/rules.d/70-persistent-net.rulesがeth0を設定するルールになっている。
このファイルを削除する。

リンク

参考

関連


[Top]