initrd の何をチェックしている??

LS410D

initrd.buffalo 内の initrd のサイズを変えるとブートしなくなる事がわかったが、
ちょっと気になることがあって、 initrd.buffalo 内の initrd を ar で作り直してみる。

比べてみる

オリジナルの initrd と
スクリプトで作った initrd とを比べてみる

スクリプトの変更

root@qube:/srv/tftp/ls400-111# vi remakeinitrd.sh
	:
	:
root@qube:/srv/tftp/ls400-111# cat remakeinitrd.sh
set -x

dd if=initrd.buffalo.orig of=/tmp/initrd.gz bs=64 skip=1
gunzip /tmp/initrd.gz

mkdir root
cd root
cat /tmp/initrd | cpio -id

find . -depth -print | cpio -ov > /tmp/initrd.new

root@qube:/srv/tftp/ls400-111#
オリジナルは /tmp/initrd
スクリプトで作った initrd は /tmp/initrd.new
とする。

スクリプトの実行

root@qube:/srv/tftp/ls400-111# !bash
bash remakeinitrd.sh
+ dd if=initrd.buffalo.orig of=/tmp/initrd.gz bs=64 skip=1
185731+1 records in
185731+1 records out
11886820 bytes (12 MB) copied, 7.6144 s, 1.6 MB/s
+ gunzip /tmp/initrd.gz
+ mkdir root
+ cd root
+ cat /tmp/initrd
+ cpio -id
52829 blocks
+ find . -depth -print
+ cpio -ov
./usr/lib/libreadline.so.6.2
./usr/lib/libstdc++.so.6.0.16-gdb.py
./usr/lib/libkmod.so.2
	:
	:
./www/cgi-bin/resume.cgi
./www/cgi-bin/query.cgi
./www/cgi-bin
./www
.
52612 blocks
+ exit
root@qube:/srv/tftp/ls400-111#

比べてみる

サイズは、、
root@qube:/srv/tftp/ls400-111# ls -l /tmp/initrd*
-rw-r--r-- 1 root root 27048448 Sep 28 16:49 /tmp/initrd
-rw-r--r-- 1 root root 26937344 Sep 28 16:49 /tmp/initrd.new
root@qube:/srv/tftp/ls400-111#
オリジナルのほうが大きい。なぜ?

ファイルフォーマットは、、

root@qube:/srv/tftp/ls400-111# file !$
file /tmp/initrd*
/tmp/initrd:     ASCII cpio archive (SVR4 with no CRC)
/tmp/initrd.new: cpio archive
root@qube:/srv/tftp/ls400-111#
がー。これかぁ??

ASCII cpio archive を作る

JF- Linux Kernel 2.6 Documentation- buffer-format.txt にも
initramfs バッファフォーマットは "newc" もしくは "crc" CPIO フォーマット
に基づいており
と書いてある。
ちゃんと initramfs 勉強してないのバレバレ。

ASCII cpio archive は -H newc で作るとのこと。

スクリプトの変更

root@qube:/srv/tftp/ls400-111# !vi
vi remakeinitrd.sh
	:
	:
root@qube:/srv/tftp/ls400-111# cat !$
cat remakeinitrd.sh
set -x

dd if=initrd.buffalo.orig of=/tmp/initrd.gz bs=64 skip=1
gunzip /tmp/initrd.gz

mkdir root
cd root
cat /tmp/initrd | cpio -id

find . -depth -print | cpio -ovH newc > /tmp/initrd.new
root@qube:/srv/tftp/ls400-111#
cpio に -H newc オプションを追加する。

スクリプトの実行

掃除してから実行
root@qube:/srv/tftp/ls400-111# rm -fr root
root@qube:/srv/tftp/ls400-111# rm /tmp/initrd*
root@qube:/srv/tftp/ls400-111# !bash
bash remakeinitrd.sh
+ dd if=initrd.buffalo.orig of=/tmp/initrd.gz bs=64 skip=1
185731+1 records in
185731+1 records out
11886820 bytes (12 MB) copied, 7.78992 s, 1.5 MB/s
+ gunzip /tmp/initrd.gz
+ mkdir root
+ cd root
+ cat /tmp/initrd
+ cpio -id
52829 blocks
+ cpio -ovH newc
+ find . -depth -print
./usr/lib/libreadline.so.6.2
./usr/lib/libstdc++.so.6.0.16-gdb.py
./usr/lib/libkmod.so.2
	:
	:
./www/cgi-bin/resume.cgi
./www/cgi-bin/query.cgi
./www/cgi-bin
./www
.
52829 blocks
+ exit
root@qube:/srv/tftp/ls400-111#

比べてみる

サイズは、、
root@qube:/srv/tftp/ls400-111# ls -l /tmp/initrd*
-rw-r--r-- 1 root root 27048448 Sep 28 17:00 /tmp/initrd
-rw-r--r-- 1 root root 27048448 Sep 28 17:00 /tmp/initrd.new
root@qube:/srv/tftp/ls400-111#
一致!!

ファイルフォーマットは、、

root@qube:/srv/tftp/ls400-111# file !$
file /tmp/initrd*
/tmp/initrd:     ASCII cpio archive (SVR4 with no CRC)
/tmp/initrd.new: ASCII cpio archive (SVR4 with no CRC)
root@qube:/srv/tftp/ls400-111#
一致!

中身は、、、

root@qube:/srv/tftp/ls400-111# cmp !$
cmp /tmp/initrd*
/tmp/initrd /tmp/initrd.new differ: char 8, line 1
root@qube:/srv/tftp/ls400-111#
作り直しているので、もちろん中身は違う

initrd.buffalo を作り直す

initrd のサイズが一致したので、initrd.buffalo を作り直す

スクリプトの修正

root@qube:/srv/tftp/ls400-111# !vi
vi remakeinitrd.sh
	:
	:
root@qube:/srv/tftp/ls400-111# cat !$
cat remakeinitrd.sh
set -x

dd if=initrd.buffalo.orig of=/tmp/initrd.gz bs=64 skip=1
gunzip /tmp/initrd.gz

mkdir root
cd root
cat /tmp/initrd | cpio -id

find . -depth -print | cpio -ovH newc > /tmp/initrd

gzip /tmp/initrd
mkimage -A ARM -O Linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initramfs -d /tmp/initrd.gz initrd.buffalo

rm -f /tmp/initrd.gz

rm -f ../initrd.buffalo
ln initrd.buffalo ..
root@qube:/srv/tftp/ls400-111#
ar に -H newc をつけただけで、それ以外は、ほぼ以前のもの

スクリプトの実行

root@qube:/srv/tftp/ls400-111# rm -fr root
root@qube:/srv/tftp/ls400-111# rm /tmp/initrd*
root@qube:/srv/tftp/ls400-111# !bash
bash remakeinitrd.sh
+ dd if=initrd.buffalo.orig of=/tmp/initrd.gz bs=64 skip=1
185731+1 records in
185731+1 records out
11886820 bytes (12 MB) copied, 7.51199 s, 1.6 MB/s
+ gunzip /tmp/initrd.gz
+ mkdir root
+ cd root
+ cat /tmp/initrd
+ cpio -id
52829 blocks
+ find . -depth -print
+ cpio -ovH newc
./usr/lib/libreadline.so.6.2
./usr/lib/libstdc++.so.6.0.16-gdb.py
	:
	:
./www/cgi-bin/resume.cgi
./www/cgi-bin/query.cgi
./www/cgi-bin
./www
.
52829 blocks
+ cd ..
+ rm -fr root
+ gzip /tmp/initrd
+ mkimage -A ARM -O Linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initramfs -d /tmp/initrd.gz initrd.buffalo
Image Name:   initramfs
Created:      Sat Sep 28 17:13:00 2013
Image Type:   ARM Linux RAMDisk Image (gzip compressed)
Data Size:    11925158 Bytes = 11645.66 kB = 11.37 MB
Load Address: 0x00000000
Entry Point:  0x00000000
+ rm -f /tmp/initrd.gz
+ rm -f ../initrd.buffalo
+ ln initrd.buffalo ..
root@qube:/srv/tftp/ls400-111#
できた。
念のため確認。
root@qube:/srv/tftp/ls400-111# ls -l ../initrd.buffalo
-rwxr-xr-x 2 root yamasita 11925222 Sep 28 17:13 ../initrd.buffalo
root@qube:/srv/tftp/ls400-111# ls -l initrd.buffalo
-rwxr-xr-x 2 root yamasita 11925222 Sep 28 17:13 initrd.buffalo
root@qube:/srv/tftp/ls400-111#
よし。

tftp Boot

LS410Dの電源を入れ、しばらくすると E07

Func ボタンを押す。白点滅になり、

root@qube:/srv/tftp/ls400-111# !tail
tail -f /var/log/daemon.log
	:
	:
Sep 28 17:16:23 qube in.tftpd[2295]: connect from 192.168.11.150 (192.168.11.150)
Sep 28 17:16:23 qube tftpd[2296]: tftpd: trying to get file: uImage.buffalo
Sep 28 17:16:23 qube tftpd[2296]: tftpd: serving file from /srv/tftp
Sep 28 17:16:24 qube in.tftpd[2297]: connect from 192.168.11.150 (192.168.11.150)
Sep 28 17:16:24 qube tftpd[2298]: tftpd: trying to get file: initrd.buffalo
Sep 28 17:16:24 qube tftpd[2298]: tftpd: serving file from /srv/tftp
tftp サーバに取りに来た。
しばらくして、いつもの通り消灯、白点滅、E07

やっぱり

initrd.buffalo 内の initrd を

中身を変えず touch でタイムスタンプを変えても問題なくブートしてきた
サイズを変えたらブートしなくなった。
同じサイズで作りなおし(=中身を変え)たらブートしなくなった。

つまり、単にサイズやタイムスタンプで見ているのではなく、
initrd の中身をチェックしているということか。。。



LS410D

楽天市場
Amazon


BUFFALO さん、GPLに従い、LS410Dのカーネルソースを開示してください!
ハックの記録
LinkStation/玄箱 をハックしよう

カーネルソースが開示された!

ツイート Tweet to @yasunari_y @yasunari_yをフォロー

Copyright (C) 2003-2013 Yasunari Yamashita. All Rights Reserved.
yasunari @ yamasita.jp 山下康成@京都府向日市