NetBSD-1.6.1で 1CF Embeded NetBSD を作る どんなものか? ============= - CFだけで動く小型NetBSD - 電源をいきなりバチンと落せる - FANレス、HDレスで MicroPCから駆動部分がなくなる - ルータ、ファイアウォール、ファイルサーバ、WEBサーバへ発展可能 (ここではOS部分の作り方のみ紹介。) CF内の構成 ========== Compact Flash +----------------------------+ | boot loader | MBR +----------------------------+ | netbsd.gz | | - Kernel | /dev/wd1a (ffs) | - rootFS (/dev,/sbin,/bin) | | | +----------------------------+ 起動の仕組み ============ - BIOSがBoot loaderを読む - Boot loaderがnetbsd(.gz)を読む - netbsd(.gz)内には、kernelとファイルシステムのイメージがあり、 起動時に読み込みメモリに展開される。 - シングルユーザモードでshが起動するので、/.profile に起動させたい プログラムを記述することによって希望するサービスを開始させる # 組み込み系のNetBSDでは一般的な手法のようです。 作業の流れ ========== ・前準備 - sourceの準備 gnusrc.tgz, sharesrc.tgz, src.tgz, src.tgz - toolchainの構築 ・CHIBI kernel作成 - configの準備 - kernelのbuild ・root file systemイメージの作成 - デバイス file - 必要なシステム file - 改造init ・CHIBI Kernelにroot file systemをマージ - mdsetimage ・CFに書込む - disklabel - newfs - mount - kernelを /netbsdの名前でコピー 作業内容 ====== ・前準備 % su root # mkdir /mnt/mem # mkdir /mnt/cf # mkdir /home/chibi # cd / # tar zxf /home/takemaru/gnusrc.tgz # tar zxf /home/takemaru/sharesrc.tgz # tar zxf /home/takemaru/src.tgz # tar zxf /home/takemaru/src.tgz # mkdir /usr/obj # cd /usr/src # ./build.sh tools ・小さなkernelを作る # cd /sys/arch/i386/conf # cp GENERIC CHIBI # vi CHIBI (32MBのrootファイルシステムを持つKernel) ----- ... options MEMORY_DISK_HOOKS options MEMORY_DISK_IS_ROOT # force root on memory disk options MEMORY_DISK_SERVER=0 # no userspace memory disk support #options MEMORY_DISK_ROOT_SIZE=32768 # 16M options MEMORY_DISK_ROOT_SIZE=65536 # 32M options NKPTP=30 # 120MB (デフォルトは4=16MB) ... pseudo-device md 1 # memory disk device (ramdisk) ... ----- MEMORY_DISK_ROOT_SIZEとNKPTPパラメータに注意。 希望するrootFSのサイズをMEMORY_DISK_ROOT_SIZEに設定。 それに対応してNKPTPは十分大きく(対応関係不明 ^_^;) Kernel+RootFS < NKPTP になるように。 # config CHIBI # cd ../compile/CHIBI # make depend # make # cp /sys/arch/i386/compile/CHIBI/netbsd /home/chibi ・root file systemのイメージ(32MB)を作る # cd /home/chibi # dd if=/dev/zero of=rootfs.img bs=32m count=1 # vnconfig -c -v /dev/rvnd0 rootfs.img # newfs /dev/rvnd0a # mount -t ffs /dev/vnd0a /mnt/mem - make device # mkdir /mnt/mem/dev # cp /dev/MAKEDEV /mnt/mem/dev # cd /mnt/mem/dev # ./MAKEDEV ramdisk - required files /dev, /sbin/init, /bin/sh が最低限必要 # mkdir /mnt/mem/sbin # foreach com ( fsck halt init mount newfs ping reboot shutdown umount ) ? cp /sbin/${com} /mnt/mem/sbin ? end # mkdir /mnt/mem/bin # foreach com ( cat cp csh date dd df kill ln ls mkdir mv ps pwd rm sh sync ) ? cp /bin/${com} /mnt/mem/bin ? end # mkdir /mnt/mem/etc # mkdir /mnt/mem/var - custom "init" 普通のinitのままでは起動時にリターンの入力待ちになる。 入力を待たないような initを作る。 # cd /usr/src/sbin/init # make -D SMALLPROG # cp obj/init /mnt/mem/sbin # cd /home/chibi # umount /mnt/mem # vnconfig -u /dev/vnd0 ・root file sustemをkernelにマージする # mdsetimage -v netbsd rootfs.img # gzip -c netbsd > netbsd.gz # chmod +x netbsd.gz ・Compact Flashに書込む # fdisk -a -u wd1 Disk: /dev/rwd1d NetBSD disklabel disk geometry: cylinders: 978 heads: 8 sectors/track: 32 (256 sectors/cylinder) BIOS disk geometry: cylinders: 124 heads: 32 sectors/track: 63 (2016 sectors/cylinder) Partition table: 0: sysid 169 (NetBSD) start 63, size 249921 (122 MB), flag 0x80 beg: cylinder 0, head 1, sector 1 end: cylinder 123, head 31, sector 63 1: 2: 3: # disklabel -e -I wd1 size offset fstype [fsize bsize cpg/sgs] a: 249921 63 4.2BSD 1024 8192 293 # (Cyl. 0*- 976*) c: 249921 63 unused 0 0 # (Cyl. 0*- 976*) d: 250368 0 unused 0 0 # (Cyl. 0 - 977) # newfs /dev/rwd1a # mount /dev/wd1a /mnt/cf # cp netbsd.gz /mnt/cf # umount /mnt/cf # /usr/mdec/installboot -v /usr/mdec/biosboot.sym /dev/rwd1a