玄箱でNetBSDを動かす

メニュー





更新履歴


広告










このサイトはAmazon.co.jpアソシエイトに参加しています。


「manual/boot-selector」の編集履歴(バックアップ)一覧はこちら

manual/boot-selector」の最新版変更点

追加された行はこの色になります。

削除された行はこの色になります。

 * なんちゃってブートセレクタの説明
+
+&color(red){注意:このページは古い情報が書かれています。ご本家NetBSD/sandpointには*絶対に*適用しないようにしてください。}
+
 LinuxからNetBSDを起動する/しないを選択できるブートセレクタ(もどき)を作成しました。
 ** 特長
 - Linuxのブートシーケンス中に埋め込む形で使用します。
 - リードオンリーマウント状態でnbloaderをinsmodしますので、かなり安全にNetBSDをブートできます。
 - AVRの制御を自前で行っていますので、起動後に勝手にリブートしてしまうことが(たぶん)有りません。
 - シリアルコンソールが有れば、キー入力によりLinux/NetBSDを選択できます。
 - シリアルコンソールが無くとも、デフォルト値を保存しておくことでリブートによるOSの切替が可能です。
 - 実験カーネル等、不安定なカーネルのために一時的な起動の切り替え(今回はNetBSDを起動するが、次回はLinuxを起動する、など)が可能です。
 - Debian化キットのカーネルロードと共存可能です。
 ** 『なんちゃって』の理由
 Linuxを選んでも特に何もしていないため、ブートセレクタとは呼ぶのはおこがましいからです。
 ** 使い方
 *** 1. NetBSDカーネルの準備
 NetBSDカーネルは、サンプルカーネルがそのまま使用可能です。
 ダウンロードしたカーネル(netbsd.bin)は、Linux側の/bootにコピーしておきます。
 *** 2. なんちゃってブートセレクタのファイルのコピー
 (ここの内容はmake installで行っているものです。)
 kuro_bootsel.shをLinux側の/etc/init.d/以下に、kuro_boot.confを/etc以下にコピーします。
 (kuro_bootsel.shのパーミッションをチェックし、実行可であることを確認してください。)
 また、/etc/rcS.d/にて、
  ln -s ../init.d/kuro_bootsel.sh S15kuro_bootsel.sh
 を実行してシンボリックリンクをしておきます。
 *** 3.nbloader_v2.oのコピー
 nbloader_v2.oは/lib/modules/2.4.17_mvl21/kernel/nbloader_v2.o(玄箱/HG)、または/lib/modules/2.4.17_kuro-box/kernel/nbloader_v2.o(初代玄箱)としてコピーしておきます。
 *** 4.設定
 /etc/kuro_boot.confを必要に応じて修正します。
 このファイルでは永続的な設定を行います。
 一時的な設定を行うためには、このファイルを/etc/kuro_boot.tmpとしてコピーして、こちらを修正します。
 内容は以下の通りです。(必要に応じてコメントを外して修正して下さい)
 
  # kuro_bootsel config file (2005-11-07)
  #
  # "bootdefault"
  # 1: Linux, 2-5: See below
  #bootdefault=1
  
  #
  # "timeout"
  # prompt timeout (in secs)
  #timeout=3
  
  #
  # "AVR"
  # AVR port name
  #AVR=/dev/AVR00
  
  # Menu entry No.2
  #
  menu2="NetBSD(HDD:wd0)"
  loader2=/lib/modules/`/bin/uname -r`/kernel/nbloader_v2.o
  kernel2=/boot/netbsd.bin
  option2="bootdev=0xa0000000"
  
  # Menu entry No.3
  #
  #menu3="NetBSD(EM-boot)"
  #loader3=/lib/modules/`/bin/uname -r`/kernel/nbloader_v2.o
  #kernel3=/boot/emergency.bin
  #option3=
  
  # Menu entry No.4
  #
  #menu4="NetBSD(USB:sd0)"
  #loader4=/lib/modules/`/bin/uname -r`/kernel/nbloader_v2.o
  #kernel4=/boot/netbsd.bin
  #option4="bootdev=0xa0000004"
  
  # Menu entry No.5
  #
  #menu5="Linux(New-kernel)"
  #loader5=/lib/modules/`/bin/uname -r`/kernel/loader.o
  #kernel5=/boot/linux.bin
  #option5="cmdline=\"root=/dev/hda1\""
 
 :bootdefault|デフォルトのOSを指定します。1ならLinuxで、2~5は指定したものとなります。無指定時は1(Linux)です。
 :timeout|コンソールでのOS選択のプロンプト時の入力タイムアウト時間(秒)です。デフォルトは3秒です。入力が無くこの時間経過すると、デフォルトのOS(bootdefaultで指定)が起動します。
 :AVR|Linux側から見えるAVRポートのデバイス名です。デフォルトは/dev/AVR00です。&br()&color(red){間違えるとハマりますので注意して設定して下さい。}
 :menu[2345]|メニューに表示する文字列です。
 :loader[2345]|loader.oやnbloader_v2.oのある場所(フルパス)です。
 :kernel[2345]|LinuxやNetBSDのカーネルの名前(フルパス)です。
 :option[2345]|ブートローダへ渡す引数を記述します。
 
 *** 5.起動
 設定が終わったらおもむろにリブートします。シリアルコンソールが有ると、ブート途中で次のような表示が出るはずです。
  ************************************************
  Select the OS: (default is 1)
  1: Linux, 2: NetBSD(HDD:wd0)
  boot>
 ここで1を押すとそのままLinuxが起動し、2を押すとNetBSDが起動します。3秒間放置するとデフォルト(この例ではLinux)が起動します。
 ** NetBSDの不安定カーネル/ユーザランドの起動のためのTips
 実験のため不安定なカーネルを起動する場合、シリアルコンソールが無いと毎度その不安定なカーネルのブートに行ってしまい、ハマッてしまいます。
 これを回避するためには、/etc/kuro_boot.tmpを作成し、NetBSDをブートするように設定します。/etc/kuro_boot.conf側はLinuxを起動するように設定しておきます。
 kuro_boot.tmpはkuro_boot.confよりも優先して読み込まれます。また、一旦起動すると削除されます。
 このため、次に起動した場合はkuro_boot.confが使用される形になります。
 これで、たとえNetBSDのブートではまっても、おもむろに電源を切り再投入することでLinux側が起動する、と言う形にすることが出来ます。(実験の度に毎度設定は面倒でしょうが、安全のためです。)
 カーネルが不安定で無くとも、ユーザランドの設定がおかしい際でもこれが有効だと思います。
 シリアルコンソールが無い場合にはこれをうまく活用してください。
 ** その他
 たぶんバグがあります。また、/etc/rcS.d/の入れる場所については議論の分かれる所だと思います。
 /etc/rcS.dの入れる場所によっては、kuro_boot.tmpの削除が出来ない場合があります。
 少なくともルートパーティションがリードライト可能になった後に入れることが必要です。
 ----
 * kuro_bootsel.shの中身(2005-11-07版)
 ライセンスはBSDとします。
 文字列表示のとき、ベル(^G)を鳴らしている所があります。コピペの際はご注意下さい。
 
  #! /bin/bash
  #
  # KURO-BOX boot selector (2005-11-07)
  # (c) 2005 Eiji Kawauchi
  #
  
  # default values
  timeout=3
  bootdefault=1
  AVR=/dev/AVR00
  
  menu2="NetBSD(HDD:wd0a)"
  loader2=/lib/modules/`/bin/uname -r`/kernel/nbloader_v2.o
  kernel2=/boot/netbsd.bin
  option2="bootdev=0xa0000000"
  
  menu3=
  loader3=
  kernel3=
  option3=
  
  menu4=
  loader4=
  kernel4=
  option4=
  
  menu5=
  loader5=
  kernel5=
  option5=
  
  # These may override above
  if [ -f /etc/default/kuro_boot.conf ]; then
          . /etc/default/kuro_boot.conf
  fi
  if [ -f /etc/kuro_boot.conf ]; then
          . /etc/kuro_boot.conf
  fi
  if [ -f /etc/kuro_boot.tmp ]; then
          . /etc/kuro_boot.tmp
          rm -f /etc/kuro_boot.tmp
  fi
  
  # functions
  init_avr()
  {
          # AVR Control
          /bin/stty -F $AVR cs8 parenb -parodd clocal 9600
          /bin/echo -n 'AAAAFFFFJJJJ>>>>VVVV>>>>ZZZZVVVVKKKK' > $AVR
  }
  boot_kernel()
  {
          if [ "$1"x = ""x ]; then
                  #echo "Loader not specified."
                  return 0;
          fi
          if [ ! -f $1 ]; then
                  #echo "Loader does not exist."
                  return 0;
          fi
          if [ "$2"x = ""x ]; then
                  echo "Kernel not spicified."
                  return 0;
          fi
          if [ ! -f $2 ]; then
                  echo "Kernel does not exist."
                  return 0;
          fi
          init_avr;
          /bin/sync; /bin/sync;
          /bin/umount -a
          /bin/mount -n -o remount,ro /
          /sbin/insmod $1 kernel=$2 $3
  }
  
  select_boot()
  {
          menustr="1: Linux"
          if [ "$menu2"x != ""x ]; then
                  menustr="$menustr, 2: $menu2"
          fi
          if [ "$menu3"x != ""x ]; then
                  menustr="$menustr, 3: $menu3"
          fi
          if [ "$menu4"x != ""x ]; then
                  menustr="$menustr, 4: $menu4"
          fi
          if [ "$menu5"x != ""x ]; then
                  menustr="$menustr, 5: $menu5"
          fi
          /bin/echo "************************************************"
          /bin/echo "Select the OS: (default is $bootdefault)"
          /bin/echo $menustr "^G^G"
          read -t $timeout -n 1 -s -p "boot> " key
          if [ "$key"x = ""x ]; then
                  key=$bootdefault
          fi
          /bin/echo $key
  }
  
  
  if [ "$1"x = "start"x ]; then
          select_boot
          case $key in
          2)  boot_kernel "$loader2" "$kernel2" "$option2" ;;
          3)  boot_kernel "$loader3" "$kernel3" "$option3" ;;
          4)  boot_kernel "$loader4" "$kernel4" "$option4" ;;
          5)  boot_kernel "$loader5" "$kernel5" "$option5" ;;
          *)  ;;
          esac
  fi
 
 ----
 ご連絡先: E.Kawauchi atto gmail dotto com