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) segundo 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 nomde 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 é 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: Este arquivo de backup juntamente com uma senha válida no momento em que foi realizado este backup permite que alguém faça a decriptografia da área de dados do LUKS, ao voltar esse backup todas as áreas de key slots, serão sobrescritos para o que tem no Backup; mesmo que a senha tenha sido alterada ou removida após o backup, ela será restaurada caso o arquivo de backup seja importado para o dispositivo LUKS.

Observe também que, com um backup de cabeçalho, você perde a capacidade de limpar com segurança o dispositivo LUKS apenas substituindo o cabeçalho e os slots de chave. Você também precisa apagar com segurança todos os backups de cabeçalho ou sobrescrever a área de dados criptografada. A segunda opção é menos segura, pois alguns setores podem sobreviver, por exemplo. devido ao 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!