(2010-01-11)かなり希なニーズしかないと思いますが、掲示板に、USBブートに対応していないPCでUSBハードディスク(USBメモリ)上に置いたカーネルをブートさせる手法を掲載しています。←iSCSIブートに対応していないPCでiSCSIストレージ上に置いたカーネルをブートさせる手法とほぼ同じです。NFSブートのカーネル管理にも有効です。
CFブートがメインのページはこっちです。
(2008-1-3) Linux各ディストリビューションで(USB接続DVDドライブなどを使わずに)インストーラをUSBメモリなどからUSBブートさせたり、内蔵ハードディスクからインストーラを起動する方法なら→ Linuxを、インストーラが起動したドライブにインストールするを更新しました。 ←ワンスピンドルPCに光学ドライブを使わずにLinuxをインストールする場合等に
(2007-8-18) USB接続ハードディスク(USBメモリ)への直接インストールに関する情報を追加しました。(fc6のUSBブート化手順は削除しました。)
(2007-8-2) Debian Linux の OneCD(ライブDVD)化手順のページを追加しました。
書き込み回数に制限のあるUSBメモリやCF等を使用してLinuxを運用する用途(USBブート,CFブート)にも使用できる手順です。
本ページは通常のディストリビューションのUSBブートに関する情報を扱っています。OneCD LinuxのUSBブートに関しては、ここにOneCD LinuxをUSBブートLinuxに改造するページへのポインタがあります。←(2008-1-9)Fedora 8 Live CDについての記述を追加しました。(取り消し線を引いてある部分のリンクもまだ参考になるかと思います。)私自身はいつも諳でコマンドを打ってUSBブート化しています。
- 各ディストリビューションのUSB接続ハードディスク(USBメモリ)への直接インストール・対応状況(USBブート対応状況)
- Vine Linux 4(4.2) をUSB接続のハードディスク(USBメモリ)にインストールした際に必要な修正作業(USBブートの為の追加修正作業)
- Vine Linux 4(4.2) を一旦内蔵ハードディスクに(普通に)インストールした後、USB接続のハードディスクやUSBメモリにLinux OSの環境を丸ごと移し変えてUSBブートさせる手順(USBブート化手順)
- Vine4(4.2)をUSBブートで運用する場合の注意点
- ブート対応USBメモリについて
- ご要望、ご意見、質問を下のフォームにどうぞ(でもここより、掲示板や書き込みフォームのページに書いて頂いた方が気づき易いと思います。)
各ディストリビューションのUSB接続ハードディスク(USBメモリ)への直接インストール・対応状況(USBブート対応状況)
表に示すように、多くのLinuxディストリはWindowsと異なり、USB接続のハードディスクやUSBメモリに直接インストールすることが可能です。Linuxの世界ではUSBブートは当たり前です。それに対してWindowsが標準で(ブート革命などを使わずに)USBブートに対応することは永遠?にないでしょう。MicrosoftとしてはリムーバルディスクにOSをインストールして欲しくないからです。
(2009-9-9現在)
(検証基準とした環境: i845GのPC)
ディストリ | 対応状況 | 詳細 |
Fedora 7 | △ | 基準PCではインストーラがUSB接続ハードディスクを認識しなかった。手持ちのi855のPCではインストールでき、そのUSB接続ハードディスクを基準PCに接続すると正常にブートできた。Vine4.1とは異なり、基本的には対応しており、更新等の運用面も問題ない(筈)。 |
Fedora 8 | ○ | 特に問題なし。 |
Fedora 9 | ○ | もうわざわざここに書く必要ないでしょう。 |
RedHat EL 5(互換のCentOS 5等も含む) | 未検証 | 基本的にFC6のフィーチャーを継承しているので多分一応は対応しているでしょう。検証するとFedora7と同様の結果となるのでは? |
Debian 4(etch) | ○ | 特に問題なし。 |
Ubuntu 7.04ja | ○ | 特に問題なし。 |
Ubuntu 7.10ja | ○ | 特に問題なし。 |
Ubuntu 8.04ja | ○ | もうわざわざここに書く必要ないでしょう。 |
Vine 4.1 | ×△ | インストーラはUSB接続ハードディスクを認識し、インストールプロセスは一見正常におこなわれたように見えるが、実は未対応の部分があり、インストール後に再起動をおこなった際に正常にブートしない。(2008-1-4)Vine4.2がリリースされたのでVine4.1用の対応方法は削除しました。 |
Vine 4.2 | ×△ | 惜しい! 開発者がUSBブートに対応しようとしたことはわかるが、まだ駄目。開発時のカーネルとリリース時のカーネルの構成が異なる為だろう。下記の修正を加えるとブートできる。但し運用には下記の注意が必要。 |
Vine 5.0 | ○△ | 一応のUSBブート対応を果たした。が他ディストリと比べるとまだ何歩か遅れ気味。環境によってはVine 4.2以前と同様にイニシャルラムディスクの修正が必要となる場合がある。 |
openSUSE 10.2 | ○ | 特に問題なし。 |
openSUSE 10.3 | ○ | 特に問題なし。 |
Vineだけ置いてけぼりをくらっているという印象です。
※: 書き方でわかると思いますが念を押しておきます。Vine4.1の状況は環境の違いによって出現するバグといった類のものではなく、Vine4.1が未対応であることは明白です。(2008-1-4追記) Vine4.2もまだ対応途中の段階のようです。多分、Vine 5.0ではUSBブートに対応すると思います。そのときはこのページの内容の殆どを削除すると思います。(2009-9-9追記)上表で少し触れましたがVine 5.0のUSBブート対応には(現在の標準的なレベルと比べると)少し時代遅れな面があります。イニシャルラムディスク内の/initファイルにrootデバイス名が直接記述されています。この為、インストール時と使用時でrootデバイス名が異なってしまう環境ではイニシャルラムディスクの修正が必要になります。現在、他の多くのディストリビューションではインストール時と使用時でrootデバイス名が異なっても修正なしに正常にブート可能です。
Vine Linux 4(4.2) をUSB接続のハードディスク(USBメモリ)にインストールした際に必要な修正作業(USBブートの為の追加修正作業)
上に記したようにインストール後に再起動してもそのままでは正常にブートしません。
インストーラに再起動を促された際にすぐには再起動せずに[Ctrl]+[Alt]+[F2]キーを押してコンソール画面に下り、以下に記すinitrdの修正作業をおこなってから再起動して下さい。
また、私がVine4.2で試したところではgrub.confでrootデバイスをLABEL形式で指定していると、rootデバイスのマウントに失敗することがありました。ブートに失敗したときは、次の起動時のgrub画面でeditして、カーネル引数のrootデバイス指定をデバイス名でおこなうように修正してみた方がいいでしょう。
initrdの修正(インストール時)
initrdの解凍
修正が必要なinitrdを解凍します。
# cd /mnt/sysimage/boot # mkdir work # cd work # gzip -dc ../initrd.img | cpio -idmv
カーネルモジュールのコピー
カーネルモジュールを上記work内のlibディレクトリにコピーします。
# cd /mnt/sysimage/boot/work # find /mnt/sysimage/lib/modules -name uhci-hcd.ko -exec cp -p {} lib \; # find /mnt/sysimage/lib/modules -name ohci-hcd.ko -exec cp -p {} lib \; # find /mnt/sysimage/lib/modules -name ehci-hcd.ko -exec cp -p {} lib \;
initスクリプトの修正
↑のカーネルモジュールのコピーを忘れないように
initrd内のinitスクリプトを修正します。
--- init.orig 2008-01-03 22:20:36.000000000 +0900 +++ init 2008-01-03 23:10:56.000000000 +0900 @@ -5,6 +5,12 @@ echo Mounted /proc filesystem echo Mounting sysfs mount -t sysfs none /sys +echo "Loading uhci-hcd.ko module" +insmod /lib/uhci-hcd.ko +echo "Loading ohci-hcd.ko module" +insmod /lib/ohci-hcd.ko +echo "Loading ehci-hcd.ko module" +insmod /lib/ehci-hcd.ko echo "Loading scsi_mod.ko module" insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module"
sleep 5という行ありますが、環境によってはもっと長くsleepする必要があります。私の環境の一つではsleep 9としました。他のディストリビューションでは必要な時間だけ待つコマンドが用意されていたりします。
用心深い人はsetquietをコメントアウトし、mountを実行する行の次の行にsleep 20を追加しておくといいでしょう。詳細が把握できますし、rootデバイスのマウントに失敗した場合でもsleep中に[Ctrl]+[Alt]+[Delete]を押せばハードディスクを傷めずに再起動できます。
initrdの再圧縮
initrdを圧縮します。(以下、一例)
# cd /mnt/sysimage/boot/work # find | cpio -c -o | gzip -9 > ../initrd.img もしくは # find | cpio -H newc -o | gzip -9 > ../initrd.img
(2007-7-30追加) ブートには(new)SVR4フォーマットのcpioアーカイブが必要です。manどおりであれば、-H newcオプションを使用しなければならないところですが、Fedora、Vineのcpioコマンドは-cオプションでSVR4フォーマットのファイルを生成します。
上記作業内容を手打ちするのは大変ですよね。以下の「fix-vine4-usbboot.sh」スクリプトを実行すれば一気に作業が終わります。
で、どうやってインストール中の環境にこのスクリプトを持ってきましょうか?
私はフロッピーディスクを使って持ってきてしまいました。ノートパソコンだとどうしましょうか?
ネットワーク経由だと多分多くのコマンド打ちが必要でしょう。
スクリプトを含ませたUSBメモリをインストール開始時から挿しこんでおけば自動で認識してくれるんじゃないでしょうか???・・・・
USB接続ハードディスクや内蔵ハードディスクのVineが読めるファイルシステム上にスクリプトを置いておいてもいいでしょう。←妥当な線
でも実際のところ、他にLinux環境があるのなら、普通はそちらに当該のUSB接続ハードディスクを接続して作業するでしょう。(インストーラのコンソールも作業しにくいことはないですが...)
ダウンロード fix-vine4-usbboot-oninstall.sh
#!/bin/sh MNTROOT=/mnt/sysimage cd ${MNTROOT}/boot mkdir work cd work gzip -dc ../initrd.img | cpio -idmv
find ${MNTROOT}/lib/modules -name uhci-hcd.ko -exec cp -p {} lib \; find ${MNTROOT}/lib/modules -name ohci-hcd.ko -exec cp -p {} lib \; find ${MNTROOT}/lib/modules -name ehci-hcd.ko -exec cp -p {} lib \;
patch -p0 <<EOT --- init.orig 2008-01-03 22:20:36.000000000 +0900 +++ init 2008-01-03 23:10:56.000000000 +0900 @@ -5,6 +5,12 @@ echo Mounted /proc filesystem echo Mounting sysfs mount -t sysfs none /sys +echo "Loading uhci-hcd.ko module" +insmod /lib/uhci-hcd.ko +echo "Loading ohci-hcd.ko module" +insmod /lib/ohci-hcd.ko +echo "Loading ehci-hcd.ko module" +insmod /lib/ehci-hcd.ko echo "Loading scsi_mod.ko module" insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module" EOT chmod +x init
find | cpio -H newc -o | gzip -9 > ../initrd.img
initにsleep 5という行ありますが、環境によってはもっと長くsleepする必要があります。私の環境の一つではsleep 9としました。他のディストリビューションでは必要な時間だけ待つコマンドが用意されていたりします。
用心深い人はsetquietをコメントアウトし、mountを実行する行の次の行にsleep 20を追加しておくといいでしょう。詳細が把握できますし、rootデバイスのマウントに失敗した場合でもsleep中に[Ctrl]+[Alt]+[Delete]を押せばハードディスクを傷めずに再起動できます。
Vine Linux 4(4.2) を一旦内蔵ハードディスクに(普通に)インストールした後、USB接続のハードディスクやUSBメモリにLinux OSの環境を丸ごと移し変えてUSBブートさせる手順(USBブート化手順)
内蔵ハードディスクでブートした環境上での作業手順紹介です。
作業1.ルート以下全内容のコピー
対象のディストリビューションの場合、普通、USB接続のハードディスクやUSBメモリを接続すると一般ユーザの権限で自動マウントされます。これをumountして、rootでmountし直してからコピーして下さい。
作業2.initrdの修正
上記と実質的に全く同じ作業をおこないます。
違いは、1)上記手順で/mnt/sysimageとなっている個所を作業時のUSB接続ハードディスクやUSBメモリのマウントポイントに読み替えることと、2)カーネルが複数インストールされている可能性がある為に以下のような感じでカーネルの詳細バージョンを意識して作業する必要があること の2点です。
※(2009-09-05追記)このページ読者の方の情報によると、最新の2.6.16-76.51vl4のデフォルト状態ではinitrd.img内の/initにusb-storage.koに関する記述がないとのことで、usb-storage.koをロードする文も追加する必要があります。またもちろん、initrd内にusb-storage.koのコピーをおこなう必要もあるでしょう。
カーネルモジュールを上記work内のlibディレクトリにコピーする例
# find /lib/modules/`uname -r` -name uhci-hcd.ko -exec cp -p {} lib \; # find /lib/modules/`uname -r` -name ohci-hcd.ko -exec cp -p {} lib \; # find /lib/modules/`uname -r` -name ehci-hcd.ko -exec cp -p {} lib \;
作業3.USB接続のハードディスクのパーティションにに内臓ディスクと同じラベルを付ける
作業4と作業5の内容によってはこの作業は必要ありません。
※デバイス名の代わりにラベルを用いることのメリット・デメリットをよく理解した上で作業を選択して下さい。
※以下はUSBブート時のrootデバイスを/dev/sda1と仮定しています。
例
# e2label /dev/sda1 / # ←デバイス、ラベル共実際の値に合わせる
作業4.fstabの修正
※以下はUSBブート時のrootデバイスを/dev/sda1、swapデバイスを/dev/sda2と仮定しています。
また、フラッシュメモリ系のデバイスを想定してnoatimeを指定しています。
例
/dev/sda1 / ext3 noatime 1 1 /dev/sda2 swap swap defaults 0 0
もしくは(作業3をおこなった場合に)
LABEL=/ / ext3 noatime 1 1 /dev/sda2 swap swap defaults 0 0
作業5.grub.confの修正
作業3をおこなった場合にこの作業は必要ありません。
こんな感じに修正して下さい。rootディスクを指定しないのがミソです(つまりこのセクションは全3行です)。rootディスクを指定しないことによって様々なBIOS設定に対応できます。※rootディスクを絶対に指定してはいけないというわけではありません。
※以下はUSBブート時のrootデバイスを/dev/sda1と仮定しています。
title Vine Linux (Current kernel) kernel /boot/vmlinuz ro root=/dev/sda1 initrd /boot/initrd.img
※Vine4.2で私が試したところでは、ある環境では、grub.conf内でrootデバイスをLABEL形式で指定すると、イニシャルラムディスク内でのマウントが失敗しました。その環境でもfstabでの指定はデバイス名、LABEL形式のどちらの指定でも大丈夫でした。
作業6.grubのインストール
もしマルチブート環境を構築するなら、是非このページに目を通してみて下さい。
※他のOS上からgrubを再インストール(セットアップ)する場合はこんな感じの作業が必要になる場合があります。(どんな場合に必要なのかについての説明は長くなるので略します。) |
(2008-1-17ちょっとだけ更新)usbで接続されているデバイスへのgrubインストールは何か特別ではないかとの先入観を持たれている方が多いようです。でも実際には内蔵HDDに対してインストールする場合と何らと言っていいほど変わりません。usbデバイスは、Linux USB対応OS起動中はドライバーによってscsiデバイスとしてエミュレーションされ、scsi HDDと同様に扱うことができます。OS起動時は(USBブートできるPCであれば)BIOSによってHDDとしてエミュレーションされています。これが意味することは、grubで「USBブート」する為に「USB対応grub」なんてものは(どんなOSであっても)必要ないということです(少し詳しい説明)。そもそもgrubのみならず世の殆どのPC用ブートローダにUSBブート対応は必要ありません。通常使われる意味でのUSBブートとはBIOSの機能によっておこなうものだからです。ブートローダ自体がUSBブートに対応しなければならないケースとはブート革命/USBのブートローダのようにUSBブート未対応のBIOSを持ったPC上で疑似USBブートを実現させる用途のような特殊な場合だけです。要は難しく考える必要はないということです。grubインストール時とブート時でHDDの順番が変わる場合があることだけには注意が必要です。(あえてmapには言及しません)
私の場合、こんな感じです。
自分の環境に適宜合わせて下さい。
※以下の(hd1,0)とは、作業をおこなったPCにとっての2番目のハードディスクの1番目のパーティションを意味します。リムーバルなUSBハードディスクもしくはUSBメモリが2番目のハードディスクとして認識されているということになります。
1段階ブートの場合、
# grub GRUB version 0.97 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.]
grub> root (hd1,0) Filesystem type is ext2fs, partition type 0x83
grub> setup (hd1) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... 15 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded Done.
grub>quit
※setup (hd1)は母艦PCにとっての2番目のハードディスクのMBRにgrubのstage1をインストールすることを意味します。作業時にUSBハードディスクもしくはUSBメモリが何番目のハードディスクと認識されていようとUSBブートに直接関係はありません。
↓※以下の作業を始めておこなう方は、それまでに確実に2段階ブートが何かを理解し、自分でMBM等のMBR専用のブートローダをインストールする必要があることを理解してから作業にとりかかって下さい。
2段階ブートの場合、
2段階ブートの場合、たとえばこのように、
# grub grub> root (hd1,0) ←rootで指定するのはmenu.lst(grub.conf),stage2等の場所 grub> setup (hd1,0) ←setupで指定するのはgrub(grubのstage1)のインストール先
setupで指定するデバイスをハードディスク(の先頭)ではなくパーティション(の先頭)とします。
上は母艦上の作業としてのサンプルですが、
普通にLinuxをブートし、そのOS上でブートの方式を1段階ブートから2段階ブートに変更する場合であれば、たとえば、
# grub grub> root (hd0,0) ←rootで指定するのはmenu.lst(grub.conf),stage2等の場所 grub> setup (hd0,0) ←setupで指定するのはgrub(grubのstage1)のインストール先
こんな感じになります。もちろん詳細は適宜自身の環境に合わせて下さい。
マルチブート環境の場合、↑このように、grubをPBR(パーティションの先頭セクタ)にインストール(セットアップ)することを強く推奨します。
(2008-12-3追記)参考としてgrub上でのパーティション表記の例を示しておきます。
特殊な設定をしていない限り、以下の表の対応が成立します。
一般的な表現 | grub上での表記 | Linux上でのSATA接続の場合のデバイス名 |
1番目のハードディスク※全体 | (hd0) | /dev/sda |
1番目のハードディスク※の第1パーティション | (hd0,0) | /dev/sda1 |
1番目のハードディスク※の第2パーティション | (hd0,1) | /dev/sda2 |
1番目のハードディスク※の第3パーティション | (hd0,2) | /dev/sda3 |
1番目のハードディスク※の第4パーティション | (hd0,3) | /dev/sda4 |
1番目のハードディスク※の第5パーティション | (hd0,4) | /dev/sda5 |
1番目のハードディスク※の第6パーティション | (hd0,5) | /dev/sda6 |
1番目のハードディスク※の第7パーティション | (hd0,6) | /dev/sda7 |
2番目のハードディスク※全体 | (hd1) | /dev/sdb |
2番目のハードディスク※の第1パーティション | (hd1,0) | /dev/sdb1 |
2番目のハードディスク※の第2パーティション | (hd1,1) | /dev/sdb2 |
2番目のハードディスク※の第3パーティション | (hd1,2) | /dev/sdb3 |
2番目のハードディスク※の第4パーティション | (hd1,3) | /dev/sdb4 |
2番目のハードディスク※の第5パーティション | (hd1,4) | /dev/sdb5 |
※ハードディスクにはUSBメモリやUSB接続のSDカードやUSBアダプタを介したCF等も含みます。内蔵・外付けの区別はありません。
現在は各ハードディスクにパーティションを最高16個作成できます。ただしそのうち1個は拡張領域となるのでファイルシステムとして確保できる数は最大15となります。
Vine4(4.2)をUSBブートで運用する場合の注意点
Vine Linux 4はmkinitrdコマンドがUSBブートに完全に対応していない為、上記と同様の作業(※)をおこなってUSBブートが可能になっても、現状ではカーネルを更新する都度、上記と同様の作業(※)が必要です。(Vine Linux にFedoraのmkinitrdを移植すべきです。)
- apt等によってカーネルが更新された際には忘れずにinitrdの修正(上記と同様の作業(※))をおこなうことを習慣づけておく
- mkinitrdをカスタマイズしてUSBブートに対応させた上でmkinitrdを更新対象から外しておく
- カーネルが更新された後に上記と同様の作業(※)をせずに再起動して、ブートが失敗したら、前のカーネルで起動して上記と同様の作業(※)をおこなう
等の方針で運用をおこなう必要があります。
※: 上記と同様とはいっても全く同じではありません。/bootのパスが異なりますし、インストール時とは異なり複数バージョンのカーネルモジュールがインストールされていることが殆どなのでカーネルモジュールのコピー元はカーネルバージョンまで指定する必要がある筈です。この運用時の作業をスクリプト化したものが↓です。上の1もしくは3の方針で運用する場合に使用できます。
ダウンロード fix-vine4-usbboot-onope.sh
#!/bin/bash -ex
getdefaultversion() { default=$(grep -v "^ *#" </boot/grub/menu.lst|grep default) eval $default index=0 grep -v "^ *#" </boot/grub/menu.lst|egrep "^\s*kernel"|while read i do if [ $index -eq $default ]; then kernelfile=$(echo $i| cut -d" " -f 2) real=$(/bin/ls -l ${kernelfile}) echo ${real##*vmlinuz-} break fi index=$(( index + 1)) done }
ver=$(getdefaultversion) [ ! -n "${ver}" ] && echo "error" && exit 1
rm -rf /boot/work mkdir /boot/work cd /boot/work gzip -dc ../initrd.img | cpio -idmv
find /lib/modules/${ver} -name uhci-hcd.ko -exec cp -pi {} lib \; find /lib/modules/${ver} -name ohci-hcd.ko -exec cp -pi {} lib \; find /lib/modules/${ver} -name ehci-hcd.ko -exec cp -pi {} lib \;
patch -p0 -b <<EOT --- init.orig 2008-01-03 22:20:36.000000000 +0900 +++ init 2008-01-03 23:10:56.000000000 +0900 @@ -5,6 +5,12 @@ echo Mounted /proc filesystem echo Mounting sysfs mount -t sysfs none /sys +echo "Loading uhci-hcd.ko module" +insmod /lib/uhci-hcd.ko +echo "Loading ohci-hcd.ko module" +insmod /lib/ohci-hcd.ko +echo "Loading ehci-hcd.ko module" +insmod /lib/ehci-hcd.ko echo "Loading scsi_mod.ko module" insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module" EOT
find | cpio -H newc -o | gzip -9 > ../initrd.img
ブート対応USBメモリについて
よく「ブート対応のUSBメモリってどれ?」と質問する人がいます。一般的な用語として「ブート対応USBメモリ」という言い方は確かに間違いではありません。しかしここを読めば気づくと思いますが、技術的にはそんなものはありません。もっと具体的に書きますと、"USBブートする為の機構を持たせられたUSBメモリ"なんてものは存在しないということです。「BIOSがそのUSBメモリのブートに対応しているか」が「ブートするか否か」を決めるのであって、たとえ100種類のPCでブートしないUSBメモリであっても、あるPCのBIOSが対応すればそのPCではUSBブート可能となります。ただし、こんなことを書いている私自身はUSBブート対応のPCで使用してもブートが出来ないUSBメモリにお目にかかったことはありません。初期のUSBメモリの中にはそんなものがあるのでしょうか。殆どのUSBメモリはUSBブートを謳っていませんが、実際には殆ど(まず)可能だというのが実情だと思います。USBハードディスクではPCによってはブートできないものに出くわしたことはあります。 最初の話の結論みたいなものを書いておきます。実際のところは「多くのPCでUSBブート可能なUSBメモリ」が「いわゆるブート対応USBメモリ」というものです。 |