Lucas2 프로젝트에서 사용하는 Chrome OS 의 모든 것에 대해 다룬다.
Chrome OS 를 크로미엄(chromium) OS 라고도 부른다.
Chrome OS 는 소스코드가 공개되어 있는 오픈소스로 누구나 다운로드 받아 빌드 후 사용이 가능하다.
준비운동하기
작업환경은 vmware 을 사용하였고, 이 외의 것은 아래와 같다.
Host OS | Debian 7 |
Guest OS | Ubuntu 12.04 - Precise |
H/W | x64 |
Chromium OS 를 컴파일하기 전에 사전에 환경을 만들어야 한다. 참고로 여기서 설명하는 내용의 모든 것은 http://www.chromium.org/chromium-os/developer-guide 사이트를 기반으로 한 것이다.
본격적인 작업에 앞서 유의할 점들이 몇가지 있다.
- 반드시 root 가 아닌 일반 계정으로 로그인하여 작업해야 한다. 구글이 제공하는 개발환경 자체가 일반 계정을 가정하고 만든 것이기 때문에 일반 계정이 필요하다. 만일 작업 중 root 권한이 필요하다면, sudo 명령어를 사용한다. 여기서는 wjkim 이라는 사용자 계정을 기준으로 한다.
- 집 또는 방화벽이 없는 네트워크에 연결한다. 필자의 경우, 처음 회사에서 소스코드를 다운로드 받았는데, 이후 빌드하는 과정에서 수무한 에러와 직면해야 했다. 나중에 알게된 사실이지만, 사내망에서는 일부 도메인 네임을 제외하고는 모든 도메인을 차단한 상태이기 때문이다. 실제 소스코드를 다운로드 받는 과정에서 여러 프로그램들의 소스코드를 각각의 사이트에 접속하여 받게 된다. 여기서 문제가 된 것이다. 따라서 사내망이 아닌 외부망에서 작업하길 권한다.
이제 본격적으로 작업을 시작한다.
먼저 필요한 프로그램들을 설치해야 한다.
$su - wjkim $cd /home/wjkim $sudo apt-get install git-core gitk git-gui subversion curl
Install depot_tools
$git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git $export PATH="$PATH":`pwd`/depot_tools $git config --global user.email "you@example.com" $git config --global user.name "Your Name" $uname -m x86_64
소스코드 받기
$mkdir -p ${HOME}/chromiumos $cd ${HOME}/chromiumos $repo init -u https://chromium.googlesource.com/chromiumos/manifest.git --repo-url https://chromium.googlesource.com/external/repo.git $repo sync
빌드하기
$./chromite/bin/cros_sdk (cr) ((d044d58...)) wjkim@wjkim-virtual-machine ~/trunk/src/scripts $
빌드 전에 타겟 아키텍처를 어떤 것으로 할지 선택해야 한다. 현재 지원하는 아키텍처는 아래와 같다.
- x86-generic - builds a generic image suitable for computers with a x86-compatible CPU (32 bit)
- amd64-generic - builds a generic image suitable for computers with a x86_64-compatible CPU (64 bit)
- arm-generic - builds a generic image suitable for computers with an ARM CPU (32 bit)
여기서는 'amd64-generic' 로 빌드한다.
$export BOARD=amd64-generic $./setup_board --board=${BOARD}
비밀번호 설정하기
chronos 계정에 대한 암호를 설정해야 한다. 빌드 이후, chrome OS 이미지로 부팅할 때, 로그인 가능한 계정은 chronos 로서 암호를 지정해주어야 로그인이 가능하다.
$./set_shared_user_password.sh
패키지 빌드
$./build_packages --board=${BOARD}
이미지 생성
$./build_image --board=${BOARD} --noenable_rootfs_verification dev
에러메세지를 발견하지 못했다면, 성공적으로 빌드가 된 것이다. 빌드 이미지를 동작시켜야 하는데, 우리는 vmware 를 사용하여 확인할 것이다. 따라서 vmware 이미지로 변환시켜야 한다.
아래와 같이 실행한다.
$./image_to_vm.sh --from=../build/images/amd64-generic/R34-5414.0.2014_02_06_0736-a1 --board=amd64-generic $./image_to_vm.sh --format=vmware --from=../build/images/amd64-generic/R34-5414.0.2014_02_06_0736-a1 --board=amd64-generic
생성되는 디렉토리(../build/images/amd64-generic/R34-5414.0.2014_02_06_0736-a1)를 USB 메모리에 저장하여 vmware 상에서 불러들인다.
만일 kvm 을 사용한다면, 아래와 같이 실행한다.
$sudo kvm -m 1024 -vga cirrus -pidfile /tmp/kvm.pid -net nic,model=virtio -net user,hostfwd=tcp::9222-:22 \ -hda /mnt/host/source/src/build/images/amd64-generic/R34-5414.0.2014_02_06_0736-a1/chromiumos_qemu_image.bin
USB 메모리에 설치하는 방법도 있다.
$./image_to_usb.sh --from=../build/images/amd64-generic/R34-5414.0.2014_02_06_0736-a1
사용 팁
하드디스크 드라이드에 설치하기
하드디스크 드라이브에 크로미엄 OS 를 설치하려면, 먼저 USB 메모리로 크로미엄 OS 를 실행해서 로그인 해야 한다.
크로미엄 OS 의 GUI 에는 설치를 위한 툴은 준비되어 있지 않다. 하드디스크 드라이버에 설치를 위해서는 터미널 모드로 이동해야 한다.
'Ctrl + Alt + T' 키를 누르면, 터미널 화면으로 전환된다.
아래와 같이 실행하면 이미지를 하드디스크 드라이브로 복사된다.
$/usr/sbin/chromeos-install
이 명령어를 실행하면 하드디스크 드라이브의 내용이 삭제되기 때문에 주의해야 한다.
터미널 열기
터미널을 열려면 'Ctrl + Alt + T' 를 누르자. 그러면 터미널 모드로 화면이 바뀐다.
터미널 화면이 열려있을 때 'F3' 을 누르면 모든 화면 보기 모드로 이동할 수 있다. 터미널이 GUI 로 관리되는 화면 중 하나로 다루어지고 있음을 확인할 수 있다.
본래의 GUI 관리 화면으로 되돌아오려면 'Alt + Tab' 을 누르자. exit 명령으로 로그아웃해도 GUI 화면으로 되돌아오지는 않는다. 아래 그림과 같다.
- GUI 화면 '-(Ctrl + Alt + F1)→' 터미널 화면
- 터미널 화면 '←(Ctrl + Alt + F2)-' GUI 화면
단축키 정리
키 | 기능 |
Ctrl + T | 새로운 탭을 표시한다 |
Ctrl + Shift + T | 바로 전에 표시된 탭을 한번 더 표시한다 |
Ctrl + Tab | 다음 탭을 표시한다(마지막 탭이 표시되어 있을 때는 가장 앞에 있는 탭을 표시한다) |
Ctrl + Shift + Tab | 앞에 있는 탭을 표시한다(첫 번째 탭이 표시되어 있을 때는 마지막 탭을 표시한다) |
Ctrl + 1~8 | 순서대로 탭을 표시한다. 예를 들어 Ctrl + 2 는 왼쪽부터 두번째에 있는 탭을 표시한다 |
Ctrl + 9 | 마지막 탭을 표시한다(탭 수에 관계없음) |
Ctrl + N | 새로운 윈도우를 표시한다 |
Alt + Tab | 다음 화면을 표시한다(마지막 화면이 표시되어 있을 때는 가장 앞에 있는 화면을 표시한다) |
Alt + Shift + Tab | 앞에 있는 화면을 표시한다(첫 번째 화면이 표시되어 있을 때는 마지막 화면을 표시한다) |
Ctrl + W | 탭을 닫는다(탭이 하나 밖에 없을 때 혹은 탭이 없는 화면을 닫는다) |
Ctrl + Shift + W | 화면을 닫는다(여러 탭을 한번에 닫는다) |
Ctrl + Alt + T | GUI 화면 안에 하나의 화면으로 터미널 화면을 표시한다 |
Ctrl + Alt + F1 | 크롬 터미널을 표시한다 |
Ctrl + Alt + F2 | 터미널 화면을 표시한다(GUI 화면 모드에 포함되지 않는다) |
F12 | 화면 일람모드로 전환한다(일람이 표시되어 있을 때 ESC 로 해제할 수 있다) |
F8 | 음소거를 한다 |
F9 | 볼륨을 줄인다 |
F10 | 볼륨을 높인다 |
바이너리 이미지 업데이트 하기
mini sd card 에 이미지 write
삼성으로부터 받은 전체 이미지를 flash 에 write 하기 위해서는 바이너리 이미지 파일을 mini sd card 에 write 해야 한다.
참고로 바이너리 이미지는 타겟보드에 따라 11 인치, 13 인치로 나뉘어지며, 이에 따라 이미지 파일 또한 나뉜다.
- 11인치 : PIT (chromiumos_test_image_PIT_emmcdebug_mwifiex_param_0209.bin)
- 13인치 : PI (chromiumos_test_image_PI_emmcdebug_mwifiex_param_0209.bin)
write 하기 전에 'pv' 라는 프로그램을 설치한다.
#apt-get install pv
mini sd card 를 sd card 어댑터에 넣고, PC 에 꼽는다. 아래와 같이 제대로 인식되었는지 확인한다.
#dmesg | tail [ 1322.066269] mmc0: new high speed SDHC card at address aaaa [ 1322.066935] mmcblk0: mmc0:aaaa SU08G 7.40 GiB
11인치와 13인치 보드를 위해 2개의 mini sd card 가 필요하고, 여기에 각각 write 를 할 것이다.
#pv chromiumos_test_image_PIT_emmcdebug_mwifiex_param_0209.bin | dd of=/dev/mmcblk0 bs=8M // 11 인치 #pv chromiumos_test_image_PI_emmcdebug_mwifiex_param_0209.bin | dd of=/dev/mmcblk0 bs=8M // 13 인치
위에서 주의할 것은 디바이스명을 '/dev/mmcblk0' 로 지정하는 것이다. 위 작업을 통해 mini sd card 에 파티션을 만드는 작업을 하기 때문에 mini sd card 전체를 적어주어야 한다.
예를들어 '/dev/mmcblk0p1' 를 적는다면, 제대로 동작하지 않을 것이다.
필자의 경우, sd card 어댑터를 사용했기 때문에 '/dev/mmcblk0' 로 인식했지만, 만일 usb 어댑터를 사용했다면, '/dev/sdc' 등과 같이 디바이스가 인식될 것이다. 이런 경우에도 전체 디바이스명(/dev/sdc)을 적어주어야 한다.
위의 작업이 끝나면, sd card 를 슬롯에서 제거하고 다시 꽂아 마운트해보자. 정상적으로 마운트가 된다면, 성공이다.
크로스 컴파일하기
앞서 chrome os 빌드시, 'amd64-generic' 를 선택했기 때문에 모든 chrome os 바이너리 및 라이브러리 파일들이 모두 amd64-generic 용으로 빌드되었다.
따라서 외부 프로그램을 크로스 컴파일하기 위해서는 툴체인의 위치와 이름을 알아야 한다.
흔히 gcc 로 오해하기 쉽지만, 절대아니다. 'x86' 이다.
간단한 'hello world' 프로그램을 만들어 위 툴체인으로 빌드하자. 그리고 usb 메모리에 담아, chrome os 로 부팅하여 옮긴 후 실행해보자!