*カーネルとユーザランドの統合単一イメージ [#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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS