RTLinux 의 8MB CompactFlash 에적재방법 2004.4. 시뮬라인연구소김대현 Rev.2 1. 개요 A. 리눅스는일반적으로설치된다면보통 500MB의하드디스크가요구된다. 또한항상정상적인부팅과종료과정을거쳐야리눅스의파일시스템에문제를야기하지않는다. B. 그러나게임기와같이임베디드한상황에서대용량의하드디스크를쓰는것은문제가있을수있다. 하드디스크는충격에매우취약하므로운반시에손상될수있다. 또한전원의개폐가수시로일어날수있는상황이기때문에리눅스의파일시스템이깨져버리는것은시간문제일것이다. C. 따라서최적화된크기가매우작아진리눅스를충격에강한 potable 한매체에담고전원계페에무관한리눅스를만드는게게임또는컨드롤러와같은임베디드분야에최적일것이다. D. 그러기위해서 CompactFlash를매체로사용하고리눅스의최소파일을담은루트파일시스템을압축하여초기램디스크형식으로한다면이러한모든문제는해결될것이다. 2. 준비물 A. RTLinux / linux kernel patch B. linux 커널소스 / syslinux C. 타겟 CPU보드 D. 8MB 이상 CompactFlash Disk E. 64 MB RAM F. 1GB이상 HDD/3.5인치 FDD/CD-ROM DRIVE G. Alzza/adalinux/redhat 6.0 or 6.2 H. 키보드 / 모니터 3. RTLinux 설치 A. CPU보드에 HDD/CDROM/FDD/ 를연결한후 Redhat리눅스를설치한다. B. ftp://ftp.kernel.org에서 Rtlinux와같이사용할수있는리눅스커널을다운받는다. 보통 RTLinux버전에따라그에맞는리눅스커널이있기때문에아무버전이나쓸수있는것이아니다. RTLinux는 ftp://ftp.rtlinux.at/pub/rtlinux/contrib/hofrat/ 에서패치파일과함께받는다. 패치파일은리눅스커널버전과맞는지다시한번확인한다. 모든파일은 /usr/src 디렉토리에옮겨놓는다. C. 리눅스커널소스와 RTLinux의소스를다음과같이설치한다. tar xvfz linux-2.4.22.tar.gz tar xvfz rtlinux-3.2.pre2.tar.gz ln s /usr/src/linux-2.4.22 /usr/src/linux
D. 리눅스를다음과같이패치한다. 이미패치된거널이라면다음과정은생략한다. cd /usr/src/linux patch p1 <../kernel_patch-2.4.22-rtl3.2-pre3 E. 리눅스를다음과같이컴파일한다. cd /usr/src/linux make menuconfig ; 커널설정, F항에자세히기술되어있음 make dep ; dependency 채크 make bzimage ; 커널컴파일및이미지생성 make modules ; 모듈컴파일 make install ; 모듈및커널설치 cp /usr/src/linux/arch/i386/boot/bzimage /boot/vmlinuz-rtlinux F. make menuconfig를수행할때다음의옵션은반드시선택되어야한다. i. Processor type 1. 486/Cx486 2. Symmetric Multi Processing (RTlinux를위해반드시필요 ) ii. Loadable Module Support (RTLinux 모듈탑재를위해반드시필요 ) iii. General 1. Networking support (TCP/IP통신을위해반드시필요 ) 2. PCI support ( 내장형 LAN을위해반드시필요 ) 3. Kernel support a.out 4. Kernel support ELF 5. Kernel support MISC 6. Sysctrl support ( 컴파일시이부분빠지면에러발생 ) iv. Block Device 1. Ram disk (CF로부팅시반드시필요 ) 2. Initial Ram Disk (CF로부팅시반드시필요 ) v. Networking Option 1. Packet Socket 2. Unix Domain Socket 3. TCP 4. IP(allow large window) vi. ATA/IDE 1. ATA/IDE/ support 2. IDE,ATA A. Enhanced IDE, (CF를위해반드시필요 ) B. Include IDE/ATA-2 Disk vii. Networking Device Support 1. Ethernet 10 or 100 Mbit A. EISA,VLB,PCI : Realtek RTL-8139 ; 커널카피
viii. Character Device 1. Virtual Terminal ( 커널로드시반드시필요 ) 2. Support for console 3. Standard/generic (dumb) serial support (serial 통신을위해필요 ) 4. Support for console on serial port ix. File System 1. kernel Auto mounter vesion4 2. DOS FAT fs support 3. MSDOS FAT fs support (CF로부터램디스크이미지로딩을위해필요 ) 4. Secondary extended fs support ( 램디스크를위해반드시필요 ) 5. Minix fs support 6. /proc fs support x. Console Driver xi. VGA Text Console G. 리눅스커널을설치하기위해 /etc/lilo.conf 파일을 vi편집기로다음과같은내용을추가한후 lilo 를실행하고 reboot 를실행하여재부팅한다. 부트프롬프트가뜨면 rtlinux 를입력하여 rtlinux로부팅한다. image=/boot/vmlinuz-rtlinux label=rtlinux root=/dev/hda1 ; 시스템환경에맞게루트파일시스템이있는디바이스로설정 read-only ramdisk=30720 H. RTLinux를다음과같이컴파일하고설치한다. cd /usr/src/rtlinux make menuconfig make dep make make install I. Rtlinux를다음과같이 test해본다. make regression i. make regression항목에서모든부분 test가 [OK] 일때제대로설치되고동작하는것이다. ii. Rtlinux를다음과같이시작해본다. rtlinux start 이때아래와같은내용이화면에출력되며앞에 (+) 가표시된경우그모듈이제대로로딩되었음을의미하며 (-) 인경우로딩이되지않았음을의미한다. (+)rtl.o (+)rtl_fifio.o
4. CompactFlash Disk 사전준비 A. 도스나윈도우가설치된다른 PC에서 3.5인치디스켓을다음과같이포멧하고부팅가능한디스켓을만든다 format a:/s 이미포멧이되어있으면 sys a: B. 그디스켓에 syslinux.exe 와 ldlinux.sys를복사한다 C. 만약 CompactFlash가 Format되어있지않다면 Format한다. ( 일반적으로 format되어있음 ) D. 타겟보드에서하드디스크는빼고 CF와 FDD는연결한상태에서디스켓으로부팅한후도스프롬프트에서아래와같이입력한다. syslinux c: (lilo설치하는기능과같음 ) E. CF로 ldlinux.sys 를복사한다. F. CF에서 syslinux.cfg 텍스트파일을생성하여아래와같이편집한다. default zimage display logo append=load_ramdisk=1 initrd=root.rtl initrd_archive=mimix ramdisk_size=30720 root=/dev/ram0 boot=/dev/hdc1,msdos G. 위에서 logo 파일은부팅될때화면에표시되는내용으로 CF에서편집기로 logo 파일을생성한후리눅스가처음구동될때표시될내용을편집하고저장한다. 5. 루트파일시스템만들기 A. 루트파일시스템은리눅스커널이실행되고최종적으로초기화및리눅스파일시스템으로사용하기위해마운팅되는파일시스템이미지이다. 이이미지는최종적으로압축된바이너리이미지로생성되어 CF로부팅시에램디스크이미지로사용될것이다. B. /root/ramdiskimage 란디렉토리를생성하고그디렉토리로이동한다. C. 내용이없는 linuxrc 파일을생성하고실행가능하게모드를변경한다. chmod 666 linuxrc D. VRRacer 와관계된모든파일을 /ramdiskimage 디렉토리에복사한다. E. boot, dev, etc, bin, lib, sbin, proc, sbin/lib, usr, usr/sbin, root 디렉토리를생성한다. F. /root/ramdiskimage/dev디렉토리에는 /dev디렉토리의모든내용을카피한다. G. /root/ramdiskimage/etc디렉토리에는 /etc디렉토리에있는아래파일들을카피한다. - conf.*, *.conf, passwd*, shadow*, - services, protocols, identd, fstab, inittab - rc.d/ 디렉토리를전체카피하고 rc.d/rc3.d/ 디렉토리에있는아래파일만남겨둔다. S10network, S11portmap, S14nfslock, S16apmd, S20random, S30syslog, S35identd, S40crond, S50inet, S60lpd, S75keytable, S85numlock, S99linuxconf, S99local
- fstab파일은아래와같이수정한다. /dev/ram0 / ext2 defaults 1 1 proc /proc defaults 0 0 - etc/rc.d/rc.local파일의맨마지막줄에아래내용을첨가한다. rtlinux start ; 부팅시자동으로 rtlinux를시작하기위해 cd / insmod /smcprtmodule.o /VRRacer - /etc/sysconfig/network-script/* H. /root/ramdiskimage/usr디렉토리에는 /usr 디렉토리내의아래파일들을카피한다. - /usr/rtlinux/bin/* - /usr/rtlinux/include/* - /usr/rtlinux/modules/* - /usr/include/rtlinux - /usr/sbin/libslang* - /usr/sbin/libnewt* I. /root/ramdiskimage/lib디렉토리에는아래파일을카피한다. - /lib/modules/2.4.22/* ; rtlinux를위한모듈들 - /lib/libncurses* ; 네트웍킹을위한라이브러리 J. /root/ramdiskimage/sbin디렉토리에는아래파일들을카피한다. - /sbin/sysctrl ; 이파일이없으면부팅시 Configuring Kernel Parameter에러가발생한다. K. bin디렉토리에는아래파일들을카피한다. - /bin/netconf L. 루트파일시스템은나중에램디스크로복사될것이기때문에전체크기가램디스크 ( 현재30720kbyte) 크 기보다반드시작아야한다. 만약클경우 CF로부팅시에 Kernel Panic 이발생하게된다. 따라서 루트파일시스템디렉토리에서 du 명령으로디스크사용량을반드시체크한다. 6. Network설정 A. /root/ramdiskimage/etc/sysconfig/network-script로이동한다. B. DHCP를사용할때 ifcfg-eth0 파일을아래와같이편집한다. DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes C. 고정 IP를사용할때 ifcfg-eth0 파일을아래와같이편집한다. DEVICE=eth0 BOOTPROTO=static IPADDR= 설정할 IP주소
NETMASK= 설정할 netmask GATEWAY= 설정할 Gateway 7. Ramdisk Image만들기 A. 루트파일시스템을하나의이미지파일로만들기위해다음과같이램드라이브를 ext2 type 으로 format하고 /mnt 디렉토리에마운팅한다. mke2fs /dev/ram0 mount /dev/ram0 /mnt B. /mnt 디렉토리에루트파일시스템을모두복사하고 /mnt를언마운팅한다. cp dprfr /root/ramdiskimage/* /mnt umount /mnt C. 램디스크이미지파일을생성및압축한다. dd if=/dev/ram0 of=root.rtl bs=1k count=30720 gzip root.rtl D. CompactFlash Disk(hdc1) 를 /mnt에마운팅하고램디스크이미지파일을 CF에복사하고 /mnt를언마운팅한다. mount /dev/hdc1 /mnt mv root.rtl.gz /mnt/root.rtl umount /mnt 8. 루트파일시스템파일리스트 A. 굵은글씨체로된파일은순수리눅스에는있지않는것들이기때문에주의깊게복사해야한다. /: MBase.ini dsmpcx1.ini linuxrc* opt/ smcprtmodule.o SMCP.INI bin/ etc/ proc/ tmp/ VRRacer* boot/ home/ lost+found/ sbin/ usr/ WashCx1.ini dev/ lib/ mnt/ smcp.ini var/ diotest* bin: awk@ date* false* linuxconf* nice* sh@ userconf@ basename* dd* fgrep* ls* pwd* sleep* usleep* bash* df* gawk* mkdir* rm* sty* which* cat* dmesg* grep* mknod* rmdir* su* zcat* chgrp* domainname@ gtar@ mount* rtl-config* touch* chmod* echo* hostname* mt* rtlinux@ true* chown* egrep* init* mv* sed* umount* cp* ex@ kill* netconf@ setserial* uname* boot: dev: ram ram0 ramdisk@ console cua0 random ipstate null rtc rtf0 rtf1~63 rft0~3 kmem loop0~7 mbuff hdc hdc1 mem etc: DIR_COLORS gshadow ld.so.conf passwd- shells HOSTNAME host.conf lmhosts profile sysconfig/
muttrc hosts localtime profile.d/ sysctl.conf alzza-release hosts.allow login.defs protocols syslog.conf bashrc hosts.deny logrotate.conf pwdb.conf up2date.conf conf.linuxconf identd.conf logrotate.d/ rc.d/ uucp/ conf.modules inetd.conf motd resolv.conf yp.conf csh.cshrc info-dir mtab screenrc ypserv.conf fstab initlog.conf nsswitch.conf securetty gettydefs inittab pam.conf services group inputrc paper.config shadow group- ld.so.cache passwd shadow- etc/logrotate.d: cron linuxconf syslog uucp etc/profile.d: alzza-pref.csh* hangul-init.csh* lang.csh* lessopen-init.csh* mc.csh* alzza-pref.sh* hangul-init.sh* lang.sh* lessopen-init.sh* mc.sh* etc/rc.d: init.d/ rc* rc.local* rc.sysinit* rc3.d/ etc/rc.d/init.d: anacron* functions.orig* kdcrotate* network.orig* rstatd* syslog* apmd* glx_install.sh* keytable* nfs* rtlinux* usb* arpwatch* glx_remove.sh* killall* nfslock* rusersd* xfs* atd* gpm* kudzu* numlock* rwalld* ypbind* crond* halt* linuxconf@ pcmcia* rwhod* yppasswdd* everytime* identd* lpd* portmap* sendmail* ypserv* firstime* inet* netfs* random* single* functions* ipchains* network* routed* snmpd* etc/rc.d/rc3.d: K20nfs@ K20rwhod@ K84ypserv@ S20random@ S99linuxconf@ K20rstatd@ K34yppasswdd@ K92ipchains@ S50inet@ S99local@ K20rusersd@ K50snmpd@ S10network@ S75keytable@ K20rwalld@ K55routed@ S11portmap@ S85numlock@ etc/sysconfig: apmd clock hwconf init mouse network-scripts/ sendmail* cbq/ console/ i18n keyboard network pcmcia soundcard etc/sysconfig/cbq: cbq-0000.example etc/sysconfig/console: etc/sysconfig/network-scripts: ifcfg-eth0* ifdown-post* ifup-aliases* ifup-ppp* ifdown-ppp* ifup-ipx* ifup-routes* ifcfg-lo* ifdown-sl* ifup-plip* ifup-sl* ifdown@ ifup@ ifup-post* network-functions etc/uucp: call dial dialcode oldconfig/ passwd port sys etc/uucp/oldconfig: home: lib: ld-2.1.2.so* libdl.so.1@ libncurses.so.5.0* ld-linux.so.1@ libdl.so.1.9.5* libnsl-2.1.2.so* ld-linux.so.1.9.5* libdl.so.2@ libnsl.so.1@
ld-linux.so.2@ libext2fs.so.2@ libpthread-0.8.so* ld.so* libext2fs.so.2.4* libpthread.so.0@ ld.so.1.9.5* libm-2.1.2.so* libresolv-2.1.2.so* libc-2.1.2.so* libm.so.6@ libresolv.so.2@ libc.so.6@ libncurses.so@ libtermcap.so.2@ libcrypt-2.1.2.so* libncurses.so.4@ libtermcap.so.2.0.8* libcrypt.so.1@ libncurses.so.4.0@ modules/ libdl-2.1.2.so* libncurses.so.5@ lib/modules: 2.4.22/ lib/modules/2.4.22 misc/ modules.dep lib/modules/2.4.22/misc: mbuff.o@ rtl.o@ rtl_posixio.o@ rtl_time.o@ psc.o@ rtl_fifo.o@ rtl_sched.o@ lost+found: mnt: cdrom/ disk/ floppy/ mnt/cdrom: mnt/disk: mnt/floppy: opt: proc: sbin: clock@ ifdown* ipchains-restore* modinfo* rpc.lockd* depmod* ifup* kbdrate* modprobe* runlevel* dump* ifuser* kerneld* netreport* service* fixperm@ init* killall5* pcinitrd* setpci* ftl_check* initlog* klogd* pidof@ stinit* ftl_format* insmod* ksyms* probe* sulogin* getkey* insmod.static* loglevel* pump* swapoff@ halt* install-info* losetup* reboot@ sysctl* hwclock* installkernel* lsmod* rmmod* telinit@ ifconfig* ipchains* minilogd* route* update* tmp: usr: bin/ include/ lib/ rtlinux@ rtlinux-3.2/ sbin/ usr/bin: rtl-config* rtlinux@ usr/include: rtlinux@ usr/lib: librtlinux.a@ libslang.so@ libslang.so.1.2.2 librtlinuxpsos.a@ libslang.so.1@ usr/rtlinux-3.2: bin/ include/ lib/ modules/
usr/rtlinux-3.2/bin: rtl-config* rtlinux@ usr/rtlinux-3.2/include: rtl.config usr/rtlinux-3.2/lib: librtlinux.a librtlinuxpsos.a usr/rtlinux-3.2/modules: mbuff.o psc.o rtl.o rtl_fifo.o rtl_posixio.o rtl_sched.o rtl_time.o usr/sbin: authconfig* netconfig* routed* rpc.rusersd* tcpd* usermod* uusched* inetd* rdistd* rpc.rstatd* rwhod* timed* utmpd* var: arpwatch/ db/ lock/ nis/ run/ tmp/ cache/ local/ log/ preserve/ spool/ var/arpwatch: var/cache: var/db: var/local: var/lock: console/ subsys/ var/lock/console: var/lock/subsys: atd gpm keytable lpd network random syslog crond inet kudzu netfs portmap sendmail xfs var/log: uucp/ var/log/uucp: Debug Log Stats