[last updated:2006/04/08] [since:2005/12/09]
PCカードスロットから起動する64MBのコンパクトフラッシュを作ってみました。 このコンパクトフラッシュで、私の所持するDynabook SS S5とDynabook SS S9 の起動に成功しています。
このページは、コンパクトフラッシュLinux環境(以下、CF-Linux)作成の 手順メモと顛末記です。
まず、マシンとして以下を仮定している。
メモリは256MBをRAMDISKとして利用する。
基本的な仕様は次の通り。
インストールされてしまうファイルのうち、以下を削除して容量を確保する
スタティックライブラリについては
# find /usr/lib -name "*.a" \! -name "*_nonshared.a" -print | xargs rm
Emacs Lispについては
# find /usr/share/emacs -name "*.elc" -print | sed -ne "s/c$//p" | xargs rm
で削除できる。
今回の使い方ではシステムのファイルシステムが展開されるので、/linuxrcは
exit 0
のみでよい
initrdイメージは、以下のように作成する
# dd if=/dev/zero of=rootfs.img bs=1024k count=256 # mke2fs -F -m0 rootfs.img # tune2fs -i0 -c0 rootfs.img # mount -t ext2 -o loop rootfs.img tmp/ # cp -dpR /mnt/lfs/{bin,dev,etc,home,lib,linuxrc,media,mnt, \ opt,proc,root,sbin,srv,sys,tmp,usr,var} \ tmp/ # umount tmp/ # gzip -9 rootfs.img
カーネルのブートオプションとして
root=/dev/ram0
が必要
コンパクトフラッシュ(/dev/hde)をフォーマットし、ファイルを配置する
# fdisk /dev/hde ... (/dev/hde1をWin95 FAT領域として作成) # mkfs.vfat /dev/hde1 # mount /dev/hde1 /mnt # mkdir -p /mnt/boot/grub # cp boot/grub/stage1 boot/grub/stage2 boot/grub/menu.lst /mnt/boot/grub # cp boot/kernel boot/config boot/System.map /mnt/boot # cp rootfs.img.gz /mnt # unmount /mnt
コンパクトフラッシュをDynabook SS S5のPCカードスロットに入れ、普通に
# grub --no-floppy grub> root (hd1,0) grub> setup (hd1) grub> quit
とすれば、起動するコンパクトフラッシュができる
menu.lstの例
default 0 timeout 5 title CF Linux (Dynabook SS S5) root (hd0,0) kernel /boot/kernel-2.6.14.3 root=/dev/ram0 video=tridentfb:1024x768-16@60 initrd /rootfs.img.gz title CF Linux root (hd0,0) kernel /boot/kernel-2.6.14.3 root=/dev/ram0 initrd /rootfs.img.gz title CF Linux (single-user mode) root (hd0,0) kernel /boot/kernel-2.6.14.3 root=/dev/ram0 1 initrd /rootfs.img.gz
[LFS]はLFS-6.1のパッケージ、[LFS*]はLFS-6.1のパッケージから バージョンを上げたもの、[add]が追加したパッケージ。
config/cf/host.defを編集する
#define DefaultGcc2i386Opt -O2 -fno-strength-rduce -fno-strict-aliasing -march=i686 -L=/tools/lib #define Freetype2Dir /tools #define SharedLibFreetype2 NO #define NormalLibFreetype2 YES #define HasZlib NO #define HasLibpng NO #define XorgServer NO #define BuildGlxExt NO #define BuildFreeType NO #define BuildTrueTypeFonts NO
build用ディレクトリで以下を実行
sed -i -e "s@^#include <linux/config.h>@/* & */@" `grep -lr linux/config.h *`
なお、host.defとlinux/config.hの問題については、HLFSの文書を参考にした。
/etc/acpi/events/powerを作成
event=button[ /]power action=/etc/acpi/power.sh
/etc/acpi/power.shを作成
/sbin/init 0
今回の構築では、VMwareが大活躍しました。 特に、スナップショットが便利で、要所要所で取っておくと、 失敗しても元に戻せます。何度も助けられました。
構築当時のログを挙げます。 [注]は、ログを後で見返した上での注記を付加しています。
対策(3)(金策が必要)を考える
※メーカー修理は却下[注2]
boot時は次の順に起動が試される(init/main.c)[注2]
このプロセスが死ぬとpanicになる
LFS 6.1のHost System Requirementsに、
とある[注]
lddで見ると、次のコマンドが/toolsに依存している
temporary systemのものが残っている
initrdイメージは 以下のように作成する
# dd if=/dev/zero of=initrd bs=1024k count=xxx # mke2fs -F -m0 initrd # mount -t ext2 -o loop initrd /mnt (ここでシステムのファイルをコピー; カーネル本体は不要) (システムがそのままbootableならlinuxrcはexitだけでも可) (linuxrcはinitrdで実行される(必須[注1])) # umount /mnt # gzip -9 initrd
→ initrd.gzのできあがり
システムのファイルをコピーするときは、
# mkmod -m 600 /mnt/dev/console c 5 1
でコンソールデバイスを作成するのも忘れずに… (mknod -m 666 /mnt/dev/null c 1 3 も必要か?)
grubのインストール[注] については、
# grub --no-floppy > root (hd1,0) ← hd1がCFだった > setup --prefix="" (hd1) ← FAT内に平たく配置したので > quit
でO.K.
jfbtermをmake install する前に
# install -d /usr/share/fonts # install -d /usr/share/fonts/jfbterm
しておく必要あり[注1]
config/cf/host.defに以下を追加 (HLFS[注2]の文書より)[注3]
#define DefaultGcc2i386Opt -O2 -fno-strength-reduce -fno-strict-aliasing -march=i686 -L/tools/lib
config/cf/host.defに以下も 追加[注5]
#define DefaultGccIncludeDir /tools/lib/gcc/i686-pc-linux-gnu/3.4.3/include
更に、config/cf/host.defに追加[注6]
#define XorgServer NO
build-xにて、次を実行(HLFSの文書より)[注7]
sed -i -e "s@^#include <linux/config.h>@/* & */@" `grep -lr linux/config.h *`
host.defに以下も追加
#define BuildGlxExt NO #define BuildFreeType NO #define BuildTrueTypeFonts NO
host.def変更[注9]
#define Freetype2Dir /tools #define HasZlib NO #define HasLibpng NO #define SharedLibFreetype2 NO #define NormalLibFreetype2 YES
これらを追加
config/cf/host.defを編集する
#define DefaultGcc2i386Opt -O2 -fno-strength-rduce -fno-strict-aliasing -march=i686 -L=/tools/lib #define Freetype2Dir /tools #define SharedLibFreetype2 NO #define NormalLibFreetype2 YES #define HasZlib NO #define HasLibpng NO #define XorgServer NO #define BuildGlxExt NO #define BuildFreeType NO #define BuildTrueTypeFonts NO
build用ディレクトリで次を実行
sed -i -e "s@^#include <linux/config.h>@/* & */@" `grep -lr linux/config.h *`
jfbtermの ソースディレクトリで
tic terminfo.jfbterm
を実行する
/etc/rc.d/init.d/udev に
udevd --daemon
を追加
/usr/lib/libgcc_s.so.1と/usr/lib/libgcc_s.soが/tools/libのファイルの シンボリックリンクとなっているので、実体をコピーする[注1]
rm /usr/lib/libgcc_s.so* install -m 755 /tools/lib/libgcc_s.so.1 /usr/lib ln -s libgcc_s.so.1 /usr/lib/libfcc_s.so
opensslのcertsがないので、opensslのソースディレクトリのcertsからコピー
cp -p certs/*.{0,pem} /etc/ssl/certs
/usr/lib にて、
find . -name "*.a" \! -name "*_nonshared.a" -print | xargs rm
でO.K.
/usr/share/emacs にて、
find . -name "*.elc" -print | sed -ne "s/c$//p" | xargs rm
でO.K.
CFパーティションにボリュームラベルを つけて、
mount -L [ボリュームラベル] /mnt
でマウントし、設定をコピーしてumountする手があるか
追加したいソフトウェア
他のツールとの兼ね合いがあるので、*fsは全て見送り
rootfs.imgの作成では、 dd, mke2fsのあと、
tune2fs -i0 -c0 rootfs.img
を行う[注1]
CFに
を置き、/boot/grub/menu.lstを作ってgrubをインストールする
カーネルオプションに
video=tridentfb:1024x768-16@60
をつければO.K.[注]
events/power追加
event=button[ /]power action=/etc/acpi/power.sh
power.sh作成
/sbin/init 0
/etc/udev/rules.d/50-hotplug.rulesを作成[注]
ENV{UDEVD_EVENT}="1", RUN+="/sbin/hotplug"
インストールパッケージの変更・追加など
などなど
他のアプリケーション
などなど
/devにtmpfsをマウントした直後に
mknod /dev/null c 1 3
を追加 → O.K.