ブート色々

2000.9.7


Linuxの起動方法について、試したことを書きます。
以下の説明は、下図のような、WindowsとLinux(SlackwareとLaser5)のマルチブート環境について記してあるので、構成の変化に応じて適当に読み替えてください。
 
 
パーティション
HDA
HDB
1 Windows WindowsData
2 LinuxSWAP Laser5 /
3 Slackware / Laser5 /usr
4 Slackware /usr Laser5 /home

[LILOによるブート/起動ディスクによるブート/GRUBによるブート/Loadlinによるブート/homeへ]


LILOによるブート

LILOはLInux LOaderの略で、複数のシステムを選択して実行できるブートローダです。
ブートに関する情報は/etc/lilo.confに定義したあと、/sbin/liloを実行することにより、次回ブートするためのLILOが作成されます。LILOには、ブートイメージ等の情報が、(ファイル名でなく)物理的アドレスで記憶されるので、kernelを再構築したあとは、(同じファイル名のkernelイメージを作ってもハードディスクに保存される物理的位置が変わってしまうので)かならず、/sbin/liloを実行して、LILOの情報を書き換えておく必要があります。

/etc/lilo.confの例

マルチシステムをブートするための/etc/lilo.conf例を示します。赤字は、説明用のコメントで実際はありません。コメントは私なりの解釈ですので、厳密な意味では間違っているかも知れませんが、考え方はほぼあっていると思います。詳細は "man lilo.conf"等で確認を。
 
# Start LILO global section
boot = /dev/hda3                <-- /dev/hda3にLILOを置く
message = /boot/boot_message.txt     <-- 起動時のメッセージの場所
prompt                          <-- 入力待ちをする
timeout = 600                   <-- 600×0.1(=60)秒入力待                        タイムアウト時はdefaultを実行(特にしていなければ1番初めの指定
vga = normal                    <-- 画面はVGA 80×25 text mode
# End LILO global section
# DOS bootable partition config begins
other = /dev/hda1        <-- /dev/hda1からLILOの2ndloader以外で
  label = DOS          <-- DOS と入力すると
  table = /dev/hda       <-- パーティションテーブルとして/dev/hda を使って
                                /dev/hda1起動する(ここではWindows)
# DOS bootable partition config ends
# Linux(Slackware) bootable partition config begins
image = /vmlinuz        <-- 今のシステムの/vmlinuzが使用するkernel
  root = /dev/hda3       <-- /dev/hda3 に /(root)を置く
  label = Linux         <-- Linux と入力すると立ち上がる
  read-only             <-- 最初はread-only
# Linux bootable partition config ends
# Linux(Redhat) bootable partition config begins
image = /mnt/boot/vmlinuz      <-- 今のシステムの/mnt/boot/vmlinuzが
                                     使用するブートイメージ
                              あらかじめ/mntに/dev/hdb2をmountしておく
  root = /dev/hdb2       <-- /dev/hdb2 に /(root)を置く
  label = Laser5        <-- Laser5 と入力すると立ち上がる
  read-only             <-- 最初はread-only
# Linux bootable partition config ends
この例では、LILOを/dev/hda3に置くことになっていますから、/dev/hda3bootable flagをFDISK(Linux版)等を利用して立てて置く必要があります。

/boot/boot_message.txtの例

LILO起動時に表示するメッセージで256文字以内で何を書いてもいいのですが、私はslackwareに最初に入っていたものを手直しして使っています。下の青色の部分を/etc/lilo.confの"label= "で書いた中身と同じにしておくと入力を忘れても大丈夫です。
不用意に、他人にdefault以外で起動させたくない場合は、何も書かないほうがいいかも。
これは、あくまでもメッセージで、実際に起動を選択する文字列とは関係ないのだから立ち上げる人が間違えなければ何を書いても構いません。
Welcome to the LILO Boot Loader!

Please enter the name of the partition you would like to boot
at the prompt below.  The choices are:

DOS     - DOS or Windows (FAT/FAT32)
Linux   - Slackware (ext2fs)
Laser5  - Laser5 (ext2fs)

以上の2つを定義したら、マルチブートしたいシステムのブートイメージのあるパーティションを全てmountしたのち/sbin/liloを実行します。

#  mount ーt ext2 /dev/hdb2 /mnt
# /sbin/lilo
Laser5(/dev/hdb2)には/etc/lilo.confは必要ありませんが、Laser5のkernelを再構築したら、再起動して、slackwareを立ち上げて、/sbin/liloを実行します。

2段LILO

上のLILO設定では、
  1. /sbin/liloを実行するごとに、関連するLinuxのkernelイメージのあるパーティションをmountする必要がある。
  2. /sbin/liloを実行するシステム(例ではslackware)以外のkernel(例ではLaser5)を再構築した場合でも、/sbin/liloを実行するシステム(slackware)に戻って、/sbin/liloを実行する必要がある。
の問題があります。マルチブートするシステムが多いとシステムの再起動、/sbin/liloを実行するためだけのmountしなおしが頻繁に発生します.これを解決するのが2段(ロケット)LILOと呼ばれる方式です。
最初に実行されるLILOで、ブートイメージの場所を"image="で、直接指定していたのをやめ、"other="で他システム扱いにし、"table="で、パーティションテーブルを指定します。(下の青色の部分が変更部分です)
 
# Start LILO global section
boot = /dev/hda3
message = /boot/boot_message.txt
prompt
timeout = 600
vga = normal
# End LILO global section
# DOS bootable partition config begins
other = /dev/hda1
  label = DOS
  table = /dev/hda
# DOS bootable partition config ends
# Linux(Slackware) bootable partition config begins
image = /vmlinuz
  root = /dev/hda3
  label = Linux
  read-only
other = /dev/hdb2
  label = Laser5
  table = /dev/hdb
# Linux bootable partition config ends

この場合Laser5を選択すると、ブートイメージがわからないので、Laser5側のパーティションで再度LILOを起動するようにします。そのために、Laser5(/dev/hdb2)でも/etc/lilo.confを定義して、/sbin/liloを実行します。例を以下に示します。
 

# Start LILO global section
boot = /dev/hdb2        <-- (2段目の)LILOを/dev/hdb2に置く
image = /boot/vmlinuz     <-- (dev/hdb2)/boot/vmlinuzをブートイメージに使う。
  root = /dev/hdb2
  read-only
# Linux bootable partition config ends

2段目はシステムを選択しなおす必要がないので、prompt も timeoutも指定してありません(指定しても良いのですがその場合は2回入力待ちになります)。入力しないので、システム識別用のlabelも不要です。
この例では、

  1. /dev/hda3 のslackwareのkernelを変更した場合は、slackwareで/sbin/liloを実行
  2. /dev/hdb2のlaser5のkernelを変更した場合は、laser5で/sbin/liloを実行
するだけですみますので、他のシステムのmountや、再実行による/sbin/liloは不要です。

起動ディスクによるブート

以下の方法で起動ディスクを作成します。
  1. mkbootdisk による方法
    1. Laser5などのREDHAT系のディストリビューションでは起動ディスク作成用のスクリプトが用意されているのでこれを利用して作成できます。
      # mkbootdisk --device /dev/fd0 {versionNo.}-{release}
      {versionNo.}-{release}には、作成する起動ディスクに使用するブートイメージのversionとreleaseを指定します。というか、
      ls /boot で
      vmlinuz-2.2.5-rh60_L5_2
              ^^^^^^^^^^^^^^^
      と表示されるブートイメージの"vmlinuz-"より後の部分(^^^で示した部分)を指定します。
      複数のカーネルイメージが/boot以下にある場合どれかを指定します。
  2. liloによる方法
    1. /etc/lilo.confで
        boot = /dev/fd0
      として、LILOを置く場所を/dev/fd0に指定して/sbin/liloを実行すると、フロッピーにLILOが作成されます。
      mkbootdiskを使用した場合は、イメージがフロッピーに書き込まれますから、ハードディスク上のイメージ(vmlinuz)が書き換えられても、フロッピー内のイメージで起動されますが、これは、LILOをフロッピーに書き込んだだけですから、ブートイメージはハードディスク上の(/bootにある)イメージがそのまま使用されます。したがって、ハードディスク上のイメージを(kernel再構築等で)書き換えると起動できません。
  3. 自分でスクリプトを書く
    1. mkbootdiskが自分のパッケージに含まれない場合は、同じことを自分で実行すれば、起動ディスクを作ることができます。
      起動ディスクの中身を見ると
      +-boot--boot.200
      |       boot.b
      |       map
      |       message
      |
      +-etc--lilo.conf
      |
      +-dev--fd0
      |      hdb2
      |
      +-lost+founud
      |
      +-initrd.img
        vmlinuz-2.2.5-rh60_L5_2
      となっていますので、同じようにディレクトリを作成し、起動したいシステムの/boot以下のファイルやinitrd.img、vmlinuzをコピーします。
      /devはフロッピーと起動するパーティションの分をコピーしておきます。
      最後に、/sbin/lilo -r  /dev/fd0を実行すれば、完成です。
       
      $kernel={起動するカーネルバージョン}
      $MOUNTDIR=/dev/fd0
      cp -a /boot/vmlinuz-$kernel $MOUNTDIR
      /sbin/mkinitrd $MOUNTDIR/initrd.img $kernel
      mkdir $MOUNTDIR/etc
      mkdir $MOUNTDIR/dev
      mkdir $MOUNTDIR/boot
      cp -a /dev/fd0 $MOUNTDIR/dev
      cp -a /dev/hdb2 $MOUNTDIR/dev
      cp -a /boot/boot.b $MOUNTDIR/boot/boot.b

      cat > $MOUNTDIR/etc/lilo.conf <<EOF
      boot=/dev/fd0
      timeout=100
      message=/boot/message
      prompt
      image=/vmlinuz-$kernel
              label=linux
              root=/dev/hdb2
      EOF
      [ -f $MOUNTDIR/initrd.img ] && echo "   initrd=/initrd.img" >> \
                              $MOUNTDIR/etc/lilo.conf

      cat >> $MOUNTDIR/etc/lilo.conf <<EOF
      image=/vmlinuz-$kernel
              label=rescue
              append="load_ramdisk=2 prompt_ramdisk=1"
              root=/dev/fd0
      EOF
      [ -f $MOUNTDIR/initrd.img ] && echo "   initrd=/initrd.img" >> \ 
              $MOUNTDIR/etc/lilo.conf
      chmod 644 $MOUNTDIR/etc/lilo.conf

      cat >> $MOUNTDIR/boot/message <<EOF
      Press <return> (or wait 10 seconds) to boot your Red Hat Linux system from
       /dev/hdb2. If you want to use a rescue disk, type "rescue" now.

      EOF

      /sbin/lilo -r $MOUNTDIR

       


grubによるブート

LILOは、カーネルのイメージのある場所を、物理的位置で記憶しているので、kernelを再構築しなおすと、同じ名前であってもハードディスク上の場所が変わってしまうので、/sbin/liloを実行してLILO内に記憶されているkernelイメージの場所を書き換える必要があります。これに対してgrubでは、ファイルシステムを認識しているので、ファイル名で直接kernelイメージを指定できます。従って、kernelを入れ換えても、grubの内容を変更する必要はありません。
また、メニュから起動する他、grubのコマンドプロンプトモードへ入って、任意のハーティションのファイルや、起動パラメータの変更ができますので、一度フロッピーにgrub boot loaderを作っておくと、LILOの設定誤りや、システムを一部変更して立ち上げできなくなった場合でも、ハードディスク上のどこかに、正常なシステムが残っていれば、立ち上げることができます。

フロッピーによるbootディスク作成

  1. フォーマット済のフロッピを用意し、ファイルシステムを作ります

  2.  
    $mkfs -t vfat /dev/fd0     <--(ext2でもvfatでも可)
    $mount -t vfat /dev/fd0 /mnt/floppy
  3. フロッピーに boot/grub ディレクトリを準備します。

  4.  
    $cd /mnt/floppy
    $mkdir boot
    $cd boot
    $mkdir grub
  5. grub以下のstage1 stage2 と自分のシステムにあわせつたmenu.lstをフロッピーの/boot/grub以下にコピーします。
  6. $cp /boot/grub/* .        <--コピー元は、準備したgrubにより
                                 異なります。
                       /usr/share/grub/i386-pc/の場合もあり
    $cp hoge/menu.lst .       <--用意したmenu.lstをコピーする。
    menu.lstは、サンプルを参考に作成します。ここで、ポイントはハードディスクおよびパーティションの指定が、1やaから始まるのでなく、0からスタートすることです。例をあげると hdb4 は (hd1,3) になります。私の場合は次の通りです。
    #
    # Boot menu configuration file
    #

    # For booting Slackware
    title=          Slackware Linux-2.0.36
    kernel= (hd0,2)/vmlinuz root=/dev/hda3 ro
              
            /dev/hda3/vmlinuz を使って / は /dev/hda3

    # For booting Laser5
    title=          Laser5 Linux-2.2.5
    kernel= (hd1,1)/boot/vmlinuz root=/dev/hdb2 ro
              
            /dev/hdb2/boot/vmlinuz を使って / は /dev/hdb2

    # For booting Windows NT 3.5 or DOS
    title=          Windows 98/DOS boot menu
    root=           (0x80,0)
    chainloader=    +1
           kernel イメージでなく、rootで指定した位置のローダに制御を渡す
     

  7. grubを起動してgrub consoleに入り、ブートローダをフロッピーに書き出します

  8.  
    $grub                <ーーー grubを起動
    grub>root (fd0)        <ーーー 作業ディレクトリを(fd0)にする
     Filesystem type is fat, using whole disk
    grub>setup (fd0)        <ーーー ブートローダを(fd0)に書き込む
    Run "install /boot/grub/stage1 d (fd0) /boot/grub/stage2 p /boot/grub/menu.lst"
        rootで指定した(fd0)の/boot/grub/stage1 を fd0 にインストール
        stage2 は rootで指定した(fd0)の/boot/grub/stage2 をインストール。
        パラメータとして、(fd0上の) /boot/grub/menu.lst を使用する。
    grub>quit         <ーーー 終了
    menu.lstはフロッピー上のものを指定したので、項目を追加/変更する場合は、/dev/fd0/boot/grub/menu.lstを編集すれば可能です。

    (参考)ハードディスク上stage1、stage2を直接使ってフロッピーを作成することもできます。
     

    #grub              <--rootでgrubを起動してgrub consoleに入る (/dev/hdxを使うため)
    grub>root (hd1,1)
     Filesystem type is ext2fs, partition type 0x83
    grub>install /boot/grub/stage1 d (fd0) boot/grub/stage2 p (hd1,2)/hoge/menu.lst"
        (hd1,1の)/boot/grub/stage1 を fd0 にインストール
        stage2 は (rootで指定してあるhd1,1の)/boot/grub/stage2 インストール
        パラメータとして、/home/hoge/menu.lst を使用する。(/homeはrootと別のパーティション(hd1、2)にある)
    grub>quit
    この場合、stage1をフロッピーから読み込んだ後、menu.lstはハードディスク上のものを使用する
    /home/hoge/menu.lstが無くなるとメニュによる起動はできなくなる。コンソールモードは使用可能

使用方法

フロッピーを挿入して起動したら、メニュが表示されるので、↓↑キーを使って起動するOSを選択してリターンを押します。
メニュを変更したい場合はeをキーインします。escキーを押すとメニュモードに戻れます。
コマンドラインに移行したい場合はcをキーインすします。メニュモードへはescキーを押します。

コマンドラインから起動するには、
起動するパーティションを

grub>root {起動パーティション}    にて選択
grub>kernel  {起動パーティション}/boot/vmlinuz root=/dev/hdb2 ro    とカーネルとパラメータを指示
grub>boot  にて起動します。

imageファイルを使ってブートフロッピーをつくる

grubのFTPサイトには grub-boot-x.yy.x.image というファイルが用意されています。これを使うと直接フロッピー作成ができます。
ダウンロードしたimageを
Windowsであれば、rawite.exeを使って、Linuxであれば dd を使って フロッピーを作成すると、
ブートローダのstage1,stage2とフロッピー上に/boot/grub/以下のファイルが作成されます。
これには、menu.lstが含まれています。サンプルが入っているのでそのままでは、使えませんが、適当なeditorで自分の環境に合わせて編集すればフロッピー完成です。

Loadlinによるブート

LoadlinはWindowsからLinuxを起動する方法です。各ディストリビューションのdosutils等に含まれている loadlin.exe をそのままWindowsパーティションの適当なホルダ(私はc:Loadlinというホルダを作ってその中に入れています)に置きます。loadlin.tgzがある場合は、これを適当なホルダに展開すると、ドキュメントや実行するバッチファイルもloadlinと同時に展開されますから、こっちの方がいいかもしれません。
あと必要なのは、実行するkernelのイメージで、
slackware系の場合は  /vmlinuz
redhat系は  /boot/vmlinuz
で、これをloadlin.exeを置いた同じホルダにコピーして、msdosプロンプトで実行します。場合によっては、initrd.imgが必要な場合があります。/etc/lilo.conf に、initrd=initrd-2.2.12.img などとある場合は、それもコピーしておく必要があります。kernelイメージ(vmlinuz)もinitrd.imgも、ブートしたいシステムのものを用意します。
Linux側で必要なものをWindows側へ準備する実行例を示します。
 
# mount -t vfat /dev/hda1 /win      <-- Windowsパーティションを/winにマウント
# cp /boot/vmlinuz /win/loadlin/linux1 
           kernelイメージをWindowsパーティションのloadlinホルダにlinux1の名前でコピー
           msdosプロンプトでは8文字以上の名前は使えませんから、8文字以内の名前であることが必要
これに対して、Windowsから起動する場合は、loadlin.tgzを展開してできる「linux.bat」に例がありますが、以下のようになります。
必ず、Windows上のmsdos窓からでなく、msdosで起動しなおす必要があります。
>chev us                 <--Englishモードにします。これを入れないとうまく起動しない
>smartdrv /C
>c:\loadlin\loadlin  c:\loadlin\linux1 root=/dev/hdb2 ro 
               コピーしたカーネルイメージ(今回はlinux1)の名前とLinuxの/の位置を指定します
起動に関するその他のパラメータは付属ドキュメントを参照してください。

LInux側できちんと準備しておけば良いのですが、LILOの変更がうまくいかなかった場合に、loadlinで起動したい場合には、kernelイメージが準備できていないと起動できません。この場合は、Windows側からLinux側のext2ファイルシステムの中身を読みだして、loadlinホルダにコピーする必要があります。
これには、Explore2fs をWindowsにインストールすると、エクスプローラライクな操作で、Linuxパーティションが操作できます。書き込みもできるようですが、保証されていないので、読みだしだけとし、コピーしたいファイルを右クリックして出て来るプルダウンメニューのexportを使って、Linux側からWindows側にkernelイメージ他をコピーすれば、Loadlinが使用できます。



[HOME]