Jetson & 머신러닝/삭제

[삭제] Jetson Xavier를 SSD로 부팅하는 방법(nvidia 문서 기준으로)

아크리엑터 2024. 7. 1. 22:06
반응형

2024.7.7 update

아래의 내용으로 SSD로 부팅할 수있게 설치하는 방법을 설명했는데,  결론은, 그냥 jetson sdkmanager로 nvme로 설치를 하면 동일한 것이었음.   sdkmanager로 설치를 할 때 nvme 로 설치하도록 선택해서 설치를 해도 오류가 나서 설치가 안되었는데, 그 원인을 알았음.

nvme로 설치할 때, 터미널 로그를 조회하도록 하고 약 97~98%시점에서 Xavier가 리부팅되는 소리가 들린다(팬이 돌아간다). 그 때 USB연결이 끊어졌다가 안 붙는 상황이 있다.  virtualbox의 USB연결을 확인해서 해당 USB를 연결되도록 하고, 한참을 기다리면 정상적으로 설치가 된다. 

너무 쉬운 방법이었는데, 너무 돌아왔다.   쉽게 살아야 하는데.. 너무 돌아왔다.

 

 

-----------------------------------------------------

 

NVIDIA서 공식 안내된 내용에서 필요한 자료로 재정리한다. 

https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3275/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/flashing.html#wwpID0E0QN0HA

 

generic-no-api-public_r2

Your browser has DOM storage disabled. Make sure DOM storage is enabled and try again.

docs.nvidia.com

 

Jetson AGX Xavier시리즈의 Device는 내부의 eMMC에만 저장되는 부팅 펌웨어를 사용하는데, Jetpack 4.6 이상 부터는 NVME, USB로 부팅할 수 있게 바뀌었다. 이를 위해서는 eMMC를 플래싱한 후에 NVMe, USB로 부팅할 수 있다고 한다. 

기존에 많이 알려져 있는 rootBootOnNVMe.sh 를 사용하는 방식이 아닌, nvidia 공식 페이지에서 제공되는 방식을 설명한다. 기존 rootBootOnNVMe.sh 의 경우, 커널 변경시의 오류가 있어서 공식 페이지를 찾아서 진행해봤다. (내가 rootBootOnNVMe.sh를 잘못 설치했을 수도 있다)

설치하는 방법은 여러가지가 있는데, 내가 진행했던 절차를 그대로 시간순으로 정리한다. 시행 착오를 거친 것이라 생략해도 되는 부분이 있다.

우분투가 설치된 Host서버에 SSD를 직접 부착하는 방법을 먼저 설명한다. 이것은 Host서버에 SSD를 직접 설치를 해보지는 못했다. 노트북에서 하려고 하니, 추가 포트가 없어서 그냥 명령어를 순서대로 나열하였다.

 

[nvme에 설치]

1. SSD 디바이스 찾기

   -d\ 다음의 SPACE는 2개를 넣어야 한다. 디바이스는 nvme0n1 으로 확인했다.

$ lsblk -d -p |grep nvme | cut -d\  -f 1
/dev/nvme0n1

 

2. 디스크 초기화/파티션 생성

  이 명령으로 SSD가 완전히 초기화 된다. 데이터 모두 날라간다.

$ sudo parted /dev/nvme0n1 mklabel gpt

Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data
on this disk will be lost. Do you want to continue?
Yes/No? Yes                                                               
Information: You may need to update /etc/fstab.

Disk 유틸리티에는 이렇게 보여진다.

 

이 Disk 유틸리티를 실행하여, 즉, 위의 화면에서 "+"를 선택한다.  통 파티션을 만들기 위해 전체를 선택하고, 파일 포맷은 ext4로 선택한다. (최소 16GB 이상이어야지만 된다)

ext2, ext3으로 포맷하는 것보다는 더 빠르고 안정적인 ext4를 강력히 권장한다고 한다고 표현되어있다.

 

3. NVME 파티션 마운트

$sudo mount /dev/nvme0n1p1 /mnt

 

/mnt 에 마운트 된 것은 아래 화면에서 확인한다.  아래 그림은 참고로만 넣었다. 아래는 16GB만 APP파티션으로 되어있는데, 실제로는 전체가 잡히도록 하였다.  내 경우에는 명칭은 APP이 아닌, SSD로 정했다.

 

4.  설치

Host 서버에서 아래의 절차대로 명령어를 입력한다.  sdk-manager를 이용하여 다운로드/설치를 진행한 폴더로 이동해서 설치를 진행한다. 이때 Host서버(앞에서 virtual box에 ubuntu를 설치했었다)가 돌아가는 컴퓨터와 Xavier간에 USB로 연결을 시켜두고 virtualbox에서 USB를 인식해야 한다. 


이렇게 reset/recovery 모드로 들어가기 위해서는 아래 순으로 버튼을 누른다.

  • Xavier가 부팅이 되어있는 상태이고(기본적으로 emmc에 설치된 상태에서 진행할 수 있다), 앞에서 host서버의 /mnt  폴더에  nvme디바이스가 마운트 되어있다.
  • 전원이 켜져 있는 상태에서 "RECOVERY" 버튼(중간)을 누르고 있는다.
  • 그리고, "RESET" 버튼(맨오른쪽)을 눌렀다가 땐 후, Recovery 버튼을 땐다.
  • 물론, 전원이 꺼진 상태에서, Recovery 버튼을 누르고 있는 상태에서 전원버튼(맨 왼쪽)을 눌렀다가 땐 것과 동일한다.

위의 절차를 따르면, 모니터 연결이 꺼지며 Host서버와 케이블로 연결된다.   virtualbox를 사용하면서, host서버와 xavier의 연결이 안될 경우에는 USB인식을 virtualbox로 연결되도록 했는지를 확인하고, 연결시켜 주면 된다.

Host서버에 설치된 Ubuntu에 Python이 설치되어있지 않으면 설치를 하자.  아래에 실행될 스크립트 내에 python을 사용하는데. 이것이 없어서 오류 메시지가 떠서, 사전에 설치를 하였다. 

$ sudo apt install python3
$ cd /usr/bin
$ sudo ln -s python3 python

 

sdkmanager에서 다운로드 받은 파일이 있는 디렉토리로 접근하여, 아래와 같이 명령을 입력한다.  아래의 "jetson-agx-xavier-devkit"은 AGX XAVIER에서만 사용할 수 있고, 다른 Device를 사용할 경우에는 맨 아래 쪽에 첨부한 디바이스 보드 이름으로 교체할 수 있다.

$ cd nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS
$ cd Linux_for_Tegra/
$ sudo BOOTDEV=nvme0n1p1 ./flash.sh --no-flash jetson-agx-xavier-devkit nvme0n1p1
$ sudo mkdir tmp_system
$ sudo mount bootloader/system.img.raw ./tmp_system
$ sudo rsync -axHAWX --numeric-ids --info=progress2 --exclude=/proc ./tmp_system/ /mnt

 

 

5. unmount & disconnect from host

$ sudo umount /mnt
$ sudo umount ./tmp_system
 

 

 

[USB에 설치]

위의 nvme에 설치하는 방식으로는 실제 진행해보지 못하였다.(Xavier에 연결해서, 화면 캡쳐와 어떻게 작동되는지를 check해봤을 뿐) 지금 Host OS를 맥북에 virtualbox를 설치해서 사용하고 있어서, nvme를 USB어댑터에 연결해서 사용하였다.

USB를 맥북에 연결하고, virtualbox의 우분투에서 이 USB를 인식되도록 하였다. 그 이후 명령을 아래에 나열하였다. 위의 NVME의 경우와 동일한데, 디바이스명만 다르다.

 

1. SSD 디바이스 찾기

아래 명령으로 flashing할 디바이스 이름을 찾는다.

$ sudo lsblk -p -d | grep sd
sdb1
 

2. 디스크 초기화/파티션 생성

  이 명령으로 SSD가 완전히 초기화 된다. 데이터 모두 날라간다.

$ sudo parted /dev/sdb1 mklabel gpt

Warning: The existing disk label on /dev/sdb1 will be destroyed and all data
on this disk will be lost. Do you want to continue?
Yes/No? Yes                                                               
Information: You may need to update /etc/fstab.

host서버에서 Disk 유틸리티를 실행하여, 즉, 위의 화면에서 "+"를 선택한다.  통 파티션을 만들기 위해 USB의 전체를 선택하고, 파일 포맷은 ext4로 선택하여, 포맷한다. (최소 16GB 이상이어야지만 된다)

 

3. USB 파티션 마운트

$sudo mount /dev/sdb1 /mnt

 

4.  설치

위의 nvme설명과 동일하게 진행한다. 단지, nvme디바이스명 대신에, sdb1으로 바꿔서 실행하였다.

$ cd nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS
$ cd Linux_for_Tegra/
$ sudo BOOTDEV=sdb1 ./flash.sh --no-flash jetson-agx-xavier-devkit sdb1
$ sudo mkdir tmp_system
$ sudo mount bootloader/system.img.raw ./tmp_system
$ sudo rsync -axHAWX --numeric-ids --info=progress2 --exclude=/proc ./tmp_system/ /mnt

 

5. unmount & disconnect from host

$ sudo umount /mnt
$ sudo umount ./tmp_system
 
 

 

[공통]

 

6. 실행(Boot)

Xavier 디바이스의 전원을 끈다. 그리고, nvme /usb디바이스를 host서버에서 빼서, Xavier에 부착한 후에 Xavier전원을 켜서 부팅을 한다. 그런데, 기존에 emmc에 설치된 OS만 부팅되고 nvme에 설치된 OS로는 부팅이 안된다.

그래서, emmc로 부팅 한 후에, /boot/extlinux/extlinux.conf 의 파일의 부트 디바이스를 변경하는 방법도 사용해봤는데, 될 때도 있었고, 재설정해보니 안되었었다. 어떻게 멀티부팅이 되도록 했는지 기억이 나지 않아서, T.T  간략히 기록을 남긴다.

 

$ lsblk -o NAME,PARTUUID
NAME         PARTUUID
loop0        
loop1        
loop2        
loop3        
loop4        
loop5        
loop6        
loop7        
loop8        
loop9        
mmcblk0      
├─mmcblk0p1  2605c1db-2966-43c5-9276-664256aa1a74
├─mmcblk0p2  6426c97c-f7f1-45a2-a883-a7658685bc61
├─mmcblk0p3  1e005408-70d4-4bca-87e5-e2348006d729

└─mmcblk0p44 6fc36095-24f2-4014-a469-427101847a6a

nvme0n1      
└─nvme0n1p1  e6a2ddae-abcd-4ad0-a055-0860eb312345

$ sudo vi /boot/extlinux/extlinux.conf

APPEND ... root=PARTUUID=e6a2ddae-abcd-4ad0-a055-0860eb312345  quiet

 

7. 다시 nvme디바이스에 flash (initrd flash)

nvidia의 문서를 다시 읽어봤다.  ssd로 부팅이 안될 경우에는 머시기 거시기 적혀져 있는데, 뭔가 많다. C-Boot, U-Boot 를 사용해야 한다는 말도 있고, CBoot는 deprecated 되었다고 안내된 문서도 있다. 그래서 아래의 방식을 해보았다.

맥북의 virtualbox에 설치된 Host서버에 아래의 패키지를 설치한다.

$ sudo apt install libxml2-utils abootimg sshpass device-tree-compiler

 

Host서버와 xavier를 USB케이블로 연결해두고, xavier는 recovery 모드로 적용하였다.

$ cd nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS
$ cd Linux_for_tegra

$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh jetson-agx-xavier-devkit nvme0n1p1

한참동안, 무엇을 하는지 한참의 로그가 화면에 나온다. Xavier가 자동으로 부팅을 한 후에 UI 가 나오지 않은 상태에서 멈춰져 있었고, Host서버에는 "waiting for target to boot up" 메시지가 계속 나온다. virtualbox의 USB연결이 안되어있었던 것이 보여서, 재연결해주었다. 그러니, 후속으로 진행이 되었다.

/home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra/tools/kernel_flash/l4t_initrd_flash_internal.sh --no-flash jetson-agx-xavier-devkit nvme0n1p1
************************************
*                                  *
*  Step 1: Generate flash packages *
*                                  *
************************************
Create folder to store images to flash
Generate image for internal storage devices
Generate images to be flashed
....

[  10.2027 ] partition_id partition_name       StartingLba EndingLba
[  10.2040 ]            1 BCT                                         0       63
[  10.2161 ]            2 mb1                                        64      575
[  10.2472 ]            3 mb1_b                                     576     1087
[  10.2752 ]            4 MB1_BCT                                  1088     1215
[  10.3070 ]            5 MEM_BCT                                  1216     1663
[  10.3407 ]            6 spe-fw                                   1664     2175
[  10.3591 ]            7 mb2                                      2176     2623
[  10.3817 ]            8 mts-preboot                              2624     2687
[  10.3817 ]            9 reserved_for_chain_A_boot                2688     6783
[  10.3817 ]           10 MB1_BCT_b                                6784     6911
[  10.3817 ]           11 MEM_BCT_b                                6912     7359
[  10.3817 ]           12 spe-fw_b                                 7360     7871

....


******************************************
*                                        *
*  Step 2: Generate rcm boot commandline *
*                                        *
******************************************
ROOTFS_AB= ROOTFS_ENC= /home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra/flash.sh  --no-flash --rcm-boot jetson-agx-xavier-devkit mmcblk0p1
.....

/tmp/tmp.HUrwKnN8Y3 /home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra
flashimg0=boot0.img
/home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra
Success
Cleaning up...
Finish generating flash package.



/home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra/tools/kernel_flash/l4t_initrd_flash_internal.sh  --usb-instance 1-2 --device-instance 0 --flash-only  jetson-agx-xavier-devkit nvme0n1p1
**********************************************
*                                            *
*  Step 1: Build the flashing environment    *
*                                            *
**********************************************
Create flash environment 0
/home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra/bootloader /home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra
/home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra
Finish creating flash environment 0.


****************************************************
*                                                  *
*  Step 2: Boot the device with flash initrd image *
*                                                  *
****************************************************
/home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra/temp_initrdflash/bootloader0 /home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra
./tegraflash.py --bl nvtboot_recovery_cpu_t194_sigheader.bin.encrypt --bct br_bct_BR.bct --securedev  --bldtb tegra194-p2888-0001-


/home/user_id/nvidia/nvidia_sdk/JetPack_5.1.3_Linux_JETSON_AGX_XAVIER_TARGETS/Linux_for_Tegra


***************************************
*                                     *
*  Step 3: Start the flashing process *
*                                     *
***************************************
Waiting for target to boot-up...
Waiting for target to boot-up...
Waiting for target to boot-up...
Waiting for target to boot-up...
Waiting for target to boot-up...
Waiting for target to boot-up...
Waiting for target to boot-up...
....
Waiting for target to boot-up...
Waiting for device to expose ssh ......RTNETLINK answers: File exists
RTNETLINK answers: File exists
Run command: if [ -f /qspi/l4t_flash_from_kernel.sh ]; then USER=root /qspi/l4t_flash_from_kernel.sh --no-reboot --qspi-only ; fi on root@fe80::1%usb0


writing item=67, 1:3:secondary_gpt, 31272713728, 16896, gpt_secondary_1_3.bin, 16896, fixed-<reserved>-0, da2e2ff99f8e119686c16b870ea9f1f53b6a2591
[ 174]: l4t_flash_from_kernel: Successfully flash the emmc
[ 174]: l4t_flash_from_kernel: Flashing success

Reboot target
Run command: sync; nohup reboot &>/dev/null & exit on root@fe80::1%usb0
SSH ready
Success
Cleaning up...
Log is saved to Linux_for_Tegra/initrdlog/flash_1-2_0_20240707-143339.log

 

8. Xavier 디바이스 재시작

Xavier의 전원을 껐다가 다시 켜면, 우분투  설치화면이 나오고 설치를 완료하면 SSD로 부팅된 것을 확인할 수 있다.

이 Xavier에는 기본 우분투만 설치되어있었다. 그래서, 여기에 JetPack SDK와 개발툴을 설치하였다.

설치를 위해서, host서버에 USB로 Xavier를 연결하였다.Xavier는 부팅이 되어있는 상태로 두어야 한다.

host서버에서 sdkmanager를 실행하고 JetPack SDK 5.1.3과 Additional SDKS를 선택하였다. [STEP2]에서는  Target components의 "Jetson Linux"를 선택제외하고 나머지는 모두 선택하여 패키지들만 설치를 하게 하였다.

 

 

설치가 완료된 후에, jtop으로 확인을 하면, Libraries에 설치된 것들이 표시된다.

9. 마무리 확인

     이제 opencv, torch, vision을 설치해야 한다. 그 글은 이미 포스팅 된 것이 있는데, 그 링크는 나중에 추가해 두겠다.

 

 

첨부.

Jetson Modules and Configurations
with Respective Jetson Developer Kit Carrier Board
Module
Part Number *
Value of $(BOARD)
Module Notes **
Series Notes
Jetson Xavier NX P3668-0000
jetson-xavier-nx-devkit
For development use only.
Internal QSPI-NOR & on-module microSD card.
Small form factor.
Jetson Xavier NX (8 GB)
P3668-0001
jetson-xavier-nx-devkit-emmc
Internal QSPI-NOR & eMMC.
Jetson Xavier NX (16 GB)
P3668-0003
jetson-xavier-nx-devkit-emmc
Internal QSPI-NOR & eMMC.
Jetson Nano 2GB
P3448-0003
jetson-nano-2gb-devkit
For educational & experimental use only.
Internal QSPI‑NOR & microSD card.
Compact, economical.
Jetson Nano 4GB
P3448-0000
jetson-nano-devkit
or
jetson-nano-qspi-sd
For development use only.
Internal built-in QSPI‑NOR & on-module microSD card.
Jetson Nano 4GB
P3448-0002
jetson-nano-devkit-emmc
Internal QSPI-NOR and eMMC.
Jetson AGX Xavier (16 GB)
P2888-0001
jetson-agx-xavier-devkit
Internal eMMC.
High-performance series for demanding applications.
Jetson AGX Xavier (32 GB)
P2888-0004
jetson-agx-xavier-devkit
Internal eMMC.
Jetson AGX Xavier 64GB
P2888-0005
jetson-agx-xavier-devkit-64gb.conf
Internal eMMC.
Jetson AGX Xavier Industrial
P2888-0008
jetson-agx-xavier-industrial
Internal eMMC.
Jetson TX2
P3310-1000
jetson-tx2-devkit
Internal eMMC.
Midrange series, more performance than Jetson Xavier NX series or Jetson Nano, at less cost than Jetson AGX Xavier series
Jetson TX2i
P3489-0000
jetson-tx2-devkit-tx2i
Industrial module with expanded environmental limits and increased useful life.
Internal eMMC.
Jetson TX2 4GB
P3489-0080
jetson-tx2-devkit-4GB
Internal eMMC.
Jetson TX2 NX
P3636-0010
jetson-xavier-nx-devkit-tx2-nx
Used with Jetson Xavier NX Developer Kit for development work.
Internal eMMC.
Jetson TX1
P2180-1000
jetson-tx1-devkit
Used with Jetson TX2 Developer Kit.
Internal eMMC for development work.
Not recommended for new development.
*   GB indicates DRAM size.
**   Except as noted, all modules are intended for development or production use. For detailed Jetson module information, see the Jetson Modules page on the NVIDIA Developer Site.
 
반응형