Cover for Expandindo armazenamento do meu homelab post

Expandindo armazenamento do meu homelab

De 64GB a 1TB no Raspberry PI 5

De volta pra me divertir

Já faz um tempo que não posto por aqui, ano complicado, reforma em casa, trabalho novo, promoções e mudanças em perspectivas pessoais (passei fazer academia e me tornei menos disposto a digitar minhas RANT’s).

Alguns projetos foram pro lixo, outros vieram com força, em vez de coisas promissoras e automações que não me levaram a lugar nenhum, decidi voltar a fazer posts com coisas que gosto (Python, Open Source e Raspberry PI).

Hoje é apenas o primeiro passo de projetos atrasados que eu tinha pro meu Raspberry, me arrependo um pouco de ter comprado a versão de 4GB de RAM, talvez não dê pra fazer o hometeater que eu queria ou o NAS que eu planejei, mas 4GB de RAM pra coisas como NextCloud são interessantes.

Com o tictac do final do ano batendo em minha porta, decidi fazer um post sobre filesystens e hardwares, nem um pouco influenciado por esse post do Fábio Akita aqui

O que eu precisei comprar pra fazer isso?

Para poder utilizar todo o poder do Raspberry, eu comprei um adaptador USB 3.0/Sata, esse tipo de adaptador só funciona para HDD de notebook (que é o meu caso) e SSD, se você tem os HDD de computador mesmo, precisa de algo que possua uma fonte de alimentação adequada.

O dispotivo que eu comprei , foi de fabricação genérica, mas um similar que achei na internet foi este aqui

Vamos começar

Eu vou considerar que você leu o meu post sobre LLM para coisas pequenas e j;a tem seu RPI instalado e disponivél via SSH

E sim, esse é mais um post de sequencia de terminal.

AVISO

Antes de começar , certifique-se de saber se seu HDD possui dados, pois no processo iremos refazer a partição e formatar o mesmo para aplicar o filesystem correto.

Entendendo o HDD

Para termos detalhes do nosso HDD atualmente, ao conectar este na porta USB por meio do adaptador SATA (por favor use adaptadores e portas USB 3.0), podemos ver informações do nosso disco com o comando lsblk

No meu primeiro momento o output desse comando foi isso aqui:

v_raton@oberon:~$ lsblk                  
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 931.5G  0 disk 
|-sda1        8:1    0   512M  0 part 
`-sda2        8:2    0   931G  0 part /media/v_raton/5bf2ac1a-8132-4552-9a85-3223b6e84d64
                                      /media/devmon/sda2-usb-JMicron_Generic_
mmcblk0     179:0    0  29.7G  0 disk 
|-mmcblk0p1 179:1    0   512M  0 part /boot/firmware
`-mmcblk0p2 179:2    0  29.2G  0 part /

Podemos identificar o nosso HDD como sda, visto que mmcblk0 representa o nosso microSD onde o SO do RPI está alocado (32GB+-)

Curioso é que a partição sda1 não foi montada de imediato, acredito que foi algum tipo de warnup, visto que ao reconectar tudo pareceu normal em seguida mas o seníl aqui esqueceu de copiar e colar o output.

Desmontando as partições

Não vou entrar em muitos detalhes sobre o que é montagem de disco, pois o Post do akita fala sobre isso, mas , a nivél de conhecimento, seria a idéia de que um dispositivo de armazenamento quando conectado é entendido como tal, em seguida os seus arquivos são “conectados” a um ponto do filesystem do sistema operacional, isso seria em curtos termos o conceito de montagens, você pode não ter ouvido falar dessa palavra, mas quando você clica em “Remover dispositivo com segurança” no Windows, o que ele está fazendo é a desmontagem do volume do disco conectado.

Para desmontar as partições, basta executar o comando sudo umount /dev/<alias_partition> onde <alias_partition> seria o nome que aparece no comando anterior, nesse meu caso, esse HDD estava com duas partições

No meu caso eu executo duas vezes para a partição sda1 e sda2, assim tendo os seguintes comandos:

sudo umount /dev/sda1
sudo umount /dev/sda2

Entre os comandos executados , você pode acompanhar o desmonte do disco, usando o comando lsblk

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 931.5G  0 disk 
|-sda1        8:1    0   512M  0 part 
`-sda2        8:2    0   931G  0 part /media/devmon/sda2-usb-JMicron_Generic_
mmcblk0     179:0    0  29.7G  0 disk 
|-mmcblk0p1 179:1    0   512M  0 part /boot/firmware
`-mmcblk0p2 179:2    0  29.2G  0 part /
v_raton@oberon:~$ lsblk                
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 931.5G  0 disk 
|-sda1        8:1    0   512M  0 part 
`-sda2        8:2    0   931G  0 part 
mmcblk0     179:0    0  29.7G  0 disk 
|-mmcblk0p1 179:1    0   512M  0 part /boot/firmware
`-mmcblk0p2 179:2    0  29.2G  0 part /

Apagando as partições

Após desmontar as partições, é preciso apagar as mesmas, para isso basta utilizar a ferramenta fsdik no modo interativo.

Primeiro vamos executar esta ferramenta em modo interativo para o sda com o seguinte comando:

sudo fsdik /dev/sda

Isso vai te levar a um prompt, não fique asustado, primeiro vamos usar o comando d para apagar as partições, caso tenha mais de uma , selecione o nùmero da partição e repita este passo até apagar todas as partições

Em seguida use o comando w para sobrescrever a tabela de partições com esse ajuste.

Saindo deste shell e usando o comando lsblk vemos que as partições foram apagadas:

``NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 931.5G  0 disk
mmcblk0     179:0    0  29.7G  0 disk
|-mmcblk0p1 179:1    0   512M  0 part /boot/firmware
`-mmcblk0p2 179:2    0  29.2G  0 part 

Criando uma nova partição

Essa partição que iremos criar , vai ser para o disco sda, vamos utilizar a ferramenta fdisk novamente.

Após acessar o fsdik, iremos usar o comando n para criar uma nova partição.

Aqui você pode configurar como quiser, eu preferi configurar uma partição única no disco inteiro , possa ser que ele pergunte sobre uma assinatura de partição vfat a ser apagada, basta confirmar.

Eu usei todos os valores padrão.

v_raton@oberon:~ $ sudo fdisk /dev/sda

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


Command (m for help): n
Partition number (1-128, default 1):
First sector (34-1953525134, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525134, default 1953523711):

Created a new partition 1 of type 'Linux filesystem' and of size 931.5 GiB.
Partition #1 contains a vfat signature.

Do you want to remove the signature? [Y]es/[N]o: y

The signature will be removed by a write command.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Podemos ver o resultado com o já conhecido comando fsblk, mas podemos usar o comando fdisk para ver as partições:

sudo fdisk -l /dev/sda

Normalmente irá aparecer os detalhes do disco no final, o meu ficou mais ou menos assim:

Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: Generic
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 9DAF71C9-BEA2-4C58-9A8F-AB015307915D

Device     Start        End    Sectors   Size Type
/dev/sda1   2048 1953523711 1953521664 931.5G Linux filesystem

Dessa forma temos o disco sda que pode ser localizado no path /dev/sda. e sua respectiva única partição sda1 que pode ser localizada em /dev/sda1, isso significa que o nosso sistema operacional irá tratar o disco como um dispositivo e a partição como outro dispositivo, curioso não?

Criando um filesystem

Antes de realizar o nosso próximo passo temos que entender um pouco o que é um filesystem.

Filesystem é uma definição de sistema de arquivos que vai determinar como o sistema operacional irá interoperabilizar os arquivos.

Se você deseja criar algo que possa ser acessado via rede a partir de um computador não-linux, pode-se usar o nfs , existem alguns tutoriais de como fazer isso, mas neste meu caso , irei optar por um sistema de arquivos do tipo ext4, já que meu Raspberry não possui tanto recurso pra ficar lhedando com arquivo em rede, e não é do meu interesse visto que coisas como Syncthing atendem muito melhor às minhas necessidades, porém nfs pode ser interessante em casios de disco compartilhados em ambiente empresarial ou de automações.

Então sem mais delongas, vamos criar nosso sistema de arquivos:

sudo mkfs -t ext4 /dev/sda1

Estamos usando a partição sda1 , que foi criada no passo anterior

O output desse comando pode demorar um pouco pra executar, no meu caso usando um HDD de 750rpm Seagate Barracuda de 1TB que já tinha bastante tempo de uso foi coisa de 10s, o resultado impresso em tela foi este:

mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 244190208 4k blocks and 61054976 inodes
Filesystem UUID: 41ac6003-2512-477f-b774-78895106d83f
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

Vamos montar!!!!

Esta é a penúltima etapa do nosso processo e a mais “complicada”, assim como desmontamos o disco, agora que temos nosso filesystem, precisamos montar ele de novo, seria o equivalente à ligar, você pode pensar em desconectar e conectar de novo, mas isso iria montar ele como device externo, queremos que essa montagem seja feita de uma forma que possamos, no ùltimo passo, realizar a montagem automática no boot do sistema.

Eu vou considerar que a esta altura do campeonato você já conhece os comandos mdkr, chown e quais os usergroups.

Você deve tanbém ter de antemão o nome e o usergroup de seu usuário do Raspberry, uma forma de descobrir isso é com o comando who para o username e id -Gn para os nomes dos grupos, mas se você seguiu o que eu fiz no meu guia de id LLM para coisas pequenas, basta usar o username como grupo, no meu caso v_raton

Então vamos lá:

  1. Criando pasta para montagem
sudo mkdir /mnt/hd1
  1. Habilitando o owner
sudo chown -R v_raton:v_raton /mnt/hd1
  1. Descobrindo o UUID da partição:

Este passo é importante, pois para cada disco, é criado um UUID, dessa forma, poderemos no próximo passo configurar para que o sistema monte automaticamente a partição com base no UUID.

sudo blkid | grep sda1

Este comando resulta em um output +- assim:

/dev/sda1: UUID="41ac6003-2512-477f-b774-78895106d83f" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="2225e7fe-b823-2a44-890f-0a3d6e942b13"
  1. Atualizando o arquivo fstab

A parte legal do linux, é que de certa forma, tudo é um arquivo ou pasta, não sendo diferente para as partições montadas no boot do sistema, e sim, em tese daria pra deixar um “pendrive” como disco a ser montado no boot, de certa forma, é assim que funcionam as live ISO de coisas como o Linux Mint.

Antes de ir para o próximo passo, certifique-se de ter instalado algum editor de texto de linha de comando, eu , particulamente vou usar o vim que já vem no Raspibian.

sudo vi /etc/fstab

Editando o arquivo fstab

O arquivo fstab tem de ser editado com muito cuidado, primeiro ponto é que cada linha, será iterada na inicialização para que seja feita a montagem de cada disco.

O seu arquivo vai iniciar +- assim:

proc            /proc           proc    defaults          0       0
PARTUUID=2cfd61b5-01  /boot/firmware  vfat    defaults          0       2
PARTUUID=2cfd61b5-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

Vamos entender as colunas:

Para entender mais sobre a fstab, existe esse blogpost do Diolinux, recomendo muito a leitura.

nossa linha ficará mais ou menos assim:

UUID=41ac6003-2512-477f-b774-78895106d83f       /mnt/hd1        ext4    defaults        0       1

Por fim , nosso arquivo ficaria assim:

proc            /proc           proc    defaults          0       0
PARTUUID=2cfd61b5-01  /boot/firmware  vfat    defaults          0       2
PARTUUID=2cfd61b5-02  /               ext4    defaults,noatime  0       1
UUID=41ac6003-2512-477f-b774-78895106d83f       /mnt/hd1        ext4    defaults        0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

Vamos montar com o comando mount:

sudo mount -a

Você pode receber o aviso sobre o systemd ainda não ter atualizado corretamente as informações, isso é normal.

Mas agora podemos usar o lsblk para ver o resultado:

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 931.5G  0 disk
`-sda1        8:1    0 931.5G  0 part /mnt/hd1
mmcblk0     179:0    0  29.7G  0 disk
|-mmcblk0p1 179:1    0   512M  0 part /boot/firmware
`-mmcblk0p2 179:2    0  29.2G  0 part /

Um detalhe para garantir que possamos manipular esse HDD, seria adicionar permissões nele para nosso usuário, usando o comando abaixo:

sudo chmod -R 777 /mnt/hd1

Testando 1, 2….

Agora vamos testar se conseguimos ler e escrever no disco.

Vamos criar um arquivo e escrever nele o output do nosso comando screenfetch ou qualquer outra coisa como o cowsay:

screenfetch > /mnt/hd1/teste.txt

Vamos reiniciar o sistema para testar se conseguimos ler o conteúdo do arquivo:

sudo reboot

E vamos ver se conseguimos ler o conteúdo do arquivo após o reboot e a reconexão ao sistema via SSH:

cat /mnt/hd1/teste.txt

E voualá! (No editor de texto fica certim, mas aqui no post a logo ficou toda deformada KKKKK)

         _,met$$$$$gg.           v_raton@oberon
      ,g$$$$$$$$$$$$$$$P.        OS: Debian 12 bookworm
    ,g$$P""       """Y$$.".      Kernel: aarch64 Linux 6.6.51+rpt-rpi-2712
   ,$$P'              `$$$.      Uptime: 13d 20h 37m
  ',$$P       ,ggs.     `$$b:    Packages: 1657
  `d$$'     ,$P"'   .    $$$     Shell: bash 5.2.15
   $$P      d$'     ,    $$P     Disk: 20G / 947G (3%)
   $$:      $$.   -    ,d$$'     CPU: ARM Cortex-A76 @ 4x 2.4GHz
   $$\;      Y$b._   _,d$P'      RAM: 1205MiB / 4045MiB
   Y$$.    `.`"Y$$$$P"'
   `$$b      "-.__
    `Y$$
     `Y$$.
       `$$b.
         `Y$$b.
            `"Y$b._
                `""""

Conclusão

Sim, esse guia é bem genérico, eu particulamente não lembrava de todos os comandos ou passos de cabeça (primeiro motivo pra ter feito o post em si), mas com isso podemos utilizar algumas das ferramentas de gestão do linux, sem falar que eu deixei algumas referências aos vídeos do Fàbio Akita e ao Diolinux, pois me custaria um tempo explicar aqui do zero, algo que ambos fizeram com mais detalhes e propriedade do que eu, porém eu pretendo realizar atualizações neste post ou criando um novo para explicar com mais calma os gaps que deixei aqui, afinal o objetivo desse guia é mostrar mesmo o quão poderoso e , ao mesmo tempo simples o Linux é, imagino que pra refazer isso no Windows, bem seja impossivél pois não me recordo de existir imagens do OS que suportem o Raspberry, MacOS nem se comenta…..

Referências