Ir para o conteúdo

OpenBSD : Arquivos como blockdevices

1. OpenBSD : Arquivos como blockdevices

Durante a sua vida num sistema *NIX você acaba esbarrando em imprevistos que te fazem querer ter uma outra partição ou disco, pelos mais variados motivos : swap area extra, segurança, testes, etcetera et al.

No GNU/Linux eu tinha o hábito de criar um arquivo e usá-lo como dispositivo de blocos ( imagem de disco ), usando o trio dd + losetup + mount. E isso, remontando o que disse anteriormente, é particularmente útil quando desejamos aplicar regras de gerenciamento que são implementadas especialmente no filesystem. No meu caso do OpenBSD eu tive um probleminha com o python e o W^X ( que é padrão desde 2016 ). Na postagem "Python e Virtualenv" esbarramos em um problema desta natureza. E a solução utilizada não foi das mais elegantes, apesar de eficaz.

Problemas como esse mencionado acima vão se tornando cada vez mais comuns, especialmente se você é um programador ( ou estudante de programação ) e precisa rodar seus códigos no seu $HOME. Aplicar a solução que eu costumava usar no Linux aqui no OpenBSD requer algumas mudanças entre o dd e o mount, como veremos a seguir.

Nota

A maior parte dos comandos mencionados ( especialmente os que lidam com montagem, particionamento e formatação de discos ) só podem ser executados como root. Portanto não devemos estranhar se recebermos um 'permission denied'.

1.1 Criando o arquivo

Eu criei um diretório no meu $HOME para armazenar esse tipo de arquivo :

mkdir $HOME/disks ;

Isso ajuda a manter as coisas organizadas. :)

Agora, assim como no GNU/Linux, usamos o dd(1) para criar o arquivo. A diferença aqui é que no dd do openbsd as unidades de medida são lowercase. Então, para criar um block device de 1GB :

dd if=/dev/zero of=${HOME}/disks/disk0.img bs=1m count=1024 ;

Perceba que se isso fosse no GNU, teriamos o bs=1M, com 'm' maiúsculo.

1.2 Criando o vnode disk driver

Similar o loop device, o vnode disk driver é o que vai tornar o arquivo que criamos acima mais parecido com um block device de fato. Primeiro devemos verificar quais vnd estão disponíveis :

Nota

Para mais informações sobre o vnd(4), consulte o manual.

vnconfig -l ;
Saída :

vnd0: covering /home/user/disks/disk0.img on sd0k, inode 1880939
vnd1: not in use
vnd2: not in use
vnd3: not in use

Percebam que temos o vnd0 ocupado por outro disco virtual. Vamos utilizar o vnd1 neste caso :

doas vnconfig vnd1 /home/user/disks/disk1.img ;

1.3 Inicializando, particionando e particionando

AVISO

As coisas podem ficar um pouco confusas aqui. Isso porque diferente do Linux, os UNIX BSD têm uma peculiaridade de subparticionar ( slices ) as partições.

"É o que!?"

Isso mesmo. Para isso vamos ter que utilizar outro post explicando por A+B como que isso funciona. Mas por hora, vamos seguir com as instruções para ter nosso volume virtual disponível.

Vamos inicializar o disco virtual. Nesse caso vamos inicializar o disco com MBR :

fdisk -iy /dev/rvnd1c

Nota

Me parece que o fdisk do OpenBSD não trabalha com dispositivos de bloco. Ao tentar particionar o disco com o fdisk, recebi um fdisk: /dev/vnd1c is not a character device.

É possível verificar com fdisk -v :

Primary GPT:
        Not Found

Secondary GPT:
        Not Found

MBR:
Disk: /dev/rvnd1c       geometry: 20971/1/100 [2097152 Sectors]
Offset: 0       Signature: 0xAA55
            Starting         Ending         LBA Info:
 #: id      C   H   S -      C   H   S [       start:        size ]
-------------------------------------------------------------------------------
 0: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
 1: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
 2: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
*3: A6      1   0  29 -  20970   0 100 [         128:     2096972 ] OpenBSD

Agora precisamos usar o disklabel para criar o slice do FFS para o OpenBSD. Lembrando que para o OpenBSD a partição "c" é uma representação do disco inteiro :

disklabel -E vnd1

Interativamente vamos criar uma partição "a" para a nossa imagem de disco :

Label editor (enter '?' for help at any prompt)
vnd1> a
partition: [a] a
offset: [128]
size: [2096972]
FS type: [4.2BSD]
vnd1*> p
OpenBSD area: 128-2097100; size: 2096972; free: 12
#                size           offset  fstype [fsize bsize   cpg]
  a:          2096960              128  4.2BSD   2048 16384     1
  c:          2097152                0  unused                    
vnd1*> q
Write new label?: [y] y

Agora, vamos criar um novo filesystem neste vnd1. Para isso, temos que chamar o newfs passando como argumento o raw device do vnd1 na partição 'c' ( que representa o disco todo ) : /dev/rvnd1 :

newfs /dev/rvnd1a
Com isso teremos um filesystem FFS ( ufs ) criado. Se fosse um filesystem linux, poderiamos utilizar o mkfs em vez do newfs. Outra possibilidade é tambem poder particionar o disco virtual.

Em seguida, podemos montar o block device ( vnd1 ) no ponto de montagem de nossa escolha com as opções do FFS:

mount -o /dev/vnd1a /home/user/mnt/test/

O resultado do comando mount :

(...)
/dev/vnd1a on /home/user/mnt/test type ffs (local)

1.4 Tornando permanente

Muito provavelmente você vai querer que sua imagem seja montada durante o boot. Para isso vamos usar o /etc/fstab e adicionar as seguintes entradas pertinentes ao nosso disco virtual :

/home/user/disks/disk1.img /dev/vnd1c            vnd rw   0 0
/dev/vnd1a                 /home/user/mnt/test/  ffs rw   0 0

Claro que as opções de montagem vão variar de acordo com o objetivo, mas já é possível se ter uma idéia de como é possível aplicar configurações de forma mais seletiva.