Google Coral, macOS 에서 초기화 하기
잘못된 설정, 개발 환경 문제 혹은 기타 등등의 사유로 Coral을 초기화해야 할 때가 있다. eMMC 파티션 정보까지 지운 다기 보다 Mendel Linux를 처음 상태로 만들면 된다. 처음 Coral을 설정했을 때와 같이 fastboot를 사용하면 되겠지 싶지만 여기서 막히는 사람들이 많다. Platform에 따라 mdt 명령어가 원활하게 동작하지 않아 이를 생략하는 경우가 다수 있기 때문. mdt를 사용할 수 없다면 명령어를 사용해 bootloader를 불러올 수 있는 방법이 딱히 없다. 그럼 어떻게 해야 할까?
mdt reboot-bootloader는 동작하지 않았다 가정하면 fastboot devices를 해도 Coral이 발견되지 않는다. 때문에 이다음 절차로 넘어갈 수가 없다. Coral을 다뤄보는 사람 대부분이 디바이스 제어에 생소한 경우가 많아 여기서 헤매고 더 이상 진행하지 못하는 경우를 여럿 봤다.
❯ fastboot devices /opt/Corai.ai/ ❯
목표
최종 목표는 Coral에 Mendel Linux를 새로 설치하는 것이다. 이를 위해 내 MBP(MacBook Pro)가 Coral과 연결되어 있어야 하며, Coral은 이를 받아들일 준비가 되어 있어야 한다.
과정
Mendel Linux가 부팅되는 시점 부터 fastboot를 사용할 수 있는 방법이 없다. 즉, Mendel로 진입하기 전 fastboot를 활성화해야 한다. 이 절차는 Platform과 상관 없이 동일하다. 먼저 모든 케이블을 제거하고 Micro USB Type-B 케이블만 연결한다. 시리얼 통신을 통해 Coral과 직접 통신을 위해서다.
Coral이 MBP와 연결 되었는지 확인해 보자. 실리콘랩스의 CP2102가 인식 되어있어야 한다. macOS/Linux 에서는 SLAB_USB 등의 이름의 장치가 보인다. 아래는 연결 실패한 사례.
❯ ls -al /dev/{tty,cu}*.* crw-rw-rw- 1 root wheel 9, 1 4 21 15:42 /dev/cu.Bluetooth-Incoming-Port crw-rw-rw- 1 root wheel 9, 3 4 21 15:42 /dev/cu.SamsungLevelover-SPPDev crw-rw-rw- 1 root wheel 9, 0 4 21 15:42 /dev/tty.Bluetooth-Incoming-Port crw-rw-rw- 1 root wheel 9, 2 4 21 15:42 /dev/tty.SamsungLevelover-SPPDev
드라이버가 설치되어 있음에도 불구하고 인식이 안 되는 경우도 있지만 대부분의 경우 드라이버 인식 실패다. macOS의 경우 모하비는 바로 인식이 가능하지만, 카탈리나에서는 인식이 안 되는 경우가 더러 있다. 드라이버 설치 시 잠시 Type-B케이블을 분리하도록 하자.
시리얼 포트가 정상적으로 생성되었는지 확인해보자. 앞에서 보이지 않았던 SLAB_USBtoUART%가 생겼을 것이다. 일반적으로 숫자가 없거나 낮은 게 Enhanced Port이며, 높은 게 Standard Port다. 우리는 Enhanced Port를 사용한다.
❯ ls -al /dev/{tty,cu}*.* crw-rw-rw- 1 root wheel 9, 1 4 21 15:42 /dev/cu.Bluetooth-Incoming-Port crw-rw-rw- 1 root wheel 9, 5 4 21 16:25 /dev/cu.SLAB_USBtoUART crw-rw-rw- 1 root wheel 9, 7 4 21 16:25 /dev/cu.SLAB_USBtoUART3 crw-rw-rw- 1 root wheel 9, 3 4 21 15:42 /dev/cu.SamsungLevelover-SPPDev crw-rw-rw- 1 root wheel 9, 0 4 21 15:42 /dev/tty.Bluetooth-Incoming-Port crw-rw-rw- 1 root wheel 9, 4 4 21 17:29 /dev/tty.SLAB_USBtoUART crw-rw-rw- 1 root wheel 9, 6 4 21 16:28 /dev/tty.SLAB_USBtoUART3 crw-rw-rw- 1 root wheel 9, 2 4 21 15:42 /dev/tty.SamsungLevelover-SPPDev
포트에 접근하기 위해 screen을 실행하고, 전원을 연결하면 U-Boot부트로더가 보인다. 이때 화면이 잠시 멈추며 “Hit any key to stop”에서 카운트다운이 시작되는데, 이때 아무 키나 누르자. 그럼 Mendel로 진입하지 않고 프롬포트 상태가 보인다.
❯ screen /dev/tty.SLAB_USBtoUART 115200 In: serial Out: serial Err: serial BuildInfo: - ATF - U-Boot 2017.03.4 flash target is MMC:0 Net: Warning: ethernet@30be0000 using MAC address from ROM eth0: ethernet@30be0000 Fastboot: Normal Hit any key to stop autoboot: 0 u-boot=>
help를 입력하면 다양한 명령어가 보이는데, 앞서 설명한것과 같이 Coral의 fastboot모드 활성화가 주 목적인 만큼, 명령어 입력을 통해 fastboot모드에 진입하자. 그리고 USB Type-C(OTG)케이블을 연결하자.
u-boot=> fastboot 0 Configured USB Switch for UFP
위에서 보이지 않았던 장치가 보인다. Coral을 가장 처음 설정했을 때와 같고, 이후 순서는 공식 문서와 같다.
~ ❯ fastboot devices 1d1949d6f32ef62a fastboot ❯ curl -O https://dl.google.com/coral/mendel/enterprise/mendel-enterprise-day-13.zip ❯ unzip mendel-enterprise-day-13.zip && cd mendel-enterprise-day-13 ❯ bash flash.sh Sending 'bootloader0' (991 KB) OKAY [ 0.048s] Writing 'bootloader0' OKAY [ 0.235s] Finished. Total time: 0.308s Rebooting into bootloader OKAY [ 0.025s] Finished. Total time: 0.025s < waiting for any device > Sending 'gpt' (33 KB) OKAY [ 0.017s] Writing 'gpt' OKAY [ 0.360s] Finished. Total time: 0.399s ... Writing 'rootfs' OKAY [ 43.515s] Sending sparse 'rootfs' 2/4 (408501 KB) OKAY [ 14.384s] Writing 'rootfs' OKAY [ 21.602s] Sending sparse 'rootfs' 3/4 (389107 KB) OKAY [ 13.552s] Writing 'rootfs' OKAY [ 44.306s] Sending sparse 'rootfs' 4/4 (231325 KB) OKAY [ 7.965s] Writing 'rootfs' OKAY [ 82.525s] Finished. Total time: 240.925s ❯
위 작업이 진행되고 있을 때 screen으로 연결된 시리얼 통신 화면을 보면 Coral의 처리 현황을 확인할 수 있다.
idx 0, ptn 0 name='gpt' start=0 len=2048 idx 1, ptn 0 name='tos' start=0 len=2047 idx 2, ptn 0 name='bootloader0' start=66 len=4094 idx 3, ptn 1 name='boot' start=16384 len=262144 idx 4, ptn 2 name='misc' start=278528 len=2048 idx 5, ptn 3 name='rootfs' start=294912 len=14958592 cannot get the partion info for fbmisc fastboot_get_lock_stat: error in get mmc part writing to partition 'gpt' support sparse flash partition for gpt Initializing 'gpt' switch to partitions #0, OK mmc0(part 0) is current device Writing 'gpt' MMC write: dev # 0, block # 0, count 34 ... 34 blocks written: OK Writing 'gpt' DONE! flash backup gpt image successfully switch to partitions #0, OK mmc0(part 0) is current device flash target is MMC:0 request 000000007bf34880 was not queued to ep1in-bulk .. idx 4, ptn 2 name='misc' start=278528 len=2048 idx 5, ptn 3 name='rootfs' start=294912 len=14958592 cannot get the partion info for fbmisc writing to partition 'rootfs' sparse flash target is MMC:0 writing to partition 'rootfs' for sparse, buffer size 377264596 Flashing sparse image at offset 294912 Flashing Sparse Image ........ wrote 1868681216 bytes to 'rootfs' request 000000007bf34880 was not queued to ep1in-bulk
완전히 초기화가 완료됐다. hostname이 초기화되어 랜덤 하게 바뀐 것을 확인할 수 있다.
[ 110.991466] IPv6: ADDRCONF(NETDEV_UP): usb1: link is not ready [ 110.997695] IPv6: ADDRCONF(NETDEV_UP): usb1: link is not ready [ 111.008843] IPv6: ADDRCONF(NETDEV_UP): usb1: link is not ready [ 111.023906] IPv6: ADDRCONF(NETDEV_UP): usb1: link is not ready Mendel GNU/Linux (day) arid-calf ttymxc0 arid-calf login:
많은 사람들이 fastboot devices에서 장치가 보이지 않아 더이상 진행하지 못하는것을 목격할 수 있었다. Android SmartPhone을 다뤄봤던 사람이라면 좀더 이해가 빠를 것이다. 부팅 전 핫키 조합으로 boot-loader를 호출하는 것과 같은 단계라고 할까.
혹시 리눅스 환경에서 코랄 초기화하는 것은 알 수 있을까요? 계속 실패해서요