파일시스템



커널은 빌드 시스템이 생성한 램 디스크 이미지를 루트 파일시스템으로 마운트하고 이미지에 포함된 init 프로세스를 실행한다. init 프로세스의 설정 파일은 추가적인 이미지들과 가상 파일시스템을 가상 파일시스템의 디렉터리에 마운트한다. 


/proc, /sys, /acct는 각각 procfs, sysfs, cgroupfs, 파일 시스템을 사용하여 마운트된다. /proc와 /sys는 기존의 리눅스 기반 시스템과 같은 위치에 마운트되는 반면, cgroups는 리눅스에서는 /cgroup으로 안드로이드에서는 /acct로 마운트 된다.


또한 /dev 는 tmpfs로 마운트됨을 알아두자, tmpfs를 사용하면 디렉터리의 내용이 영구 저장소에 기록되지 않고 그때그떄 만들어지고 지워진다. 안드로이드는 리눅스의 udev메커니즘에 따라 /dev 안의 노드를 동적으로 생성한다. 즉, 주변기기가 연결되거나 장치 드라이버가 로드되고 초기화되면 /dev 안에 해당 기기를 가리키는 노드가 생성된다.


procfs, sysfs, cgroup은 모두 가상 파일시스템으로 시스템에서 동작 중인 커널에서 관리한다. 실제 저장소가 아닌 커널 안에서 관리되는 자료구조인 것이다. procfs는 커널이 내부정보를 사용자 공간으로 내보낼 때 사용된던 방식이다. 보통 procfs 안의 항목들은 텍스트 파일 또는 텍스트 파일을 포함한 디렉터리로 해당 정보를 커널로부터 명령행으로 덤프할 수 있다. 예를 들어 시스템의 CPU 종류를 알고 싶으면 /proc/cpuinfo 파일의 내용을 덤프하면 된다.


sysfs의 항목들은 주변장치의 상세 정보를 얻거나 사용자 공간에서 특정 드라이버의 동작을 제어하는 비트를 조작할 때 사용 할 수 있다. 예를 들어 안드로이드 전원 관리 기능 상당수는 /sys/power/ 안의 항목들로 제어할 수 있다.


tmpfs는 임시 파일 저장에 사용되는 가상 파일시스템을 램에 생성한다. 램에 전원이 공급되는 한 커널을 통해 이 파일들을 읽고 쓸 수 있다.


cgroupfs는 특정 프로세스들과 자식 프로세스들을 그룹으로 묶고, 그룹 단위로 시스템 자원과 우선순위를 할당한다.



루트 디렉터리

리눅스 루트 파일시스템의 전형적인 구조는 파일시스템 계층구조 표준(FHS)으로 정의되어 있다. 그런데 안드로이드는

FHS를 따르지 않고 /system과 /data 디렉터리에 핵심 기능 대부분을 담아 두었다.


안드로이드 루트 디렉터리는 AOSP 빌드 시스템이 생성한 ramdisk.img를 마운트한 것이다. 보통은 ramdisk.img는 커널과 함께 기기의 주 저장 장치에 저장되며 시스템 시작 시 부트로더가 읽어들인다. 




/system

/system 에는 AOSP 빌드 시스템이 생성한 읽기 전용 컴포넌트들이 담겨 있다. [그림 6-2]에는 안드로이드 구조에 더해 각 모듈이 파일시스템의 어느 위치에 있는지까지 표시되어 있다.


system.img를 마운트한 /system 디렉터리에 안드로이드 컴포넌트 대부분이 들어있다.


일반적으로 /system은 읽기 전용으로 마운트되는데, 그 이유는 안드로이드 운영체제 전체를 새 버전으로 갱신할 때가 아니면 변경할 일이 없기 때문이다. 따라서 OTA 업데이트 스크립트가 바이너리를 패치할 떄 이 파티션은 출시 이후 그대로이니, 아주 깨끗한 상태에서 새로운 변경 내용을을 적용하게 됨을 보장한다.




/data

/data에는 계쏙해서 변하는 데이터와 앱 모두가 저장된다. 예를 들어 구글 플레이에서 내려받은 앱의 모든 데이터는 여기에 저장된다. AOSP빌드 시스템이 생성한 userdata.img 이미지는 대체로 비어 있다. 그래서 /data 디렉터리는 거의 텅 빈 상태로 시작한다. 시스템이 사용되면서 이 디렉터리에 내용이 점차 채워지고 그 내용은 재부팅해도 꼭 보존되어야 한다. 그래서 /data는 보통 영구 저장장치에 읽기 쓰기 모드로 마운트된다.




다중 사용자 지원

4.2/젤리빈에서 추가된 가장 중요한 기능 하나는 다중 사용자 지원이다. 이 기능을 제공하기 위해 AOSP는 데이터 저장 방식을 약간 수정했다. 예로 /data/data는 기존의 기기 소유주, 즉 관리자 계정의 앱 데이터를 담는 디렉터리다. 다른 사용자들의 데이터는 /data/user/<USER_ID> 에 저장된다. 다음은 /data/user/의 내용이다.



SD카드

소비자 기기들 대부분에는 microSD카드가 있어서 언제든 사용자가 뽑아서 컴퓨터에 꽂을 수 있다.

다음은 /sdcard 디렉터리에 있을 법한 항목들이다.



실제로 추가된 sdcard 위치



빌드 시스템과 파일 시스템

빌드 시스템이 파일시스템을 생성하는 과정을 입맛에 맞게 제어하는 방법을 좀더 자세히 알아보자.


빌드 템플릿과 파일경로

다음은 각 타깃 빌드 템플릿을 사용하여 빌드한 모듈의 기본 설치 위치이다.

 


내부를 보면 빌드 시스템이 각 모듈의 LOCAL_MODULE_PATH를 생성한다. 이 경로는 컴파일된 결과물이 설치되는 위치로 어떤 빌드 템플릿을 사용 하느냐에 따라 달라진다.

기본 설정을 변경하려면 Andoird.mk 파일을 열어 LOCAL_MODULE_PATH를 수정한다.

예를 들어 어떤 도구는 /system/bin 대신에 /sbin에 설치 해야만 한다. 이렇게 하려면 Android.mk는 다음과 비슷해질 것이다.



/sbin이 아니라 $(TARGET_ROOT_OUT_SBIN)로 설정한다는 점을 유의하자.

TARGET_ROOT_OUT_* 매크로는 다른 기본 매크로들과 함께 build/core/envsetup.mk에 정의되어 있다.



명시적으로 파일 복사하기

빌드 시스템이 필요 없는 파일도 있다. 빌드 시스템이 생성하는 파일 시스템 컴포넌트에 파일을 복사하기만 하면 된다. 이를 위해서는 .mk 파일들에 PRODUCT_COPY_FILES 매크로를 사용한다. 






+ Recent posts