Pular para o conteúdo principal

Expansão de Memória do reComputer para Jetson

O reComputer para Jetson é vendido com 16 GB de eMMC e vem com ubuntu 18.04 LTS e NVIDIA JetPack 4.6 instalados, de modo que o espaço de usuário restante disponível é de cerca de 2 GB, o que é um obstáculo significativo para usar o reComputer para treinamento e implantação em alguns projetos. Este tutorial apresentará o processo de expansão para diferentes modelos de reComputer com base nessa situação e ajudará os desenvolvedores a expandir seus sistemas transferindo-os para dispositivos de armazenamento externos.

Fundamentos da Expansão de Capacidade

O primeiro setor no disco onde o sistema está instalado é chamado de Master Boot Record (MBR), que contém informações sobre o BootLoader, a tabela de partição e o identificador fixo 55AA. Durante o processo de inicialização do Linux, o BootLoader e o kernel passam por duas fases importantes.

Fase 1: O BootLoader inicializa (initrd) um sistema de arquivos raiz temporário (ramfs). O ramfs contém programas de configuração para drivers, sistemas de arquivos (fs), redes (net), etc. que são necessários na inicialização. Depois disso, o controle do BootLoader é transferido para o kernel, para que o kernel possa pegar esses programas, movê-los para a memória (RAM) e executá-los para carregar os vários módulos funcionais.

Fase 2: Depois que o kernel carrega os módulos necessários com o ramfs, ele libera o sistema e configura o sistema de arquivos raiz real (rootfs) para montar no diretório raiz real.

  1. Nas duas fases acima, não precisamos modificar a parte do kernel que carrega os módulos funcionais com o ramfs (fase 1), portanto, mesmo que o reComputer tenha sido expandido, ele ainda precisará usar a eMMC.
  2. O que precisamos modificar é a segunda fase, que monta o sistema de arquivos raiz na memória externa, possibilitando assim a expansão.

Observações Sobre a Expansão de Capacidade

  1. O principal princípio da expansão via armazenamento externo é definir o rootfs para estar em um dispositivo de armazenamento externo.

  2. Este método de expansão irá modificar arquivos de sistema em nível de kernel Linux e você pode se deparar com alguns problemas que não são fáceis de resolver. Você deve usar um reComputer novo e um dispositivo de armazenamento novo ao seguir este tutorial para concluir a expansão e não tente armazenar arquivos valiosos no dispositivo. Se algo não funcionar como esperado, talvez seja necessário formatar novamente o dispositivo de armazenamento ou até mesmo o reComputer e, como opção final de retenção, nós ofereceremos ajuda para restaurar o backup via porta serial, se possível, mas você é responsável por qualquer perda de dados.

  3. Este processo de expansão não requer recompilar o kernel e economiza cerca de 40 minutos de tempo de instalação em comparação com outros métodos de expansão anteriores disponíveis on‑line.

Expansão Via Slot M.2 na Placa Carrier e SSD

SSD, também conhecido como Solid State Drive, é frequentemente usado como dispositivo de armazenamento principal para laptops, desktops, etc. Com sua alta confiabilidade e taxas rápidas de leitura e gravação de dados, é a melhor escolha para a expansão do reComputer. A tabela a seguir lista os produtos da Série reComputer que atualmente estão disponíveis para soluções de expansão com SSD. A principal razão pela qual o reComputer J1010 não suporta expansão com SSD é porque a placa carrier não está equipada com um slot M.2 adequado.


Produto reComputer J1020 reComputer J2011 reComputer J2012 reComputer J2021
SKU 110061361110061363110061401110061381
Vista lateral
Módulo equipadoJetson Nano 4GJetson Xavier NX 8GBJetson Xavier NX 16GBJetson Xavier NX 8GB
Placa carrier em operaçãoJetson A206Jetson A206Jetson A206J202

Requisitos de Software e Hardware

As seguintes condições precisam ser atendidas para a solução de expansão usando SSDs, que são os requisitos básicos para que a expansão seja comprovadamente bem-sucedida.

requisitos de software e hardware
reComputer para JetsonVersões do JetPack 4.4 ~ 4.6
A placa carrier deve conter slot M.2 M‑Key
SSDO SSD precisa usar sistema de arquivos estendido de quarta geração (Ext4)
Interface M.2 M‑Key com protocolo NVMe
Capacidade recomendada ≤ 512 GB

!!!Attention A versão atualizada do JetPack não foi testada para expansão, portanto a estabilidade ou o sucesso da expansão não podem ser garantidos, siga este tutorial com atenção.

O SSD precisa ser M.2 M‑Key, caso contrário não irá corresponder à interface na placa carrier.

Dispositivos de armazenamento com sistemas de arquivos que não sejam o sistema de arquivos estendido de quarta geração (Ext4) não conseguem concluir as operações de expansão.

Etapas de expansão

Passo 1. Instalar o SSD

Siga as etapas nas Instruções de Hardware para instalar o SSD no reComputer.

Passo 2. Preparar o SSD

Use o atalho Ctrl+F ou clique no ícone do Ubuntu no canto superior esquerdo para procurar por Disks e abrir a ferramenta Disks que vem com o Ubuntu 18.04.

Selecione seu SSD no lado esquerdo e, em seguida, selecione Format Disk no canto superior direito, abaixo da barra de menu.

Formate seu SSD para o formato GPT. Uma janela pop‑up aparecerá pedindo para você confirmar e inserir a senha de usuário.

Em seguida, clicamos no + do meio para adicionar uma letra/unidade de disco.

Clique em "Next".

Dê um nome ao seu SSD e selecione Ext4 no tipo e clique em "Create". Neste ponto concluímos a preparação do SSD de acordo com os requisitos de expansão.

Passo 3. Construir o diretório raiz no SSD

Use o comando git para baixar para o reComputer os arquivos de script de que precisamos.

git clone https://github.com/limengdu/rootOnNVMe.git
cd rootOnNVMe/

Em seguida, execute o seguinte comando para construir no SSD os arquivos do diretório raiz da eMMC; o tempo de espera desta etapa depende do tamanho do diretório raiz que você está usando.

./copy-rootfs-ssd.sh

Passo 4. Configurar o ambiente e concluir a expansão

Execute o comando a seguir para concluir a configuração do rootfs.

./setup-service.sh

Quando você reiniciar o reComputer, verá que a eMMC se tornou um dispositivo de armazenamento externo na interface principal e verá que a pegada do sistema foi reduzida, então a expansão foi bem-sucedida.

!!!Attention O caminho padrão do SSD no arquivo de script é /dev/nvme0n1p1, que também é o caminho atribuído por padrão pelo reComputer. Se você descobrir que o caminho do seu SSD não coincide com esse ao usar o comando sudo fdisk -l, altere o caminho de todos os /dev/nvme0n1p1 nos arquivos copy-rootfs-ssd.sh, data/setssdroot.service e data/setssdroot.sh em rootOnNVMe para o caminho em que o seu SSD está localizado.

A expansão acima não removerá o conteúdo original do diretório raiz da eMMC. Se você não quiser inicializar a partir do SSD, pode remover o SSD e o sistema ainda será inicializado a partir da eMMC.

Expansão de capacidade via dispositivo de armazenamento USB

Dispositivos de armazenamento USB, como pendrives USB e discos rígidos portáteis, são amplamente usados como armazenamento externo em várias áreas da vida, e a expansão via USB também é aplicável ao reComputer. A tabela a seguir lista os produtos reComputer que atualmente estão disponíveis para soluções de expansão via USB.

ProdutoreComputer J1010
SKU110061362
Vista lateral
Módulo equipadoJetson Nano 4G
Placa carregadora em operaçãoplaca carregadora J1010

A maior vantagem de fazer a expansão por meio de dispositivos de armazenamento USB em vez de SSDs é o alto grau de conveniência dos dispositivos USB e a simplicidade de removê‑los. No entanto, mesmo com a interface USB 3.2 de alta velocidade, a taxa de transferência de dados é muito menor do que a do barramento PCIe padrão, portanto o método de expansão com SSD é superior em termos de estabilidade, confiabilidade e velocidade de transferência de dados.

Requisitos de Software e Hardware

As seguintes condições precisam ser atendidas para a solução de expansão usando USB, que é o requisito básico para verificar se a expansão pode ser feita com sucesso.

requisitos de software e hardware
reComputer para JetsonVersões do JetPack 4.4 ~ 4.6
O módulo equipado precisa ser Jetson Nano
Dispositivos de armazenamento USBOs dispositivos de armazenamento USB precisam usar sistema de arquivos de quarta geração estendida (Ext4)
Corrente de alimentação do dispositivo de armazenamento USB ≤ 0,5 A

!!!Attention A versão atualizada do JetPack não foi testada para expansão, portanto a estabilidade ou o sucesso da expansão não podem ser garantidos, siga este tutorial com atenção.

Dispositivos de armazenamento USB de grande capacidade exigem que o reComputer seja alimentado corretamente para manter o funcionamento adequado, e dispositivos de armazenamento USB com capacidade acima de 512 GB não são recomendados. Alimentação insuficiente pode fazer com que o reComputer desligue.

Módulos equipados que não sejam Jetson Nano não suportam expansão usando este método no momento.

Dispositivos de armazenamento com sistemas de arquivos que não sejam de quarta geração estendida (Ext4) não conseguem concluir as operações de expansão.

Etapas de expansão

Etapa 1. Preparar os arquivos necessários

Use o comando git para baixar para o reComputer os arquivos de script de que precisamos.

git clone https://github.com/limengdu/bootFromUSB.git
cd bootFromUSB

Etapa 2. Preparar o dispositivo de armazenamento USB

Conecte um dispositivo de armazenamento USB ao reComputer e abra a ferramenta Disks que acompanha o Ubuntu 18.04 usando o atalho Ctrl+F ou clicando no ícone do Ubuntu no canto superior esquerdo e procurando por Disks.

Selecione seu dispositivo de armazenamento USB no lado esquerdo e, em seguida, selecione Format Disk no canto superior direito, abaixo da barra de menu.

Formate o seu dispositivo de armazenamento USB para o formato GPT. Uma janela pop‑up aparecerá pedindo para você confirmar e inserir a senha de usuário.

Em seguida, clicamos no + do meio para adicionar um caractere de disco.

Clique em "Next".

Dê um nome ao seu dispositivo de armazenamento USB e selecione Ext4 em type e clique em "Create". Neste ponto, já concluímos a preparação do dispositivo de armazenamento USB de acordo com os requisitos de expansão.

Etapa 3. Montar um dispositivo de armazenamento USB

O dispositivo de armazenamento USB preparado de acordo com a etapa 2 pode ser visto no software Disks como não montado.

!!!Note Se você perceber que seu dispositivo USB foi montado automaticamente após a formatação, pule esta etapa.

Usamos o seguinte comando para montar o dispositivo USB.

mkdir /media/USB/
sudo mount <USB Device Path> /media/USB/

Onde <USB Device Path> se refere ao caminho do dispositivo de armazenamento USB, esse parâmetro pode ser visto em Device no software Disks ou pode ser consultado com o comando sudo fdisk -l. Por exemplo, para o meu dispositivo USB, posso montar /dev/sda1 em /media/USB/ com o seguinte comando.

sudo mount /dev/sda1 /media/USB/

Use o seguinte comando para verificar o local de montagem do dispositivo.

sudo findmnt -rno TARGET <USB Device Path>

Para o meu dispositivo USB, os comandos que preciso usar são:

sudo findmnt -rno TARGET /dev/sda1

Etapa 4. Copiar o sistema para um dispositivo de armazenamento USB

O script copyRootToUSB.sh copia o conteúdo de todo o sistema eMMC para o dispositivo de armazenamento USB. Claro, o dispositivo de armazenamento USB deve ter mais espaço de armazenamento do que o eMMC.

O comando usado é o seguinte.

usage: ./copyRootToUSB.sh [OPTIONS]
-d | --directory Directory path to parent of kernel

-v | --volume_label Label of Volume to lookup

-p | --path Device Path to USB drive (e.g. /dev/sda1)

-h | --help This message

Em geral, para necessidades regulares de expansão, podemos simplesmente selecionar -p no parâmetro [OPTIONS] e, depois, precisamos adicionar o caminho do dispositivo USB (por exemplo, /dev/sda1), que obtivemos na etapa 3. Por exemplo, para o meu dispositivo USB, o comando completo que preciso usar é:

./copyRootToUSB.sh -p /dev/sda1

O tempo que esse comando leva para ser executado depende do tamanho dos arquivos armazenados no seu eMMC.

Etapa 5. Consultar o UUID dos dispositivos USB

Para garantir, precisamos procurar o UUID do dispositivo USB.

./partUUID.sh 

O caminho padrão para este comando é sda1 (/dev/sda1), mas você também pode determinar o UUID de outros dispositivos USB. Especifique /dev/ usando a flag -d. Por exemplo, para o meu dispositivo USB seria:

$ ./partUUID.sh -d sdb1

UUID of Disk: /dev/sdb1
e34d67bb-83bb-4fc5-b9a4-a1388d2b2be5
Sample for /boot/extlinux/extlinux.conf entry:
APPEND ${cbootargs} root=UUID=e34d67bb-83bb-4fc5-b9a4-a1388d2b2be5 rootwait rootfstype=ext4

!!!Attention Se o UUID retornado for diferente em formato e comprimento do exemplo acima, então o dispositivo provavelmente não foi formatado como Ext4, comece novamente a partir da etapa 2!

Etapa 6. Modificar a configuração de boot para concluir a expansão

Primeiro, precisamos fazer um backup do arquivo de configuração de boot.

sudo cp /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.bak

Esta etapa é a mais importante e perigosa na operação de expansão do dispositivo USB. Edite o arquivo /boot/extlinux/extlinux.conf e /media/nvidia/boot/extlinux/extlinux.conf, depois adicione uma entrada para apontar para o novo rootfs, o local é o caminho do dispositivo USB, preencha‑o no parâmetro <path> abaixo. As informações de caminho são obtidas na etapa 3.

$ sudo vi /boot/extlinux/extlinux.conf
$ sudo vi /media/nvidia/boot/extlinux/extlinux.conf

LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
INITRD /boot/initrd
APPEND ${cbootargs} quiet root=<path> rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 sdhci_tegra.en_boot_part_access=1

Para o dispositivo de armazenamento USB que estou usando, o arquivo /boot/extlinux/extlinux.conf e /media/nvidia/boot/extlinux/extlinux.conf modificados ficam da seguinte forma:

TIMEOUT 30
DEFAULT primary

MENU TITLE L4T boot options

LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
INITRD /boot/initrd
APPEND ${cbootargs} quiet root=/dev/sda1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 sdhci_tegra.en_boot_part_access=1
# APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 sdhci_tegra.en_boot_part_access=1

# When testing a custom kernel, it is recommended that you create a backup of
# the original kernel and add a new entry to this file so that the device can
# fallback to the original kernel. To do this:
#
# 1, Make a backup of the original kernel
# sudo cp /boot/Image /boot/Image.backup
#
# 2, Copy your custom kernel into /boot/Image
#
# 3, Uncomment below menu setting lines for the original kernel
#
# 4, Reboot

# LABEL backup
# MENU LABEL backup kernel
# LINUX /boot/Image.backup
# INITRD /boot/initrd
# APPEND ${cbootargs}

Salve o arquivo e reinicie o reComputer, a raiz do sistema será alternada para o dispositivo de armazenamento USB e a expansão estará concluída.

Restaurar backup do sistema via console serial

Quando o seu sistema não inicializa corretamente devido a um erro, ou por algum outro motivo (um cenário comum é que o ícone da Nvidia fique reaparecendo na inicialização), então o backup que você fez durante a expansão terá um papel importante. Entendemos sua ansiedade neste momento, mas tenha paciência e siga as etapas abaixo para colocar o reComputer no console serial e operaremos o U‑boot para restaurar o seu backup.

Preparação de material

Preparação de materialDescrição
Host Ubuntu x1
Não é possível acessar o sistema reComputer Jetson x1
Módulo UART para USB x1
Fio DuPont fêmea para fêmea x3

Etapas para acessar o console serial

Passo 1. Conectando o módulo UART para USB ao reComputer

Conecte o reComputer ao módulo UART para USB de acordo com as instruções de fiação na tabela abaixo.

reComputerMódulo UART para USB
GND-->GND
UART TXD-->RX
UART RXD-->TX

!!!Tip A interface VCC entre o reComputer e o módulo UART para USB não precisa ser conectada.

O reComputer não precisa ser ligado por enquanto depois que o cabo estiver conectado, então, por favor, deixe-o de lado por enquanto.

Desconecte a memória externa expandida.

Passo 2. Instalar e iniciar o minicom no host Ubuntu

Se o seu host Ubuntu não tiver o minicom instalado, você pode instalar o minicom no seu computador com o seguinte comando.

sudo apt-get install minicom

Após aguardar a conclusão da instalação, insira o comando para iniciar o minicom.

sudo minicom

Passo 3. Preparando-se para configurar o minicom

Na barra de menu do minicom, abrimos a porta serial e a configuramos para que possamos obter as informações de inicialização do reComputer por meio do minicom. Na barra de menu, pressione a tecla o do teclado para acessar a tela de configuração. Use as setas para cima e para baixo do teclado para mover o cursor até Serial port setup.

Passo 4. Conectando o reComputer ao host Ubuntu

Neste momento, criamos uma nova janela de linha de comando e inserimos comandos na janela para monitorar o acesso do novo dispositivo.

dmesg --follow

Neste ponto, ligaremos o reComputer e conectaremos o módulo UART para USB com o reComputer conectado ao host Ubuntu via porta USB. A janela da linha de comando mostrará o nome do dispositivo recém-conectado, precisamos encontrar o fragmento começando com tty e anotá-lo.

Passo 5. Operação U-boot

Volte ao minicom e preencha o nome do dispositivo obtido no passo 4 em Serial Device. Além disso, verifique se a taxa de baud está configurada para 115200.

Depois de modificar, pressione Enter para salvar. Selecione Save setup as dfl e saia da interface do minicom.

Insira novamente o comando sudo minicom e, depois de entrar no minicom, veremos as informações de inicialização do reComputer na janela.

Podemos solucionar por que o reComputer falha ao inicializar usando as informações retornadas e usando a ajuda de comandos para ver todos os comandos disponíveis no sistema U-boot. Saber como usar esses comandos é necessário para resolver o problema, mas, é claro, pode ser difícil.

Tegra210 (P3450-0000) # help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
blkcache - block cache diagnostics and control
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootefi - Boots an EFI payload from memory
bootelf - Boot from an ELF image in memory
booti - boot Linux kernel 'Image' format from memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootvx - Boot vxWorks from an ELF image
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dfu - Device Firmware Upgrade
dhcp - boot image via network using DHCP/TFTP protocol
dm - Driver model low level access
echo - echo args to console
editenv - edit environment variable
enterrcm - reset Tegra and enter USB Recovery Mode
env - environment handling commands
exit - exit script
ext2load - load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
ext4load - load binary file from a Ext4 filesystem
ext4ls - list files in a directory (default /)
ext4size - determine a file's size
ext4write - create a file in the root directory
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatmkdir - create a directory
fatrm - delete a file
fatsize - determine a file's size
fatwrite - write file into a dos filesystem
fdt - flattened device tree utility commands
fstype - Look up a filesystem type
go - start application at address 'addr'
gpio - query and control gpio pins
gzwrite - unzip and write memory to block device
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
imxtract - extract a part of a multi-image
itest - return true/false on integer compare
ln - Create a symbolic link
load - load binary file from a filesystem
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
ls - list files in a directory (default /)
lzmadec - lzma uncompress a memory region
md - memory display
mii - MII utility commands
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mw - memory write (fill)
nm - memory modify (constant address)
nvme - NVM Express sub-system
part - disk partition related commands
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
pxe - commands to get and boot from pxe files
reset - Perform RESET of the CPU
run - run commands in an environment variable
save - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv - set environment variables
sf - SPI flash sub-system
showvar - print local hushshell variables
size - determine a file's size
sleep - delay execution for some time
source - run script from memory
sspi - SPI utility command
sysboot - command to get and boot from syslinux files
test - minimal test like /bin/sh
tftpboot - boot image via network using TFTP protocol
true - do nothing, successfully
ums - Use the UMS [USB Mass Storage]
unzip - unzip a memory region
usb - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version

Suporte Técnico e Discussão de Produto

Obrigado por escolher nossos produtos! Estamos aqui para lhe fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja o mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...