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

 レスキューディスクを1枚で作成すろと、どうしても容量不足になりがちです。
特に容量を圧迫させているのがglibcであり、Turbolinux7で使われているglibc-2.2.4では、libc.so.6(libc-2.2.4.so)だけでもそのサイズは1.4Mバイトにもなります。
 そこで、今回はバージョンの低いglibcを使う事で容量削減を実現しようと思います。(今回使うglibcは2.1.3です。2.2.4から2.1.3にするだけでも、libc.so.6のサイズは400Kバイトほど削減できます。)
 ただ、面倒な事に、glibcを入れ替えると既存のコマンド(glibc2.2.4でコンパイルされている物)で動作しないものが多くあります。この為、利用する全てのプログラムやライブラリを新しいglibcでもってコンパイルし直す事とします。本ページではレスキューディスク作成において利用する全てを新しいglibcとリンクさせてmakeしています。

 今回使用するTurbolinux7環境ではglibc-2.2.4がインストールされています。
 今回新しくコンパイルするglibc-2.1.3はレスキューディスク用なので、/libなどにはインストールしません。 /usr/i686-linuxglibc2ディレクトリにインストールし、そこのglibでもって他のプログラムやライブラリをコンパイルする環境を構築します。
 言い換えると、gccを利用してコンパイルする際に、既存のglibc-2.2.4と新しくインストールするglibc-2.1.3のどちらのライブラリとリンクするかをコンパイル時に指定出来ると言う事です。

作業の流れは次のようになります。
 1.glibc-2.1.3環境の構築
 2.gcc環境の構築(コンパイル時のglibc指定)
 3.各種プログラムのコンパイル
 4.レスキューディスクの作成
 5.今回作成したレスキューディスク

前回までの内容

  1. glibc-2.1.3環境の構築
  2. gcc環境の構築(新しいglibcを使ったコンパイル設定)
    glibc-2.1.3の構築と、gcc環境の構築についてはちょっと長くなるので、
    別ページ(コンパイル用途としてのGlibc2環境の構築)にまとめました。そちらを参照して下さい。
      
  3. 各種プログラムのコンパイル
    これ以降にコンパイルするプログラムはレスキューディスクにコピーするだけなので、makeが完了すればインストールは必要ないのですが、1カ所にまとめると楽なので、とりあえずは/usr/local/resq-disk/rootディレクトリをインストール先として指定します。

    今回の全てのコンパイルでは、レスキューディスク用にインストールしたGlibc2とリンクされるように、コンパイルオプション、リンクオプションをconfigure実行時、もしくはMakefileを修正する事で指定します。

    ■SysVinit
    init, shutdown, halt, killall5などが含まれます。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/s/sysvinit/
    ダウンロードファイル:sysvinit_2.85.orig.tar.gz.tar、 sysvinit_2.85-12.diff.gz
    [root resq]# tar zxvf sysvinit_2.85.orig.tar.gz
    [root resq]# cd sysvinit-2.85.orig/
    [
    root sysvinit-2.85.orig]# gzip -d ../sysvinit_2.85-13.diff.gz
    [root sysvinit-2.85.orig]# patch -p1 < ../sysvinit_2.85-13.diff
    [root sysvinit-2.85.orig]# cd src
    レスキューディスク用途のGlibc2を使うようにMakefileを修正します。
    [
    root src]# vi Makefile
    13行目付近のCFLAGS,LDFLAGSオプションの後に以下の2行を追加します。
    CFLAGS += -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include
    LDFLAGS += -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib
    ROOT=/usr/local/resq-disk/root
    また、インストールしようとするとディレクトリがなく、エラーとなる為次の1行を追加しました。
    install:
    <-install項目の直後に
            mkdir -p $(ROOT)/bin/ $(ROOT)/sbin/ $(ROOT)/usr/include/ $(ROOT)/usr/bin/ $(ROOT)/etc/ $(ROOT)$(MANDIR)/man1/ $(ROOT)$(MANDIR)/man5/ $(ROOT)$(MANDIR)/man8/
    [root src]# make
    [root src]# make install

    ■ash
    shプログラムです。bashは大きすぎる為レスキューディスクには向きません。そのため、サイズの小さいashを利用します。
    初め、http://ftp.debian.org/debianよりダウンロードしてきたのですが、いまいちMakefileが理解できなかった為TuroblinuxのFTPサイトよりダウンロードしました。
    ダウンロードURL:ftp://ftp.turbolinux.co.jp/pub/TurboLinux/TurboLinux/ia32/Server/7/source/SRPMS/
    ダウンロードファイル:ash-0.2-21.src.rpm
    [root archive]# rpm -ivh ash-0.2-21.src.rpm
    [
    root resq]# mv /var/src/rpm/SOURCES/* ./
    [root resq]# tar zxvf ash-linux-0.2.tar.gz
    [root resq]# cd ash-linux-0.2/
    [
    root ash-linux-0.2]# patch -p1 < ../ash-linux-0.2-glibc21.patch
    [
    root ash-linux-0.2]# patch -p1 < ../ash-0.2-make.patch
    [
    root ash-linux-0.2]# patch -p1 < ../ash-installer-lib.patch
    レスキューディスク用途のGlibc2を使うようにMakefileを修正します。
    [root ash-linux-0.2]# vi Makefile
    以下の2行を付け足します。
    CFLAGS += -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include
    LDFLAGS += -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib
    インストール先も変更してしまいます。
    install: all
            install sh /usr/local/resq-disk/root/bin/ash
            # install -m 644 sh.1 /usr/man/man1/ash.1
    [root ash-linux-0.2]# make
    [root ash-linux-0.2]# make install

    ■console-tools
    loadkeysなどが提供されます。今回のレスキューディスクではloadkeysのみ使用します。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/c/console-tools/
    ダウンロードファイル:console-tools_0.2.3.orig.tar.gz、console-tools_0.2.3-23.3.diff.gz
    [root resq]# tar zxvf console-tools_0.2.3.orig.tar.gz
    [root resq]# cd console-tools-0.2.3/
    [
    root console-tools-0.2.3]# gzip -d ../console-tools_0.2.3-23.3.diff.gz
    [root console-tools-0.2.3]# patch -p1 < ../console-tools_0.2.3-23.3.diff
    --enable-shared=noを付けないと、複数のシェアードライブラリを使う事になって面倒なので、sharedはなしにします。
    [root console-tools-0.2.3]# CFLAGS=" -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include \
    -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include \
    -L/usr/i686-linuxglibc2/lib -Wl,-rpath=/usr/i686-linuxglibc2/lib" \
    LDFLAGS=" -b i686-linuxglibc2 -L/usr/i686-linuxglibc2/lib -Wl,-rpath=/usr/i686-linuxglibc2/lib" \
    ./configure --enable-shared=no --prefix=/usr/local/resq-disk/root/
    [root console-tools-0.2.3]# make
    ドキュメントの作成で、sgml2txtが無いと文句を言われましたが、関係ないので無視しました。
    [root console-tools-0.2.3]# make install

    ■fileutils
    cp, dd, df , ln , ls, mkdir, mknod, mv, rm, sync, chmod, chownなどのコマンドが提供されます。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/c/console-tools/
    ダウンロードファイル:console-tools_0.2.3.orig.tar.gz、console-tools_0.2.3-23.3.diff.gz
    [root resq]# tar zxvf fileutils-4.0.tar.gz
    [root resq]# cd fileutils-4.0/
    cflagsに-Wl,-rpath=/usr/i686-linuxglibc2/libまで付加しないと、configureでエラーになります。
    [
    root fileutils-4.0]# CFLAGS=" -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include -Wl,-rpath=/usr/i686-linuxglibc2/lib" \
    ./configure --prefix=/usr/local/resq-disk/root/ --disable-nls
    [root fileutils-4.0]# make
    以下のようなエラーが出ましたが、エラー発生箇所をコメントアウトする事で解決です。
        path-concat.c:34: conflicting types for `malloc'
        /usr/i686-linuxglibc2/include/stdlib.h:474: previous declaration of `malloc'
    lib/path-concat.cファイルを開き、34行目をコメントアウトします。編集後は再度makeを実行します。
    //char *malloc ();
    [root fileutils-4.0]# make install

    ■e2fsprogs
    mke2fs、libcom_err.so、libext2fs.soなどが提供されます。
    ダウンロードURL:http://ftp.yz.yamagata-u.ac.jp/pub/linux/slackware/slackware-8.0/source/a/e2fsprog/
    ダウンロードファイル:e2fsprogs-1.22.tar.gz
    [root resq]# tar zxvf e2fsprogs-1.22.tar.gz
    [
    root resq]# cd e2fsprogs-1.22/
    [
    root e2fsprogs-1.22]# ./configure --prefix=/usr/local/resq-disk/root/ --enable-elf-shlibs \
    --with-ccopts=" -O2 -b i686-linuxglibc2 -nostdinc -I../lib -I../lib -I../include -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    --with-ldopts=" -b i686-linuxglibc2 -L/usr/i686-linuxglibc2/lib -Wl,-rpath=/usr/i686-linuxglibc2/lib"
    [root e2fsprogs-1.22]# make
    [root e2fsprogs-1.22]# make install
    make installではヘッダファイルがインストールされなかったので、make install-libsで再度ヘッダ、ライブラリをインストール。
    [root e2fsprogs-1.22]# make install-libs

    ■dump
    dump、restoreが提供されます。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/d/dump/
    ダウンロードファイル:dump_0.4b27.orig.tar.gz、dump_0.4b27-4.diff.gz
    [root resq]# tar zxvf dump_0.4b27.orig.tar.gz
    [root resq]# cd dump-0.4b27/
    [
    root dump-0.4b27]# gzip -d ../dump_0.4b27-4.diff.gz
    [root dump-0.4b27]# patch -p1 < ../dump_0.4b27-4.diff
    ./configure --prefix=/usr/local/resq-disk/root/ \
    --with-ccopts=" -O2 -b i686-linuxglibc2 -nostdinc -I/usr/local/resq-disk/root/include/ext2fs -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    --with-ldopts=" -b i686-linuxglibc2 -L-I/usr/local/resq-disk/root/lib -L/usr/i686-linuxglibc2/lib -Wl,-rpath=/usr/i686-linuxglibc2/lib" --with-manowner=root
    エラーになりました。以下エラー内容
    checking for ext2fs/ext2fs.h... no
    checking for ext2fs_open in -lext2fs... no
    configure: error: You need to install the Ext2fs libraries from the E2fsprogs distribution first - hint: make install-libs
    configureがext2fs.hファイルを見つけてくれないので(通常のincludeパスにない為でしょう)、configureをちょっといじります。もちろんエラーのでなかった環境では不要です。読み飛ばして下さい。
    [root dump-0.4b27]# vi configure.in
    295行目あたり~340行目あたりまでを以下のように修正します。ようは、configureでext2fs.hのチェックを外してしまいます。
    (省略)
    if [0] ; then
    <-- 追加
    dnl
    dnl Check for Ext2fs headers and libraries
    dnl
    (省略)
    fi
    <-- 追加
    dnl
    dnl Check for termcap libraries
    (省略)
    [root dump-0.4b27]# autoconf
    <-- configure ファイルを作成後、再びconfigure。
    [
    root dump-0.4b27]# ./configure --prefix=/usr/local/resq-disk/root/ --with-manowner=root \
    --with-ccopts=" -O2 -b i686-linuxglibc2 -nostdinc -I/usr/local/resq-disk/root/include/ -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    --with-ldopts=" -b i686-linuxglibc2 -L/usr/local/resq-disk/root/lib -L/usr/i686-linuxglibc2/lib -Wl,-rpath=/usr/i686-linuxglibc2/lib:/usr/local/resq-disk/root/lib" --with-manowner=root
    [root dump-0.4b27]# make
    /usr/i686-linuxglibc2/include/asm/types.h:21: redefinition of `__s64'
    /usr/i686-linuxglibc2/include/sys/types.h:37: `__s64' previously declared here
    /usr/i686-linuxglibc2/include/asm/types.h:22: redefinition of `__u64'
    /usr/i686-linuxglibc2/include/sys/types.h:38: `__u64' previously declared here
    以上の様なコンパイルエラーが出たので、以下のヘッダファイルをいじってしまった。
    /usr/i686-linuxglibc2/include/sys/types.hの37,38行目をコメントアウトします。ただし、暫定処理なので、コンパイル後は元に戻しておきましょう。
    //typedef __quad_t quad_t;        
    //typedef __u_quad_t u_quad_t;
    [
    root dump-0.4b27]# make
    またエラー。
    traverse.c:112: conflicting types for `ext2_ino_t'
    //typedef ino_t ext2_ino_t;   
    traverse.cファイルの112行目をコメントアウトします。
    [root dump-0.4b27]# make install

    ■gzip
    gzipを提供します。
    ダウンロードURL:ftp://wuarchive.wustl.edu/mirrors/gnu/gzip/
    ダウンロードファイル:gzip-1.2.4.tar.gz
    [root resq]# tar zxvf gzip-1.2.4.tar.gz
    [root resq]# cd gzip-1.2.4/
    [
    root gzip-1.2.4]# ./configure --prefix=/usr/local/resq-disk/root/
    [root gzip-1.2.4]# make \
    CFLAGS="-O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    LDFLAGS=" -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib "
    [root gzip-1.2.4]# make install

    ■mingetty
    mingettyを提供します。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/m/mingetty/
    ダウンロードファイル:mingetty_1.06.orig.tar.gz
    [root resq]# tar zxvf mingetty_1.06.orig.tar.gz
    [root resq]# cd mingetty-1.06/
    [
    root mingetty-1.06]# gunzip ../mingetty_1.06-2.diff.gz
    [root mingetty-1.06]# patch -p1 < ../mingetty_1.06-2.diff
    Makefieを一部修正します。
    MANDIR=/usr/local/resq-disk/root/usr/share/man/man8
    <-- 修正
    SBINDIR=/usr/local/resq-disk/root/sbin                      
    <-- 修正
    以下の2行を追加

    CFLAGS += -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include
    LDFLAGS = -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib
    [root mingetty-1.06]# make
    [root mingetty-1.06]# make install

    ■modutils
    insmod、modprobe、lsmod、rmmodなどを提供します。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/m/modutils/
    ダウンロードファイル:modutils_2.4.15.orig.tar.gz、modutils_2.4.15-1.diff.gz
    [root resq]# tar zxvf modutils_2.4.15.orig.tar.gz
    [root resq]# cd modutils-2.4.15/
    [
    root modutils-2.4.15]# gunzip -d ../modutils_2.4.15-1.diff.gz
    [root modutils-2.4.15]# patch -p1 < ../modutils_2.4.15-1.diff
    [root modutils-2.4.15]# CC=gcc \
    CFLAGS="-O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    LDFLAGS=" -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib " \
    BUILDCFLAGS=" -O2 " \
    ./configure --prefix=/usr/local/resq-disk/root --enable-strip
    [root modutils-2.4.15]# make
    [root modutils-2.4.15]# make install

    ■procps
    ps、kill、topなどを提供します。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/p/procps/
    ダウンロードファイル:procps_2.0.7.orig.tar.gz、procps_2.0.7-8.woody1.diff.gz
    [root resq]# tar zxvf procps_2.0.7.orig.tar.gz
    [root resq]# cd procps-2.0.7.orig/
    [
    root procps-2.0.7.orig]# gunzip ../procps_2.0.7-8.woody1.diff.gz
    [root procps-2.0.7.orig]# patch -p1 < ../procps_2.0.7-8.woody1.diff
    ./Makefileファイルの修正
    export DESTDIR = /usr/local/resq-disk/root       
    <--編集します。
    export INCDIRS = -I/usr/i686-linuxglibc2/include/ncurses -I/usr/X11R6/include<--編集します。
    以下の2行を追加します。

    CFLAGS += -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include
    LDFLAGS += -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib

    ps/Makefileファイルの修正
    ファイルの先頭に以下の1行を追加

    CFLAGS = -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include
    psのリンクオプションを編集
    $(CC) -o ps escape.o global.o help.o select.o sortformat.o output.o parser.o display.o -L../proc -lproc -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib

    proc/Makefileファイルの修正
    TOPDIR = /usr/local/resq-disk/root    
    <--編集します。
    export MANDIR = /man             <--編集します。
    SHLIBDIR = $(TOPDIR)/lib#          <--編集します。
    リンクオプションの修正
    gcc -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib -shared -Wl,-soname,$(SONAME) -o $@ $^ -lc
    [
    root procps-2.0.7.orig]# make
    [root procps-2.0.7.orig]# make libinstall

    ■sh-utils
    chroot、 env、stty、sleep、su、whoなどを提供します。
    ダウンロードURL:http://ftp.gnu.org/gnu/sh-utils/
    ダウンロードファイル:sh-utils-2.0.tar.gz
    [root resq]# tar zxvf sh-utils-2.0.tar.gz
    [root resq]# cd sh-utils-2.0/
    [
    root sh-utils-2.0]# CC=gcc \
    CFLAGS=" -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    LDFLAGS=" -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib " \
    ./configure --prefix=/usr/local/resq-disk/root
    [root sh-utils-2.0]# make
    [root sh-utils-2.0]# make install

    ■textutils
    cat、head、sort、tac、tail、wcなどを提供します。
    ダウンロードURL:http://ftp.gnu.org/gnu/textutils/
    ダウンロードファイル:textutils-2.0.tar.gz
    [root resq]# tar zxvf textutils-2.0.tar.gz
    [root resq]# cd textutils-2.0/
    [
    root textutils-2.0]# CC=gcc \
    CFLAGS="-O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    LDFLAGS=" -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib " \
    ./configure --prefix=/usr/local/resq-disk/root
    [root textutils-2.0]# make
    [root textutils-2.0]# make install

    ■termcap
    libtermcapを提供します。
    ダウンロードURL:http://ftp.gnu.org/gnu/termcap/
    ダウンロードファイル:termcap-1.3.1.tar.gz
    [root resq]# tar zxvf termcap-1.3.1.tar.gz
    [root resq]# cd termcap-1.3.1/
    [
    root termcap-1.3.1]# ./configure --prefix=/usr/local/resq-disk/root --disable-install-termcap
    Makefile編集
    CFLAGS = -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include  
    <-- CFLAGSの値を修正します。
    [
    root termcap-1.3.1]# make
    [root termcap-1.3.1]# make install

    ■util-linux
    fdisk、 login、mount、moreなどを提供します。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/u/util-linux/
    ダウンロードファイル:util-linux_2.11n.orig.tar.gz、util-linux_2.11n-7.diff.gz
    [root resq]# tar zxvf util-linux_2.11n.orig.tar.gz
    [root resq]# cd util-linux-2.11n/
    [
    root util-linux-2.11n]# gunzip ../util-linux_2.11n-7.diff.gz
    [root util-linux-2.11n]# patch -p1 < ../util-linux_2.11n-7.diff
    まずはMCONFIGの編集を行います。
    [root util-linux-2.11n]# vi MCONFIG
    206行目あたりの既存のCFLAGSの宣言下あたりに以下の1行を追加
    CFLAGS += -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include -I/usr/local/resq-disk/root/include
    それ以外のオプションの設定を行います。
    HAVE_PAM=yes       
    <-- noに変更(レスキューディスクでPAMをわざわざ使う必要はないでしょう。)
    HAVE_SHADOW=yes
    <-- noに変更
    HAVE_SLANG=yes    
    <-- noに変更

    [root util-linux-2.11n]# export DESTDIR=/usr/local/resq-disk/root
    [root util-linux-2.11n]# LDFLAGS=" -b i686-linuxglibc2 -L/usr/local/resq-disk/root/lib -Wl,-rpath=/usr/i686-linuxglibc2/lib " \
    ./configure

    configureにて出来上がったmake_includeファイルを修正します。
    これはライブラリの比較的大きいncursesを使わないようにする為です。
    [root util-linux-2.11n]# vi make_include
    HAVE_NCURSES=no
    <-- yesならnoにする
    LIBCURSES=-lncurses
    <-- あればこの行を削除する。
    HAVE_TERMCAP=yes
    <-- noならばyesに
    LIBTERMCAP=-ltermcap
    <-- なければ追加する。

    more.cでコンパイルエラーが出てしまったのでMakefileを編集します。
    [root util-linux-2.11n]# vi text-utils/Makefile
    feq "$(HAVE_TERMCAP)" "yes"
    CFLAGS+=-DHAVE_termcap
    <-- 追加
    BIN:=$(BIN) more

    ifeq "$(HAVE_TERMCAP)" "yes"
    more: more.o
            $(CC) $(CFLAGS) $(LDFLAGS) $(LIB)/xstrncpy.o $^ -o $@ $(LIBTERMCAP)
    <--修正
    また、util-linux_2.11n-7はglibc2.2.4以上を必要とする為、2.1.3では一部(text-utils以下の一部)コンパイルできない物があります。それらは、Makefileを書き換え、コンパイルのリストから外します。
    USRBIN= hexdump line   <-- 修正
    [root util-linux-2.11n]]# make
    [root util-linux-2.11n]# make install

    ■zlib
    libzを提供します。
    ダウンロードURL:http://www.gzip.org/zlib/zlib-1.2.1.tar.gz
    ダウンロードファイル:zlib-1.2.1.tar.gz
    [root resq]# cd zlib-1.2.1/
    CC=gcc \
    CFLAGS="-O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    LDFLAGS=" -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib " \
    ./configure --prefix=/usr/local/resq-disk/root --shared
    すこしばかし、Makefileの修正をします。
    [
    root zlib-1.2.1]# vi Makefile
    LDSHARED=gcc -shared -Wl,-soname,libz.so.1 -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib
    <--オプション追加
    [root zlib-1.2.1]# make
    [root zlib-1.2.1]# make install

    ■levee
    viクローンです。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/l/levee/
    ダウンロードファイル:levee_3.4o.orig.tar.gz
    [root resq]# tar zxvf levee_3.4o.orig.tar.gz
    [root resq]# cd levee-3.4o.orig/
    [
    root levee-3.4o.orig]# gunzip ../levee_3.4o-6.diff.gz
    [root levee-3.4o.orig]# patch -p1 < ../levee_3.4o-6.diff
    Makefileを一部修正します。
    [root levee-3.4o.orig]# vi Makefile
    以下の2行を追加します。
    CFLAGS+= -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include -I/usr/local/resq-disk/root/include/
    LDFLAGS+= -b i686-linuxglibc2 -L/usr/local/resq-disk/root/lib -Wl,-rpath=/usr/i686-linuxglibc2/lib
    DESTDIR=/usr/local/resq-disk/root

    lev: $(OBJS)
            $(CC) $(CFLAGS) -o lev $(OBJS) $(LIBES) $(LDFLAGS)  
    <--修正します

    install:
            install lev $(DESTDIR)/bin                                          
    <-- /usr/binから/binへ
            # install lev.1 $(DESTDIR)/usr/share/man/man1            
    <-- コメントにします。
    [root levee-3.4o.orig]# make
    [
    root levee-3.4o.orig]# make install
    また、termcapライブラリを利用するので、/etc/termcapファイルが必要になります。今回はvt100の設定を自分の環境より書き写しています。
    termcapファイルの設定は環境変数TERMで指定する必要があります。今回のレスキューディスクでは/etc/profileでTERM=vt100環境変数を指定しています。

    ■grep
    grepを提供します。
    ダウンロードURL:http://ftp.debian.org/debian/pool/main/g/grep/
    ダウンロードファイル:grep_2.4.2.orig.tar.gz
    [root resq]# tar zxvf grep_2.4.2.orig.tar.gz
    [root resq]# cd grep-2.4.2/
    [
    root grep-2.4.2]# gunzip ../grep_2.4.2-3.diff.gz
    [root grep-2.4.2]# patch -p1 < ../grep_2.4.2-3.diff
    [root grep-2.4.2]# CC=gcc \
    CFLAGS=" -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    LDFLAGS=" -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib " \
    ./configure --prefix=/usr/local/resq-disk/root --disable-nls
    [root grep-2.4.2]# make
    [
    root grep-2.4.2]# make install

    ■tar
    tarを提供します。
    ダウンロードURL:http://ftp.gnu.org/gnu/tar/
    ダウンロードファイル:tar-1.12.tar.gz
    [root resq]# tar zxvf tar-1.12.tar.gz
    [root resq]# cd tar-1.12/
    [
    root tar-1.12]# CC=gcc \
    CFLAGS=" -O2 -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include " \
    LDFLAGS=" -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib " \
    ./configure --prefix=/usr/local/resq-disk/root --disable-nls
    [root tar-1.12]# make
    [root tar-1.12]# make install

    ここまで終わったら、デバックシンボルを削除する作業に取りかかります。
    stripする事で余計なシンボルを削除し、プログラム、ライブラリの容量を小さくします。
    初めからデバックシンボルがないバイナリも多いのですが、一部のライブラリやプログラムにはデバックシンボルが残っているので、一通り実行します。ライブラリは-gオプションを付けて、それ以外はオプション無しで実行します。
    [root lib]# cd /usr/i686-linuxglibc2/lib
    [root lib]# strip -g ld-2.1.3.so
    [root lib]# strip -g libc-2.1.3.so
    [root lib]# strip -g libdl-2.1.3.so
    [root lib]# strip -g libutil-2.1.3.so
    [root lib]# strip -g librt-2.1.3.so
    [root lib]# strip -g libnss_files-2.1.3.so
    [root lib]# strip -g libcrypt-2.1.3.so

    [root bin]# cd /usr/local/resq-disk/root/bin/
    [root bin]# strip cp
    [root bin]# strip dd
    [root bin]# strip df
    [root bin]# strip du
    [root bin]# strip gzip
    [root bin]# strip kill
    [root bin]# strip ln
    [root bin]# strip loadkeys
    [root bin]# strip login
    [root bin]# strip ls
    [root bin]# strip mkdir
    [root bin]# strip mknod
    [root bin]# strip mount
    [root bin]# strip mv
    [root bin]# strip ps
    [root bin]# strip pwd
    [root bin]# strip rm
    [root bin]# strip sleep
    [root bin]# strip stty
    [root bin]# strip sync
    [root bin]# strip umount
    [root bin]# strip grep
    [root bin]# strip more
    [root bin]# strip tar
    [root bin]# strip hostname

    [root bin]# cd /usr/local/resq-disk/root/sbin
    [root sbin]# strip fdisk
    [root sbin]# strip halt
    [root sbin]# strip init
    [root sbin]# strip insmod
    [root sbin]# strip killall5
    [root sbin]# strip mingetty
    [root sbin]# strip mke2fs
    [root sbin]# strip mkfs
    [root sbin]# strip mkfs.ext2
    [root sbin]# strip mkswap
    [root sbin]# strip restore
    [root sbin]# strip shutdown
    [root sbin]# strip swapon

    [root bin]# cd /usr/local/resq-disk/root/lib
    [root lib]# strip -g libcom_err.so.2.0
    [root lib]# strip -g libext2fs.so.2.4
    [root lib]# strip -g libproc.so.2.0.7
    [root lib]# strip -g libuuid.so.1.2
    [root lib]# strip -g libe2p.so.2.3
    [root lib]# strip -g libz.so.1.2.1
    ここまで来たらいつも通りにレスキューディスクを作成します。
     
  4. レスキューディスクの作成
    事前準備として、使用するFDは次の通り一度フォーマットしておきます。
    [root kernel]# fdformat /dev/fd0u1722
    カーネルファイルシステムは前回までと同様に作成します。
    1. FDのフォーマット(カーネル配置用ファイルシステム作成)
      カーネル配置用に作成したファイルシステムサイズ(ここでは370k)は後で使用するので忘れない事。
      ※ 370=カーネルサイズ+必須ファイル分(約40Kバイト必要)
      [root kernel]# ls -lh /usr/src/linux/arch/i386/boot/bzImage  カーネルサイズの確認
      -rw-r--r-- 1 root root 335k Apr 7 23:21 bzImage
      [
      root kernel]# mke2fs -i 8192 -m 0 /dev/fd0u1722 -b 1024 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した位置からの書き込み。

    ルートファイルシステムの作成
    ルートファイルシステムの作成はレスキューディスクの作成(1)と同様です。詳しくはそちらを参照してください。
    ここでは、簡単に説明します。
    下記の例では/mnt/ramdiskディレクトリに/dev/ramをマウントしています。

    #-- RAMディスク準備 --

    dd if=/dev/zero of=/dev/ram bs=1k count=4096
    mkdir -p /mnt/ramdisk
    mke2fs -m 0 -i 20000 -b 1024 /dev/ram 4096
    mount -t ext2 /dev/ram /mnt/ramdisk

    cd /mnt/ramdisk
    mkdir root dev proc etc sbin bin lib mnt usr tmp var
    chmod +t tmp
    rmdir lost+found

    #------ /dev ------
    必要となるデバイススペシャルファイルを作成します。/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 vcs1 c 7 1
    mknod vcs2 c 7 2
    mknod vcs3 c 7 3
    mknod vcs4 c 7 4
    mknod vcsa1 c 7 129
    mknod vcsa2 c 7 130
    mknod vcsa3 c 7 131
    mknod vcsa4 c 7 132

    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/
     #--ld.so.cache,ld.so.confファイルを作成します。ld.so.cacheは後でldconfigを実行した際に完成します。--
    touch ld.so.cache
    vi /mnt/ramdisk/etc/ld.so.conf
        内容はについてはここを参照
     #--issueファイルを作成します。--
    vi /mnt/ramdisk/etc/issue           内容はについてはここを参照      
     #--motdファイルを作成します。--
    vi /mnt/ramdisk/etc/motd           内容はについてはここを参照
     #--rcファイルを作成します。--
    vi /mnt/ramdisk/etc/rc              内容はについてはここを参照
     #--fstabファイルを作成します。--
    vi /mnt/ramdisk/etc/fstab          内容はについてはここを参照
     #--inittabファイルを作成します。--
    vi /mnt/ramdisk/etc/inittab         内容はについてはここを参照
     #--nsswitch.confァイルを作成します。--
    vi /mnt/ramdisk/etc/nsswitch.conf       内容はについてはここを参照
     #--rc.haltファイルを作成し、実行権限を与えます。--
    vi /mnt/ramdisk/etc/rc.halt         内容はについてはここを参照
    chmod +x /mnt/ramdisk/etc/rc.halt
     #--termcapファイルを作成します。--
    vi /mnt/ramdisk/etc/termcap       内容はについてはここを参照
     #--passwd,groupファイルを作成します。--
     ユーザーもグループもrootのみ用意します。そしてrootのパスワードは空です。

    vi /mnt/ramdisk/etc/passwd       内容はについてはここを参照
    vi /mnt/ramdisk/etc/group         内容はについてはここを参照
     #--profileファイルを作成します。--
    vi /mnt/ramdisk/etc/profile        内容はについてはここを参照
     #--shellsファイルを作成します。--
    vi /mnt/ramdisk/etc/shells         内容はについてはここを参照
     #--keyマップファイルの作成--
    dumpkeys > jp106.kmap

    #------/bin------
    cd /mnt/ramdisk/bin
    下のcpコマンドは1行で記述できますが、見やすくする為わざわざ2行にして書いています。
    cp /usr/local/resq-disk/root/bin/{ash,cat,chmod,chown,cp,dd,df,du,ln,login,ls,mkdir,mknod,more,tar,hostname} .
    cp /usr/local/resq-disk/root/bin/{mount,mv,ps,pwd,rm,stty,sync,umount,loadkeys,gzip,kill,sleep,lev,grep} .
    ln -s ash sh
    ln -s lev vi


    #------/lib------
    cd /mnt/ramdisk/lib
    #--ライブラリファイルのコピー 見やすくする為、行を分けて記述しています。--
    cp -a /usr/i686-linuxglibc2/lib/{libc-2.1.3.so,ld-2.1.3.so,libdl-2.1.3.so,libutil-2.1.3.so} .
    cp -a /usr/i686-linuxglibc2/lib/{librt-2.1.3.so,libnss_files-2.1.3.so,libcrypt-2.1.3.so} .
    cp -a /usr/local/resq-disk/root/lib/{libcom_err.so.2.0,libext2fs.so.2.4,libproc.so.2.0.7} .
    cp -a /usr/local/resq-disk/root/lib/{libuuid.so.1.2,libe2p.so.2.3,libz.so.1.2.1} .
    #-- シンボリックファイルのコピー--
    ln -s libc-2.1.3.so libc.so.6
    ln -s ld-2.1.3.so ld-linux.so.2.1
    ln -s ld-2.1.3.so ld-linux.so.2  
    既存のコマンドはld-linux.so.2にリンクされているはずなので、用意しておきます。
    ln -s libcom_err.so.2.0 ibcom_err.so.2
    ln -s libdl-2.1.3.so libdl.so.2
    ln -s libext2fs.so.2.4 libext2fs.so.2
    ln -s libnss_files-2.1.3.so libnss_files.so.2
    ln -s libuuid.so.1.2 libuuid.so.1
    ln -s libutil-2.1.3 libutil.so.1
    ln -s librt-2.1.3.so librt.so.1
    ln -s libcrypt-2.1.3.so libcrypt.so.1
    ln -s libz.so.1.2.1 libz.so.1
    ln -s libe2p.so.2.3 libe2p.so.2

    #------ldconfigの実行------
    /sbin/ldconfig -r /mnt/ramdisk

    #------/sbin------
    cd /mnt/ramdisk/sbin
    cp -a /usr/local/resq-disk/root/sbin/{restore,fdisk,mingetty,halt,shutdown,init,mke2fs,mkswap} .
    cp -a /usr/local/resq-disk/root/sbin/{swapon,killall5,reboot,insmod,modprobe,lsmod,rmmod} .

    #------/var------
    cd /mnt/ramdisk/var
    mkdir /mnt/ramdisk/var/{log,run}
    touch /mnt/ramdisk/var/run/utmp

    #----- モジュールのインストール ------------
    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

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

  5. 今回作成したもの
    今回作成したFDのイメージを置いておくので興味があったら使ってください。(ユーザーはrootのみでパスワード無しです。)
    ryocho-linux.bin.gz
    使い方はダウンロード後、ddコマンドでFDに書き込みます。
    fdformat /dev/fd0u1722                               <--FDのフォーマット
    gzip -d ryocho-linux.bin.gz                       
         <--gzipの解凍
    dd if=ryocho-linux.bin of=/dev/fd0u1722 bs=1k 
    <--FDへのコピー
    今回利用したカーネル、ファイルシステムをイメージからを取り出すには以下のようにします。
    gzip -d ryocho-linux.bin.gz                  <--gzipの解凍
    mkdir kernelfs rootfs                                     <-- マウント用ディレクトリ作成
    mount -o loop ryocho-linux.bin kernelfs/
             <-カーネルファイルシステムのマウント
    dd if=ryocho-linux.bin of=filesystem.gz skip=370 bs=1k  <--ルートファイルシステムデータ取りだし
    gunzip filesystem.gz
    mount -o loop filesystem ./rootfs                     <--ルートファイルシステムのマウント
    その他、今回作成したイメージ・ファイルです。
    menuconfigのバックアップファイル・・・resq5-small.conf


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