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 사이트를 기반으로 한 것이다.
본격적인 작업에 앞서 유의할 점들이 몇가지 있다.
이제 본격적으로 작업을 시작한다.
먼저 필요한 프로그램들을 설치해야 한다.
$su - wjkim $cd /home/wjkim $sudo apt-get install git-core gitk git-gui subversion curl
$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 $
빌드 전에 타겟 아키텍처를 어떤 것으로 할지 선택해야 한다. 현재 지원하는 아키텍처는 아래와 같다.
여기서는 '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 화면으로 되돌아오지는 않는다. 아래 그림과 같다.
키 | 기능 |
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 | 볼륨을 높인다 |
삼성으로부터 받은 전체 이미지를 flash 에 write 하기 위해서는 바이너리 이미지 파일을 mini sd card 에 write 해야 한다.
참고로 바이너리 이미지는 타겟보드에 따라 11 인치, 13 인치로 나뉘어지며, 이에 따라 이미지 파일 또한 나뉜다.
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 로 부팅하여 옮긴 후 실행해보자!