できるかな? … 成功! Edit

  • 概要
    USB接続した外部ストレージをルートデバイスとして起動する。

  • 利点
    様々なディストリビューション等を、USBストレージ上で手軽に試行することができる。

  • 実験構成
    以下の物でUSBストレージを構成して、起動実験を試みた。
    • BUFFALO社MCR-CF-LT/U2
      USB2.0&USB1.1対応カードリーダー/ライター スタンドレスタイプ コンパクトフラッシュ専用
      MCRCFLTU2.jpg
    • HGST社MicroDrive
      MicroDrive.jpg
  • これらもルートデバイスにすることが可能と思われる。
    • USB接続型HDD
    • USBメモリスティック

カーネルの準備 Edit

  • ramdisk.gzの作成
    initrd用のRAM DISKを作成します。
    landisk:/share/src/kernel# dd if=/dev/zero of=ramdisk bs=1024 count=2048
    landisk:/share/src/kernel# mke2fs ramdisk
    landisk:/share/src/kernel# mount -o loop ramdisk /mnt
    
    /mnt にinitrdの起動システムを構築します。
    /mnt/bin下のコマンドは全てbusyboxを使用しました。
    landisk:/share/src/kernel# find /mnt
    /mnt
    /mnt/lost+found
    /mnt/bin
    /mnt/bin/cp
    /mnt/bin/ln
    /mnt/bin/ls
    /mnt/bin/mv
    /mnt/bin/rm
    /mnt/bin/sh
    /mnt/bin/ash
    /mnt/bin/cat
    /mnt/bin/env
    /mnt/bin/pwd
    /mnt/bin/sed
    /mnt/bin/yes
    /mnt/bin/echo
    /mnt/bin/expr
    /mnt/bin/test
    /mnt/bin/chgrp
    /mnt/bin/chmod
    /mnt/bin/chown
    /mnt/bin/lsmod
    /mnt/bin/mkdir
    /mnt/bin/mknod
    /mnt/bin/mount
    /mnt/bin/rmmod
    /mnt/bin/sleep
    /mnt/bin/touch
    /mnt/bin/modprobe
    /mnt/bin/insmod
    /mnt/bin/umount
    /mnt/bin/busybox
    /mnt/busybox.config
    /mnt/dev
    /mnt/dev/console
    /mnt/dev/hda
    /mnt/dev/hda1
    /mnt/dev/hda2
    /mnt/dev/hda3
    /mnt/dev/hda4
    /mnt/dev/hda5
    /mnt/dev/hdb
    /mnt/dev/hdb1
    /mnt/dev/hdb2
    /mnt/dev/hdb3
    /mnt/dev/hdb4
    /mnt/dev/hdb5
    /mnt/dev/sda
    /mnt/dev/sda1
    /mnt/dev/sda2
    /mnt/dev/sda3
    /mnt/dev/sda4
    /mnt/dev/sda5
    /mnt/dev/sdb
    /mnt/dev/sdb1
    /mnt/dev/sdb2
    /mnt/dev/sdb3
    /mnt/dev/sdb4
    /mnt/dev/sdb5
    /mnt/dev/ttySC0
    /mnt/dev/ttySC1
    /mnt/lib
    /mnt/lib/modules
    /mnt/lib/modules/ehci-hcd.ko
    /mnt/lib/modules/ohci-hcd.ko
    /mnt/lib/modules/usb-storage.ko
    /mnt/lib/modules/usbcore.ko
    /mnt/linuxrc
    /mnt/proc
    
    /linuxrc はこの様な物を準備しました。
    usb-storage.koをinsmodしてから、デバイスが認識されるまで、sleepで待たせています。
    これを行わないと、すぐさまマウントシーケンスに突入してしまい、ハングアップします。
    USB1.1のデバイスを接続する場合は、もう少し待ったほうが良いかもしれません。

    補足:赤文字の部分は FireWireのデバイスからLinuxをブート を参考にした。
    SCSIバス(エミュレーション)のスキャンを行っているらしい。
    成功する時と失敗する時があって、なんか不安定なんだよな〜!
    #!/bin/sh
    
    export PATH=/bin
    mount -nt proc none /proc
    
    insmod /lib/modules/usbcore.ko
    sleep 2
    
    insmod /lib/modules/ehci-hcd.ko
    sleep 2
    
    insmod /lib/modules/ohci-hcd.ko
    sleep 2
    
    insmod /lib/modules/usb-storage.ko
    sleep 10
    
    echo "scsi add-single-device 0 0 0" > /proc/scsi/scsi
    echo "scsi add-single-device 1 0 0" > /proc/scsi/scsi
    echo "scsi add-single-device 2 0 0" > /proc/scsi/scsi
    sleep 5
    
    #echo "0x303" > proc/sys/kernel/real-root-dev
    
    umount proc
    
    exit 0
    
    圧縮します。
    landisk:/share/src/kernel# umount /mnt
    landisk:/share/src/kernel# gzip -9 ramdisk
    
  • カーネルパラメータ….config
    initrd関連のオプションをイネーブルにします。
    Device Drivers  --->
        Block devices  --->
            <*> RAM disk support
            (16)  Default number of RAM disks
            (4096) Default RAM disk size (kbytes)
            [*]   Initial RAM disk (initrd) support
            ()  Initramfs source file(s)
    SH initrd options  --->
        [*] Embed root filesystem ramdisk into the kernel (NEW)
        (ramdisk.gz) Filename of gziped ramdisk image (NEW)
    
    なお、先ほど作成した ramdisk.gzを、zImageへ組み込みます。
    下記の場所へコピーして、ビルドを行います。
    linux-2.6.12/arch/sh/ramdisk/ramdisk.gz
    

ルートファイルシステムの準備 Edit

  • USBストレージにアクセスするには?
    • hotplugのインストール
      landisk:~# apt-get install hotplug
      
    • あとは挿すだけ。
      landisk:~# dmesg
      usb 3-2: new high speed USB device using ehci_hcd and address 3
      Initializing USB Mass Storage driver...
      scsi0 : SCSI emulation for USB Mass Storage devices
      usb-storage: device found at 3
      usb-storage: waiting for device to settle before scanning
      usbcore: registered new driver usb-storage
      USB Mass Storage support registered.
        Vendor: BUFFALO   Model: MCR   HS-CF       Rev: 1.95
        Type:   Direct-Access                      ANSI SCSI revision: 00
      SCSI device sda: 3999744 512-byte hdwr sectors (2048 MB)
      sda: Write Protect is off
      sda: Mode Sense: 03 00 00 00
      sda: assuming drive cache: write through
      SCSI device sda: 3999744 512-byte hdwr sectors (2048 MB)
      sda: Write Protect is off
      sda: Mode Sense: 03 00 00 00
      sda: assuming drive cache: write through
       sda: sda1
      Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
      usb-storage: device scan complete
      
      /proc/partitionsによるとsda(SCSI)デバイスとして認識されています。
      landisk:~# cat /proc/partitions 
      major minor  #blocks  name
      
         3     0  156290904 hda
         3     1    8193118 hda1
         3     2     265072 hda2
         3     3   40965750 hda3
         3     4  106864380 hda4
         8     0    1999872 sda
         8     1    1999840 sda1
      
  • パーティション設定
    この様な感じでパーティション分割した。
    landisk:~# fdisk /dev/sda
    
    Command (m for help): p
    
    Disk /dev/sda: 2047 MB, 2047868928 bytes
    64 heads, 63 sectors/track, 992 cylinders
    Units = cylinders of 4032 * 512 = 2064384 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1               1          40       80608+  83  Linux
    /dev/sda2              41          95      110880   82  Linux swap / Solaris
    /dev/sda3              96         992     1808352   83  Linux
    
    Command (m for help): 
    
  • ファイルシステムのフォーマット
    • /dev/sda1 ext2
    • /dev/sda2 swap
    • /dev/sda3 reiserfs とする。
      landisk:~# mke2fs -c  /dev/sda1
      landisk:~# mkswap     /dev/sda2
      landisk:~# mkreiserfs /dev/sda3
      
  • debian26の導入
    • mount
      landisk:~# mount -t reiserfs /dev/sda3 /mnt
      
    • あとは/mnt/下へ、通常通りdebian26環境を構築
      唯一の変更点は/etc/fstabかな!
      # UNCONFIGURED FSTAB FOR BASE SYSTEM
      /dev/sda3     /            reiserfs    defaults        0 1
      proc          /proc        proc    defaults        0 0
      /dev/sda2     swap         swap    defaults        0 0
      
    • umount
      umountしておきましょう。
      landisk:~# mount -t reiserfs /dev/sda3 /mnt
      

起動 Edit

  • kernelsw.conf
    以下のkernelsw.confを使用して、kernelsw(26).plでブートします。
    ミソはappendにrootデバイスのメジャー/マイナー番号を16進数で指定することです。
    LinuxSHのバグ?なのかな!!
    linear
    boot=/dev/sda
    disk=/dev/sda
    bios=0x80
    timeout=50
    default=linux
    image=/boot/zImage-usbstorage
            label=linux
            root=/dev/hda3
    append="mem=64M console=ttySC1,9600 root=803"
    
  • 立ち上がり後の確認
    /dev/sda3がルートデバイスとしてマウントされている。
    landisk:~# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/sda3              1808260    121964   1686296   7% /
    tmpfs                    31176         0     31176   0% /dev/shm
    
  • ご参考まで
    本実験で実際に使用したカーネルなど…
    http://eggplant.ddo.jp/www/download/kernel26/boot_at_usbstorage/

添付ファイル: fileMCRCFLTU2.jpg 142件 [詳細] fileMicroDrive.jpg 162件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-06-13 (火) 20:02:26 (6534d)