xavier nx | nvme 부팅

mrzjo·2022년 8월 6일
0
post-thumbnail

Jetson Xavier NX, AGX Xavier는 initrd를 이용해 캐리어 보드상에서 NVMe에 flash할 수 있다.


이런거 없이도 된다.

참조한 링크

준비물

host 준비

sudo systemctl stop udisks2.service
sudo apt install -y libxml2-utils simg2img abootimg sshpass

L4T 준비

압축해제

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

secure boot 설치

  • Jetson Linux R32.7.2 Release Page
    • 이 링크 아래쪽에 Jetson Platform Fuse Burning and Secure Boot Documentation and Tools 를 클릭하면 secure boot 압축파일을 받을 수 있다.
  • Linux for Tegra 하나 위의 폴더에서 압축을 풀면 정확한 위치에 풀린다.
cd ~/work
wget https://developer.nvidia.com/embedded/l4t/r32_release_v7.2/t186/secureboot_r32.7.2_aarch64.tbz2

tar tvf secureboot_r32.7.2_aarch64.tbz2                                                20:09:35
drwxrwxrwx 0/0               0 2022-04-17 02:57 Linux_for_Tegra/
drwxrwxrwx 0/0               0 2022-04-17 02:57 Linux_for_Tegra/tools/
drwxrwxrwx 0/0               0 2022-04-17 02:57 Linux_for_Tegra/tools/backup_restore/
-rw-rw-rw- 0/0            5991 2022-04-17 02:57 Linux_for_Tegra/tools/backup_restore/l4t_backup_restore.func
-rwxrwxrwx 0/0           14274 2022-04-17 02:57 Linux_for_Tegra/tools/backup_restore/nvbackup_partitions.sh
-rwxrwxrwx 0/0            4578 2022-04-17 02:57 Linux_for_Tegra/tools/backup_restore/l4t_backup_restore.sh
-rwxrwxrwx 0/0            9902 2022-04-17 02:57 Linux_for_Tegra/tools/backup_restore/nvrestore_partitions.sh
-rw-rw-rw- 0/0            3280 2022-04-17 02:57 Linux_for_Tegra/tools/backup_restore/README_backup_restore.txt
-rwxrwxrwx 0/0            3317 2022-04-17 02:57 Linux_for_Tegra/odmfuseread.sh
-rwxrwxrwx 0/0           48226 2022-04-17 02:57 Linux_for_Tegra/odmfuse.sh
-rwxrwxrwx 0/0           27031 2022-04-17 02:57 Linux_for_Tegra/nvmassfusegen.sh
drwxrwxrwx 0/0               0 2022-04-17 02:57 Linux_for_Tegra/bootloader/
-rw-rw-rw- 0/0            9385 2022-04-17 02:57 Linux_for_Tegra/bootloader/README_Massfuse.txt
-rw-rw-rw- 0/0            6121 2022-04-17 02:57 Linux_for_Tegra/bootloader/LICENSE.tegrakeyhash
-rwxrwxrwx 0/0         1074600 2022-04-17 02:57 Linux_for_Tegra/bootloader/tegrakeyhash
-rw-rw-rw- 0/0           24309 2022-04-17 02:57 Linux_for_Tegra/bootloader/odmsign.func
-rwxrwxrwx 0/0            9986 2022-04-17 02:57 Linux_for_Tegra/bootloader/wb_sign.sh
-rw-rw-rw- 0/0           29854 2022-04-17 02:57 Linux_for_Tegra/bootloader/README_secureboot.txt
drwxrwxrwx 0/0               0 2022-04-17 02:57 Linux_for_Tegra/pkc/
-rw-rw-rw- 0/0            6916 2022-04-17 02:57 Linux_for_Tegra/pkc/0001-warmboot-change-wb-prepare-code-for-t1x4.patch
-rwxrwxrwx 0/0         1134965 2022-04-17 02:57 Linux_for_Tegra/pkc/nvsecuretool
-rw-rw-rw- 0/0            6121 2022-04-17 02:57 Linux_for_Tegra/pkc/LICENSE.mkpkc
-rwxrwxrwx 0/0            4098 2022-04-17 02:57 Linux_for_Tegra/pkc/tegrafuse.sh
-rw-rw-rw- 0/0            6121 2022-04-17 02:57 Linux_for_Tegra/pkc/LICENSE.nvsecuretool
-rwxrwxrwx 0/0          684549 2022-04-17 02:57 Linux_for_Tegra/pkc/mkpkc
-rw-rw-rw- 0/0           24458 2022-04-17 02:57 Linux_for_Tegra/odmfuse.func

tar xpf secureboot_r32.7.2_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이 필요하다.
  • initrd_flash tool이 dtb를 별도 지정할 수가 없어서 적절하게 파일명을 바꿔줘야 한다.

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/0c4c2f619101214b815792e8d2f9d73a/tegra19x-mb1-pinmux-p3668-a01.cfg
wget -O kernel/dtb/jdk100-xaviernx.dtb \
   https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/157b94bbd87a2bc1f70a7f6c2abd70ea/jdk100-xaviernx.dtb

sudo mv kernel/dtb/tegra194-p3668-all-p3509-0000.dtb \
   kernel/dtb/tegra194-p3668-all-p3509-0000.dtb.org
sudo cp kernel/dtb/jdk100-xaviernx.dtb \
   kernel/dtb/tegra194-p3668-all-p3509-0000.dtb
sudo cp kernel/dtb/jdk100-xaviernx.dtb \
   bootloader/tegra194-p3668-all-p3509-0000.dtb
   
wget -O bootloader/kernel_jdk100-xaviernx.dtb \
   https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/d44da832d8eefff6a194b3c761303a1a/kernel_jdk100-xaviernx.dtb
wget -O bootloader/kernel_jdk100-xaviernx.dtb.sb \
   https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/2803db8b2ecd2f30d381c65068ca3f20/kernel_jdk100-xaviernx.dtb.sb
wget -O bootloader/kernel_jdk100-xaviernx_sigheader.dtb.encrypt \
   https://gitlab.com/telelian_public/l4t/jdk100-xaviernx/uploads/7b7bf9469224e00d6b881252d130bc43/kernel_jdk100-xaviernx_sigheader.dtb.encrypt
   
sudo cp bootloader/kernel_jdk100-xaviernx.dtb \
   bootloader/kernel_tegra194-p3668-all-p3509-0000.dtb
sudo cp bootloader/kernel_jdk100-xaviernx.dtb.sb \
   bootloader/kernel_tegra194-p3668-all-p3509-0000.dtb.sb

sudo cp bootloader/kernel_jdk100-xaviernx_sigheader.dtb.encrypt \
   bootloader/kernel_tegra194-p3668-all-p3509-0000_sigheader.dtb.encrypt
   

jdk100 준비

NVMe SSD

sector 확인

  • NVMe SSD를 linux가 설치된 PC나 jdk100에 연결하여 fdisk로 확인한다.
  • 내 경우는 M.2 NVMe to USB가 없는 관계로 jdk100의 eMMC boot 상태에서 NVMe drive를 연결하여 확인했다.
  • 512GB SSD이지만 SSD마다 세부적인 값이 다를 수 있으므로 확인이 필요하다.
sudo fdisk /dev/nvme0n1
[sudo] password for nvidia:

Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
# p를 눌러 ↓ 바로 아래 줄을 확인하여 어디 적어놓자.
Disk /dev/nvme0n1: 477 GiB, 512110190592 bytes, 1000215216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf2eba7c1

Device         Boot Start        End    Sectors  Size Id Type
/dev/nvme0n1p1       2048 1000215215 1000213168  477G 83 Linux
  • 지금의 경우
    • 용량 : 477GiB (GibiBytes. GigaBytes아님)
    • 512110190592 bytes
    • 1000215216 sectors

flash_l4t_nvme.xml 에 SSD sectors값 입력

  • ${L4T}/tools/kernel_flash/flash_l4t_nvme.xml
    • 위에서 두번째 줄 num_sectors의 값을 위에서 확인한 sectors의 값으로 바꿔준다.
<partition_layout version="01.00.0000">
    <device type="nvme" instance="0" sector_size="512" num_sectors="1000215216">
        <partition name="master_boot_record" type="protective_master_boot_record">
            <allocation_policy> sequential </allocation_policy>
            <filesystem_type> basic </filesystem_type>
            <size> 512 </size>
            <file_system_attribute> 0 </file_system_attribute>
            <allocation_attribute> 8 </allocation_attribute>
            <percent_reserved> 0 </percent_reserved>
            <description> **Required.** Contains protective MBR. </description>
        </partition>
      ...
      

l4t_initrd_flash.sh

generate flash images

  • 중간에 -S 하고 APP partition으로 사용할 size를 입력하는데
    • fdisk에서 확인한 GiB 용량에서 1GiB이상 작아야 한다.
    • 지금은 477GiB를 위에서 확인했으므로 476Gib
    • 전체 partition을 보면 남은 자투리 영역이 UDA란 이름으로 잡히고 따로 쓸 수 있다.
    • 지금같은 경우 APP partition을 200GiB로 잡으면 나머지 276GiB는 UDA로 잡힌다. 취향대로 사이즈를 설정하면 된다.
  • 이 명령으로 image와 설정파일만 만드는데 시간이 꽤 걸린다.
  • 아래의 flash only 명령으로 flash할 땐 flash만 하자.
    • image를 만들때만 이 명령을 사용하고
    • 실제 보드에 flashing 할 땐 아래의 flash-only 옵션을 사용하여 시간을 낭비하지 말자.
cd ${L4T}
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
   -c ./tools/kernel_flash/flash_l4t_nvme.xml \
   -S 476GiB --no-flash --showlogs \
   jetson-xavier-nx-devkit-emmc nvme0n1p1

flash to board

  • jdk100의 Recovery mode로 진입한다. 참조
  • 입력 후의 프로세스
    1. Build the flashing environment
    2. Boot the device with flash initrd image
    3. Start the flashing process
cd ${L4T}
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
   -c ./tools/kernel_flash/flash_l4t_nvme.xml \
   --flash-only --showlogs \
   jetson-xavier-nx-devkit-emmc nvme0n1p1

verify

재부팅 후 아래의 명령으로 nvme drive로 부팅이 완료됐는지 확인한다.

 df / -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  468G  5.2G  439G   2% /
  • nvme0n1p1이 /로 제대로 마운트됐다.

partition

sudo parted /dev/nvme0n1
GNU Parted 3.2
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: GIGABYTE GP-GSM2NE3512GNTD (nvme)
Disk /dev/nvme0n1: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size    File system  Name               Flags
 1      20.5kB  511GB  511GB   ext4         APP                msftdata
 2      511GB   511GB  67.1MB               kernel             msftdata
 3      511GB   511GB  67.1MB               kernel_b           msftdata
 4      511GB   511GB  459kB                kernel-dtb         msftdata
 5      511GB   511GB  459kB                kernel-dtb_b       msftdata
 6      511GB   511GB  66.1MB               recovery           msftdata
 7      511GB   511GB  524kB                recovery-dtb       msftdata
 8      511GB   511GB  262kB                kernel-bootctrl    msftdata
 9      511GB   511GB  262kB                kernel-bootctrl_b  msftdata
10      511GB   512GB  315MB                RECROOTFS          msftdata
11      512GB   512GB  492MB                UDA                msftdata
profile
telelian

0개의 댓글