xavier nx | sd 카드로 부팅하기

mrzjo·2022년 7월 20일
0

abstract

Jetson emmc model들의 저장공간은 늘 부족하다.
그래서 지난 시간의 docker의 저장위치 이동에 이은 sd card로 부팅하여 저장공간을 확보하는 내용을 준비했다.

준비물

L4T 준비

압축해제

  • host PC의 적당한 위치에 파일을 받고 압축을 해제하자.
    • 지금은 ~/work 에서 작업한다고 가정.
  • rootfs는 아무데나 있으면 안되고 Linux_for_Tegra/rootfs 폴더 아래에 위치해야 한다.
  • rootfs는 tar 압축해제 시 반드시 sudo 명령으로 해야한다.
    • 하부 폴더의 권한 문제가 있음
cd ~/work
wget https://developer.nvidia.com/embedded/l4t/r32_release_v7.1/t186/jetson_linux_r32.7.1_aarch64.tbz2
wget https://developer.nvidia.com/embedded/l4t/r32_release_v7.1/t186/tegra_linux_sample-root-filesystem_r32.7.1_aarch64.tbz2
tar xpf jetson_linux_r32.7.1_aarch64.tbz2
cd Linux_for_Tegra/rootfs
sudo tar xpf ../../tegra_linux_sample-root-filesystem_r32.7.1_aarch64.tbz2

rootfs 준비

  • ~/work/Linux_for_Tegra를 ${L4T}로 가정.

필수 바이너리 설치

cd ${L4T}
sudo ./apply_binaries.sh

사용자 등록

  • 이걸 안하면 jetson으로 최초 부팅할 때 사용자를 등록하는 과정을 거침.
cd ${L4T}/tools
#sudo ./l4t_create_default_user.sh -u {username} -p {password} -n {hostname} -a --accept-license
sudo ./l4t_create_default_user.sh -u nvidia -p nvidia -n jdk100 -a --accept-license

device tree 준비

  • jdk100 carrier board를 사용하는 경우 아래 링크의 파일이 필요하며 다른 캐리어보드를 사용시 그에 맞는 dtb file이 필요하다.

backup & download

cd ${L4T}
cp bootloader/t186ref/BCT/tegra19x-mb1-pinmux-p3668-a01.cfg bootloader/t186ref/BCT/tegra19x-mb1-pinmux-p3668-a01.cfg.org 
wget -O bootloader/t186ref/BCT/tegra19x-mb1-pinmux-p3668-a01.cfg https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/d1741c3bcfddc723fc8ceff6d67da0b9/tegra19x-mb1-pinmux-p3668-a01.cfg
wget -O kernel/dtb/jdk100-xaviernx.dtb https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/a088620adbffdce432e77f98a5f01f2c/jdk100-xaviernx.dtb
wget -O bootloader/kernel_jdk100-xaviernx.dtb https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/cc46dbf5eb0263ad3ba44dea42b0c9c4/kernel_jdk100-xaviernx.dtb
wget -O bootloader/kernel_jdk100-xaviernx.dtb.sb https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/726e5885f05ecbae49a314bc117f1132/kernel_jdk100-xaviernx.dtb.sb

sd card 준비

이미지 생성

cd ${L4T}/tools
sudo ./jetson-disk-image-creator.sh -o sdcard.img -b jetson-xavier-nx-devkit

sd card 파티션 삭제 및 img 복사

  • sd card를 host PC에 꼽고 어느 드라이브인지 확인한다. 여기선 /dev/sdX 라고 간주.
# sd 카드 파티션 삭제
sudo gdisk /dev/sdX
# type o -> create a new empty GUID partition table (GPT)
# type w -> write table to disk and exit

# 위에서 만든 sdcard.img 를 sd card로 복사
sudo dd if=sdcard.img of=/dev/sdX conv=sync,noerror bs=512 status=progress

파티션 확장

  • sdcard.img의 크기만큼만 파티션이 할당되어 있다. sd card의 실제 크기만큼 늘려주는 작업이다.

parted

  • parted 실행 후 p를 눌렀을 때 아래와 같은 경고가 보이면 Fix해주고 넘어간다.
sudo parted /dev/sdX

GNU Parted 3.2
Using /dev/sdX
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p

Warning: Not all of the space available to /dev/sdX appears to be used, 
you can fix the GPT to use all of the space (an extra 237504512)
or continue with the current setting?
Fix/Ignore?
  • 경고 없으면 그냥 진행한다.
sudo parted /dev/sdX

GNU Parted 3.2
Using /dev/sdX
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p

Model: Generic STORAGE DEVICE (scsi)
Disk /dev/sdX: 63.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name               Flags
 2      1049kB  68.2MB  67.1MB               kernel
 3      68.2MB  135MB   67.1MB               kernel_b
 4      135MB   136MB   459kB                kernel-dtb
 5      136MB   137MB   459kB                kernel-dtb_b
 6      137MB   203MB   66.1MB               recovery
 7      203MB   204MB   524kB                recovery-dtb
 8      204MB   205MB   262kB                kernel-bootctrl
 9      206MB   206MB   262kB                kernel-bootctrl_b
10      207MB   311MB   105MB                RECROOTFS
11      311MB   446MB   134MB                UDA
 1      446MB   6256MB  5810MB  ext4         APP
  • p를 눌러 확인을 해보면 맨 아래 1번 파티션이 나중에 jetson의 root(/)가 된다.
    6GB 정도 밖에 잡혀있지 않으므로 확장한다.
(parted) resizepart 1 -1
(parted) p
Model: Generic STORAGE DEVICE (scsi)
Disk /dev/sdX: 63.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name               Flags
 2      1049kB  68.2MB  67.1MB               kernel
 3      68.2MB  135MB   67.1MB               kernel_b
 4      135MB   136MB   459kB                kernel-dtb
 5      136MB   137MB   459kB                kernel-dtb_b
 6      137MB   203MB   66.1MB               recovery
 7      203MB   204MB   524kB                recovery-dtb
 8      204MB   205MB   262kB                kernel-bootctrl
 9      206MB   206MB   262kB                kernel-bootctrl_b
10      207MB   311MB   105MB                RECROOTFS
11      311MB   446MB   134MB                UDA
 1      446MB   63.9GB  63.4GB  ext4         APP

(parted) quit
  1. resizepart 1 -1
  2. p로 확인
    • 1번 파티션이 63.9GB로 늘어났다.
  3. quit

resize2fs

sudo resize2fs /dev/sdX1

resize2fs 1.44.1 (24-Mar-2018)
Resizing the filesystem on /dev/sdX1 to 15482892 (4k) blocks.
The filesystem on /dev/sdX1 is now 15482892 (4k) blocks long.

PARTUUID 확인

  • blkid로 PARTUUID를 확인하여 메모해 둔다.
sudo blkid /dev/sdX1
/dev/sda1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTLABEL="APP" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

L4T 최종 준비

uuid file 생성

  • 위에서 확인한 PARTUUID를 아래 파일 안에 써준다.
cd ${L4T}/bootloader/
touch l4t-rootfs-uuid.txt_ext
echo "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" > l4t-rootfs-uuid.txt_ext

boot order 변경

  • ${L4T}/bootloader/cbo.dts의 내용 중 boot-order 부분을 변경

/dts-v1/;

/ {
	compatible = "nvidia,cboot-options-v1";
	boot-configuration {
		/* nvme boot-order can be in "nvme:C<n>", "nvme:pcie@<addr>", or "nvme" format */
        
		// boot-order = "sd", "usb", "nvme", "emmc", "net";
        // 윗 줄을 아래 줄로 변경
		boot-order = "emmc", "sd", "usb", "nvme", "net";
        
		tftp-server-ip = /bits/ 8 <192 168 0 1>;
		dhcp-enabled;
		/* remove dhcp-enabled if uncommenting static-ip configuration */
		/* static-ip = /bits/ 8 <0 0 0 0>;
		 * ip-netmask = /bits/ 8 <255 255 255 0>;
		 * ip-gateway = /bits/ 8 <0 0 0 0>;
		 */
	};
};

flash

set recovery mode

  1. jdk의 recovery USB port를 host PC에 연결한다.
  2. 전원 연결 후 리커버리 버튼을 누른 상태로 리셋 버튼을 눌렀다 떼고
    2~3초 후에 리커버리 버튼에서 손을 뗀다.
  3. lsusb로 모드에 제대로 진입했나 확인한다.
  • 제대로 설정됐다면 ID 0955:7e19 가 보인다.
  • ID가 안 보이면 2번을 다시 수행한다.
lsusb

Bus 001 Device 010: ID 0955:7e19 NVIDIA Corp. APX

flash

cd ${L4T}
sudo ./flash.sh -d kernel/dtb/jdk100-xaviernx.dtb jetson-xavier-nx-devkit-emmc external
  • 완료되면 sd card를 jdk100에 삽입 후 보드를 리셋한다.

마무리

  • 보드의 터미널에서 확인.
df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk1p1   59G  4.9G   51G   9% /
none            3.5G     0  3.5G   0% /dev
tmpfs           3.8G  4.0K  3.8G   1% /dev/shm
tmpfs           3.8G   21M  3.8G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.8G     0  3.8G   0% /sys/fs/cgroup
tmpfs           777M  108K  777M   1% /run/user/1000
  • df -h로 확인해서 /dev/mmcblk1p1의 size가 sd 카드의 실제 사이즈에 가까우면 성공
profile
telelian

0개의 댓글