レスキューディスクの作成(4)

 今まで作成してきた、レスキューディスクはモジュールをサポートしていなかったので、今回はカーネルモジュールをサポートするように修正します。
 モジュールをサポートする事で、カーネルの機能を十分に活用出来るようになります。今回作成したレスキューディスクと、別の機能ディスクを作成し、そこに必要なモジュール等を入れておけば使用方法は格段に広がるはずです。

前回までの内容
  1. モジュールをサポートしたカーネルの作成
    今までは、モジュールをサポートしないカーネルを利用してきたのですが、今回からモジュールに対応したカーネルを作成します。
    難しい事はとくになく、カーネルモジュールをサポートし、makeし直すだけです。
    今回も、利用した環境は Turbolinux 7 Server(カーネルバージョン 2.4.9です。)

    以下に、必須項目と今回のテスト用為にモジュール化した項目を示します。
    Loadable module support      カーネルモジュールをサポートする為には必須項目です。
            [*] Enable loadable module support
            [*] Kernel module loader

    今回、試しに以下の項目をモジュールとして組み込むようにしました。
    IDE, ATA and ATAPI Block devices
            <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
                    <M> Include IDE/ATAPI CDROM support
     <-CDROM
    File systems
            <M> DOS FAT fs support  
    <-DOSファイルシステムサポート
            <M> VFAT (Windows-95) fs support  
    <-FAT32のサポート
           <M> ISO 9660 CDROM file system support
     <-ISO CDのサポート

    manuconfigを終了したら、カーネル及びモジュールをコンパイルします。
    make dep          <-- 依存関係の更新
    make clean        
    <-- 前回のオブジェクト削除
    make bzImage    
    <-- カーネルの作成
    make modules  
    <-- モジュールの作成

    ここまで来たら、カーネルをFDへ書き込みます。

    事前準備として、使用するFDは次の通り一度フォーマットしておきます。
    [root kernel]# fdformat /dev/fd0u1722

    カーネルのファイルシステムは前回までと同様に作成します。
    1. FDのフォーマット(カーネル配置用ファイルシステム作成)
      カーネル配置用に作成したファイルシステムサイズ(ここでは370k)は後で使用するので忘れない事。
      ※ 370=カーネルサイズ+必須ファイル分(約40Kバイト必要)
      今回から、ファイルシステムをより小さくできるようにminixを使ってみました。(ほとんど差はなかったけど...。(^^;))
      [root kernel]# ls -lh /usr/src/linux/arch/i386/boot/bzImage  カーネルサイズの確認
      -rw-r--r-- 1 root root 343k May 30 01:11 bzImage
      [
      root kernel]# mkfs -tminix /dev/fd0u1722 370          カーネルファイルシステムフォーマット
      [root kernel]# mount /dev/fd0u1722 /mnt/floppy
       
    2. 必須ディレクトリ・ファイルの作成、コピー
      [root kernel]# cd /mnt/floppy/
      [
      root floppy]# rmdir lost+found
      [
      root floppy]# mkdir boot dev
      [
      root floppy]# cd dev
      [
      root dev]# mknod null c 1 3
      [
      root dev]# mknod fd0 b 2 0
      [root dev]# mknod fd0u1722 b 2 60
      [
      root dev]# cd ../boot/
      [
      root boot]# cp /boot/boot-text.b boot.b
      [
      root boot]# cd ..
      [
      root floppy]# vi bdlilo.conf <--内容については下記を参照。
      [
      root floppy]# cp /usr/src/linux/arch/i386/boot/bzImage .
      bdlilo.confの内容は次の通り。
      boot=/dev/fd0u1722
      install=/boot/boot.b
      map=/boot/map
      read-write
      backup=/dev/null
      prompt
      timeout=100
      image=bzImage
          label=Bootdisk
          root=/dev/fd0u1722
      ※boot=/dev/fd0u1722の場合にcompactオプションを指定すると、lilo起動時にError 0x04が発生するので、compactオプションは付けません。
       
    3. liloの実行(インストール)
      [root floppy]# lilo -v -C bdlilo.conf -r /mnt/floppy
        
    4. カーネルのRAM変数の書き換え。
      370K(カーネル配置用に作成したファイルシステムのサイズ)+16384(2^14:RAMディスクの指定)=16820
      [root floppy]# rdev -r /mnt/floppy/bzImage 16754
      [root floppy]# rdev /mnt/floppy/bzImage /dev/fd0u1722
       
    5. ルートファイルシステムの書き込み
      ルートファイルシステム作成については後述します。
      ここでは、FDへの書き込み方法についてだけ説明します。
      FDのカーネルファイルシステムの直後よりルートファイルシステムを書き込みます。今回は370Kバイトになります。
      また、FDがマウントされている場合は、事前のマウントを解除しておきます。
      [root floppy]# cd ..
      [root /mnt]# umount /dev/fd0u1722
          <-- FDのアンマウント
      [root /mnt]# dd if=rootfs.gz of=/dev/fd0u1722 bs=1k seek=370  <--370Kバイトseekした位置からの書き込み。

  2. ルートファイルシステムの作成
    ルートファイルシステムの作成はレスキューディスクの作成(1)と同様です。詳しくはそちらを参照してください。
    ここでは、簡単に説明します。
    今回から、モジュールをサポートするので、iinsmod, modprobe, lsmod, rmmodは必須になります。
      insmod・・・ モジュールをカーネルにロードする。
      rmmod ・・・ モジュールをアンロードする。
      lsmod  ・・・ ロードされているモジュールの一覧を表示する。
      modprobe・・・依存関係を解決し、モジュールをロードする。
      depmod・・・モジュールの依存関係をmodules.dep等のファイルに書き出す。
    #!/bin/sh

    #-- RAMディスク準備 --
    RAMディスクエリアフォーマット後、マウントします。。
    dd if=/dev/zero of=/dev/ram bs=1k count=4096
    mkfs -tminix /dev/ram 4096
    mkdir -p /mnt/ramdisk
    mount -t minix /dev/ram /mnt/ramdisk

    RAMディスク上に必要となるディレクトリを作成します。
    cd /mnt/ramdisk
    mkdir root dev proc etc sbin bin lib mnt usr tmp var
    chmod +t tmp スティッキービット付与

    デバイススペシャルファイルを作成します。
    #------ /dev ------
    cd /mnt/ramdisk/dev
    mknod console c 5 1
    mknod cua0 c 5 64
    mknod cua1 c 5 65
    mknod cua2 c 5 66
    mknod cua3 c 5 67
    mknod mem c 1 1
    mknod kmem c 1 2
    mknod null c 1 3
    mknod zero c 1 5
    mknod tty c 5 0
    mknod tty0 c 4 0
    mknod tty1 c 4 1
    mknod tty2 c 4 2
    mknod tty3 c 4 3
    mknod tty4 c 4 4
    mknod ttyS1 c 4 65

    mknod fd0 b 2 0
    mknod fd0H1440 b 2 28
    mknod fd0h1440 b 2 40
    mknod fd0u1722 b 2 60

    mknod ram b 1 1
    mknod ram0 b 1 0
    mknod ram1 b 1 1
    ln -s ram0 ramdisk
    mknod hda b 3 0
    mknod hda1 b 3 1
    mknod hda2 b 3 2
    mknod hda3 b 3 3
    mknod hda4 b 3 4
    mknod hda5 b 3 5
    mknod hda6 b 3 6
    mknod hda7 b 3 7
    mknod hda8 b 3 8
    mknod hda9 b 3 9
    mknod hda10 b 3 10
    mknod hdb b 3 64
    mknod hdb1 b 3 65
    mknod hdb2 b 3 66
    mknod hdb3 b 3 67
    mknod hdb4 b 3 68
    mknod hdb5 b 3 69
    mknod hdb6 b 3 70
    mknod hdb7 b 3 71
    mknod hdb8 b 3 72
    mknod hdb9 b 3 73
    mknod hdb10 b 3 74
    mknod hdc b 22 0
    ln -s hdc cdrom


    システムにて必至なファイルを配置します。
    # ------ /etc ------
    cd /mnt/ramdisk/etc/
    mkdir pam.d
    touch ld.so.cache
    echo /lib > /mnt/ramdisk/etc/ld.so.conf
    echo /lib/security >> /mnt/ramdisk/etc/ld.so.conf
    #--issueファイルを作成します。--
    echo Ryocho Linux > /mnt/ramdisk/etc/issue
    echo "VC: \\l" >> /mnt/ramdisk/etc/issue
    #--motdファイルを作成します。--
    echo Welcome to Ryocho Linux. > /mnt/ramdisk/etc/motd
    #--rcファイルを作成します。--
    echo '#!/bin/sh' > /mnt/ramdisk/etc/rc
    echo /bin/mount -av >> /mnt/ramdisk/etc/rc
    echo /bin/loadkeys /etc/jp106.kmap >> /mnt/ramdisk/etc/rc
    echo /bin/hostname ryouto.jp >> /mnt/ramdisk/etc/rc
    chmod +x /mnt/ramdisk/etc/rc
    #--fstabファイルを作成します。--
    echo /dev/ram0 / ext2 defaults 1 1 > /mnt/ramdisk/etc/fstab
    echo /proc /proc proc defaults 1 1 >> /mnt/ramdisk/etc/fstab
    #--inittabファイルを作成します。--
    echo id:2:initdefault: > /mnt/ramdisk/etc/inittab
    echo si::sysinit:/etc/rc >> /mnt/ramdisk/etc/inittab
    echo 1:2345:respawn:/sbin/mingetty tty1 >> /mnt/ramdisk/etc/inittab
    echo 2:2345:respawn:/sbin/mingetty tty2 >> /mnt/ramdisk/etc/inittab
    echo l0:0:wait:/etc/rc.halt 0 >> /mnt/ramdisk/etc/inittab
    echo l6:6:wait:/etc/rc.halt 6 >> /mnt/ramdisk/etc/inittab
    #--rc.haltファイルを作成します。--
    echo '#!/bin/sh' > /mnt/ramdisk/etc/rc.halt
    echo "echo \"Sending all processes the TERM signal...\"" >> /mnt/ramdisk/etc/rc.halt
    echo "killall5 -15" >> /mnt/ramdisk/etc/rc.halt
    echo "sleep 2" >> /mnt/ramdisk/etc/rc.halt
    echo "echo \"Sending all processes the TERM signal...\"" >> /mnt/ramdisk/etc/rc.halt
    echo "killall5 -9" >> /mnt/ramdisk/etc/rc.halt
    echo "sleep 2" >> /mnt/ramdisk/etc/rc.halt
    echo "echo \"Unmounting file systems\"" >> /mnt/ramdisk/etc/rc.halt
    echo "umount -a -f" >> /mnt/ramdisk/etc/rc.halt
    echo "case \"\$1\" in" >> /mnt/ramdisk/etc/rc.halt
    echo " 0)" >> /mnt/ramdisk/etc/rc.halt
    echo " echo \"The system is halted\"" >> /mnt/ramdisk/etc/rc.halt
    echo " eval halt" >> /mnt/ramdisk/etc/rc.halt
    echo " ;;" >> /mnt/ramdisk/etc/rc.halt
    echo " 6)" >> /mnt/ramdisk/etc/rc.halt
    echo " echo \"rebooting the system...\"" >> /mnt/ramdisk/etc/rc.halt
    echo " eval reboot" >> /mnt/ramdisk/etc/rc.halt
    echo " ;;" >> /mnt/ramdisk/etc/rc.halt
    echo "esac" >> /mnt/ramdisk/etc/rc.halt
    chmod +x /mnt/ramdisk/etc/rc.halt
    # --pam.d/otherファイルを作成します。--
    echo auth optional /lib/security/pam_permit.so > /mnt/ramdisk/etc/pam.d/other
    echo account optional /lib/security/pam_permit.so >> /mnt/ramdisk/etc/pam.d/other
    echo password optional /lib/security/pam_permit.so >> /mnt/ramdisk/etc/pam.d/other
    echo session optional /lib/security/pam_permit.so >> /mnt/ramdisk/etc/pam.d/other
    #--passwd,groupファイルを作成します。--
    echo root:x:0:0:root:/root:/bin/ash > /mnt/ramdisk/etc/passwd
    echo root:x:0:root > /mnt/ramdisk/etc/group
    #--profileファイルを作成します。--
    echo export PATH=/usr/bin:/bin:/sbin > /mnt/ramdisk/etc/profile
    echo stty erase ^H >> /mnt/ramdisk/etc/profile
    #--shellsファイルを作成します。--
    echo /bin/sh > /mnt/ramdisk/etc/shells
    echo /bin/ash >> /mnt/ramdisk/etc/shells
    #--keyマップファイルの作成--
    dumpkeys > jp106.kmap

    レスキューに必要と思われるファイル群を配置しておきます。
    #------/bin------
    cd /mnt/ramdisk/bin
    cp /bin/{ash,cat,chmod,chown,cp,dd,df,hostname,ln,login,ls,mkdir,mknod,more,mount,mv,ps,
    pwd,rm,stty,umount,loadkeys,kill} .
    ln -s ash sh

    /binや/sbinのコマンドで使用されるライブラリ全てを追加する必要があります。
    #------/lib------
    cd /mnt/ramdisk/lib
    #--ライブラリファイルのコピー--
    cp /lib/{libc-2.2.4.so,ld-2.2.4.so,libcom_err.so.2.0,libcrypt-2.2.4.so,libdl-2.2.4.so,libext2fs.so.2.4,
    libnsl-2.2.4.so,libnss_files-2.2.4.so,libpam.so.0.75,libpam_misc.so.0.75,libproc.so.2.0.6,
    libutil-2.2.4.so,libuuid.so.1.2,librt-2.2.4.so,libe2p.so.2.3} .
    #-- シンボリックファイルのコピー--
    cp -a /lib/{ld-linux.so.2,libcom_err.so.2,libcrypt.so.1,libdl.so.2,libext2fs.so.2,libnsl.so.1,libnss_files.so.2,
    libpam.so.0,libpam.so,libpam_misc.so.0,libpam_misc.so,libutil.so.1,libuuid.so.1,librt.so.1,libe2p.so.2} .
    #--他のディレクトリにあるファイルのコピー--
    cp /usr/lib/libz.so.1.1.3 .
    cp -a /usr/lib/libz.so.1 .
    #--pamで使用するライブラリのコピー--
    mkdir -p /mnt/ramdisk/lib/security
    cd /mnt/ramdisk/lib/security
    cp /lib/security/pam_permit.so .

    ldconfigを実行し、ルートファイルシステムのシェアードライブラリ情報を作成します。
    #------ldconfigの実行------
    /sbin/ldconfig -r /mnt/ramdisk

    レスキューに必要と思われるファイル群を配置しておきます。
    #------/sbin------
    cd /mnt/ramdisk/sbin
    cp -a /sbin/{restore,fdisk,mingetty,halt,shutdown,init,mke2fs,
    mkfs,mkfs.ext2,mkfs.ext3,mkswap,swapon,killall5,reboot} .
    cp -a /sbin/{insmod,modprobe,lsmod,rmmod} .

    log,runなどのファイルを置いておきます。
    #------/var------
    cd /mnt/ramdisk/var
    mkdir /mnt/ramdisk/var/{log,run}
    touch /mnt/ramdisk/var/run/utmp

    #----- モジュールのインストール ------------
    モジュールは通常/lib/modusにインストールされますが、環境変数"INSTALL_MOD_PATH"を指定する事で、インストール先を変更する事が可能になります。
    export INSTALL_MOD_PATH=/mnt/ramdisk
    cd /usr/src/linux
    make modules_install
    #モジュールインストールで不要ファイルまで作成されるので削除
    cd /mnt/ramdisk/lib/modules/2.4.9-3
    rm -rf block modules.generic_string modules.isapnpmap modules.parportmap
    modules.pcimap modules.usbmap pcmcia scsi

    完成したルートフィルシステムを圧縮ファイルにまとめます。
    これを先ほどの手順のとおりFDに書き込みます。

    #------圧縮ルートファイルシステムの作成------
    cd /mnt
    umount /dev/ram
    dd if=/dev/ram bs=1k | gzip -v9 > rootfs.gz

  3. FDの確認
    モジュールが正しくロードされる事を確認します
    簡単に、依存関係について説明です。
    下記の例ではcdromとide-cdの関係を例にとって説明します。
    これらはどちらもCD-ROMを利用する際に必要となります。
    [root root]# insmod ide-cd.o
    ide-cd.o: unresolved symbol cdrom_mode_select
    ide-cd.o: unresolved symbol ...
    ide-cd.o: unresolved symbol ...
    ide-cd.o: unresolved symbol ...
    と、cdrom.oに含まれる関数がないと言われます。
    これは、cdrom.o -> ide-cd.oの順にinsmodを実行しない為です。
    これを自動化させるのが、modprobeであり、依存関係ファイルを作成するのがdepmodです。
    カーネル作成時に、「Loadable module support」-「Kernel module loader」を有効にしていれば、必要な時(例えばmount時など)に、カーネルが自動的にモジュールをロードしてくれますが、そうでない場合は、手動で組み込まなくてはなりません。
    今回はmodule loaderも有効にしてカーネルを作成しているので、CD-ROMをマウントするだけで、モジュールのロードはカーネルが行ってくれます。
    # mount /dev/cdrom /mnt  CDROMのマウント
    # lsmod モジュールが自動的に読み込まれている事を確認します。
    Module         size       Used  by
     isofs        15680         1 (autoclean)
     ide-cd      23604         1
     cdrom      25280         0 [ide-cd]


    今回は、以上でおしまいです。

お問い合わせはwebmaster@ryouto.jpまで。
Copyright (C)2003 ryouto.jp. All Rights Reserved.