Skip to main content

203.3 Criando e Configurando opções do sistema de arquivos Linux


Este tópico trata sobre como criar e configurar algumas opções do Sistema de Arquivos do Linux como AutoMount, Criptografia e imagens para CD e DVD.



Automount


É muito usado para montar um diretório (partição) apenas quando este for usado, ou seja, a aplicação fica monitorando esse diretório, mas ele não está montado, quando você tenta acessar ele, é automaticamente montado durante o acesso (é totalmente transparente para quem vai acessar), seu uso é mais visto em conjunto com o NFS.


Tanto no CentOS/RedHat como distros Debian like, será necessário instalar o pacote chamado autofs, após instalação, p script que roda em background é chamado automount e o daemon dele será o autofs.

# Mostrando o serviço (daemon):
$ sudo systemctl status autofs
● autofs.service - Automounts filesystems on demand
Loaded: loaded (/lib/systemd/system/autofs.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-01-13 14:17:31 UTC; 1min 24s ago
Docs: man:autofs(8)
Main PID: 2762 (automount)
Tasks: 3 (limit: 2280)
Memory: 1.9M
CGroup: /system.slice/autofs.service
└─2762 /usr/sbin/automount --pid-file /var/run/autofs.pid

Jan 13 14:17:31 ubuntu2004.localdomain systemd[1]: Starting Automounts filesystems on demand...
Jan 13 14:17:31 ubuntu2004.localdomain systemd[1]: Started Automounts filesystems on demand.

# Serviço que roda em background:
$ ps aux | grep automount
root 2762 0.0 0.2 39784 4080 ? Ssl 14:17 0:00 /usr/sbin/automount --pid-file /var/run/autofs.pid

O arquivo de configuração fica em /etc/auto.master. Para inserir um diretório para esse fim temos a seguinte estrutura:

/mnt/autofs /etc/autofs.conf.my --timeout 10
1 2 3

1 = O diretório que será monitorado pelo 'autofs'; dentro desse diretório ficarão os
diretórios que serão montados.
2 = Qual arquivo vai conter os detalhes dessa montagem.
3 = O 'timeout' esperará 10 segundos depois que sair do diretório para desmontar ele.

Agora vamos preparar o ambiente para que seja montado automaticamente:

# Crie a pasta que vamos usar:
$ sudo mkdir /mnt/autofs

# Em '/etc/auto.master' adicione a linha abaixo (coloquei no começo do arquivo):
/mnt/autofs /etc/autofs.conf.my --timeout 10

# Crie o arquivo de configuração:
$ sudo touch /etc/autofs.conf.my

# Em '/etc/autofs.conf.my' adicione a linha abaixo:
teste -fstype=auto :/dev/vdb2
1 2 3

1 = Diretório que vamos acessar;
2 = Opções de montagem;
3 = Qual disco/partição será montado. Os ':' (dois pontos) indicam
que é uma montagem local.

Para montagem remota, pegue como exemplo abaixo:
teste -fstype=nfs 192.168.40.10:/dev/sdc1

# Reinicie o serviço:
$ sudo systemctl restart autofs

Agora vamos aos teste.

# Verifique se o disco/partição está montado:
$ df -h | grep vdb2

# Liste o diretório (não tem nada lá):
$ ls -l /mnt/autofs
total 0

# Acesse o diretório:
$ cd /mnt/autofs/teste

# Verifique novamente se o disco/partição está montado:
$ df -h | grep vdb2
/dev/vdb2 4.9G 20M 4.6G 1% /mnt/autofs/teste

# Liste o diretório novamente:
$ ls -l /mnt/autofs
total 4
drwxr-xr-x 3 root root 4096 Jan 14 14:01 teste

Depois saida do diretório, espere 10 (no meu caso demorou um pouco mais) segundos e veja que ele foi desmontado.



Automount usando o SystemD


Antes de começar, na LPIC-1 é demonstrado como montar discos/partições usando o SystemD, acontece que essa opção que foi mostrada na LPIC-1 é diferente do que vamos mostrar agora, vamos usar também uma unit do tipo automount, para relembrar o que foi mostrado na LPIC-1 veja aqui.


Para montarmos um disco/partição automaticamente usando o SystemD vamos usar uma unit do tipo mount e outra do tipo automount. Vamos ver os passos iniciais:

# Entre na pasta abaixo:
$ cd /etc/systemd/system

# Crie o diretório abaixo:
$ sudo mkdir -p /mnt/automount/teste

# Crie o arquivo abaixo
# (o nome do arquivo tem que dar match com o nome da Unit (troque / por -)):
$ sudo touch mnt-automount-teste.mount
### Exemplo, se o diretório de montagem for /zbc/ryt,
### o nome da unit dever ser 'zbc-ryt.mount'

# Nesse arquivo que criamos, adicione o seguinte conteúdo:
[Unit]
Description=Montagem automatica usando o SystemD

[Mount]
What=/dev/vdb2
Where=/mnt/automount/teste
TimeoutIdleSec=10

[Install]
WantedBy=multi-user.taget

Essa primeira etapa mostrada acima é exatamente como descrita no passo da LPIC-1, agora vamos o que difere no automount:

## Crie o mesmo arquivo acima mas usando a unit 'automount':
$ sudo touch mnt-automount-teste.automount

## Dentro desse arquivo adicione o seguinte conteúdo:
[Unit]
Description=Montagem automatica usando o SystemD

[Automount]
# Diretório que será monitorado; onde outros dirs serão montados.
Where=/mnt/automount/teste

[Install]
WantedBy=multi-user.taget

## Agora reinicie as configurações do SystemD:
$ sudo systemctl daemon-reload

Agora verifique se tudo funcionou:

# Verifique se o serviço está ativo:
$ sudo systemctl status mnt-automount-teste.automount
● mnt-automount-teste.automount - Montagem automatica usando o SystemD
Loaded: loaded (/etc/systemd/system/mnt-automount-teste.automount; disabled; vendor preset: enabled)
Active: active (waiting) since Fri 2022-01-14 14:39:23 UTC; 1min 32s ago
Triggers: ● mnt-automount-teste.mount
Where: /mnt/automount/teste

Jan 14 14:39:23 ubuntu2004.localdomain systemd[1]: Set up automount Montagem automatica usando o SystemD.

# Verifique se o disco/partição está montado:
$ df -h | grep vdb2

# Liste o diretório (Diferente do autofs, é mostrado a pasta mesmo que não esteja 'running' ainda):
$ ls -l /mnt/automount
drwxr-xr-x 2 root root 0 Jan 14 14:44 teste
total 0

# Acesse o diretório:
$ cd /mnt/automount/teste

# Verifique novamente se o disco/partição está montado:
$ df -h | grep vdb2
/dev/vdb2 4.9G 20M 4.6G 1% /mnt/automount/teste

# Verifique novamente o serviço:
systemctl status mnt-automount-teste.automount
● mnt-automount-teste.automount - Montagem automatica usando o SystemD
Loaded: loaded (/etc/systemd/system/mnt-automount-teste.automount; disabled; vendor preset: enabled)
Active: active (running) since Fri 2022-01-14 14:44:36 UTC; 2min 28s ago
Triggers: ● mnt-automount-teste.mount
Where: /mnt/automount/teste

Jan 14 14:44:36 ubuntu2004.localdomain systemd[1]: Set up automount Montagem automatica usando o SystemD.
Jan 14 14:46:21 ubuntu2004.localdomain systemd[1]: mnt-automount-teste.automount: Got automount request for /mnt/automount/teste, triggered by 984 (bash)


ISO9660


O ISO9660 um formato de File System para fazer gravações de CD/DVD. A LPI cobra apenas os comandos cdrecord e mkisofs, porém, esses comandos estão em desuso.


Faça a instalação dos pacotes abaixo:

## Ubuntu

# Instalando os pacotes wodim, genisoimage e udftools
sudo apt install wodim genisoimage udftools -y


## RedHat

# Instalando os pacotes wodim, genisoimage e udftools
sudo dnf install wodim genisoimage udftools -y

Ao instalar wodim e genisoimage, os comandos antigos ficam disponíveis como links:

## Ubuntu:
$ ls -lh $(which cdrecord)
lrwxrwxrwx 1 root root 5 Feb 18 2020 /usr/bin/cdrecord -> wodim

$ ls -l $(which mkisofs)
lrwxrwxrwx 1 root root 11 Feb 18 2020 /usr/bin/mkisofs -> genisoimage

## CentOS 8:
$ ls -lh $(which cdrecord)
lrwxrwxrwx. 1 root root 26 Jan 25 00:08 /bin/cdrecord -> /etc/alternatives/cdrecord

$ ls -l $(which mkisofs)
lrwxrwxrwx. 1 root root 25 Jan 25 00:08 /bin/mkisofs -> /etc/alternatives/mkisofs

Vamos ver como clonar um DVD/CD e como gravar uma imagem ISO com cdrecord (wodim):

# Clonando uma ISO(CD ou DVD):
sudo dd if=/dev/sr0 of=~/clone-dvd.iso

# Gravando uma imagem ISO:
sudo cdrecord dev=/dev/sr0 ~/clone-dvd.iso


MKISOFS


Esse utilitário é usado para criar uma imagem do tipo ISO usando arquivos comuns.

# Criando uma ISO contendo tudo da pasta Download:
mkisofs -o download.iso ~/Downloads

Esse é o seu uso mais básico, vamos ver algumas opções que podemos usar em conjunto:

OpçãoDescrição
-graft-pointsÉ usada para criar diretórios na Raiz da ISO, sem isso, os arquivos que estão na raiz do
diretório que foi usado para criar a ISO não vão existir.
-JConhecida como Joilet, é usada para abrir a ISO no Windows, além disso, tras a funcionalidade
de nomes longos e o Unicode (uma codificação).
-RConhecida como Rock Ridge, similar a opção acima, mas implementa o uso de link simbólico e permissões de arquivos.
-HFSUsado para Sistemas da Apple.
-udfÉ a evolução do ISO9660, muito usado em DVD, visa resolver todos os problemas do
formato 9660 e resolve o problema de limitações de seu predecessor.
-eltorito-alt-bootUsado para criar um disco bootavel.

As opções -J, -R, -HFS e -udf são extensões usadas em forma de argumentos, essas extensões foram criadas por causa das limitações do ISO9660, visando melhorar o File System em alguns aspectos.


Vamos ver na prática o uso de algumas opções:

# Colocando 2 diretórios na raiz:
mkisofs -o ~/download-folder.iso -graft-points download=~/Downloads/ tempdir=/tmp
## Dessa forma, ao invés de pegar apenas os itens dentro de '~/Downloas' e '/tmp' e deixar na raiz,
## Ele irá deixar a pasta 'Download' e 'tmp' (com outro nome no nosso caso):

$ mount download-folder.iso /mnt/

$ ls /mnt/
download tempdir


Criptografia com DM-Crypt e Luks


Vamos ver como criptografar os dados de um disco (serve para partições também), dessa forma mantemos um certo nível se segurança, dessa forma, somente quem possui a senha poderá ver o que tem dentro do disco.


Vamos instalar as ferramentas para trabalhar com criptografia em disco:

# Instale o 'cryptsetup', ele fornece suporte para criptografia de disco:
$ sudo apt install -y cryptsetup

Com o cryptsetup vamos trabalhar com dois tipos de encriptação, um deles é mais conhecido e mais usado, que é chamado de LUKS, já o segundo não é tão usado assim, chamado dm-crypt.


O LUKS é um padrão de formatação para volumes criptografados. Ele define uma estrutura de metadados no início do dispositivo que armazena múltiplos "key slots", até 8 por padrão. Isso permite, por exemplo, que diferentes usuários (ou senhas) possam desbloquear o mesmo volume. Além disso, essa estrutura facilita operações como:

  • alteração ou revogação de senhas sem recriptografar todo o volume;
  • uso de cabeçalhos de backup para recuperação;
  • integração com crypttab, systemd, dracut, initramfs, etc.;
  • suporte mais robusto e padronizado em distribuições modernas.

Já o dm-crypt sem LUKS é uma abordagem mais simples e direta, você criptografa o dispositivo sem armazenar nenhum metadado, sem cabeçalho, sem slots de chave. A senha (ou chave) precisa ser fornecida de forma direta sempre que o volume for aberto, e não há suporte para múltiplas senhas ou manipulação de slots.


Essa abordagem pode ser útil em situações extremamente minimalistas ou quando o objetivo é evitar qualquer tipo de assinatura visível (por exemplo, para dificultar a detecção de que o volume está criptografado). No entanto, ela exige muito mais cuidado:

  • você precisa saber exatamente quais parâmetros de encriptação foram usados;
  • não há como recuperar o volume se você perder a chave ou senha;
  • não há suporte nativo para troca de senha ou backup de cabeçalho.

O luks é mais usado por servir para a maioria dos casos, já o dm-crypt é usado em casos bem especificos e necessita de um conhecimento bem aprofundado para não cometer erros.

ATENÇÃO

Os passos demonstrados desse ponto em diante vão destruir os dados no HD, por isso certifique-se de usar uma máquina virtual com um HD onde não tenha problemas em perder os dados.



Vamos começar a trabalhar com o CryptSetup:

# Vamos formatar a partição com Luks e definir uma senha:
$ sudo cryptsetup -v --verify-passphrase luksFormat /dev/vdb
WARNING: Device /dev/vdb already contains a 'dos' partition signature.

WARNING!
========
This will overwrite data on /dev/vdb irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/vdb:
Verify passphrase:
Existing 'dos' partition signature (offset: 510 bytes) on device /dev/vdb will be wiped.
Key slot 0 created.
Command successful.

# Podemos rodar o comando abaixo para verificar que possui criptografia:
$ lsblk -f /dev/vdb
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
vdb crypto_LUKS 5767bbbf-10ea-4a12-af0b-65ff24e52f27

# Vamos criar um device mapper para conseguir montar o disco:
$ sudo cryptsetup luksOpen /dev/vdb crypt_vdb
Enter passphrase for /dev/vdb:

# Agora podemos format e depois montar:
$ sudo mkfs.ext4 /dev/mapper/crypt_vdb
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 2617344 4k blocks and 655360 inodes
Filesystem UUID: dd0423cf-9f31-47c6-80c6-06ef77a366f4
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

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

# Verifique o status:
$ sudo cryptsetup status crypt_vdb
/dev/mapper/crypt_vdb is active.
type: LUKS2
cipher: aes-xts-plain64
keysize: 512 bits
key location: keyring
device: /dev/vdb
sector size: 512
offset: 32768 sectors
size: 20938752 sectors
mode: read/write

# Podemos montar e usar normalmente:
$ sudo mount /dev/mapper/crypt_vdb /mnt/

# Verifique se montou:
$ df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/crypt_vdb 9.8G 37M 9.3G 1% /mnt

# Podemos fechar a conexão (fechar o mapper) com o comando abaixo,
# primeiro desmonte o disco caso esteja montado:
$ sudo cryptsetup close crypt_vdb
# Caso deseje usar novamente precisa abrir a conexão (luksOpen)!

# Podemos ver todos os discos criptografados com conexões abertas:
$ sudo dmsetup ls
crypt_vdb (253:0)

Agora podemos montar esse disco no boot:

# Crie o arquivo abaixo:
$ sudo vim /etc/crypttab

# <target name> <source device> <key file> <options>
crypt_vdb /dev/vdb none luks

No lugar de none podemos usar um arquivo contendo a senha para decriptar o disco. Em luks é porque vamos usar o luks, mas poderia ser dm-crypt caso estivéssemos usando ele.


Agora configure o /etc/fstab:

$ sudo vim /etc/fstab

/dev/mapper/crypt_vdb /mnt/crypt_vdb auto defaults 0 0

Certifique-se de que /mnt/crypt_vdb exista.


Caso queira colocar a senha num arquivo, siga o passo a passo abaixo:

# Crie o arquivo abaixo:
$ sudo vim /etc/crypttab

# <target name> <source device> <key file> <options>
crypt_vdb /dev/vdb /root/.crypt luks

Agora crie o arquivo com a senha:

# Crie o arquivo e adicione a senha dentro dele:
$ sudo vim /root/.crypt

# Adicione a senha que está dentro arquivo como uma nova chave de autenticação:
$ sudo cryptsetup luksAddKey /dev/vdb /root/.crypt
Enter any existing passphrase:


luksDump e os Key Slots


Com o Luks é armazenado as chaves de acesso em Key Slots, estes por sua vez ficam no cabeçalho do disco que foi formatado com o Luks, o limite de chaves ou de Key Slotes é de 8 por disco ou partição, veja abaixo como ver essa informação:

$ sudo cryptsetup luksDump /dev/vdb
LUKS header information
Version: 2
Epoch: 4
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 2d1f8ea9-307f-42f3-9264-f56921eb61ef
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)

Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]

Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2i
Time cost: 4
Memory: 767183
Threads: 2
Salt: 1a 66 1a bf de 59 cc 06 55 93 ef 07 6b b8 9b 29
3d cc 38 f5 45 c5 18 70 dc 26 e9 4a c7 03 a0 6a
AF stripes: 4000
AF hash: sha256
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
1: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2i
Time cost: 4
Memory: 895268
Threads: 2
Salt: 0d d8 11 81 02 53 50 59 a7 62 82 4f 6e fb 11 c6
39 a3 28 a8 0c f9 80 78 a2 37 6b 7c 96 15 5a 84
AF stripes: 4000
AF hash: sha256
Area offset:290816 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 126273
Salt: 68 ec 99 8f 08 41 85 86 b8 30 2c 73 d9 19 49 e7
54 ac 25 be d1 4f 52 b7 85 e7 9c 6e 4f 8d e3 19
Digest: 18 78 20 af 85 74 25 58 db 37 f1 c7 71 0c ce 0d
7a a0 c2 1a b0 c4 ed ad d8 db 2a 7a fe 18 08 78

A saída pode ser diferente dependendo da versão e do dispositivo. É possível ver duas chaves (dois Key Slots) porque o primeiro é a senha de quando formatamos o disco, e a segunda chave foi adicionada para decriptar o disco durante o boot, sem ter que digitar a senha.


Podemos adicionar uma chave num key slot:

$ sudo cryptsetup luksAddKey --key-slot 7 /dev/vdb
Enter any existing passphrase:
Enter new passphrase for key slot:
Verify passphrase:

Nesse momento o disco possui 3 senhas para decriptar ele!


Podemos remover uma senha de um slot, para isso é necessário saber a senha:

$ sudo cryptsetup luksRemoveKey --key-slot 7 /dev/vdb
Enter passphrase to be deleted:

Podemos remover uma senha de um slot sem saber a senha, mas precisamos saber alguma senha válida, vamos remover a senha do slot 1:

$ sudo cryptsetup luksKillSlot /dev/vdb 1
Enter any remaining passphrase:

Pode mudar a senha:

$ sudo cryptsetup luksChangeKey --key-slot 7 /dev/vdb
Enter passphrase to be changed:
Enter new passphrase:
Verify passphrase:


Testar a senha de um Key Slot


Podemos usar o comando abaixo para testar a senha que está dentro do nosso KeySlot, dessa forma poderemos saber qual senha está armazenada ali, útil quando precisamos remover uma senha sem correr o risco de remover a errada.

$ sudo cryptsetup luksOpen --test-passphrase --key-slot 0 /dev/vdb && echo -e "\n\nSenha Correta! \n\n"
Enter passphrase for /dev/vdb:


Senha Correta!

Se você remover a opção --key-slot N, o sistema irá testar a senha para ver se ela pertence ha algum slot, mas não lhe dirá em qual slot essa senha está armazenada.



Exportar o Header e Key Slot


Podemos fazer um backup do cabeçalho e dos key slot, caso de algum problema com o header ou com os key slot podemos voltar como era antes.


AVISO IMPORTANTE: Este arquivo de backup, quando utilizado com uma senha que era válida no momento da sua criação, permite a decriptação da área de dados de um volume LUKS. Ao restaurar esse backup, todas as áreas de key slots serão sobrescritas com os dados existentes no backup. Isso significa que, mesmo que alguma senha tenha sido modificada ou removida após a criação do backup, ela será restaurada caso o cabeçalho seja importado novamente para o dispositivo LUKS.


Além disso, é importante considerar que, ao manter um backup do cabeçalho, você perde a possibilidade de inutilizar completamente um volume LUKS apenas sobrescrevendo o cabeçalho e os slots de chave. Para garantir o descarte seguro do volume, é necessário apagar todos os backups de cabeçalho ou sobrescrever completamente a área de dados criptografada.


Esta última opção, no entanto, não é totalmente confiável, pois setores individuais podem permanecer acessíveis — por exemplo, devido a mecanismos internos de gerenciamento de defeitos.

# Faça backup do cabeçalho e dos keyslots:
$ sudo cryptsetup luksHeaderBackup /dev/vdb --header-backup-file header-luks

## Mude as senhas!

# Restaure o backup:
$ sudo cryptsetup luksHeaderRestore /dev/vdb --header-backup-file header-luks

WARNING!
========
Device /dev/vdb already contains LUKS2 header. Replacing header will destroy existing keyslots.

Are you sure? (Type uppercase yes): YES

Ao fazer um backup desses, salve o arquivo num lugar seguro!