レンタルサーバ + Webシステム開発 = E-business

■レンタルサーバご利用参考資料
サーバご利用の参考にJF Project によるJF (Japanese FAQ)を掲載しています。

Linux JF(Japanese FAQ)Project.
JF は, Linux に関する解説文書・FAQ などを作成・収集・配布するプロジェクトです.

グリーンネット・トップページへ戻る


一覧に戻る
HOWTO Clone Disk Images on Linux Booted from a Network

Guilherme Tupynamba'

gtupy (at) uol.com.br

日本語訳:芳賀靖史 -

yasufumi.haga@nifty.com

2002年 9月 9日

Revision History                                                      
Revision 0.3         2002年 9月 24日          Revised by: gct         
査読の助言を組み込む                                                  
Revision 0.2         2002年 9月 23日          Revised by: jyg         
マイナー改訂                                                          
Revision 0.1         2002年 9月 9日           Revised by: gct         
ドラフト第一版                                                        

本文書では、Grub ブートローダーを用いて、 BOOTP/TFTP で Linux をブート
できるようにする方法と、 TFTP サーバーとの間で、ディスクやパーティショ
ンのイメージのセーブ/リストアをできるようにする方法を解説します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

Table of Contents
1. 法的告知事項
   
    1.1. 免責条項
    1.2. 著作権
    1.3. フィードバック
   
2. はじめに
   
    2.1. ディスクイメージのクローンを作る理由
    2.2. ネットワークからブートする理由
    2.3. ネットワークブートの概略
   
3. DHCP サーバーと TFTP サーバーの設定
   
    3.1. DHCP の設定
    3.2. TFTP の設定
    3.3. 別のサーバーを使用する
   
4. ブートファイルの準備
   
    4.1. カーネル
    4.2. initrd 上のファイル
    4.3. initrd の作成
   
5. Grub を用いたフロッピーディスクからのブート
   
    5.1. Grub のメニューファイル
    5.2. ネットワークサポートをつけた Grub のコンパイル
    5.3. ブートフロッピーディスクの作成
   
6. clone スクリプトの実行
   
    6.1. ディスクイメージの保存とリストア
    6.2. fdisk の使用
   
7. ソリューションの拡張
   
    7.1. ファイルシステムではなく、ファイルの保存とリストア
    7.2. マスターブートレコードの設定
    7.3. 必要なモジュールのロード
    7.4. grub.confで予め定義されている操作
   
8. 日本語版謝辞
A. initrd 上のファイル一覧
B. Clone スクリプト
References

1. 法的告知事項

1.1. 免責条項

ここで論じている事柄については、説明している方法を用いるにあたり、その
技術上の概念やコマンドを熟知していることが前提になっています。本文書に
掲載されているコマンドを実行に不安を感じたり、クローンスクリプトを理解
していない場合は、この指示は実行しないで下さい。

加えて、/dev/hda と /dev/hda1 の違いが分からない場合は、本 HOWTO は使用
しないで下さい。これは、おそらくパーティションのリストアと、全データの
喪失の違いになります。ここで論じている内容の誤りが原因のエラーであって
も、うまく行かなかった事に対する責任は、筆者はいっさい負わないことを覚
えておいて下さい。

本文書の目的上、サーバーとクライアントの両方で、 RedHat 7.3 ディストリ
ビューションを使用しました。大した違いは出ないと思いますが、他のディス
トリビューションやカスタムセットアップの環境では、テストは行ないません
でした。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

1.2. 著作権

著作権 (c) 2002 は、Guilherme Tupynamba' が有しています。

本文書の複製、配布、ないし変更は、 Free Software Foundationが公開してい
る、フリー文書利用許諾契約書  (
GNU Free Documentation License )のバージョン 1.1 ないしはそれ以降の条
件下で許可する。ただし、変更不可能部分が無いこと、表表紙が無いこと、お
よび裏表紙が無いこと。クローンスクリプトは、 GNU 一般公衆利用許諾契約書
(GPL)  の条件でライセンスされてい
る。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

1.3. フィードバック

本文書に関するご意見には特に感謝します。ご意見は直接、 宛てにお願いします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

2. はじめに

2.1. ディスクイメージのクローンを作る理由

ディスクイメージのクローンを作る主な理由は、膨大な数のマシンに対する、
オペレーティングシステムや基本的なアプリケーションセットのインストール
を楽に行なうためです。標準になる一台のマシンを用意し、その最初のきれい
なイメージを保存しておき、他のマシンにリストアするようにすれば、労力を
節約し、手順を簡略化することになります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

2.2. ネットワークからブートする理由

ハードディスクからブートしてしまうと、イメージをコピーする見込みが少な
くなってしまいます。例を挙げれば、ブートしたオペレーティングシステムが
マウントしているパーティションとの間で、コピーを安全に行なうことは不可
能でしょう。また、オペレーティングシステムが Linux ではない場合もありま
す。この場合は、オプションを自由に使った、クローン作成ができなくなりま
す。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

2.3. ネットワークブートの概略

クライアント機は Grub で、フロッピーディスクからブートします。それから
Grub の BOOTP サポートを用いて、 DHCP サーバーから IP アドレスを取得し
ます。次に、クライアント機は TFTP サーバーからカーネルと initrd イメー
ジを取得します。 initrd イメージをメモリにマウントしてしまえば、初期化
スクリプトが動き、このイメージに格納してあるプログラムとファイルを利用
します。このスクリプトを使えば、 TFTP サーバーにブロックデバイスの内容
を保存したり、 TFTP サーバーから内容をブロックデバイスに書き込むことが
できるようになります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3. DHCP サーバーと TFTP サーバーの設定

DHCP サーバーは Grub (BOOTP) をブートし、その後で Linux をブートする際
、クライアントに IP アドレスを提供するのに必要なものです。 TFTP サーバ
ーは、Linux のブート用に、ネットワークで利用でできるブートイメージを作
成するのに必要になります。ディスクイメージの保存/リストアを可能にする
際にも、 TFTP サーバーは必要になります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.1. DHCP の設定

DHCP の詳細は本文書の範疇を越えます。 "Linux Networking HOWTO" に DHCP
の章があります。

DHCP の設定は非常に簡単です。でも、他の人が管理しているネットワークにい
る場合は、動作中の DHCP サーバーを使う方が賢明です。自分でネットワーク
を管理しているのなら、この手順にしたがってもかまいません。

まだ DHCP をインストールしていない場合は、 rpm パッケージからインストー
ルして下さい。普通は Linux のディストリビューションの中に見つかります。

# rpm -ihv dhcp-*.rpm                                                  
                                                                       

/etc/dhcpd.conf ファイルを編集して、 DHCP サービスを設定して下さい。本
文書中の設定は、サーバーの IP アドレスが 10.0.0.1 で、 253 台までのクラ
イアントに IP アドレスを提供します。自分の環境に応じて、 /etc/
dhcpd.conf を設定して下さい。

#/etc/dhcpd.conf                                                       
server-identifier dhcp.clonedomain.com;                                
default-lease-time      172800;                                        
max-lease-time          604800;                                        
option domain-name      "clonedomain.com";                             
subnet 10.0.0.0 netmask 255.255.255.0 {                                
        range dynamic-bootp 10.0.0.2 10.0.0.254;                       
}                                                                      
                                                                       

dhcpd サーバーのスタート

/etc/rc.d/init.d/dhcpd start.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.2. TFTP の設定

TFTP の設定も、DHCP とほとんど同じくらい簡単です。

まず、rpm パッケージからインストールします。

# rpm -ihv tftp-server-*.rpm                                           
                                                                       

そして、ファイルを格納するディレクトリを作ります。

# mkdir /tftpboot                                                      
# chown nobody:nobody /tftpboot                                        
                                                                       

nobody というのは、 ftfpd がファイルをアクセスする際に設定する、ディフ
ォルトのユーザー ID になるので、 /tftpboot というディレクトリの所有者は
、 nobody にします。

/etc/xinetd.d/tftp ファイルを次のように編集します。

service tftp                                                           
{                                                                      
        socket_type     = dgram                                        
        protocol        = udp                                          
        wait            = yes                                          
        user            = root                                         
        server          = /usr/sbin/in.tftpd                           
        server_args     = -c -s /tftpboot                              
        disable         = no                                           
        per_source      = 11                                           
        cps             = 100 2                                        
}                                                                      
                                                                       

ディフォルトのファイルから変更するのは、 disable = no(サービスを有効に
する)パラメータと、サーバーに与える引数 -c です。後者の引数を与えると
、ファイルの生成が可能になります。これはブートイメージやディスクイメー
ジを保存したい場合に必要になります。通常の操作では、TFTP を読み取りのみ
にしておく必要があるかも知れません。

xinetd を再ロードします。

/etc/rc.d/init.d/xinetd reload

サーバーのテストには、tftp コマンドが使えます。このコマンドは、 tftp
rpm パッケージ(クライアント用)をインストールすれば利用できます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.3. 別のサーバーを使用する

DHCP と TFTP に関しては、別のサーバーを使用することもできます。これは動
作中の DHCP サーバーを使用する場合に必要になるかもしれません。 DHCP の
next-server パラメータを設定して、 TFTP サーバーを指すようにしたり、
Grub で tftpserver コマンドを使うことができます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

4. ブートファイルの準備

これでサーバーの設定はできました。次はクライアントをブートさせるファイ
ルを準備する必要があります。これには二つのファイルが必要になります。そ
れは、カーネルと初期 RAM ディスク(initrd) です。後者は、カーネルがルー
トファイルシステムとしてマウントするものです。本文書では、本節と次節で
概説した手順は、クライアント機で作成したものとしています。ディスクイメ
ージの保存/リストアの際は、普通ローカルのハードディスクに Linux をイン
ストールする必要はありません。でも、数多くのマシンにディスクイメージを
配置する場合は、各マシンのモデルとなる、一台のマシンに Linux をインスト
ールすることから始めて下さい。 DHCP を使い、前節で設定したことを TFTP
クライアントでテストして下さい。特に指定しない限り、コマンドは現在のデ
ィレクトリ内で、ユーザー root が bash シェルで実行します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

4.1. カーネル

圧縮されたカーネルのファイルを特定します。

# cd /boot                                                             
# ls vmlinuz-$(uname -r)                                               
vmlinuz-2.4.18-3                                                       
                                                                       

このバージョンは、システムによって様々です。このファイルを TFTP サーバ
ーにアップロードし、名前を vmlinuz に変えます。

# tftp 10.0.0.1                                                        
tftp> binary                                                           
tftp> put vmlinuz-2.4.18-3 vmlinuz                                     
Sent 1030147 bytes in 2.3 seconds                                      
tftp> quit                                                             
                                                                       

カーネルのファイル名は、ハードウェアが異なったり、カーネルのバージョン
によっては、そのままにしておく必要があるかも知れないし、別の名前にする
必要があるかも知れません。ここでは、カーネルと initrd に関して、同じ名
前を用います。こうすれば、カーネルや initrd イメージを変更しても、別の
ブートフロッピーディスクを作成する必要がなくなります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

4.2. initrd 上のファイル

次に、クライアント用にルートファイルシステムのイメージを作成します。こ
のファイルの完全なリストは、Appendix A にあります。

このファイルは、強力なシェル(bash)を用意するための、最低限の設定として
、動作中のシステムから持ってきました。クライアント用のネットワークユー
ティリティ (dhcpcd や tftp)、やコピー・圧縮ユーティリティ (dd, gzip)、
管理用コマンド (mknod や mount, fdisk それに insmod) もあります。

現在のディレクトリで、 initrd.lst という名前のディレクトリを作成し、こ
れらのファイルをそこに置いて下さい。自分のシステムでこれらのファイルが
存在するかどうかを確かめるには、次のコマンドを実行して下さい。

# ls -d $( /dev/null                                     
                                                                       

以下のようなエラーが出力されるはずです。

ls: /bin/clone: No such file or directory                              
ls: /bin/tftp: No such file or directory                               
ls: /lib/3c59x.o: No such file or directory                            
                                                                       

最初のエラーは、現在のディレクトリに作ることになっているスクリプトです
。二番目のエラーは、 /bin ではなく、 /usr/bin ディレクトリで見つかった 
tftp プログラムです。三番目はネットワークインタフェースカードのモジュー
ル(たぶん自分のではないでしょう)で、 /lib/modules/$(uname -r)/kernel/
drivers/net で見つかったものです。

この三つのファイルについては、以降の節で個別にすぐ論じます。他にも無い
ファイルがあれば、インストールのし忘れとか、バージョンの違い、ディスト
リビューションやハードウェアの違いを調べて下さい。そして、このリストは
自分のシステムの合うように調整して下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

4.3. initrd の作成

次はイメージを作成する段階です。本文書での設定だと、 4 メガバイトの大き
さがあれば、充分ファイルが保持できます。必要ならサイズを大きくしてもか
まいません。

# dd if=/dev/zero of=initrd bs=1024 count=4096                         
4096+0 records in                                                      
4096+0 records out                                                     
# yes | mkfs initrd                                                    
mke2fs 1.27 (8-Mar-2002)                                               
initrd is not a block special device.                                  
Proceed anyway? (y,n) Filesystem label=                                
blah blah blah...                                                      
# mkdir mnt                                                            
# mount -o loop initrd mnt/                                            
# egrep -v "clone|3c59x|tftp" initrd.lst | cpio -pdm mnt               
4876 blocks                                                            
                                                                       

さて、egrep コマンドで、ファイルが三つ除外されました。そこで、tftp プロ
グラムを、 /usr/bin からイメージディレクトリにコピーします。

# cp -p /usr/bin/tftp mnt/bin/                                         
                                                                       

ネットワークインタフェースカード用には、正しいモジュールを特定して下さ
い。そのファイルを特定するには、 lspci コマンドと、 lsmod コマンドの出
力を用います。そのモジュールは、 /lib/modules/$(uname -r)/kernel/
drivers/net にあります。

    Note: 3c59x という名前を使っているところがあれば、すべて自分のケー
    スに合ったモジュール名に読み変えて下さい。
   
# cp -p /lib/modules/$(uname -r)/kernel/drivers/net/3c59x.o mnt/lib/   
                                                                       

Appendix B にあるクローンスクリプトを編集して、 Section 6 で説明した変
数を変更します。そのファイルを実行可能なパーミッションにして、イメージ
ディレクトリにコピーして下さい。

# chmod +x clone                                                       
# cp -p clone mnt/bin/                                                 
                                                                       

initrd イメージをアンマウントし、圧縮してから、 TFTP サーバーに送ります
。

# umount mnt/                                                          
# gzip initrd                                                          
# tftp 10.0.0.1                                                        
tftp> binary                                                           
tftp> put initrd.gz                                                    
Sent 1155530 bytes in 2.8 seconds                                      
tftp> quit                                                             
                                                                       

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5. Grub を用いたフロッピーディスクからのブート

次の段階は、Grub を用いたブートフロッピーディスクの作成です。 Grub とは
、GRand Unified Bootloader のことです。これは BOOTP と TFTP が扱えるの
で、ネットワークからブートできます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.1. Grub のメニューファイル

現在のディレクトリで、 grub.conf という名前で、以下のような内容のファイ
ルを作ります。

default=0                                                                  
timeout=1                                                                  
title Clone                                                                
        bootp                                                              
        root (nd)                                                          
        kernel /vmlinuz rw root=/dev/ram ramdisk_size=4096 init=/bin/clone 
        initrd /initrd.gz                                                  
                                                                           

最後の 4 行は、ネットワークからブートするのに使う、 Grub のコマンドです
。

 ・ bootp は、 DHCP サーバーから IP アドレスを取得するのに使います。
   
 ・ root (nd) は、ネットワーク(TFTP サーバー)のルートを設定するのに使
    います。 tftpserver  コマンドを使えば、このコマンドの
    前に、別の TFTP サーバーを設定できます。
   
 ・ kernel は、カーネルファイルとそのパラメータを指定します。
   
     □ rw は、ルートファイルシステムを書き込み可能にしてマウントするよ
        う指定します。
       
     □ root は、(RAM メモリ内の)ルートファイルシステムをどこにマウン
        トするのかを指定します。
       
     □ ramdisk_size は、 RAM ディスクのサイズを指定します。 4096 (kバ
        イト)がディフォルトの大きさですが、もっと大きなイメージが必要
        なら、それに応じてこのパラメータを変更して下さい。
       
     □ init は、(init と sh が無い場合に)、ユーザーモードで動く最初
        のプログラム(この場合は clone スクリプト)を指定します。
       
 ・ initrd は、ルートファイルシステムのイメージを保持しているファイルを
    指定します。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.2. ネットワークサポートをつけた Grub のコンパイル

Grub をコンパイルする場合は、最初にソースの tar ボールを the Grub web
site  からダウンロードし、展開します
。そして、作成したばかりのメニューファイルと、ネットワークインタフェー
スカードの型を引数に指定して、 configure を実行します。それからいつもの
とおり、make を実行します。

# tar xzf grub-0.92.tar.gz                                             
# cd grub-0.92                                                         
# ./configure --enable-preset-menu=../grub.conf --enable-3c90x         
# make                                                                 
                                                                       

繰り返しますが、 3c90x という型を見たら、自分が使っているネットワークイ
ンタフェースカードの型に読み変えてください。その際、最初に、Grub がその
型をサポートしているかどうか調べて下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.3. ブートフロッピーディスクの作成

一度 Grub をコンパイルしたら、ブートフロッピーディスクのイメージは、
stage1/stage1 ファイルと stage2/stage2 ファイルを連結すればできます。こ
のフロッピーディスクを作成するには、次のコマンドを実行して下さい。

# cat stage1/stage1 stage2/stage2 | dd of=/dev/fd0                     
                                                                       

これで、ブートフロッピーディスクができたはずです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

6. clone スクリプトの実行

Appendix Bで示している、 clone スクリプトは必須ではありません。 init=/
bin/bash をカーネルパラメータにして、利用可能なコマンドやプログラムが実
行できるシェルで終ってもかまいません。

このスクリプトをここに表したのは、正式なやり方のコマンドを示し、タイプ
ミスから被害が生じる可能性を減らすためです。 tftp_server や nic_module
、 major_a、 family_a それに image_a といった変数は、自分の環境やアプリ
ケーションの合わせて変更する必要があります。

注意して欲しいのは、配列 major_a と配列 family_a は対応しているというこ
とです。所定のファミリー名に誤ったメジャー番号を与えると、ユーザーに誤
解を招くことになります。重要なデバイス(ディスクとパーティションの全体
)のメジャー番号とマイナー番号は、 /dev ディレクトリのリストでわかりま
す。メジャー番号とマイナー番号は、 ls -l コマンドの出力にある、カンマで
区切られた、通常のファイルだとファイルサイズがある場所にあります。

# ls -l /dev/fd0 /dev/hda /dev/hda1 /dev/hdc                           
brw-rw----    1 root     disk       2,   0 Apr 11 11:25 /dev/fd0       
brw-rw----    1 root     disk       3,   0 Apr 11 11:25 /dev/hda       
brw-rw----    1 root     disk       3,   1 Apr 11 11:25 /dev/hda1      
brw-rw----    1 root     disk      22,   0 Apr 11 11:25 /dev/hdc       
                                                                       

set -e コマンドは、シェルにスクリプトをアボートするよう指示するもので、
ゼロ以外のコードが返るはずです。通常の終り方のように、 "Kernel panic:
Attempted to kill init!" というメッセージがそれに続きます。でも、うろた
えないで!この環境では、これが普通なのです。コンピュータを落とすだけで
かまいません。スクリプトを終らせてこの見苦しいメッセージを避ける前に、
Ctrl-Alt-Del を押して、きちんとリブートして下さい。

insmod コマンドは、ネットワークインタフェースモジュールをロードするコマ
ンドで、 dhcpcd コマンドは、 DHCP クライアントをスタートさせるコマンド
です。 Grub がそのブート中に DHCP を使用したということと、 Linux が同じ
ことをしたということが、無関係なことに注意して下さい。

このスクリプトでは、各々繰り返しを行なうために、大きなループ処理を行な
っています。まず、次の三種類の操作の中のどれを行なうかを訊いてきます。
ネットワークからデバイスへのコピー、デバイスからネットワークへのコピー
、 fdisk の実行。次に、使用するブロックデバイスがどれかを訊いてきます。
major_a 配列は、使用できるブロックデバイスのメジャー番号を持っています
。また、family_a には、デバイスファミリー個々の名称が入っています。その
後、使用するブロックデバイスのマイナー番号を訊いてきます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

6.1. ディスクイメージの保存とリストア

コピー操作の内の一つを選ぶと、スクリプトは保存ないしはリストアするイメ
ージの名前を訊いてきます。イメージ名称は、image_a 配列の要素に限定され
ています。その名前が存在しなければ、イメージと同じ名前の、名前付きパイ
プを作ります。最後に、dd と tftp を同時に起動し、イメージを転送します。
いつもの ftp とは違い、 tftp は名前付きパイプを、ちょうど普通のファイル
のように put したり get したりします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

6.2. fdisk の使用

fdisk を選ぶと、ブロックデバイスに対して起動されます。 fdisk は普通、一
つのパーティションではなく、逆にディスク全体に対して実行されます。注意
して欲しいのは、通常 /dev/hda と呼んでいるものが、 clone スクリプトでは
/dev/hda0 となることです。お望みなら、スクリプト中に fdisk を置いて、パ
ーティション生成を自動化することも可能です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

7. ソリューションの拡張

7.1. ファイルシステムではなく、ファイルの保存とリストア

保存したいのがディスクイメージ全体ではなく、ファイルシステムの中にある
ファイルだけなら、 dd の代わりに、 tar や cpio で、似たようなソリューシ
ョンが使えます。ファイルシステムをマウントする必要はあります。以下に示
すように、 clone スクリプトにもっとコマンドを追加して下さい。

# mkdir /mnt                                                           
# mount ${device_name} /mnt                                            
# mknod ${image} p                                                     
# tftp ${tftp_server} <<-EOT &                                         
binary                                                                 
put ${image}                                                           
EOT                                                                    
tar czf ${image}                                                       
                                                                       

or

# tftp ${tftp_server} <<-EOT &                                         
binary                                                                 
get ${image}                                                           
EOT                                                                    
tar xzf ${image}                                                       
                                                                       

initrd イメージには、スクリプトが使えるように、 mkdir プログラムと tar
プログラムを置いておく必要があります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

7.2. マスターブートレコードの設定

本文書の内容を用いてパーティションの再編やサイズ変更を行なった状況では
、ディスクがブートせずに終るかもしれません。その場合は、(イメージ中の 
grub に含まれている) Grub の setup コマンドを実行して下さい。これで問
題が解決するはずです。詳細は、 Grub のドキュメントを参照して下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

7.3. 必要なモジュールのロード

カーネルによっては、 SCSI デバイスのようなブロックデバイスにアクセスす
るために、余分なモジュールが必要になるかもしれません。 initrd イメージ
の /lib ディレクトリに必要なモジュールを置いて、 clone スクリプトで、対
応する insmod コマンドを実行して下さい。同じことはファイルシステムにも
言えます。例えば、fat ファイルシステムのイメージではなく、ファイルを保
存したければ、 fat.o と vfat.o モジュールが必要になります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

7.4. grub.confで予め定義されている操作

Grub のメニューファイル grub.conf はカスタマイズして、いくつかのコピー
オプションを提示するようにしても良いし、ディスクのパーティション再作成
や、ネットワークから指定したイメージを取得するような、予め定義しておい
た操作を実行するようにしてもかまいません。繰り返しますが、ここで示され
た考え方を用いて特定の作業に応用すれば、その作業が達成できるようになる
のです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

8. 日本語版謝辞

校正にあたり、JF プロジェクトの皆様にご協力いただきました。この場を借り
て御礼申し上げます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

A. initrd 上のファイル一覧

/bin/                                                                  
/bin/bash                                                              
/bin/clone                                                             
/bin/dd                                                                
/bin/gzip                                                              
/bin/mknod                                                             
/bin/mount                                                             
/bin/tftp                                                              
/dev/                                                                  
/dev/console                                                           
/dev/null                                                              
/etc/                                                                  
/etc/dhcpc/                                                            
/etc/hosts                                                             
/etc/nsswitch.conf                                                     
/etc/protocols                                                         
/etc/services                                                          
/lib/                                                                  
/lib/3c59x.o                                                           
/lib/i686/                                                             
/lib/i686/libc-2.2.5.so                                                
/lib/i686/libc.so.6                                                    
/lib/ld-2.2.5.so                                                       
/lib/ld-linux.so.2                                                     
/lib/libdl-2.2.5.so                                                    
/lib/libdl.so.2                                                        
/lib/libnss_files-2.2.5.so                                             
/lib/libnss_files.so.2                                                 
/lib/libtermcap.so.2                                                   
/lib/libtermcap.so.2.0.8                                               
/proc/                                                                 
/sbin/                                                                 
/sbin/dhcpcd                                                           
/sbin/fdisk                                                            
/sbin/insmod                                                           
/tmp/                                                                  
/var/                                                                  
/var/run/                                                              
                                                                       

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

B. Clone スクリプト

#!/bin/bash                                                            
                                                                       
set -e                                                                 
                                                                       
export PATH=/sbin:/bin                                                 
                                                                       
tftp_server=10.0.0.1                                                   
nic_module=3c59x.o                                                     
major_a=(2 3 22)                                                       
family_a=(fd hda hdc)                                                  
image_a=(img0001 img0002 img0003 img0004)                              
                                                                       
operation_a=(   "Copy from network to device" \                        
                "Copy from device to network" \                        
                "Run fdisk")                                           
                                                                       
mount -t proc proc /proc                                               
insmod /lib/${nic_module}                                              
/sbin/dhcpcd                                                           
                                                                       
while true; do \                                                       
        [ ! -z "${image}" ] && unset image                             
        echo                                                           
        echo "Clone Menu"                                              
        echo                                                           
        echo "Operation"                                               
        echo                                                           
        PS3="Choose operation (1-${#operation_a[*]}): "                
        select operation in "${operation_a[@]}"; do \                  
                [ -z "${operation}" ] && continue                      
                echo                                                   
                echo $REPLY - $operation                               
                echo                                                   
                break                                                  
        done                                                           
                                                                       
        echo "Device Family"                                           
        echo                                                           
        PS3="Choose device family (1-${#family_a[*]}): "               
        select family in "${family_a[@]}"; do \                        
                [ -z "${family}" ] && continue                         
                echo                                                   
                echo $REPLY - $family                                  
                echo                                                   
                break                                                  
        done                                                           
                                                                       
        major_i=$[REPLY-1]                                             
        major=${major_a[$major_i]}                                     
                                                                       
        echo "Minor Number"                                            
        echo                                                           
        PS3="Choose minor number (0-255): "                            
        echo -n "$PS3" >&2                                             
        read minor                                                     
        minor=$[minor%256]                                             
        echo                                                           
        echo $minor                                                    
        echo                                                           
                                                                       
        if [ "${operation}" != "${operation_a[2]}" ]; then \           
                echo "Image"                                           
                echo                                                   
                PS3="Choose image (1-${#image_a[*]}): "                
                select image in "${image_a[@]}"; do \                  
                        [ -z "${image}" ] && continue                  
                        echo                                           
                        echo $REPLY - $image                           
                        echo                                           
                        break                                          
                done                                                   
                image_i=$[REPLY-1]                                     
                image=${image_a[${image_i}]}                           
        fi                                                             
                                                                       
        echo                                                           
        echo -e "Operation:\t$operation"                               
        device_name=/dev/${family_a[${major_i}]}${minor}               
        echo -e "Device:\t\t${device_name} ($major, $minor)"           
        [ ! -z "${image}" ] && echo -e "Image:\t\t${image}"            
        echo                                                           
                                                                       
        echo "Confirmation"                                            
        echo                                                           
        PS3="Ok/Cancel (1-2): "                                        
        select ok in Ok Cancel; do \                                   
                [ -z "${ok}" ] && continue                             
                echo                                                   
                echo $REPLY - $ok                                      
                echo                                                   
                break                                                  
        done                                                           
        if [ "${ok}" = "Ok" ]; then \                                  
                if [ ! -b ${device_name} ]; then \                     
                        echo "Creating ${device_name}"                 
                        mknod ${device_name} b ${major} ${minor}       
                fi                                                     
                if [ ! -z "${image}" ]; then \                         
                        if [ ! -p ${image} ]; then \                   
                                echo "Creating pipe"                   
                                mknod ${image} p                       
                        fi                                             
                fi                                                     
                if [ "${operation}" = "${operation_a[0]}" ]; then \    
                        tftp ${tftp_server} <<-EOT &                   
                        binary                                         
                        get ${image}                                   
                        EOT                                            
                        gzip -c -d < ${image} | dd of=${device_name}   
                elif [ "${operation}" = "${operation_a[1]}" ]; then \  
                        tftp ${tftp_server} <<-EOT &                   
                        binary                                         
                        put ${image}                                   
                        EOT                                            
                        dd if=${device_name} | gzip -c > ${image}      
                elif [ "${operation}" = "${operation_a[2]}" ]; then \  
                        fdisk ${device_name}                           
                fi                                                     
                echo                                                   
        fi                                                             
                                                                       
        echo "Continuation"                                            
        echo                                                           
        PS3="Continue/Exit (1-2): "                                    
        select new in Continue Exit; do \                              
                [ -z "${new}" ] && continue                            
                echo                                                   
                echo $REPLY - $new                                     
                echo                                                   
                break                                                  
        done                                                           
        [ "${new}" = "Exit" ] && break                                 
done                                                                   
exit 0                                                                 
                                                                       

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

References

[1] GRUB.

http://www.gnu.org/software/grub/

一覧に戻る
グリーンネット・トップページへ戻る

http://www.green.ne.jp/