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 ;
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
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.