Compact Flash内に小さなオリジナル組み込みLinuxを作る。 Linuxの起動プロセスを理解し、システムをsourceからbuildする 手順を解説します。 目次: - Linuxのブートプロセスを知る (前ページで解説) - 1CF Linuxの仕様 (前ページで解説) - Linux作りの概要 (前ページで解説) - kernelのbuild - userlandのbuild - CFへの作り込み Kernelのbuild ============= % cd /tmp % wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.25.tar.gz % su root # setenv LANG C # cd /usr/src # tar zxvf /tmp/linux-2.4.25.tar.gz # cd linux-2.4.25 # make mrproper (既存の設定".config"を消します) (make oldconfig 以前のバージョンの.configがあればコンバート) # make menuconfig (あらゆるkernelのオプションを指定できます) Moduleは使わない事にします "Loadable Module support" -> "Enable loadable module support" -> OFF # make dep # make clean # make bzImage # ls /usr/src/linux-2.4.25/arch/i386/boot/bzImage 必要なカーネルができるまで menuconfigからbzImageまでを繰り返します。 /usr/src/linux-2.4.25/arc/i386/boot/bzImage が目的のカーネルです。 ドライバ類のモジュール化は行わず、カーネルに取り込みましょう。 ほぼ最小構成にてコンパイル、約10分 user landのbuild ================ ptxdistとは ptxdistは組み込み用途に適したuser landを生成するツール。 KernelコンパイルのCUI、GUIに似せたインターフェイスを持ち、設定され たオプションに合わせて必要なソースやパッチをネットワークから自動的に 入手、コンパイルを行う。targetはHD上にツリーとしてbuildされる。 busybox, uClibなどの小型化定番のツール、ライブラリもメニュー上から 使用を選ぶだけでOK。telnet,ftp,webサービス利用なども選べ、適宜プロ グラムがコンパイル、インストールされる。 内部でkernelのコンパイルも選べるが、ネットワークのドライバなど考慮されない ので自力でコンパイルした方がよい。 ptxdistを利用し生成されたディレクトリツリーをCD-RやCFにコピーすれば ユーザランドの準備は完了。/etc以下の各種設定ファイルは生成されないが、 ptxdistのアーカイブにサンプルが納められている。 また、initrdは生成されないので、必要であればLinuxに準備されている(RedHat だけ?)mkinitdというscriptが利用し作成、ptxdistでできたツリーをinitrd 内部にコピーすれば、RAMDISKのみで運用されるLinuxにも使える。 - ptxdistがgraphviz内のdotというプログラムを必要としたのでインストール % cd ~ % http://www.graphviz.org/pub/graphviz/ARCHIVE/graphviz-1.12-1.i386.rpm % su root # rpm -ivh graphviz-1.12-1.i386.rpm # exit - ptxdistをインストール % wget http://www.pengutronix.de/software/ptxdist/ptxdist-0.5.2.tgz % tar zxvf ptxdist-0.5.2.tgz % cd ptxdist-0.5.2 % setenv LANG C % make i386-generic-glibc_config (まずは一般的な設定をロード) % make menuconfig (自分好みにカスタマイズ) - BusyBox General Configration -> Support for devfs -> off General Configration -> Use the devpts filesystem for Unix98 PTYs -> off Login/Password Management Utilities Networking Utilities -> hostname/ifconfig/route/telnetd - Disk and file utils -> GRUB ブートローダとして利用します - Networking Apps -> proftpd BusyboxにはFTPデーモンが含まれていないので別途選びます。 % make world Eden/667MHz+256MBRAMで、コンパイルに約2時間半(カスタマイズなし) % ls ~/ptxdist-0.5.2/root 出来上がったユーザランドはここに出来ます。 CFへの作り込み ============== - CF内の構成 +------------------------+ | GRUB (boot loader) | MBR +------------------------+ | /boot/bzImage (Kernel) | | /boot/grub (GRUB) | | /bin | | /dev | /dev/hdc1 (ext2) | /lib | | /sbin (Userland) | | /tmp | | /usr | | /var | +------------------------+ - CFの初期化 # /sbin/fdisk /dev/hdc (CF上にhdc1としてLinuxパーティションを作成) # /sbin/mke2fs /dev/hdc1 (hdc1にext2のファイルシステムを作成) # /bin/mount /dev/hdc1 /mnt (/mntとしてmount) - ユーザランドの書き込み # cd ptxdist-0.5.2/root # tar cf - . | ( cd /mnt ; tar xf - ) - カーネルの書き込み # cp /usr/src/linux-2.4.25/arch/i386/boot/bzImage /mnt/boot - デバイスファイル作成 # cd /mnt/dev # cp -dpR /dev/hda[1-6] . # cp -dpR /dev/hdc[1-6] . # cp -dpR /dev/tty[0-3] . # cp -dpR /dev/ttyp[0-3] . # cp -dpR /dev/ptyp[0-3] . # cp -dpR /dev/shm . # cp -dpR /dev/pts . # cp -dpR /dev/console . # cp -dpR /dev/null . - 初期設定ファイルの準備 # vi /mnt/etc/fstab ----- /dev/hdc1 / ext2 errors=remount-ro,noatime 1 1 proc /proc proc defaults 0 0 tmpfs /dev/shm tmpfs size=32m 0 0 ----- # vi /mnt/etc/inittab ----- ::sysinit:/etc/init.d/rcS # Start an "askfirst" shell on the console ::askfirst:/bin/sh # login prompt on the console #::respawn:/sbin/getty 38400 console # put a getty on a serial line (for a terminal) #::respawn:/sbin/getty -L ttyS0 9600 vt100 # Stuff to do before rebooting ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ----- # vi /mnt/etc/init.d/rcS ----- #!/bin/sh # host configration hostname="test" address="192.168.2.10" gwaddress="192.168.2.254" echo echo "Bonsai Linux project (build:20040413)" echo # mount /proc file system /bin/mount /proc # mount root file system for fsck check /bin/mount -a # re-mount root file system /bin/mount -o remount,rw /dev/hdc1 / # /tmp and /var on tempfs mkdir /dev/shm/tmp mkdir /dev/shm/var /bin/mount -o bind /dev/shm/tmp /tmp /bin/mount -o bind /dev/shm/var /var chmod -R 1777 /tmp mkdir /var/log # network configure /bin/hostname $hostname /sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0 /sbin/ifconfig eth0 $address netmask 255.255.255.0 /sbin/route add default gw $gwaddress # network service start #/sbin/syslogd #/usr/sbin/telnetd #/usr/sbin/proftpd & ----- # chmod +x /mnt/etc/init.d/rcS - Boot loaderの書き込み HDからLinuxをboot、CFのMBRにGRUBを書き込む。 sgate1,stage2などはすでにCF上にあることが前提(ptxdistで作成)。 # ls /mnt/boot/grub # /sbin/grub grub> root (hd1,0) hd0かhd1かはBIOSが見つけている順。bootしたデバイスがhd0になる grub> setup (hd1) hd1つまりCFのMBRにGRUBをインストール grub> quit # vi /mnt/boot/grub/grub.conf ----- default=0 timeout=10 title Bonsai Linux root (hd0,0) kernel /boot/bzImage ro root=/dev/hdc1 ----- # cd /mnt/boot/grub # ln -s grub.conf menu.lst