
iPhone OS X Architecture: the BSD Unix Userland
Sunday, July 15, 2007
아이폰 아키텍쳐 시리즈, 이번에는 아이폰 코어 OS의 저변에 깔려 있는 유닉스를 알아본다.
The iPhone's Unix Userland.
아이폰의 커널 위에는 맥오에스텐의 BSD 유닉스 환경이 놓여 있다. 물론 ARM 프로세서용으로 포팅이 되어있고, 불필요한 유틸리티와 서비스는 빠져 있다.
커널 바깥쪽에서 돌아가는 프로세스는, 유닉스에서 유저랜드(userland)에서 돌아간다고 말한다. 맥에서 BSD 유닉스 유저랜드는 보통 데스크톱 사용자가 볼 수 없다.
친숙한 맥용 애플리케이션과 유틸리티는 별도의 환경에서 돌아가며, 이는 리눅스나 솔라리스와 같은 전형적인 데스크톱 유닉스와는 사못 다르다. 물론 기술적으로야 유저랜드에 속한다. 필자는 아이폰의 오에스텐과 맥-레이어를 별도로 알아보겠다.
맥오에스텐 파인더에서 이런 유닉스 디렉토리는 안 보인다. 그러나 커맨드라인에서는 보이며, 맥오에스텐의 후면을 알아보기에 매우 중요한 곳이다.
The Mac OS X Startup Overview.
인텔맥의 맥오에스텐이 부팅할 때는, 우선, 맥 펌웨어에 내장된 EFI 부트로더가 디스크로부터 커널을 읽어들여 RAM으로 불러들인다. 그 후, 커널은 kext를 읽고 유닉스 유저랜드를 설정한다. 평상시 부팅 과정에는 다중 사용자 환경도 여기에 포함되며, 로그인 창을 띄우게 된다. 특정 사용자가 로그인하면 맥 데스크톱 환경이 설정된다. 이 설정은 디렉토리 안에 저장된 사용자 설정에 따른다.

아이폰 또한 커널과 유저랜드, 맥 환경 순으로 부팅된다. 전 글은 아이폰이 디스크이미지 상의 오에스텐을 RAM으로 불러들임을 밝혔고, 보안 환경에서 애플리케이션을 어떻게 읽는지 설명하였다.
아이폰도 맥처럼 다중 사용자 환경이지만, 로그인 창은 뜨지 않는다. 자동 로그인을 설정한 맥과 비슷하게, 아이폰은 설정된 사용자로 로그인하며, 사용 가능한 인터페이스를 부팅시킨다.
[
BIOS PC를 뛰어넘은 애플 펌웨어]
Single User Mode.
맥은 싱글유저모드로 평상시의 부팅에 개입할 수 있다. 이 모드가 발생하면, 맥오에스텐은 사용자 계정에 따르는 다중 사용자 환경을 설정하지 않는다.
그 대신, 간단한 커맨드라인 환경으로 부팅하여, 루트 접근을 할 수 있게 된다. 파일 시스템 점검이나 디스크 복구에 유용하다.
The Three Unix Domains.
유닉스에는 세 개의 도메인이 있다. 아이폰의 오에스텐 역시 이러한 도메인 구분을 따른다.
- 머신 레벨 소프트웨어: 모든 사용자용으로 설치
- 시스템 레벨 소프트웨어: 시스템의 중요 기능 관련
- 사용자 레벨 소프트웨어: 특정 사용자만으로 설치
이 세 가지 도메인이 각 퍼미션과 권한에 따라 소프트웨어를 설치한다.
The Unix Directories.
맥에서도 보이는 다섯 가지의 루트-레벨 디렉토리가 아이폰에도 있다. 다시 말하건데, 보통 맥에서 이 디렉토리를 볼 수 없으며, 맥 운영에 매우 중요한 곳이다. 본 글은 데스크톱 유닉스나 맥과 아이폰 환경이 얼마나 다른지, 이들이 무엇이지를 간추려본다.
/bin
표준형 유닉스 배포폰과 맥에서 /bin은 머신 레벨 유닉스 애플리케이션(바이너리)이 있는 곳이다. 터미널셸인 bash나 파일복사인 cp, 파일 삭제인 rm 등, 싱글유저모드에서 필요한 모든 것이 들어있다.
그런데 아이폰의 /bin에는 launchd 명령을 내리는 launchctl만 들어있다. 즉, 데스크톱처럼 아이폰을 싱글유저모드로 부팅시킬 수 없다는 얘기다. 콘솔 셸도 없으며, 아이폰을 다르게 부팅시킬 방법도 없다.
/sbin
표준형 유닉스 배포폰과 맥에서 /sbin은 시스템 레벨 유닉스 애플리케이션(시스템 바이너리)이 있는 곳이다. 디스크 확인용인 fsck와 네트워크 파이어월인 ipfw, 라우팅인 route, 디스크 파일시스템은 mount, 그리고 맥오에스텐 상의 launchd (프로세서 론쳐)가 들어 있다. 이 또한 싱글유저모드에서 필요한 것들이다.
그런데 아이폰의 /sbin에는 HFS 포맷 드라이브를 읽고 수정하는 툴만 들어있다. HFS 포맷 드라이브는 Flash RAM 상의 디스크 이미지로 존재한다.
- fsck, fsck_hfs (file system check)
- fstyp, fstyp_hfs (file system identifier)
- mount, mount_hfs (file system mounter)
커널 익스텐션을 읽고, 그 외 다른 프로세스를 읽거나 돌리는 것도 있다.
Launchd: the Launch Daemon.
Launchd는 여러 가지 유닉스 프로세스를 교체하기 위해 애플이 만들어낸 메커니즘이다. 그 대상은 다음과 같다.
- 실행시, 혹은 사용자 로그인 시에 프로세스 시작
- 일정에 따른 프로세스 시작
- 경로 지정의 파일 변화에 따른 프로세스 시작
- 리퀘스트의 요구에 따른 프로세스 시작
- 로깅 레벨과 론치 아규먼트(argument)의 지정
- 론치 환경 변수의 지정과 작업 디렉토리 프로세스
- 리소스 제한과 권한 지정
launchd가 처음 소개된 것은 맥오에스텐 타이거이지만, crin이나 init, rc, scripts, inet, xinet, at, watchdog과 같은 기존 유닉스 프로세스도 계속 남아 있다. 그런데 레퍼드에서는 launchd만 남을 예정이다. 애플의 최신 레퍼드 OS 기술에 기반한 아이폰도 launchd만 사용한다.
애플은 또한 다른 유닉스 배포폰들이 쓰게 하기 위해, launchd를 공개하였다. 물론 리눅스 사용자들은 계속 원래 방식을 쓰는 것으로 보인다.
[
launchd in Depth - AFP548]
[
Leopard Wishlist: Launch Control]
/etc
표준형 유닉스 배포폰에서 /etc는 구성(config) 파일 저장 용도이다. 맥에서 /etc는 제일 유닉스와 관련된 곳으로서, hostconfig나 httpd(웹서버 구성 파일), 곧 사라지게 될 crontab(타이머 론치 시스템으로서, launchd로 교체된다) 등, 핵심 OS 구성파일을 저장시킨다.
맥과 관련된 구성 파일은 프리퍼런스(preferences)라 불리우며, User/System/Machine의 Preferences 폴더에 저장된다.
아이폰에서 이 디렉토리는 다음의 시스템 구성 설정파일을 저장한다.
- bluetool (BlueTooth settings)
- racoon (VPN key management settings)
- fstab (listings of file system info)
- master.passwd, passwd (password records)
- ttys (terminal settings)
- ppp (serial VPN tunneling)
- services (ports and the services that use them)
- group
- hosts
- networks
/var/log
표준형 유닉스 배포폰과 맥, 그리고 아이폰에서 /var/log는 변수를 저장하는 곳이다. 주로 log와 temp 파일을 저장한다. 그런데 아이폰에는 맥의 /var/db/netinfo가 없다.
로컬 사용자 계정과 디렉토리 정보를 관리하기 위한 데이터베이스로, 레퍼드는 더 이상 NetInfo를 사용하지 않는다. 그 대신 애플이 아직 공개하지 않은 새로운 디렉토리 시스템을 사용한다.
레퍼드의 화려한 새 디렉토리 시스템이 아이폰에는 필요가 없으므로, 아이폰의 모든 계정(루트와 사용자)은 간단한 BSD 플랫파일 레코드에 저장된다.
애플은 이들 암호를 지키기 위해 별 노력을 기울이지 않았다. 아이폰의 사용자 계정을 안다 하더라도, 커널 접속이나 새 소프트웨어 설치와 관계가 없기 때문이다.
/usr
표준형 BSD 유닉스에서 /usr는 사용자가 설치한 소프트웨어와 파일이 가는 곳이다. 맥오에스텐에서의 /usr는 X11 설치할 때처럼, 사용자-레벨의 유닉스 소프트웨어가 들어간다. 단, 맥 환경과 관련된 사용자 파일은 /Users/danieleran에 설치된다. 이 경로는 ~로 주어진다. 따라서, ~/Desktop은 /Users/danieleran/Desktop과 같다.
비록 다중 사용자 운영체제를 사용하기는 하지만, 아이폰의 사용자는 단 한 명이다. 그래서 맥과는 달리 별도의 /Users 폴더가 필요 없다. 따라서 모든 사용자 소프트웨어가 /usr에 설치된다. 보통은 ~/Library에 들어가는 콘텐트, 그리고 보통 유닉스관련된 소프트웨어가 /usr 디렉토리로 간다.
[
System File and Directory List - The iPhone Dev Wiki]
The Mac in the iPhone.
코어 OS의 유닉스 기반 위에는, 맥과 대단히 유사한 환경을 갖는다. 오에스텐이 맥오에스텐에서 나왔으니 당연하달 수 있겠다. 다음 기사에서 알아본다.
Like reading RoughlyDrafted? Share articles with your friends, link from your blog, and subscribe to my podcast!
Did I miss any details?
iPhone OS X Architecture: the BSD Unix Userland