※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

標準Linuxの/usr/local/sbin/内にある。
開発用Linuxに必要な材料をHDDに展開する役割を担う。
また、ユーザーの意思次第でHDDブートの設定も行う。

動作内容

  • /mnt/mtdにhddrootfs.tar.gz、uImage.buffaloがあるかどうかを確認して以下を実行。

ある場合
  • /mnt/bootディレクトリを作成し、/dev/sda1をext3形式でマウントして、そこにuImage.buffaloをコピーする。
  • /mnt/rootfsディレクトリを作成し、/dev/sda2をxfs形式でマウントして、そこにhddrootfs.tar.gzを展開する。
デバイス マウントポイント マウント形式
/dev/sda1 /mnt/boot ext3
/dev/sda2 /mnt/rootfs xfs
  • /usr/local/bin/kuro_libを/mnt/rootfs/usr/local/binにコピーする。
  • ChangeMyUbootEnvがあればU-Boot環境変数を書き換える。なければそのまま終了する。

ない場合
  • エラー終了させる。

スクリプト

#!/bin/sh

. /usr/local/bin/kuro_lib

TMP_BOOT_MPT=/mnt/boot
TMP_ROOT_MPT=/mnt/rootfs

HDD_ROOTFS=${MTD_MPT}/hddrootfs.tar.gz
UIMAGE=${MTD_MPT}/uImage.buffalo

CHANGE_UBOOT_ENV=${MTD_MPT}/ChangeMyUbootEnv

# check material
if [ -e ${HDD_ROOTFS} -a -e ${UIMAGE} ] ; then
        # I believe sda is already fdisked and format is finished.
        # That's a KUROBOX quality....www
        #

        mkdir ${TMP_BOOT_MPT}
        mkdir ${TMP_ROOT_MPT}

        mount -t ext3 ${DISK1_DEV}1 ${TMP_BOOT_MPT}
        [ $? -ne 0 ] && exit 1
        mount -t xfs ${DISK1_DEV}2 ${TMP_ROOT_MPT}
        [ $? -ne 0 ] && exit 1

        cp -afp ${UIMAGE} ${TMP_BOOT_MPT}/
        tar -zxvf ${HDD_ROOTFS} -C ${TMP_ROOT_MPT}/
        cp -f /usr/local/bin/kuro_lib ${TMP_ROOT_MPT}/usr/local/bin/

        # OK! prepare of hdd is finished.

        # change u-boot environment or not ?
        if [ -e ${CHANGE_UBOOT_ENV} ] ; then
                nvram -c set default_kernel_addr 0x00100000
                nvram -c set bootargs_base 'console=ttyS0,115200'
                nvram -c set bootargs_root 'root=/dev/sda2 rw panic=5'
                nvram -c set bootargs 'console=ttyS0,115200 root=/dev/sda2 rw panic=5 BOOTVER=1.09'
                nvram -c set bootcmd 'ide reset; ext2load ide 0:1 $(default_kernel_addr) /$(kernel); bootm $(default_kernel_addr)'
                nvram -c set nand_boot no
        fi

        # OK! u-boot environment is changed.

else
        exit 1
fi

スクリプト詳細

ブロックごとに見てみる。
#!/bin/sh

. /usr/local/bin/kuro_lib
シェルにshを指定して、/usr/local/bin/kuro_libをサブシェルで実行している。
このkuro_lib内の
  • MTD_MPT変数(=/mnt/mtd)
  • DISK1_DEV変数(=/dev/sda)
を使用するためだ。
TMP_BOOT_MPT=/mnt/boot
TMP_ROOT_MPT=/mnt/rootfs

HDD_ROOTFS=${MTD_MPT}/hddrootfs.tar.gz
UIMAGE=${MTD_MPT}/uImage.buffalo

CHANGE_UBOOT_ENV=${MTD_MPT}/ChangeMyUbootEnv
TMP_BOOT_MPTという変数を用意し、そこに/mnt/bootを代入。
TMP_ROOT_MPTという変数を用意し、そこに/mnt/rootfsを代入。
HDD_ROOTFSという変数を用意し、そこに/mnt/mtd/hddrootfs.tar.gzを代入。
UIMAGEという変数を用意し、そこに/mnt/mtd/uImage.buffaloを代入。
CHANGE_UBOOT_ENVという変数を用意し、そこに/mnt/mtd/ChangeMyUbootEnvを代入。
# check material
必要材料のチェック。

HDDブートの準備

if [ -e ${HDD_ROOTFS} -a -e ${UIMAGE} ] ; then
/mnt/mtd/hddrootfs.tar.gzが存在し、かつ/mnt/mtd/uImage.buffaloも存在するならば次を実行する。
# I believe sda is already fdisked and format is finished.
# That's a KUROBOX quality....www
#
「sdaはもうfdiskされフォーマットもされていると信じています。これが玄箱クオリティです。」とコメントされている。
mkdir ${TMP_BOOT_MPT}
mkdir ${TMP_ROOT_MPT}
mkdirコマンド?で/mnt/bootと/mnt/rootfsというディレクトリを作成している。
mount -t ext3 ${DISK1_DEV}1 ${TMP_BOOT_MPT}
mountコマンドで、/dev/sda1をext3形式で/mnt/bootにマウントしている。
[ $? -ne 0 ] && exit 1
そのmountコマンド実行時に終了ステータスが「0」(つまり正常)でなければ、終了ステータス「1」(つまり異常)を設定しスクリプトを終了する。
mount -t xfs ${DISK1_DEV}2 ${TMP_ROOT_MPT}
mountコマンドで、/dev/sda2をxfs形式で/mnt/rootfsにマウントしている。
[ $? -ne 0 ] && exit 1
そのmountコマンド実行時に終了ステータスが「0」(つまり正常)でなければ、終了ステータス「1」(つまり異常)を設定しスクリプトを終了する。
cp -afp ${UIMAGE} ${TMP_BOOT_MPT}/
cpコマンド?で/mnt/mtd/uImage.buffaloを/mnt/boot/にコピーしている。
「-afp」オプションは、「-a」で「できるだけ属性や構造を保持する」、「-f」で「同名ファイルを警告せずに上書きする」、「-p」で「パーミッションやタイムスタンプを保持したままコピー」という意味だ。
tar -zxvf ${HDD_ROOTFS} -C ${TMP_ROOT_MPT}/
tarコマンドで/mnt/mtd/hddrootfs.tar.gzを/mnt/rootfs/に展開している。
「-zxvf」オプションは、「-z」で「アーカイブ展開と同時にzip形式での解凍も行う(拡張子:.tar.gz)」、「-x」で「アーカイブからファイル・ディレクトリを取り出す」、「-v」で「処理の詳細を表示する」、「-f」で「アーカイブファイルのファイル名/デバイスファイル名を指定する」という意味だ。
cp -f /usr/local/bin/kuro_lib ${TMP_ROOT_MPT}/usr/local/bin/
ふたたびcpコマンド?で/usr/local/bin/kuro_libを/mnt/rootfs/usr/local/bin/に「-f」オプション(同名ファイルを警告せずに上書きする)でコピーしている。
# OK! prepare of hdd is finished.
HDDの準備は完了しました、とのコメント。
# change u-boot environment or not ?
U-Bootの環境も変更するかどうか、というコメント。ここからU-Bootの環境変数の変更処理だ。

U-Boot環境変数の設定

if [ -e ${CHANGE_UBOOT_ENV} ] ; then
/mnt/mtd/ChangeMyUbootEnvが存在すれば次を実行。
nvram -c set default_kernel_addr 0x00100000
nvram -c set bootargs_base 'console=ttyS0,115200'
nvram -c set bootargs_root 'root=/dev/sda2 rw panic=5'
nvram -c set bootargs 'console=ttyS0,115200 root=/dev/sda2 rw panic=5 BOOTVER=1.09'
nvram -c set bootcmd 'ide reset; ext2load ide 0:1 $(default_kernel_addr) /$(kernel); bootm $(default_kernel_addr)'
nvram -c set nand_boot no
nvramコマンド?を使ってU-Boot環境変数を設定している。
各環境変数の変更内容については環境変数について?で説明する。
ここではルートファイルシステムを/dev/sda2、ブートするカーネルを/dev/sda1、NANDフラッシュからのブートはしない、という設定になっている。
fi
/mnt/mtd/ChangeMyUbootEnvの有無の条件分岐を終了する。
# OK! u-boot environment is changed.
U-Boot環境を変更しました、というコメント。
実際は/mnt/mtd/ChangeMyUbootEnvがなくてもここを通るので「変更しました」では間違っているが、コメントなので問題はない。
else
/mnt/mtd/hddrootfs.tar.gzかあるいは/mnt/mtd/uImage.buffaloがなければ以下を実行。
exit 1
終了ステータスに「1」(つまり異常)を設定しスクリプトを終了する。
fi
/mnt/mtd/hddrootfs.tar.gzと/mnt/mtd/uImage.buffaloの有無の条件分岐を終了する。