カーネルとユーザランドの統合単一イメージ Edit

  • 概要
    linuxカーネルとbusyboxベースのユーザランドを単一イメージ化した、 vmlinuz-initramfs-landisk を作成しました。
    本イメージの特徴は、rootfsをramfsを上に構築するため、外部ストレージを必要としないことです。

  • 単一バイナリ
    vmlinuz-initramfs-landisk-05 (3,575,808 byte)
    vmlinuz-initramfs-landisk-08 -- uClibcベース (2,666,496 byte)
    ( 2007/06/17 )


  • 実行方法
    # kexec --append="mem=64M console=ttySC1,9600" vmlinuz-initramfs-landisk.08
    

機能について Edit

  • ログイン
    • シリアルコンソール(ttySC1)
    • USBシリアル(ttyUSB0)
    • telnetよりアクセス可能(user=root,passwd=landisk)
      ただしセキュリティは未考慮です。
  • ネットワーク
    • DHCPクライアント機能によりIPアドレスを自動で設定
    • wget, telnetd
  • レスキュー機能
    • システム構築/修復に役立つコマンドを収録
      本イメージ単体でシステム構築が可能です。
      fdisk, mkfs.(ext2,ext3,reisrfs),fsck.(ext2,ext3,reisrfs),lilo, etc.
    • usb-strageを使用可能
      USB経由で、CompactFlash, MicroDrive, HDD, USB-stick等を使用可能。


構成の詳細 Edit

  • kernel
    • linux-2.6.22-rc2-landisk ベース
    • usb-strageとusb-serial(pl2303, ftdi_sio) をカーネル組み込む済み
  • initramfs 内蔵コマンド (詳細はinitramfs.tgz を参照)
    • lilo
    • kexec, shutdown(script)
    • strace
    • reiserfs関連 … mk.reiserfs, fsck.reiserfs
    • landisk制御 … ledctrl, btnctrl, gio2
    • busybox
    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
      ■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
      

メモ … 作成方法 Edit

  • ディレクトリ構成
    私は、ビルドはカーネルツリーと別の場所で行う人ですので、次のような構成にしました。関連ファイルをここに置きます。
    /share/kernel/linux-2.6.22-rc2/
    /share/kernel/build/
    /share/kernel/build/.config
    /share/kernel/build/initramfs/
    
  • カーネルの準備
    # 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になるファイル/ファイル構造そのものです。
    # cd /share/kernel
    # mkdir build
    # cd build
    # cp ../linux-2.6.22-rc2/arch/sh/configs/landisk_defconfig-ata .config
    

  • initramfsの準備
    # cd /share/kernel/build
    # tar vxfzp somowhere/initramfs.tgz
    
  • initramfsの補足事項
    initramfsの構造は見てわかるとおり、rootfsになるファイル/ファイル構造そのものです。
    initramfsの構築で最も重要なことは、ルート直下にinitを置く ことです。

  • /initの例
    下記は次のような動作を行う initの例です。
    • ケース1:USBシリアルケーブルを接続して起動した場合は、initramfsから起動。
    • ケース2:それ以外は/proc/cmdlineで指定されたrootデバイスから起動(※1)。
    • ケース3:もし、rootデバイスが未指定だった場合は、initramfsから起動。
    • その他 :rcSスクリプトの選択機能(青文字部分)
      (※1)switch_root を使って、rootfsを指定のデバイスへ切り替えます。
    #!/bin/sh
    
    export PATH=/sbin:/bin:/usr/bin
    /bin/mount -t proc  proc /proc
    
    # check cmdline device
    CMDLINE=`cat /proc/cmdline`
    BOOTLD=/etc/init.d/rcS
    for param in $CMDLINE ; do
        case "$param" in
    	root=/dev* ) ROOT=$(echo $param | cut -d= -f2-) ;;
    	bootld=* )   BOOTLD=$(echo $param | cut -d= -f2-) ;;
        esac
    done
    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
        mount -r $ROOT /new_root
        umount -l /proc
        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はこんな感じです。
    #! /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はこんな感じです。
    auto lo
    iface lo inet loopback
     
    auto eth0
    iface eth0 inet dhcp
    
  • make menuconfig
    # cd /share/kernel/linux-2.6.22-rc2
    # make O=/share/kernel/build menuconfig
    
  • initrdramfsの変更
    build直下に作成したrootfsを格納したディレクトリ名を指定する。
    General setup  --->         
      [*] Initial RAM filesystem and RAM disk (initramfs/initrd) supporx
      (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')の値を大きくしてカーネルロードサイズの制限を緩和する。
    (結果的には、今回、変更する必要なかったみたいです。)
    Boot options  --->
      (0x01000000) Link address offset for booting   
    
  • USB serial, storageをカーネル組み込みへ
    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でマウントされる場合があるため。
    File systems  --->
      DOS/FAT/NT Filesystems  --->
      <M> MSDOS fs support
    
  • make
    # cd /share/kernel/build
    # make
    
    /share/kernel/build/arch/sh/boot/zImageが完成品


comment Edit

#comment


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-06-02 (土) 11:31:47 (6179d)