標準Linuxの/usr/local/sbin/内にある。
開発用Linuxに必要な材料をHDDに展開する役割を担う。
また、ユーザーの意思次第でHDDブートの設定も行う。
開発用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
- 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を代入。
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」で「パーミッションやタイムスタンプを保持したままコピー」という意味だ。
「-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」で「アーカイブファイルのファイル名/デバイスファイル名を指定する」という意味だ。
「-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フラッシュからのブートはしない、という設定になっている。
各環境変数の変更内容については環境変数について?で説明する。
ここではルートファイルシステムを/dev/sda2、ブートするカーネルを/dev/sda1、NANDフラッシュからのブートはしない、という設定になっている。
fi
/mnt/mtd/ChangeMyUbootEnvの有無の条件分岐を終了する。
# OK! u-boot environment is changed.
U-Boot環境を変更しました、というコメント。
実際は/mnt/mtd/ChangeMyUbootEnvがなくてもここを通るので「変更しました」では間違っているが、コメントなので問題はない。
実際は/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の有無の条件分岐を終了する。