レスキューディスクの作成(1) |
|
[root /root]# cd /usr/src/linux [root linux]# make menuconfig |
Code maturity level options ---> 不要です。 Loadable module support ---> 不要です。今後の改良版で使用予定。 Processor type and features ---> (386) Processor family ・・・適当なProcessorを選択します。 General setup ---> (ELF) Kernel core (/proc/kcore) format [*] Kernel support for ELF binaries Memory Technology Devices (MTD) --->不要です。 Parallel port support ---> 不要です。 Plug and Play configuration ---> 不要です。 Block devices ---> [*] Normal PC floppy disk support [*] Loopback device support [*] RAM disk support (4096) Default RAM disk size [*] Initial RAM disk (initrd) support Multi-device support (RAID and LVM) ---> 不要です。 Telephony Support ---> 不要です。 ATA/IDE/MFM/RLL support ---> [*] ATA/IDE/MFM/RLL support [*] Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support [*] Include IDE/ATA-2 DISK support [*] Include IDE/ATAPI CDROM support SCSI support ---> 不要です。 Fusion MPT device support ---> ?不要です。 I2O device support ---> 不要です。 Amateur Radio support ---> 不要です。 ISDN subsystem ---> 不要です。 Old CD-ROM drivers (not SCSI, not IDE) ---> 不要です。 Input core support ---> 不要です。 Character devices ---> [*] Virtual terminal [*] Support for console on virtual terminal Multimedia devices ---> 不要です。 Crypto Hardware support ---> 不要です。 File systems ---> [*] Ext3 journalling file system support (EXPERIMENTAL) [*] ISO 9660 CDROM file system support [*] /proc file system support [*] Second extended fs support Console drivers ---> [*] VGA text console Sound ---> 不要です。 USB support ---> 不要です。 Kernel hacking ---> 不要です。 |
[root linux]# make dep <--依存関係の構築 [root linux]# make clean <--不要ファイル消去 [root linux]# make bzImage <--カーネル構築 |
RAMディスクエリアをzeroクリアします。 [root /root]# dd if=/dev/zero of=/dev/ram bs=1k count=4096 RAMディスクをフォーマットします。 [root /root]# mke2fs -m 0 -i 20000 -b 1024 /dev/ram 4096 RAMディスクをマウントします。 [root /root]# mkdir -p /mnt/ramdisk [root /root]# mount -t ext2 /dev/ram /mnt/ramdisk RAMディスク上に必要となるディレクトリを作成し、不要ディレクトリは削除します。 [root /root]# cd /mnt/ramdisk [root ramdisk]# mkdir root dev proc etc sbin bin lib mnt usr tmp [root ramdisk]# chmod +t tmp スティッキービット付与 [root ramdisk]# rmdir lost+found |
[root /dev]# ls -l console crw------- 1 root root 5, 1 May 30 11:46 console ↑タイプ ↑↑ major,minor番号 |
[root ramdisk]# cd /mnt/ramdisk/dev [root dev]# mknod console c 5 1 [root dev]# mknod cua0 c 5 64 [root dev]# mknod cua1 c 5 65 [root dev]# mknod cua2 c 5 66 [root dev]# mknod cua3 c 5 67 [root dev]# mknod mem c 1 1 [root dev]# mknod kmem c 1 2 [root dev]# mknod null c 1 3 [root dev]# mknod zero c 1 5 [root dev]# mknod tty c 5 0 [root dev]# mknod tty0 c 4 0 [root dev]# mknod tty1 c 4 1 [root dev]# mknod tty2 c 4 2 [root dev]# mknod tty3 c 4 3 [root dev]# mknod tty4 c 4 4 [root dev]# mknod ttyS1 c 4 65 [root dev]# mknod fd0 b 2 0 [root dev]# mknod fd0H1440 b 2 28 [root dev]# mknod fd0h1440 b 2 40 [root dev]# mknod fd0u1722 b 2 60 [root dev]# mknod ram b 1 1 [root dev]# mknod ram0 b 1 0 [root dev]# mknod ram1 b 1 1 [root dev]# ln -s ram0 ramdisk [root dev]# mknod hda b 3 0 [root dev]# mknod hda1 b 3 1 [root dev]# mknod hda2 b 3 2 [root dev]# mknod hda3 b 3 3 [root dev]# mknod hda4 b 3 4 [root dev]# mknod hda5 b 3 5 [root dev]# mknod hda6 b 3 6 [root dev]# mknod hda7 b 3 7 [root dev]# mknod hda8 b 3 8 [root dev]# mknod hda9 b 3 9 [root dev]# mknod hda10 b 3 10 [root dev]# mknod hdb b 3 64 [root dev]# mknod hdb1 b 3 65 [root dev]# mknod hdb2 b 3 66 [root dev]# mknod hdb3 b 3 67 [root dev]# mknod hdb4 b 3 68 [root dev]# mknod hdb5 b 3 69 [root dev]# mknod hdb6 b 3 70 [root dev]# mknod hdb7 b 3 71 [root dev]# mknod hdb8 b 3 72 [root dev]# mknod hdb9 b 3 73 [root dev]# mknod hdb10 b 3 74 [root dev]# mknod hdc b 22 0 [root dev]# ln -s hdc cdrom |
[root dev]# cd /mnt/ramdisk/etc/ pamで使用するディレクトリを作成します。 [root etc]# mkdir pam.d シェアードライブラリのパス情報を格納するファイルを空状態で作成します。 [root etc]# touch ld.so.cache シェアードライブラリの検索パスを指定し、ld.so.confを作成します。 [root etc]# echo /lib > /mnt/ramdisk/etc/ld.so.conf [root etc]# echo /lib/security >> /mnt/ramdisk/etc/ld.so.conf --issueファイルを作成します。-- loginプロンプトの前に出力される文字列で内容は任意です。 [root etc]# echo Ryocho Linux > /mnt/ramdisk/etc/issue [root etc]# echo VC: \l >> /mnt/ramdisk/etc/issue --motdファイルを作成します。-- login後に出力される文字列で内容は任意です。 [root etc]# echo Welcome to Ryocho Linux. > /mnt/ramdisk/etc/motd --rcファイルを作成します。-- inittabファイルで指定され、initプロセスでこの内容が実行されます。 初期化処理はここに記述します。 [root etc]# echo '#!/bin/sh' > /mnt/ramdisk/etc/rc [root etc]# echo /bin/mount -av >> /mnt/ramdisk/etc/rc [root etc]# echo /bin/hostname ryouto.jp >> /mnt/ramdisk/etc/rc [root etc]# echo /bin/loadkeys /etc/jp106.kmap >> /mnt/ramdisk/etc/rc [root etc]# chmod +x /mnt/ramdisk/etc/rc --fstabファイルを作成します。-- ファイルシステムのマウント状況などを記述します。rcファイルで実行されるmountで参照されます。 [root etc]# echo /dev/ram0 / ext2 defaults 1 1 > /mnt/ramdisk/etc/fstab [root etc]# echo /proc /proc proc defaults 1 1 >> /mnt/ramdisk/etc/fstab --inittabファイルを作成します。-- initプロセスによって読み込まれます。最初にsysinitで指定されたモジュールを実行します。次にrespawnで指定されたmingettyが起動されます。 [root etc]# echo id:2:initdefault: > /mnt/ramdisk/etc/inittab [root etc]# echo si::sysinit:/etc/rc >> /mnt/ramdisk/etc/inittab [root etc]# echo 1:2345:respawn:/sbin/mingetty tty1 >> /mnt/ramdisk/etc/inittab --pam.d/otherファイルを作成します。-- pamによって参照されます。pamとはloginコマンドなどで使用される、セキュリティーモジュールです。ここでは、認証など必要ないと思われる為、全て許可とします。 通常pamではコマンド毎に制御ファイルが用意され(loginコマンドでは、/etc/pam.d/loginファイル)、詳細に挙動を指定します。ただし、専用ファイルが無い場合、otherを参照するので、otherのみを全て許可する指定で作成しました。(本来のotherファイルは全て拒否で作成されています。) [root etc]# echo auth optional /lib/security/pam_permit.so > /mnt/ramdisk/etc/pam.d/other [root etc]# echo account optional /lib/security/pam_permit.so >> /mnt/ramdisk/etc/pam.d/other [root etc]# echo password optional /lib/security/pam_permit.so >> /mnt/ramdisk/etc/pam.d/other [root etc]# echo session optional /lib/security/pam_permit.so >> /mnt/ramdisk/etc/pam.d/other --passwdファイルを作成します。-- rootユーザーを作成します。シェルはashを使用しています。 ちなみにpasswdファイルのフォーマットは次の通りです。 ユーザー:パスワード:UID:GID:名前:ホームディレクトリ:使用シェル。 [root etc]# echo root:x:0:0:root:/root:/bin/ash > /mnt/ramdisk/etc/passwd --groupファイルを作成します。-- グループを登録します。rootだけで十分です。 [root etc]# echo root:x:0:root > /mnt/ramdisk/etc/group --profileファイルを作成します。-- 共通のprofileです。 [root etc]# echo export PATH=/usr/bin:/bin:/sbin > /mnt/ramdisk/etc/profile [root etc]# echo stty erase ^H >> /mnt/ramdisk/etc/profile --shellsファイルを作成します。-- このファイルには使用できるシェルを羅列します。 /bin/shは/bin/ashのシンボリックリンクです。従って実際にはashしか使えないと言う事です。 bashはサイズが大きい為、レスキューディスクには不向きです。 [root etc]# echo /bin/sh > /mnt/ramdisk/etc/shells [root etc]# echo /bin/ash >> /mnt/ramdisk/etc/shells --keyマップファイルの作成-- 現在の環境のキーボード配列を指定します。 rcスクリプトのloadkeysで使用します。これを実行する事で、キー配列を通常のキー配列として扱えます。loadkeysを実行しない場合、英語キーボートとして扱われる為、アルファベットは同じ配列でも \,=,,*といった記号が英語キーボードの配列になります。 必須ではないので、FDの容量が足りなくなったら消してもいいかもしれません。このファイルとloadkeysで80Kくらいは使用しています。 [root etc]# dumpkeys > jp106.kmap |
[root etc]# cd /mnt/ramdisk/bin [root etc]# cp /bin/{ash,cat,chmod,chown,cp,dd,df,grep,hostname,ln,login,ls, mkdir,mknod,more,mount,mv,ps,pwd,rm,stty,sync,tar,umount,loadkeys,gzip,gunzip} . [root etc]# ln -s ash sh |
例えばashで使用するライブラリの調べ方は次の通りです。 まず、/bin/ashで使用しているライブラリ一覧を出力します。 [root bin]# ldd /bin/ash libc.so.6 => /lib/libc.so.6 (0x4001f000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) libc.so.6の実体を確認します。たいていの場合シンボリックリンクなのでその実体を確認します。 [root bin]# ll /lib/libc.so.6 lrwxrwxrwx 1 root root 13 Apr 22 08:12 /lib/libc.so.6 -> libc-2.2.4.so* libc-2.2.4.soを確認します。この段階でもシンボリックリンクである場合実体まで調べます。 [root bin]# ll /lib/libc-2.2.4.so -rwxr-xr-x 1 root root 1468417 Oct 4 2001 /lib/libc-2.2.4.so* 同様に、ld-linux.so.2も調べます。 [root bin]# ll /lib/ld-linux.so.2 lrwxrwxrwx 1 root root 11 Apr 22 08:12 /lib/ld-linux.so.2 -> ld-2.2.4.so* [root bin]# ll /lib/ld-2.2.4.so -rwxr-xr-x 1 root root 103327 Oct 4 2001 /lib/ld-2.2.4.so* |
[root bin]# cd /mnt/ramdisk/lib ライブラリファイルのコピー [root lib]# cp /lib/{ld-2.2.4.so,libc-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,libpwdb.so.0.61,libutil-2.2.4.so,libuuid.so.1.2, librt-2.2.4.so,libe2p.so.2.3,libpthread-0.9.so} . シンボリックリンクファイルのコピー [root lib]# cp -a /lib/{ld-linux.so.2,libc.so.6,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,libpwdb.so.0,libutil.so.1,libuuid.so.1,librt.so.1,libe2p.so.2, libpthread.so.0} . 他のディレクトリにあるファイルのコピー [root lib]# cp /usr/lib/libz.so.1.1.3 . [root lib]# cp -a /usr/lib/libz.so.1 . pamで使用するライブラリのコピー [root lib]# mkdir -p /mnt/ramdisk/lib/security [root lib]# cd /mnt/ramdisk/lib/security [root lib]# cp /lib/security/pam_permit.so . |
[root lib]# cd /mnt/ramdisk/sbin [root sbin]# cp /sbin/ldconfig . [root sbin]# cd /mnt/ramdisk ldconfigを実行し先に作成しておいた/mnt/ramdisk/etc/ld.so.cacheを更新します。 [root sbin]# chroot /mnt/ramdisk /sbin/ldconfig 実行後は不要なので削除します。 [root sbin]# rm -f /mnt/ramdisk/sbin/ldconfig |
[root sbin]# cd /mnt/ramdisk/sbin [root sbin]# cp /sbin/{restore,fdisk,mingetty,halt,init,mke2fs,mkfs, mkfs.ext2,mkfs.ext3,mkswap,shutdown,swapon,update} . |
[root sbin]# cd /mnt RAMディスクをアンマウントします。 [root /mnt]# umount /dev/ram RAMディスクの内容を読み出し、gzipで圧縮します。保存ファイル名は任意です。 [root /mnt]# dd if=/dev/ram bs=1k | gzip -v9 > rootfs.gz |
最初にカーネルをFDに書き込みます。1枚目のFDを挿入し次のコマンドを実行します。 [root /mnt]# cd /usr/src/linux/arch/i386/boot [root /boot]# dd if=bzImage of=/dev/fd0 bs=1k FDへ書き込み [root /boot]# rdev /dev/fd0 /dev/fd0 ルートデバイスをFDに指定。 [root /boot]# rdev -R /dev/fd0 0 ルートを書き込み可能にします。 [root /boot]# rdev -r /dev/fd0 49152 RAMディスクを読み込み、かつ2枚目のFDがある事を指定する。 rdev -r で指定する値(49152)の補足説明 0-10ビット:ルートファイルシステムのオフセット(今回2枚目のFDの先頭からなので"0") 14ビット:RAMディスク読み込み指定フラグ(RAMディスクを使用する為"1") 15ビット:2枚目のFDがある事を指定するフラグ(2枚目があるので"1") 0+2^14+2^15=0+16384+32768=49152 この値をrdev -r で指定する。 次にルートファイルシステムを書き込みます。 2枚目のFDを挿入し次のコマンドを実行します。 [root /mnt]# cd /mnt [root /mnt]# dd if=rootfs.gz of=/dev/fd0 bs=1k FDへ書き込み |
No. | エラーとその内容。 |
1 | 2枚目のFDを入れた後で次のようなエラーがでる。 RAMDISK: Compressed image found at block 0 invalid compressed format (err=1)<5>VFS: Insert root floppy and press ENTER ルートファイルシステムFDの書き込みに失敗しています。たぶん。(^^;) 書き込み手順を確認して下さい。 |
2 | RAMDISK: Compressed image found at block 0 invalid comperssed format (err=2)<5>VFS: Insert root floppy and press ENTER 1のエラーと同様です。 |
3 | EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended VFS: Mounted root (ext2 filesystem). Freeing unused kernel memory: 44k freed Kernel panic: No init found. Try passing init= option to kernel. エラーではinitが見つからないと言っていますが実行出来ていませんでした。 The Linux Bootdisk HOWTOを参考に、ライブラリをobjcopy でコピーしていたのですが、それが原因でした。通常のcpコマンドによるコピーだとエラーがでなくなりました。 ようはinitでリンクするlibc.so.6とld-linux.so.2が使えなかったと言う事です。 |
4 | Unable to handle kernel NULL pointer dereference at virtual address 000000 printing eip: Code: 8a 14 41 88 54 24 20 66 8b 04 43 66 89 44 24 83 44 24 58 <0>Kernel panic: Attempted to kill init! 一度だけ発生しました。原因不明です。役に立てなく済みません。_(._.)_ |
5 | INIT: version 2.78 booting /proc on /proc type proc (rw) INIT: Entering runlevel: 2 INIT: Id "1" respawning too fast: disabled for 5 minutes INIT: Id "2" respawning too fast: disabled for 5 minutes INIT: no more processes left in this runlevel inittabファイルのrespawnで指定したプロセスが2分間の間に10回プロセスが終了するとこの様になります。今回はinittabファイルで指定するmingettyの引数を誤っていた為mingettyが起動できず、initプロセスが何度起動しても毎回直ぐに異常終了していました。 1:2345:respawn:/sbin/mingetty vc/1 この↑用に書いていたのですが、 通常vc/1(/dev/vc/1)は/dev/tty1にシンボリックリンクされます。今回のFDでは/dev/tty1のみなので直接tty1と指定します。 正しくは、↓こうする。 1:2345:respawn:/sbin/mingetty tty1 ちなみに、この様なエラーは通常でも起こりえます。例えばコンソールで2分間の間に10回ログイン/ログオフを繰り返せばこの様な状態になります。 |
6 | システム起動後にloginしようとすると以下のエラーが発生。 Login incorrect pamの設定誤りです。。 login処理では、/etc/pam.d/loginもしくは/etc/pam.d/otherでその挙動を指定する必要があります。今回はotherで指定していたのですが、otherファイルの内容が存在しないモジュールを指していました。(既存システムで使用しているファイルをコピーしたのでこうなりました。) |
7 | fdiskを実行したら次のエラーが。 UnUnable to open /dev/hda カーネル構築の際に、IDEのサポートを外していました。 |
お問い合わせはwebmaster@ryouto.jpまで。
Copyright (C)2003 ryouto.jp. All Rights Reserved.