프로젝트 1 Root Filesystem 단국대학교컴퓨터학과 2009 백승재 ibanez1383@dankook.ac.kr k k http://embedded.dankook.ac.kr/~ibanez1383
Ramdisk 에대한이해 강의목표 Root filesystem 의구조이해 Root filesystem 제작과정이해 Ramdisk 기반 root filesystem 제작
3 RAMdisk? Host 의 file system loopback device 란 : 파일하나를마치디바이스처럼취급할수있게해준다. 즉파일한개를마치하나의디스크처럼인식시켜준다. 이이미지가마치하나의디바이스처럼취급되어마운트될수있게해준다. mount 될이미지 mount 될디렉토리 Target board에서사용될 file system HDD 가없는 Embedded System 에서 RAM 상에디스크처럼쓸수있도록구축한공간
4 RAMdisk 수정 RAMdisk 에추가할임의의파일을복사
5 압축전에반드시마운트를해제 수정된새로운 RAMdisk 확인
6 수정된 RAMdisk 로부팅확인
7 Root filesystem 제작순서도 1 image file 생성 dd if=/dev/zero of=ramdisk bs=1k count=16384 내부에 file system 구조를만들어서 loop back device 로 mount 하여일반 file system 과같이사용하는파일을말한다. Image file 내부에 root filesystem 을만든다. image file 에파일시스템생성 mke2fs ramdisk image file mount mkdir mnt && mount -t ext2 ramdisk ram_point o loop 기본디렉토리생성 mkdir bin dev etc lib mnt proc root sbin tmp usr var
8 Root filesystem 제작순서도 2 /dev 디렉토리에 device file 구성 복사할수있는 device file 은복사하고복사할수없는것은생성함 /etc 디렉토리에중요설정파일구성 복사하고편집함 /bin 과 /sbin 디렉토리를구성 busybox 를이용하거나개개의실행파일을 cross 컴파일하여구성 /lib 디렉토리구성 프로그램의운영에필요한동적라이블러리들과 module 들을추가함
9 Root filesystem 제작순서도 3 /var 디렉토리의구성 /var/log 디렉토리를생성 파일시스템이미지압축 umount ram_point 과 gzip -9 ramdisk kernel 과 ramdisk image 보드에적재 테스트하고설정을조정함
10 램디스크제작 디스크에루트파일시스템을만들기위한임시파일을만든다. 블록의크기만들어질파일의크기 O 으로채운다. 출력될장소
11 생성된이미지에파일시스템을만들어준다. 즉 ramdisk 에파일시스템을만들어준다. 만들어진이미지를확인할수있다.
12 mount 될디렉토리를만들어준다. 이디렉토리에서루트파일시스템을구성할것이다. Mount 된디렉토리에가서내용을확인해보면디폴트로생성된것을확인할수있다.
13 루트파일시스템의구성을만들어준다. 리눅스의디렉토리의구조와유사하게생성됨을볼수있다.
/dev 디렉토리의구성 (1/5) 14 /dev 디렉토리에사용할 device의 device file을생성해준다. 기본적인 device file은 host 컴퓨터의 /dev 디렉토리에서복사하여사용하면되며 host 컴퓨터에없는 device file이라면 mknod 명령어로만들어주면된다. Rebis 보드의 kernel과 device를기준으로보면필요한 device file들은다음과같다. ( 다음예의파일명은디렉토리도포함됨 ) console fb3 flh1 mixer null ram3 tty1 tty7 ttys0 dsp fb4 flh2 mtdblock0 ptmx random tty2 tty8 ttys1 fb fb5 flh3 mtdblock1 pts root tty3 ttyp0 ttysa0 fb0 fb6 initctl mtdblock2 ram0 ts tty4 ttyp1 ttysa1 fb1 fb7 kmem mtdblock3 ram1 tty tty5 ttyp2 ttysa2 fb2 flh0 mem mtdblock4 ram2 tty0 tty6 ttyp3 urandom zero
/dev 디렉토리의구성 (2/5) 15 /dev 디렉토리구성명령 cp -dpr /dev/audio./mnt/dev cp -dpr /dev/dsp./mnt/dev cp -dpr /dev/fb./mnt/dev cp -dpr /dev/fb[0-7]./mnt/dev cp -dpr /dev/hda./mnt/dev cp -dpr /dev/hda[0-8]./mnt/dev cp -dpr /dev/initctl./mnt/dev cp -dpr /dev/input./mnt/dev cp -dpr /dev/ircomm[0-1]/./mnt/dev / cp -dpr /dev/irnet./mnt/dev cp -dpr /dev/kmem./mnt/dev cp -dpr /dev/log./mnt/dev cp -dpr /dev/mem/./mnt/dev / cp -dpr /dev/mixer./mnt/dev cp -dpr /dev/mouse./mnt/dev cp -dpr /dev/null./mnt/dev cp -dpr /dev/pts/./mnt/dev / cp -dpr /dev/ram[0-3]./mnt/dev cp -dpr /dev/random./mnt/dev cp -dpr /dev/rtc./mnt/dev cp dpr 옵션은파일은원본파일의 uid, gid, 권한, 시간정보가그대로복사하고디렉토리라면하위디렉토리까지복사하는것을의미함
/dev 디렉토리의구성 (3/5) 16 cp -dpr /dev/tty./mnt/dev cp -dpr /dev/tty[0-8]/./mnt/dev / cp -dpr /dev/ttyp[0-3]./mnt/dev cp -dpr /dev/ttys[0-1]./mnt/dev cp -dpr /dev/ttysa[0-2]./mnt/dev cp -dpr /dev/urandom/./mnt/dev / cp -dpr /dev/video./mnt/dev cp -dpr /dev/zero./mnt/dev mknod./mnt/dev/flh0 b 60 0 mknod./mnt/dev/flh1 b 60 1 mknod./mnt/dev/flh2 b 60 2 mknod./mnt/dev/flh3 b 60 3 mknod./mnt/dev/keypad c 251 0 mknod./mnt/dev/mmcda b 241 0 mknod./mnt/dev/mmcda1 b 241 1 mknod./mnt/dev/mmcda2 b 241 2 mknod./mnt/dev/mmcda3 b 241 3 mknod./mnt/dev/mmcda4 b 241 4 mknod./mnt/dev/mtd3 c 90 6 mknod./mnt/dev/mtdblock0 b 31 0 mknod./mnt/dev/mtdblock1 b 31 1
/dev 디렉토리의구성 (4/5) 17 mknod./mnt/dev/mtdblock2 b 31 2 mknod./mnt/dev/mtdblock3 / / b 31 3 mknod./mnt/dev/mtdblock4 b 31 4 mknod./mnt/dev/ptmx c 5 2 mknod./mnt/dev/ts c 11 0 ln -s ram0./mnt/dev/root / / ln -s ttys0./mnt/dev/console root filesystem 이 ram disk이고콘솔은 ttys0 로심복릭링크함
/dev 디렉토리의구성 (5/5) 18 /dev 디렉토리 위명령어들을 shell script로만든파일임
/etc 디렉토리의구성 (1/5) 19 /etc 디렉토리는시스템의중요한설정파일들이들어있는디렉토리이다. host 컴퓨터의 /etc 디렉토리에서필요한설정파일들과 script 파일들을복사하고파일들을 target board 에맞게수정해준다. 중요파일들의용도와리스트는다음과같다. /etc 디렉토리의중요파일리스트 fstab : mount 될파일시스템리스트 inittab : init 프로세스에대한설정 ( 앞으로사용할 busybox의 init에서는사용하지않을것임 ) rc.d/* :s system stem 기동및런레벨변경 script 들 passwd : 사용자의정보리스트 shadow : 사용자들의패스워드리스트 group : system group 리스트 modules : 부팅시 module loding 에참조하는파일 기타 : 기타 network 설정에필요한파일들이나 shell 환경설정파일들
/etc 디렉토리의구성 (2/5) 20 /etc 디렉토리구성명령 TARGETDIR=./mnt/etc for FILES in `cat etcfiles.txt`; do cp -rf /etc/$files $TARGETDIR; done; echo "bin" > $TARGETDIR/ftpusers echo "" > $TARGETDIR/hosts.equiv echo "" > $TARGETDIR/modules echo "localnet 127.0.0.1" > $TARGETDIR/networks echo "GMT"" > $TARGETDIR/timezone ln -s /proc/mounts $TARGETDIR/mtab 위명령어는 etcfiles.txt 파일의내용을토대로 host 컴퓨터의 /etc 디렉토리의파일들을복사
/etc 디렉토리의구성 (3/5) 21 etcfiles.txt file 의내용 fstab group host.conf hosts hosts.allow hosts.deny inittab inputrc ioctl.save issue issue.net ld.so.cache localtime motd nsswitch.conf passwd pcmcia profile protocols rc.d resolv.conf rpc services shadow
/etc 디렉토리의구성 (4/5) 22 /etc 디렉토리
/etc 디렉토리의구성 (5/5) 23 복사한파일들을수정해준다. 기본적으로 fstab파일만수정해주면부팅이가능하나원칙대로라면 script 파일들과 network 관련설정파일들을 embedded system 의상황에맞게수정해주어야한다. /etc/fstab 파일의내용
/lib 디렉토리의구성 (1/3) 24 동적라이블러리들과 kernel module - 동적라이블러리는 arm-linux-gcc 컴파일러가설치된디렉토리에서 lib 디렉토리의라이블러리파일을사이즈를줄여서사용하면되고 module은 kernel을컴파일하여생성된 module을사용하면된다. module은 system의상황에따라틀린데현재 system에서필수요소는아니기때문에없어도상관없다. 필요한동적라이블러리리스트 ld-2.2.3.so 223so libdbso2 libdb.so.2 libnsl.so.1so libtermcap.so.2 ld-linux.so.2 libdb.so.3 libnss_dns-2.2.3.so libtermcap.so.2.0.8 libc-2.2.3.so libdl-2.2.3.so libnss_dns.so.2 libutil-2.2.3.so libc.so.6 libdl.so.2 libnss_files-2.2.3.so libutil.so.1 libcrypt-2.2.3.so 223so libm-2.2.3.so 223so libnss_files.so.2 so libcrypt.so.1 libm.so.6 libresolv-2.2.3.so libdb-2.1.3.so libnsl-2.2.3.so libresolv.so.2 버전번호는변경될수있음
/lib 디렉토리의구성 (2/3) 25 동적라이블러리생성 script (mklib.sh) libfiles.txt 파일은위에서설명한필요한동적라이블러리리스트이다. strip 명령은 binary 내에symbol string을제거함으로써사이즈를축소함
/lib 디렉토리의구성 (3/3) 26 동적라이블러리생성
/var 디렉토리의구성 (1/2) 27 sub 디렉토리와 log file 생성 - 어떤 login 프로그램이나 init 프로그램의경우 /var 디렉토리에 log file 이없을때정상적으로실행이안될수가있다. 그래서 /var 디렉토리에필요한 log file과디렉토리구조를만들어주어야한다. 명령어 mkdir -p./mnt/var/adm /./mnt/var/lock/subsys /l./mnt/var/lib /lib./mnt/var/log /l./mnt/var/run./mnt/var/spool/cron/crontabs./mnt/var/tmp touch./mnt/var/log/dmesg touch./mnt/var/log/lastlog touch./mnt/var/log/messages touch./mnt/var/log/wtmp touch./mnt/var/run/runlevel.dir touch./mnt/var/run/utmp
/var 디렉토리의구성 (2/2) 28 /var 디렉토리구성
29 메인시스템응용프로그램 수천개의바이너리명령어를임베디드시스템서어떻게지원할것인가? 완전표준응용프로그램 응용프로그램을하나씩다운받아컴파일하여램디스크에포함 BusyBox 대부분의임베디드시스템서사용 ( 대부분의 Arch 지원 ) 작지만대부분의명령어를지원하며원하는명령어만지원가능 Glibc 나 uclibc 를정적 / 동적링크하여사용가능 TinyLogin 여러로그인유틸리티를모아하나의바이너리파일로만든것 보통 BusyBox 와함께사용 Embutils 많이사용되는명령어프로그램을작게최적화시킨것 ARM, i386, PPC, MIPS의 4가지 Arch지원 정적링크만가능 BusyBox 보다적은명령어지원
30 Busybox 다운받기
압축해제 / 확인 RAMDISK 기능과구조 31
32 파일수정 Red-hat 설정과는다른부분이있기때문에수정필요
33 데비안의경우에는 /etc/init.d/rcs에 init에서처음실행하는스크립트가명시되어있지만 Redhat에서는 /rc.d/rc.sysinit에명시되어있다
34 config BusyBox 의최상위디렉토리 부팅가능한 BusyBox 를만들기위해설정을해줌
35 Root File system 제작 busybox 설정 menu 항목 1 General Configuration busybox 에관한일반적인설정 Build Options build에관한일반적인설정 ( cross 컴파일여부및공유라이블러리사용여부결정 ) Installation Options install 디렉토리의설정 Archival Utilities 압축, 패키징유틸리티의선택 Coreutils 리눅스기본명령어들을선택 (ex : ls, cp, cat, ) Console Utilities console 관련명령어들을선택 Debian Utilities debian 배포판에서사용되는명령어들을선택
36 Root File system 제작 busybox 설정 menu 항목 2 Editors editor 의선택 (vi, awk, sed, ) Finding gutilities file을검색하는명령어선택 (find, grep, ) Init Utilities init 파일의설정 Login/Password Management Utilities user, group, password 관련명령어선택 (adduser, addgroup, passwd, ) Miscellaneous Utilities 기타시스템에서사용되는유틸리티선택 (strings, last, ) Linux Module Utilities linux module 관련유틸리티선택 (insmod, lsmod, rmmod, modprobe) Networking Utilities network 관련 server daemon 및유틸리티선택 (telnet, netstat, ping, httpd, tarceroute, )
37 Root File system 제작 busybox 설정 menu 항목 3 Process Utilities process 관리유틸리티선택 (ps, kill, top, ) Another Bourne-like Shell shell 선택및설정 (ash, msh, ) System Logging Utilities system log 관련 daemon 및유틸리티 Linux System Utilities linux 시스템설정유틸리티선택 (mount, fdisk, dmesg, ) Debugging Options bebugging symbol 추가여부결정 Load an Alternate Configuration File 기존의설정을 loading Save Configuration to an Alternate File 현재의설정을파일에저장
38 Configuration
39 공유라이브러리사용여부설정 CrossCompiler 설정
40 선택을해제한다. Busybox의 init은 /etc/inittab을제대로해석하지못하므로사용하지않도록한다.
41
42
43 Make 수행
44 바이너리파일확인 컴파일해주고나면 busybox 바이너리파일이생성됨을볼수있다.
45 BusyBox Binary File copy 생성된 busybox 를 mount 한디렉토리안의 /bin 디렉토리에복사한다.
46 확인 / 링크확인
47
48 실행파일들을 busybox 에심벌릭링크시켜주면된다.
49
파일시스템이미지압축 umount 후압축 최종적으로완성한압축된 root filesystem 이미지
51 Booting using New Kernel & New RAMDisk
kernel 설정 kernel 설정및컴파일 Ramdisk 를사용하기위한 kernel 설정