· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linux Based OnUSB-Storage Device

이상인, delpai at hotmail dot com

v 0.1

-- delpai 2004-07-09 16:43:58

1. 들어가기


이 문서는 USB 저장장치에 간단한 리눅스 시스템을 구축하여 라이브로 리눅스를 사용할 수 있는 과정을 설명하였습니다. “플로피 디스크 2장으로 만드는 리눅스”라는 문서가 있습니다만, 2년 전 문서이기 때문에 이 문서를 작성하게 되었습니다. 글쓴이가 실력이 초보인 관계로 다른 초보자가 보더라도 아주 쉽게 따라할 수 있도록 문서를 작성할 것입니다.

이후부터는 편의상 존칭을 생략하도록 하겠습니다.

1.1. 이 문서에 대해서


글쓴이는 임베디드 리눅스에 대해서 아무것도 모르는 초보자다. 리눅스를 다뤄본지도 1년밖에 되질 않았고, 이제 한창 배워가는 과정이다. 그러다 우연히 Busybox라는 임베디드 리눅스를 알게 되었고, 관련 문서를 찾다보니 위에서 언급한 “플로피 디스크 2장으로 만드는 리눅스”라는 문서를 읽어 보게 되었다. 그러다 옆에 있던 한국통신에서 준 8MB짜리 USB 저장장치가 보였고, “혹시 이거에도 리눅스가 돌아갈까?”하는 호기심에 시도를 해보았고 성공하여 이렇게 문서를 작성하게 되었다.

“플로피 디스크 2장으로 만드는 리눅스” 라는 문서와 Busybox의 Example 문서를 많이 참고하였고, 구글링을 이용하여 많은 정보를 얻었다. 후에 참고 문서에 링크를 남길테니 참고하고 싶으면 참고하여라.

2. 준비물


우선 기본적으로 USB 저장장치가 필요할 것이다. 글쓴이는 네스팟을 신청하였을 때 준 8MB자리 "Celldisk의 KEYDISK“라는 USB 저장장치였다.

그리고 리눅스가 설치되어 있는 시스템이 구축되어 있어야 하는데, 글쓴이는 레드햇 리눅스 9.0을 사용하였다.

마지막으로 리눅스 시스템에 필요한 것들은 아래와 같다.

O. Busybox 최신 버전 [http]http://www.busybox.net 에서 구할 수 있다.

O. 커널 헤더 파일 (kernel-haeders) [http]http://www.kernel.org 에서 구할 수 있다.

O. GLIBC-DEVEL [ftp]ftp://ftp.gnu.org/pub/gnu/glibc 에서 구할 수 있다.

O. Syslinux [http]http://syslinux.zytor.com 에서 구할 수 있다.

O. mtools [http]http://mtools.linux.lu/ 에서 구할 수 있다.

3. 루트 파일 시스템 이미지 만들기


우선 비어있는 파일 시스템 파일을 만들어야 한다.

# dd if=/dev/zero of=rootfs bs=1k count=4000
4000+0 records in
4000+0 records out
#


rootfs 파일이 루프 디바이스처럼 사용할수 있게 해줘야 한다.(꼭 필요하진 않다.)

# losetup /dev/loop0 rootfs
#


rootfs 파일을 파일 시스템으로 사용할 수 있도록 포맷한다.

# mkfs.ext2 -F -i 2000 rootfs
mke2fs 1.35 (28-Feb-2004)
rootfs is mounted; mke2fs forced anyway.  Hope /etc/mtab is incorrect.
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2048 inodes, 4000 blocks
200 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
2048 inodes per group

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# 


rootfs를 마운트 포인트가 될 디렉토리를 생성하고 rootfs 파일을 마운트 한다.(루트 권한을 가지고 있어야만 실행할 수 있다.)

# mkdir loop
# mount -o loop rootfs loop/


4. Busybox


Busybox는 단지 busybox라는 파일 하나이지만 우리가 리눅스에서 사용하는 많은 Utility를 사용할 수 있다. 용량도 아주 적어서 임베디드 리눅스를 구축 할 때 많이 사용한다. 자세한건 Busybox 홈페이지에서 알아보아라.

4.1. Busybox 컴파일 & 설치

구버전의 Busybox는 직접 설정 파일을 생성해주어야만 했다. 하지만 최신 버전은 make config 나 make menuconfig 로 아주 손쉽게 설정 파일을 자동 생성할 수 있다. 글쓴이는 make menuconfig를 이용하여 설정하였다.

# make menuconfig


위 명령을 실행하면 Busybox Configuration 화면이 나온다. 메뉴에 대한 설명을 하면 길어지기 때문에 생략하고, 꼭 봐야 할 메뉴들만 설명하겠다. Build Option 메뉴는 Busybox 컴파일 옵션이 있다. 이중에서 눈여겨 봐야 할 옵션은 “Build Busybox as a static binary(no shared libs)” 이다. 이 옵션을 선택할 경우는 라이브러리 파일이 필요없으므로 과정 중 하나가 생략된다. 나머지 메뉴들은 명령어들에 대한 옵션이므로 사용하고 싶은 명령어가 있으면 선택하여라.

컴파일 하고 Busybox 바이너리 파일을 설치해야한다. 설치는 전에 rootfs 파일을 마운트 했던 loop 디렉토리에 해야 한다.

# make
# make PREFIX=/loop install
# cd /loop
# ls
bin  linuxrc  lost+found  sbin  usr
# 


5. 루트 파일 시스템 구성


5.1. 라이브러리 파일 복사


첨에 필자는 uClibc를 사용할려고 했었지만, 커널 패닉이 발생하길래 해결책을 찾아보려했지만, 찾지 못하고 GLIBC의 라이브러리를 사용하였다. 용량을 줄이기 위해 busybox가 참고하는 라이브러리만 복사하였다.

# cd bin
# ldd busybox 
        linux-gate.so.1 =>  (0x00a37000)
        libm.so.6 => /lib/tls/libm.so.6 (0x00721000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x00781000)
        libc.so.6 => /lib/tls/libc.so.6 (0x005fe000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x005e5000)
# 


/lib/tls/libm.so.6, /lib/libcrypt.so.1. /lib/tls/libc.so.6, /lib/ld-linux.so.2 파일을 loop 디렉토리에 복사해야한다.

# cd..
# mkdir lib
# mkdir lib/tls
# cp /lib/tls/libm.so.6 lib/tls/
# cp /lib/tls/libc.so.6 lib/tls/
# cp /lib/libcrypt.so.1 lib/
# cp /lib/ld-linux.so.2 lib/
# 


5.2. /etc


여러 가지 설정 파일들이 존재하는 디렉토리로 꼭 만들어줘야 한다. 이 폴더 안에는 fstab, inittab, rcS 파일을 생성해줘야 한다.

/etc/fstab

proc            /proc   proc    defaults    0  


/etc/inittab

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r


/etc/init.d/rcS - 이 파일에는 실행 권한이 꼭 있어야 한다.

#! /bin/sh

/bin/mount -


/etc/mtab - 만약 Busybox 설정 옵션 중 Linux System Utilities -> Support for a real /etc/mtab(instead of /proc/mounts)를 선택했다면 링크를 걸어주어야 한다.

# ln -s /proc/mounts /loop/etc/mtab


5.3. /dev

이제 디바이스 노드를 만들어 줘야 한다. 이 디렉토리의 파일들은 메이저와 마이너 넘버로 각 장치를 구분한다. mknod 명령어로 노드를 만들 수 있지만, 손쉽게 기본적으로 필요한 노드들만 만들어주는 쉘 스크립트를 사용하였다.

mkdev.sh

#!/bin/sh
#
# makedev.sh - creates device files for a busybox boot floppy image


# we do our work in the dev/ directory
if [ -z "$1" ]; then
	echo "usage: `basename $0` path/to/dev/dir"
	exit 1
fi

cd $1


# miscellaneous one-of-a-kind stuff
mknod console c 5 1
mknod full c 1 7
mknod kmem c 1 2
mknod mem c 1 1
mknod null c 1 3
mknod port c 1 4
mknod random c 1 8
mknod urandom c 1 9
mknod zero c 1 5
ln -s /proc/kcore core

# IDE HD devs
# note: not going to bother creating all concievable partitions; you can do
# that yourself as you need 'em.
mknod hda b 3 0
mknod hdb b 3 64
mknod hdc b 22 0
mknod hdd b 22 64

# loop devs
for i in `seq 0 7`; do
	mknod loop$i b 7 $i
done

# ram devs
for i in `seq 0 9`; do
	mknod ram$i b 1 $i
done
ln -s ram1 ram

# ttys
mknod tty c 5 0
for i in `seq 0 9`; do
	mknod tty$i c 4 $i
done

# virtual console screen devs
for i in `seq 0 9`; do
	mknod vcs$i b 7 $i
done
ln -s vcs0 vcs

# virtual console screen w/ attributes devs
for i in `seq 0 9`; do
	mknod vcsa$i b 7 $i
done
ln -s vcsa0 vcsa



# mkdir dev
# mkdev.sh /loop/dev
# ls dev/
console  hdd    loop4  port  ram4  random  tty4  urandom  vcs4  vcsa   vcsa5
core     kmem   loop5  ram   ram5  tty     tty5  vcs      vcs5  vcsa0  vcsa6
full     loop0  loop6  ram0  ram6  tty0    tty6  vcs0     vcs6  vcsa1  vcsa7
hda      loop1  loop7  ram1  ram7  tty1    tty7  vcs1     vcs7  vcsa2  vcsa8
hdb      loop2  mem    ram2  ram8  tty2    tty8  vcs2     vcs8  vcsa3  vcsa9
hdc      loop3  null   ram3  ram9  tty3    tty9  vcs3     vcs9  vcsa4  zero
# 


5.4. /proc


가상 파일 시스템이 존재하는 디렉토리이다. 이 디렉토리의 파일들은 커널이 생성해주므로 디렉토리만 생성해준다.

# mkdir proc


5.5. 루트 파일 시스템 구성 마무리


이제 기본적인 루트 파일 시스템이 만들어 졌다. tmp/ 디렉토리같이 임시로 쓸 공간도 필요하다면 만들어도 무방하다. 다 구성하였으면 루트 파일 시스템 이미지를 언마운트 하고 압축해야 한다.

# umount loop
# gzip -9 rootfs


압축하면 rootfs.gz 파일이 생성되는데 이 파일의 용량은 약 1MB 정도이다. 8MB인 USB 저장장치에 들어가기엔 너무 작은 용량이다. 필요하다면 추가적인 프로그램을 설치 할 수도 있을 것이다.

6. USB 저장 장치 포맷하기


이제 USB 저장 장치의 모든 내용을 지워주어야 한다. 이 과정에는 mtools 패키지가 필요로 한다. 준비 했던 USB 저장 장치를 장착하고 mformat 명령어를 이용하여 포맷한다. mformat 명령어는 드라이브 이름을 요구하므로 /etc/mtools.conf 파일에 USB 저장장치 노드를 추가해주어야 한다. 보통 리눅스 시스템에서 USB 저장장치의 노드는 /dev/sda1 이다. VMware는 일반 리눅스 시스템과 다르다.

/etc/mtools.conf

# Example mtools.conf files.  Uncomment the lines which correspond to
# your architecture and comment out the "SAMPLE FILE" line below

# Linux floppy drives
drive a: file="/dev/fd0" exclusive mformat_only
drive b: file="/dev/fd1" exclusive mformat_only
drive e: file="/dev/sda1" exclusive mformat_only                   <-- 추가

........


# mformat e:
#


7. 커널 이미지 생성


이제 커널이미지를 생성해야한다. 이미 커널이미지가 생성이 되었다면 이 과정은 생략해도 무관하다. 글쓴이는 커널버젼 2.6.7로 생성하였다.

# cd /usr/src/linux-2.6.7
# make menuconfig
# make bzImage


8. USB 저장장치 구성


이제 USB 저장 장치로 부팅을 할 수 있도록 syslinux 명령어로 부팅가능하도록 만들어준다. 그리고 syslinux.cfg 파일과 부팅 될 때 표시할 display.txt 파일도 생성해 주어야 한다. rootfs.gz 와 bzImage파일도 복사해야한다. 커널이미지인 bzImage는 linux 라는 파일명으로 변경하여 복사해야한다.

syslinux.cfg

display display.txt
default linux
timeout 10
label linux
        kernel linux
        append initrd=rootfs.gz root=/dev/ram0 rw


display.txt - 이 파일은 아무 내용이나 들어있어도 상관없다.

   
    Linux based on USB-storage!!!!



# syslinux /dev/sda1
# mcopy syslinux.cfg e:
# mcopy display.txt e:
# mcopy rootfs.gz e:
# mcopy /usr/src/linux-2.6.7/arch/i386/boot/bzImage e:linux


9. 테스트


테스트 환경은 USB 부팅이 가능한 메인보드가 있어야 한다. 첫 번째 부팅 순서를 USB-ZIP으로 설정하면 될 것이다.

10. 마치며


USB 저장 장치로 리눅스를 만들어보았다. USB 저장장치로 리눅스를 운영하기에는 큰 제약이 많이 있었다. 부팅이 되지 않는 USB 저장 장치도 있고, USB 부팅이 지원되지 않는 메인보드도 많았기 때문이다. 하지만 최신 메인보드는 대부분 USB 부팅을 지원하고, USB 저장 장치의 용량도 커지고 있기 때문에 알아 두면 좋을 내용인거 같다.

위에서 만든 리눅스는 아주 쓸모없다. 하지만 gcc나 make 같은 설치 도구들을 추가하고, 필요한 패키지를 설치하면 더 좋은 시스템을 구축할 수 있을 것이다.


ID
Password
Join
Standing on head makes smile of frown, but rest of face also upside down.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2004-12-04 20:13:52
Processing time 0.0104 sec