*カーネルとユーザランドの統合単一イメージ [#oa3ea85d]
-概要~
linuxカーネルとbusyboxベースのユーザランドを単一イメージ化した、 vmlinuz-initramfs-landisk を作成しました。~
本イメージの特徴は、rootfsをramfsを上に構築するため、外部ストレージを必要としないことです。~
~
-単一バイナリ~
%%[[vmlinuz-initramfs-landisk-05:http://eggplant.ddo.jp/www/download/kernel26/vmlinuz-initramfs-landisk/vmlinuz-initramfs-landisk-05]] (3,575,808 byte)%%~
[[vmlinuz-initramfs-landisk-08:http://eggplant.ddo.jp/www/download/kernel26/vmlinuz-initramfs-landisk/vmlinuz-initramfs-landisk-08]] -- uClibcベース (2,666,496 byte)~
( 2007/06/17 )~
~
-実行方法
#pre{{
# kexec --append="mem=64M console=ttySC1,9600" vmlinuz-initramfs-landisk.08
}}
**機能について [#e370789f]
-ログイン~
--シリアルコンソール(ttySC1)
--USBシリアル(ttyUSB0)
--telnetよりアクセス可能(user=root,passwd=landisk)~
&color(red){ただしセキュリティは未考慮です。};
~
-ネットワーク~
--DHCPクライアント機能によりIPアドレスを自動で設定
--wget, telnetd
~
-レスキュー機能
--システム構築/修復に役立つコマンドを収録~
本イメージ単体でシステム構築が可能です。~
fdisk, mkfs.(ext2,ext3,reisrfs),fsck.(ext2,ext3,reisrfs),lilo, etc.~
--usb-strageを使用可能~
USB経由で、CompactFlash, MicroDrive, HDD, USB-stick等を使用可能。~
~
~
**構成の詳細 [#w7efcd7b]
-kernel~
--linux-2.6.22-rc2-landisk ベース
--usb-strageとusb-serial(pl2303, ftdi_sio) をカーネル組み込む済み
-initramfs 内蔵コマンド (詳細は[[initramfs.tgz:http://eggplant.ddo.jp/www/download/kernel26/vmlinuz-initramfs-landisk/initramfs.tgz]] を参照)~
--lilo
--kexec, shutdown(script)
--strace
--reiserfs関連 … mk.reiserfs, fsck.reiserfs
--landisk制御 … ledctrl, btnctrl, gio2
--busybox
-
#pre{{
BusyBox v1.2.1 (2007.05.25-11:04+0000) multi-call binary
Currently defined functions:
[, [[, addgroup, adduser, adjtimex, ar, arping, ash, awk, basename, bbconfig,
bunzip2, busybox, bzcat, cal, cat, catv, chattr, chgrp, chmod, chown, chroot,
chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cut, date, dc,
dd, deallocvt, delgroup, deluser, devfsd, df, diff, dirname, dmesg, dnsd,
dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, e2fsck, e2label, echo,
ed, egrep, eject, env, ether-wake, expr, fakeidentd, false, fbset, fdflush,
fdformat, fdisk, fgrep, find, findfs, fold, free, freeramdisk, fsck, fsck.ext2,
fsck.ext3, fsck.minix, ftpget, ftpput, fuser, getopt, getty, grep, gunzip,
gzip, halt, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock,
id, ifconfig, ifdown, ifup, inetd, init, insmod, install, ip, ipaddr, ipcalc,
ipcrm, ipcs, iplink, iproute, iptunnel, kill, killall, klogd, lash, last,
length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger,
login, logname, logread, losetup, ls, lsattr, lsmod, lzmacat, makedevs,
md5sum, mdev, mesg, mkdir, mke2fs, mkfifo, mkfs.ext2, mkfs.ext3, mkfs.minix,
mknod, mkswap, mktemp, modprobe, more, mount, mountpoint, msh, mt, mv, nameif,
nc, netstat, nice, nohup, nslookup, od, openvt, passwd, patch, pidof, ping,
ping6, pipe_progress, pivot_root, poweroff, printenv, printf, ps, pwd, rdate,
readlink, readprofile, realpath, reboot, renice, reset, rm, rmdir, rmmod,
route, rpm, rpm2cpio, run-parts, runlevel, rx, sed, seq, setarch, setconsole,
setkeycodes, setlogcons, setsid, sh, sha1sum, sleep, sort, start-stop-daemon,
stat, strings, stty, su, sulogin, sum, swapoff, swapon, switch_root, sync,
sysctl, syslogd, tail, tar, tee, telnet, telnetd, test, tftp, time, top,
touch, tr, traceroute, true, tty, tune2fs, udhcpc, udhcpd, umount, uname,
uncompress, uniq, unix2dos, unlzma, unzip, uptime, usleep, uudecode, uuencode,
vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami, xargs,
yes, zcat, zcip
}}
-使用リソース~
--free
#pre{{
■uClibc版
total used free shared buffers
Mem: 62568 5964 56604 0 0
Swap: 0 0 0
Total: 62568 5964 56604
■glibc版…参考まで
total used free shared buffers
Mem: 62564 8268 54296 0 0
Swap: 0 0 0
Total: 62564 8268 54296
}}
*メモ … 作成方法 [#w6c22171]
-ディレクトリ構成~
私は、ビルドはカーネルツリーと別の場所で行う人ですので、次のような構成にしました。関連ファイルを[[ここ:http://eggplant.ddo.jp/www/download/kernel26/vmlinuz-initramfs-landisk/]]に置きます。~
#pre{{
/share/kernel/linux-2.6.22-rc2/
/share/kernel/build/
/share/kernel/build/.config
/share/kernel/build/initramfs/
}}
-カーネルの準備
#pre{{
# cd /share/kernel
# tar vxfzj somowhere/linux-2.6.22-rc2.tar.bz2
# cd linux-2.6.22-rc2
# patch -p1 < somewhere/linux-2.6.22-rc1-landisk.patch
}}
-build ディレクトリと .configの準備~
initramfsの構造は見てわかるとおり、rootfsになるファイル/ファイル構造そのものです。~
#pre{{
# cd /share/kernel
# mkdir build
# cd build
# cp ../linux-2.6.22-rc2/arch/sh/configs/landisk_defconfig-ata .config
}}
~
-initramfsの準備~
#pre{{
# cd /share/kernel/build
# tar vxfzp somowhere/initramfs.tgz
}}
--initramfsの補足事項~
initramfsの構造は見てわかるとおり、rootfsになるファイル/ファイル構造そのものです。~
initramfsの構築で最も重要なことは、&color(red){ルート直下にinitを置く}; ことです。~
~
--/initの例~
下記は次のような動作を行う initの例です。~
---ケース1:USBシリアルケーブルを接続して起動した場合は、initramfsから起動。
---ケース2:それ以外は/proc/cmdlineで指定されたrootデバイスから起動(※1)。~
---ケース3:もし、rootデバイスが未指定だった場合は、initramfsから起動。~
---その他 :rcSスクリプトの選択機能(&color(blue){青文字};部分)
~
(※1)switch_root を使って、rootfsを指定のデバイスへ切り替えます。~
--
#pre{{
#!/bin/sh
export PATH=/sbin:/bin:/usr/bin
/bin/mount -t proc proc /proc
# check cmdline device
CMDLINE=`cat /proc/cmdline`
&color(blue){BOOTLD=/etc/init.d/rcS};
for param in $CMDLINE ; do
case "$param" in
root=/dev* ) ROOT=$(echo $param | cut -d= -f2-) ;;
&color(blue){bootld=* ) BOOTLD=$(echo $param | cut -d= -f2-) ;;};
esac
done
&color(blue){echo "::sysinit:$BOOTLD" >> /etc/inittab};
# set /dev/console
stty -F /dev/ttyUSB0 > /dev/null 2>&1
if [ $? -eq 0 ] ; then
ROOT=""
echo "ttySC1::askfirst:-/bin/sh" >> /etc/inittab
ln -sf ttyUSB0 /dev/console
else
ln -sf ttySC1 /dev/console
fi
# exec real init
if [ "$ROOT" = "" ] ; then
echo "INIT: boot from initramfs"
umount -l /proc
exec /sbin/init </dev/console >/dev/console 2>&1
else
echo "INIT: boot from $ROOT"
mkdir /new_root
&color(red){mount -r $ROOT /new_root};
umount -l /proc
&color(red){exec /sbin/switch_root -c /dev/console /new_root /sbin/init};
fi
}}
~
--ケース1と3の補足~
本ケースでは、その後、initramfs内の/sbin/initへ処理が移り、最終的には /etc/init.d/rcSにてシステムの初期化が行われます。~
/etc/init.d/rcSはこんな感じです。~
#pre{{
#! /bin/sh
# mount
/bin/mount -a
# Network
hostname landisk
ifup -a
# Daemon
inetd
btnctrl /etc/btn_action.conf &
ledctrl pwr=0 status=1 buzzer=10
}};
/etc/network/interfacesはこんな感じです。~
#pre{{
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
}}
-make menuconfig
#pre{{
# cd /share/kernel/linux-2.6.22-rc2
# make O=/share/kernel/build menuconfig
}}
--initrdramfsの変更~
build直下に作成したrootfsを格納したディレクトリ名を指定する。~
#pre{{
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) supporx
(&color(red){initramfs};) Initramfs source file(s)
(0) User ID to map to 0 (user root)
(0) Group ID to map to 0 (group root)
}}
--Link address offset を変更~
カーネルサイズが巨大になるため、オフセットを0x00800000→0x01000000へ変更。~
つまり、[[Kernel-2.4 サイズ制限緩和パッチ]]の(2')の値を大きくしてカーネルロードサイズの制限を緩和する。~
(結果的には、今回、変更する必要なかったみたいです。)~
#pre{{
Boot options --->
(&color(red){0x01000000};) Link address offset for booting
}}
--USB serial, storageをカーネル組み込みへ~
#pre{{
Device Drivers --->
USB support --->
<*> USB Mass Storage support
…
USB Serial Converter support --->
<*> USB Serial Converter support
[*] USB Serial Console device support (EXPERIMENTAL)
<*> USB FTDI Single Port Serial Driver (EXPERIMENTAL)
<*> USB Prolific 2303 Single Port Serial Driver
}}
--msdos fsをカーネル組み込みから外す。(モジュール化へ)~
vfatでマウントして欲しいのに、時々msdosでマウントされる場合があるため。~
#pre{{
File systems --->
DOS/FAT/NT Filesystems --->
<M> MSDOS fs support
}}
-make~
#pre{{
# cd /share/kernel/build
# make
}}
/share/kernel/build/arch/sh/boot/zImageが完成品~
~
~
*comment [#u0d8a6dc]
#comment