1. 파일시스템 개요
1) 임베디드 리눅스 파일시스템의 사용 목적과 기능에 대해
파일 시스템이란 운영체제가 물리적 저장 장치 파티션 속 정보를 저장, 관리하기위한 방법 또는 체계를 뜻한다. 임베디드 시스템은 일반적인 리눅스와는 다르게 하드디스크(시스템 운영을 위한 실행 파일은 플래시, ROM과 일정 영역 RAM에서 실행)나 별도 모니터가 필요 없고 특정 목적(임베디드 시스템과의 호환이 가능한 파일시스템, 보안, 성능 등)을 위해 사용된다.
임베디드 시스템의 파일시스템의 주요 특징으로는 제한된 자원을 사용하여 효율성을 추구하고, 열약한 환경에서도 안정적으로 가동이 가능하다. 또한 열약한 환경에서 만약 전원을 차단하거나 문제가 발생 시 자동으로 복구를 진행하거나 데이터 손실 없이 재가동이 된다. 그리고 파일시스템을 이용하기 때문에 불필요한 파일을 제거한다. 주의할 점으로는 플래시 등에서 부팅하기 때문에 파일 시스템 설치에 유의해야 한다.
기본 파일 시스템 ‘ext2’를 사용하며, ‘ext3’부터 저널링 파일시스템이 적용되었다. 저널링 파일시스템의 경우 일정 부분을 기록하여 백업 및 복구 능력이 뛰어나기 때문에 비정상 종료로 인해 실행되는 파일 시스템 복구 시간이 단축된다. 그 외 기본적인 특징은 밑과 같다.
- 가상 파일 시스템을 사용해서 다른 종류의 다양한 파일 시스템 지원
- 파일 시스템 생성 및 관리 도구 사용방법 숙지 필요
- 임베디드 시스템의 경우 램이나 플래시메모리로 파일 시스템 생성 및 관리
- 파일 시스템에 대한 기본적인 정보는 범용 컴퓨터와 동일하게 적용
파일 시스템의 이러한 특징 덕분에 HDD와 메인 메모리 속도 차가 줄어들고 파일 관리가 용이하며, 디스크의 용량을 효울적으로 사용할 수 있다.
2) 파일시스템의 디렉터리 구조에 대해
디스크는 파일시스템으로 사용될 수 있다. 사용에 따라 하나의 디스크에 여러 개의 파일시스템을 사용하거나 파일시스템으로 일부분을 사용하고 나머지 부분은 스왑 공간이나 포맷되지 않은 디스크 공간으로 사용한다. 이러한 공간을 파티션(partition), 슬라이스(slice) 등 다양하게 부르기도 한다.
파일시스템은 이러한 부분에 각각 생성될 수 있으며, 각 부분은 볼륨(volume)이라 불리는 좀 더 큰 구조를 형성하기 위해 합쳐질 수 있으며 여기에도 파일시스템이 생성될 수 있다.
각 볼륨은 논리적인 가상 디스크(virtual disk)로 취급될 수 있으며 볼륨은 한 개 이상의 시스템이 부팅되고 실행될 수 있도록 여러 개의 운영체제를 저장할 수 있다.
기본적인 리눅스 파일시스템의 디렉터리 구조는 트리 구조이다. 이 기본구조를 제외하고 사용자의 설정에 따라 변형 가능하다. 트리 구조와 함께 5가지가 존재한다.
간단하게 트리구조들을 살펴보자.
① 1단계 디렉터리
- 가장 간단한 구조, 모든 파일이 하나의 디렉터리 내에 위치해 관리되는 구조
- 모든 파일 이름이 달라야 하고 파일 증가 시 관리가 어려움
② 2단계 디렉터리
- Loot는 마스터 파일 디렉터리(MFD), 아래로 사용자 파일 디렉터리(UFD), 그 아래로 파일이 있다.
③ 트리 구조 디렉터리
- 하나의 루트 디렉터리와 여러 개의 서브 디렉터리로 구성
- 각 디렉터리에는 파일과 서브 디렉터리가 존재하며 디렉터리 생성/제거가 비교적 용이하다.
- 디렉터리 탐색은 포인터를 이용하고, 경로는 절대 경로와 상대 경로가 있다.
④ 비순환 그래프 디렉터리
- 트리 구조 디렉터리를 확장한 형태
- 디렉터리 간 파일, 서브 디렉터리 공유가 가능하다.
(복사 개념이 아니라 한 디렉터리에서 파일 수정 시 다른 디렉터리의 공유한 파일도 수정되는 형식)
- 디렉터리 구조가 복잡, 공유된 파일이 다중 탐색되어 시스템 성능이 저하될 수 있다.
또한, 파일 제거 시 고아 포인터가 발생한다.
⑤ 일반 그래프 디렉터리
- 트리 구조에 링크를 더해 순환을 허용하는 구조
- 디렉터리와 파일 공유에 융통성이 있고, 탐색 알고리즘이 간단해 파일과 디렉터리에 대한 접근이 쉽다.
- 마지막 참조가 끝났음에도 메모리를 재할당할 수 있는지 결정하는 쓰레기 수집(Garbage Collection)이 필요하다.
(전체 파일시스템을 탐색해 접근할 수 있는 파일에 표시, 두 번째 탐색에서는 표시하지 않은 메모리를 사용 가능 메모리 리스트에 추가)
밑은 디렉터리를 구성하는 디렉터리의 설명이다.
파일 이름 | 파일 설명 |
/ | 최상위 디렉터리, 모든 디렉터리의 시작 |
/bin | 일반 사용자들도 사용할 수 있는 리눅스 기본 명령어 mv, cp, rm, rmdir, df, sync 등이 저장됨 |
/boot | 운영체제의 커널과 시스템 부팅에 필요한 파일이 들어 있음, GRUB와 같은 부트로더 파일 등, 커널 컴파일을 위해 100M 이상 권장. |
/dev | 시스템 장치 파일을 저장하고 있음, 하드디스크 디바이스 파일 /dev/sda, CD-ROM 디바이스 파일 /dev/cdrom |
/etc | 패스워드 파일등 시스템 전체의 환경설정 파일이 들어있음 |
/home | 사용자의 홈 디렉터리가 위치하여 사용자의 데이터를 저장, useradd 명령으로 사용자를 생성하면 대부분 사용자의 ID와 동일한 이름의 디렉터리가 자동으로 생성됨. |
/media | DVD, CD-ROM, USB등과 탈부착이 가능한 장치들의 마운트포인로 사용되는 디렉터리 |
/mnt | media 디렉터리와 비슷한 용도로 탈부착이 가능한 장치들에 대하여 일시적인 마운트포인트로 사용하는 디렉터리 |
/proc | 실행중인 프로세스 및 현재 시스템 정보를 파일로 저장, 일명 "가상파일시스템" 이라고 하는 곳으로 현재 메모리에 존재하는 모든 작업들이 파일형태로 존재하는 곳 |
/root | 관리자(root) 유저의 홈 디렉터리로 보안상 따로 분류되어 있음 |
/sbin | 시스템 관리자용 명령어 저장, ifconfig, e2fsck, ethtool, halt, shutdown 등 /bin에 존재하지 않는 부가적인 명령어 + 네트워크 관련 명령어 |
/tmp | 임시로 파일이 저장되는 공간, 시스템을 사용하는 모든 사용자들이 공동으로 사용하는 공용 디렉터리, mysql.sock 등과 같은 소켓파일, 아파치에서 사용하는 세션파일등이 생성되기도 한다. |
/usr | 일반사용자들이 주로 사용하는 디렉터리 각종 응용프로그램이 설치되는 공간 |
/var | 시스템 운용중에 생성 되었다가 삭제되는 데이터를 일시적으로 저장하는 디렉터리. |
2. 파일시스템 빌드 준비
1) 파일시스템 빌드 과정
임베디드 리눅스 시스템의 파일시스템의 경우 ext4 파일시스템을 사용한다. 우선 파일시스템의 소스를 압축 해제하고 1번에서 설명했던 트리 구조의 디렉터리와 디렉터리 명을 확인하고 ‘mkfs.sh’를 이용하여 파일시스템 이미지를 생성한다(실행 전 권한 설정이 없는 경우 권한을 주도록 진행해야 함).
이전 툴체인, 부트로더, 커널과는 다르게 파일시스템 빌드 자체는 간단하게 진행된다.
2) 커널 configuration - ext4 선택 확인
‘df –T’ 명령어로 ext4를 확인할 수 있다.
3) 파일시스템 설치 파일 저장 및 압축 해제
우선 ‘Filesystem’ 디렉터리의 ‘rootfs_H4412.tgz’ 파일을 압축 해제한다.
밑은 압축 해제 과정 사진이다.
압축 해제 후, ‘rootfs_H4412’ 디렉터리에서 1번에서 살펴봤던 디렉터리 구조를 확인할 수 있다.
3. 파일시스템 이미지 빌드
1) 파일시스템 빌드 과정에 따라 빌드, 'rootfs_ext4.img' 생성
위의 2.3번에 이어서 다시 상위 디렉터리로 돌아와 ‘mkfs.sh’ 파일의 권한을 모든 사용자에게 준 후(chmod 777), 확인하고 ‘./mkfs.sh’ 명령을 통해 이미지를 생성한다.
결과로 ‘rootfs_ext4.img’ 파일이 생성된 것을 확인할 수 있다.