개요
Jetson Xavier AGX 기준으로 내부 eMMC 가 아닌 외부 SD 카드에 Jetpack을 설치하는 방법을 알아본다. 그냥 SD 카드 없이 NVIDIA SDK Manager를 사용하여 복구모드의 개발자키트에 설치를 진행하면 eMMC에 Jetpack이 설치가 되지만 32GB 용량으로는 저장공간의 부족을 느낄 수 있어 다양한 작업을 할 수 없는 점이 있다. 그래서 SD 카드에 Jetpack을 올려 부팅하는 방식을 알아본다
대략적인 환경 구성은 다음과 같다.
- Jetson Xavier AGX Development Kit
- Jetpack 4.5.1 install(BSP)
- Samsung 128GB SD card
- Ubuntu 18.04 host pc
패키지 설치
우분투 Host PC에서 다음 명령어를 이용하여 설치한다. qemu
라는 패키지가 설치 되어있어야 BSP를 통한 Jetpack 설치를 할 수 있는 것 같다.
$ sudo apt-get install qemu-user-static
이후 아래 명령어를 수행 했을 때 아래 출력과 같이 aarch64
관련 출력이 있는지 확인한다.
$ update-binfmts --display
>>
qemu-aarch64 (enabled):
package = qemu-user-static
type = magic
offset = 0
magic = \x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00
mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
interpreter = /usr/bin/qemu-aarch64-static
detector =
...
만약 위와같이 aarch64
환경에 대한 출력물이 없다면 다음 명령어를 실행하여 qemu
관련 셋팅을 다시 잡아준다.
$ sudo dpkg-reconfigure qemu-user-static
BSP & rootfs(루트파일시스템) 다운로드
BSP는 공식 L4T 32.5.1 릴리즈 페이지에서 다운로드 받을 수 있다. 이미지의 DRIVERS 탭의 빨간 박스로 표시한 2개를 전부 다 받아야한다.
하나는 BSP(board support package)인데 en715 보드 게시글에서 받은 BSP와 다른 점은 해당 BSP 안에 ROOTFS
이 빠져 있다는 점이다. 그래서 ROOTFS
을 따로 2번째 링크를 통해 다운받아준다.
다운로드 받았다면 앞으로 설명할 경로가 다음과 같이된다. Jetson_Linux_R32.5.1_aarch64.tbz2
은 BSP의 압축파일이고 Tegra_Linux_Sample-Root-Filesystem_R32.5.1_aarch64.tbz2
은 루트파일 시스템의 압축파일이다.
해당 경로를 앞으로 다음과 같이 지칭한다. ${L4T_RELEASE_PACKAGE}는 Jetson_Linux_R32.5.1_aarch64.tbz2
, ${SAMPLE_FS_PACKAGE} 는 Tegra_Linux_Sample-Root-Filesystem_R32.5.1_aarch64.tbz2
이다.
최상위경로
├ Jetson_Linux_R32.5.1_aarch64.tbz2
└ Tegra_Linux_Sample-Root-Filesystem_R32.5.1_aarch64.tbz2
다음 명령어를 통해서 BSP의 압축을 풀고 ROOTFS를 BSP 경로 안으로 합쳐준다.
$ tar xf ${L4T_RELEASE_PACKAGE}
$ cd Linux_for_Tegra/rootfs/
$ sudo tar xpf ../../${SAMPLE_FS_PACKAGE}
$ cd ..
$ sudo ./apply_binaries.sh
부트로더 순서 변경
앞선 게시글과 다른 점이다. 이 부분을 설정하지 않으면 설치가 끝나고 제대로 부팅이 되지 않을 수 있다. 부트로더 내용은 bootloader/cbo.dts
에 위치해있다.
BSP를 처음 다운로드 받으면 부트로더 순서는 다음과 같다. 먼저 SD 카드부터 마지막 네트워크 까지 이다.
$ vi ./bootloader/cbo.dts
>>>
...
...
boot-order = "sd", "usb", "nvme", "emmc", "net"
실제로 우리가 외부장치에 OS를 설치하게 되면 부팅방식은 다음과 같다.
- eMMC에 있는 부트로더가 먼저 올라온다.
- 부트로더에서 SD카드의 루트파일 시스템으로 OS 부팅한다.
위와 같이 작동하기 위해서 부팅 순서를 다음 처럼 바꿔준다.
# 해당 부분을 편집
boot-order = "sd", "usb", "nvme", "emmc", "net";
->
boot-order = "emmc", "sd", "usb", "nvme", "net";
그리고, 포스팅 맨 아래에 적은 ‘OS 셋팅 후 처음 부팅에서 설정해야할 것‘까지 같이 적용해야 한다.
SD Card Format & Copy rootfs
SD 카드 포맷 부분은 이전 게시글인 [Nvidia Jetson Nano/NX + EN715 Board + SD card OS 셋팅]의
SD카드 셋팅과 비슷하다. SD카드를 어댑터를 이용해 우분투 18.04 PC에 연결해준다. 그 후 sudo fdisk -l
명령어를 이용해 장치명을 확인해준다.
이 후엔 해당 게시글의 내용과 비슷하게 SD 카드를 GPT
파티션으로 설정한다.
$sudo gdisk /dev/sdx
"o" -> clear all current partition data
"n" -> create new partition
"1" -> partition number /dev/sdx1
"40M"first sectors -> Press enter last sectors
"Linux filsystem" -> using default type
"c" -> partition's name "PARTLABEL"
"w" -> write to disk and exit.
이어서 ext4
파일 형식으로 포맷까지 한뒤 PARTUUID를 기억하고 루트파일 시스템(rootfs) 복사까지 진행한다.
$ sudo mkfs.ext4 /dev/sdx1
// PARTUUID로 출력되는 UUID를 따로 기억 및 기록 해둔다.
$ sudo blkid /dev/sdx1
$ sudo mount /dev/sdx1 /mnt
// go to rootfs directory
$ cd Linux_for_Tegra/rootfs/ //this is prepared by sdkmanager
// copy rootfs
$ sudo tar -cpf - * | ( cd /mnt/ ; sudo tar -xpf - )
$ sudo umount /mnt
기억한 PARTUUID는 아래 명령어를 통해 부트로더에 bootloader/l4t-rootfs-uuid.txt_ext
파일로 기록한다.
$ cd ../
$ echo {PARTUUID} > ./bootloader/l4t-rootfs-uuid.txt_ext
설치
설치과정은 루트파일 시스템을 복사한 SD카드랑은 관계없다. Jetson 디바이스와 연관이 있다. 하지만 SD카드를 꼽는 타이밍이 또한 중요하다.
복구모드로 부팅(recovery mode booting)
Jetson Xavier AGX/TX2 보드에 USB 케이블을 통해 host pc에 연결하여 복구모드로 부팅한다. 복구모드는 아래와 같은 과정으로 진행된다.
power off -> press recovery button -> power on -> wait 2 seconds -> release recovery button
복구모드로 정상적으로 부팅되어있는지 확인하려면 Host PC에서 터미널을 열고 lsusb
명령어를 사용한다. 다음과 같은 양식의 출력이 돼야한다.
ex) Bus <bbb> Device <ddd>: ID 0955: <nnnn> Nvidia Corp.
각각 AGX 와 TX2는 다음과 같이 나와야한다.
# AGX
Bus 001 Device 024: ID 0955:7019 NVidia Corp.
# TX2
Bus 002 Device 026: ID 0955:7c18 NVidia Corp.
Jetpack Flash
해당 상태에서 아까 Linux_for_Tegra
경로에서 flash.sh
파일을 실행한다. 여기서 주의해야한다. flash.sh
스크립트 뒤에 옵션으로 붙는 항목들은 보드 장치 명
+ 부팅 디바이스
이다. flash.sh
파일을 vi
나 nano
로 열어서 보면 알 수 있지만 아래와 같은 예시가 있다.
# Examples:
# ./flash.sh <target_board> internal - boot <target_board> from on-board device (eMMC/SDCARD)
# ./flash.sh <target_board> external - boot <target_board> from external device
# ./flash.sh <target_board> mmcblk0p1 - boot <target_board> from eMMC
# ./flash.sh <target_board> mmcblk1p1 - boot <target_board> from SDCARD
# ./flash.sh <target_board> sda1 - boot <target_board> from USB device
# ./flash.sh <target_board> nvme0n1 - boot <target_board> from NVME storage device
# ./flash.sh -N <IPaddr>:/nfsroot <target_board> eth0 - boot <target_board> from NFS
# ./flash.sh -k LNX <target_board> mmcblk1p1 - update <target_board> kernel
# ./flash.sh -k EBT <target_board> mmcblk1p1 - update <target_board> bootloader
외부장치로 부팅을 할 것이기에 다음과 같이 입력한다. Xavier AGX와 TX2의 명령어가 다른데 이는 장치를 찾는 보드명을 다르게 주는 것이다. 각각 사용하는 장비에 맞게 명령어를 적용하자.
# Xavier AGX
$ sudo ./flash.sh jetson-xavier external
# TX2
$ sudo ./flash.sh jetson-tx2 external
SD card 삽입 타이밍
이 문제도 본인만 겪는 문제 인지 모르겠는데 미리 SD 카드를 꽂고 있으면 플래시 완료 후 제대로 부팅이 되지 않았다. 그 플래시가 완료되고 터미널에 BSP 플래시 완료 후 재부팅 된다는 알림이 뜨는 걸 확인하고 SD카드를 꽂아야, 그제서야 제대로 된 타이밍에 SD 카드가 읽히는 듯했다.
완료(중요!)
flash.sh
설치가 완료되면 Host PC에 연결해둔 SD카드를 어댑터에서 분리하여 Jetson Xavier AGX 또는 TX2에 꽂고 부팅하여 OS셋팅을 마무리한다. HDMI와 마우스, 키보드 등의 입력장치를 연결하여 설치 완료를 확인할 수 있다. 부팅을 하면 계정을 OS에 대한 초기 셋팅화면이 나온다. 계정 및 패스워드를 설정한다. 여기서 본인의 수차례 경험에 의해 셋팅해야할 중요한 사항이 있다.
초기 OS 셋팅 시 주의점
셋팅 중에 주의할 점이 있다. 해당 내용은 본인만 겪은 내용이라 일반적이라고 말할 수 있을 지는 모르겠다. 저장공간 크기를 지정하는 화면에서 보면 기본값이 SD카드의 최대 사이즈로 기본 지정되어있다. 하지만 설명에 보면 0
이나 ‘blank’. 즉, 빈칸으로 놔두면 최대 사이즈로 설정된다고 적혀있다. 이 부분을 기본값인 고정 최대값으로 주면 제대로 셋팅이 되지않는 문제를 겪었다. 그래서 0으로 값을 바꿔줘서 지정해야 다음에 파워모드를 셋팅하는 창으로 넘어갔다. 그래서 핵심은 기본값 대신에 0으로 바꿔주는 것이다.
OS 셋팅 후 처음 부팅에서 설정해야할 것.
이 내용도 본인이 겪은 일이라서 일반적이라고 할 수 있는 지는 모르겠다. 설치가 확인된 것을 시스템 종료 후 후에 다시 부팅 시 NVIDIA 로고가 출력되고 검은 화면에서 안움직이는 증상이 있었다. 외부에서 ping도 가지 않았다. 몇 차례 고생을 한 결과 부팅과정에 문제가 있는 것을 확인하였다. 제대로 된 장치를 못 찾는 것 같았다. 해결한 핵심 내용은 eMMC에 부트 정보는 extlinux.conf
에 있는데 여기 있는 PARTUUID
정보를 SD card
에 있는 boot
파티션의 extlinux.conf
에 같이 적어준다.
df -h
를 입력해서 파티션 정보를 보면 기존 eMMC는/media
파티션에 할당되었다는 것을 확인할 수 있으며 약 32(28)GB 이다./media/{username}/{UUID}/boot/extlinux.conf
를 열어서APPEND ....
옆에 있는PARTUUID
부분을 확인하기- 해당 내용을
/boot/extlinux/extlinux.conf
의 파일 내용에 추가해준다.
여기까지 작업했다면 시스템 종료 후 재 부팅할 때 문제 없이 올라올 것이다. 이후 필요한 CUDA, CUDNN, OPENCV 설치는 NVIDIA SDK MANAGER를 통해 설치한다. 이는 다음 포스팅에서 진행한다.
댓글남기기