1. File System 개요
리눅스에서 파일의 개념은 파일을 바이트의 단순한 연속으로 간주한다.
리눅스는 모든 입출력 디바이스들을 파일로 취급하여 심지어 NIC, Disk, Keyborad, printer 도 파일로 취급한다.
파일시스템은 모든 입출력을 제어하는 Device Driver와 연결되어 있고 시스템 호출을 통하여 사용자로부터
데이터를 받아 처리한다.
리눅스는 VFS(Virtual File System)을 통하여 ext2, jffs2, proc와 같은 다양한 파일시스템을 지원하고 있다.
임베디드 리눅스에서는 RAM disk, JFFS, JFFS2, cramfs, ramfs등과 같은 임베디드 파일시스템이 있다.
2. File System이란?
파일시스템은 파일에 이름을 붙이고, 저장 혹은 탐색을 위해 파일을 어디에 위치시킬 것인지를 나타내는 체계이다.
예를 들어 도서관에서 소장 도서의 목록을 작성하듯이 OS도 저장된 파일의 이름과 일련번호의 목록을 만드는데,
이와같이 목록을 유지,관리하는 방법을 파일시스템이라 부른다.
리눅스 커널만 존재하는 임베디드 시스템이 가능할까? 가능은 하겠지만 할 수 있는 기능은 거의 없다.
왜냐하면 커널과 인터페이스할 수 있는 쉘(shell) 과 같은 시스템 프로그램이 있어야 한다.
이를 위해서 쉘과 같은 프로그램을 포함하는 파일시스템을 커널 부팅의 마지막 과정에서 마운트하여
시스템 소프트웨어를 사용할 수 있도록 해야 한다.
임베디드 시스템에서는 Flash memory 와 RAM을 Block device로 만들어 하드디스크처럼 사용한다.
3. Root File System
Root File system은 '/' 디렉토리에 마운트되는 파일시스템을 의미하며 커널은 루트 파일 시스템을 어디서 찾아야
하는지를 알고 있어야 한다. 루트 파일시스템을 찾지 못하면 시스템을 동작할 수 없기 때문이다.
루트 파일시스템은 커널이 동작하기 위한 공간, 라이브러리, 유틸리티를 포함하고 이러한 루트 파일시스템으로
램디스크, JFFS2, NFS 등을 주로 사용한다. 소규모 시스템이며 빠른 접근이 필요하면 램디스크를 사용하는 것이 좋다.
루트 파일시스템은 일반적으로 읽기 전용으로 마운트 되었다가 커널이 정상적으로 메모리에 탑재된 후 read/write
옵션을 변경한다.
리눅스 커널은 init 프로세스부터 시작한다.
3.1 init 프로세스
캐시와 하드웨어를 초기화 한 후 커널은 프로세스 ID=1인 init 프로세스를 실행한다. init 는 다른 모든 프로세스를 부화시킨다.
커널이 init 프로세스를 동작시키려면 루트 파일시스템에 있는 파일과 라이브러리가 필요하다.
루트 파일시스템에서 최초로 필요한 실행파일은 /sbin/init인데
libc.so.6
/lib/ld-linux.so.2
를 필요한다.
init 프로세스는 /etc/inittab이라는 설정파일을 참조한다.
임베디드 플랫폼은 로그인 과정이 필요없기 때문에 시스템을 부팅한뒤 인증없이 bash를 실행하도록 설정한다.
bash가 필요한 라이브러리는 위와 같다.
3.2 루트 파일시스템 생성
커널이 램디스크를 지원하도록 설정해야 함.
램디스크에 포함될 내용을 작성하고, 램디스크를 루트 파일시스템으로 마운트시킨다.
- 램디스크를 통한 루트 파일시스템 생성하기
- 최종 램디스크와 동일한 크기의 ramrootfs라는 한개의 파일을 생성한다.
- ramrootfs을 0(zero)로 모두 채운다.
- ramrootfs 파일에 원하는 파일시스템을 생성한다.
- 루프백 디바이스를 통하여 ramrootfs를 마운트한다.
- 루트 파일시스템에 포함될 내용을 마운트된 파일시스템 ramrootfs로 복사한다.
- 파일시스템 ramrootfs를 마운트 해제한다.
4. loop device
루프백 디바이스는 초기 램디스크와 같은 파일시스템 이미지를 만들 때 사용된다.
루프백 디바이스는 파일을 블록 디바이스처럼 사용하는 기능으로 파일 속에 파일시스템을 만들어 마운트할 수 있다.
루프백 디바이스에 파일시스템을 생성하면 Hard disk , CD-ROM과 같은 블럭 디바이스와 동일한 방식으로 파일시스템을
마운트할 수 있다.
다음은 10MB 크기의 루프백 디바이스 파일시스템을 생성하는 과정이다.
5. RAM disk
램디스크란 메모리의 일부분을 하드디스크처럼 메모리에 파일을 저장하는 것이다.
램디스크를 루트 파일시스템으로 사용하는 것이 임베디으 리눅스 시스템에서 사용하는 일반적인 방법중의 하나이다.
왜 램디스크를 사용할까?
램디스크는 RAM에서 동작하기 때문에 read/write가 아주 빠르지만 시스템을 다시 부팅하거나 전원이 꺼지면 내용을 잃어버린다.
어떤 파일을 계속하여 고정적으로 사용하는 경우는 메모리상에 직접 적재한 후 사용하는 편이 다른 방법보다 빠르다.
5.1 램디스크의 생성
dd if=/dev/zero of=ramdisk_img bs=1k count=8192
...
5.2 램디스크의 수정
- ramdisk_img.gz의 압축을 해제한다.
- 루프백 디바이스로 tmp dir에 mount 한다.
- 마운트된 tmp dir로 이동한 후 디렉토리의 내요을 확인한다. 다음 단계로 넘어가기전에 램디스크를 갱신한다.
- 설정한 램디스크의 용량을 초과하지 않도록 주의할 것
- tmp dir를 umount한다.
- ramdisk_img를 gzip 명령어로 압축한다.
6. JFFS2 파일시스템과 MTD
6.1 JFFS2 파일시스템
JFFS는 비휘발성 특성이 있으므로 데이터를 안정적으로 보호한다. JFF2는 JFFS를 기반으로 RedHat에서 개발한 것으로
MTD 드라이버에 의해 플래시에 구현될 수 있는 파일시스템으로 JFFS의 가비지 컬렉션 문제를 극복한 임베디드 시스템을
위한 저널링 파일시스템이다.
6.2 MTD (Memory Technology Device)
플래시 메모리를 포장하는 추상계층을 위한 하위시스템이다.
MTD의 목적은 하드웨어 드라이버와 시스템 상위 단계사이에 표준 인터페이스 계층을 둠으로써 새로운 하드웨어를 위한 장치
작성을 편리하게 하며, 상위 단계의 응용 프로그램 수정 작업을 최소화하는데 있다.