Skip to main content

203.2 Manutenção de um sistema de arquivos Linux


Este tópico trata sobre como e quais comandos usar para fazer a manutenção do sistema de arquivo no Linux, muitos dos comandos que caem na LPIC-1 voltam a cair aqui.



Formatar uma partição​


Reveja aqui sobre mkfs, mke2fs.


A novidade aqui é o comando mkswap, que já foi visto aqui, seu uso se da para criar filesystem do tipo Swap.



DUMPE2FS​


O comando dumpe2fs pode ser usado para verificar informações do File Ssystem ext{2,3,4}, como label, tempo de verificações, última verificação, dentre muitas outras informações.


OpçãoDescrição
-hMostra informações.
-bMostra badblocks.
-fMostras mais informações que o -h, similar ao rodar o comando sem informar nenhum argumento.

# Verificando o dumpe2fs sem argumento (é diferente se rodado com o -h):
$ sudo dumpe2fs /dev/vda1 | grep -E "Filesystem volume name|Last mounted on|Last checked|Check interval|Filesystem UUID"
dumpe2fs 1.45.5 (07-Jan-2020)
Filesystem volume name: <none>
Last mounted on: /boot
Filesystem UUID: 06f9bb7b-a89e-485c-9f2a-d71facd28b2a
Last checked: Tue Mar 9 16:04:59 2021
Check interval: 0 (<none>)

# Verificando as informações do File System:
sudo dumpe2fs -h /dev/vda1
dumpe2fs 1.45.5 (07-Jan-2020)
Filesystem volume name: <none>
Last mounted on: /boot
Filesystem UUID: 06f9bb7b-a89e-485c-9f2a-d71facd28b2a
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 124672
Block count: 124672
Reserved block count: 6233
Free blocks: 41161
Free inodes: 124352
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 60
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 31168
Inode blocks per group: 974
Flex block group size: 16
Filesystem created: Tue Mar 9 16:04:59 2021
Last mount time: Sat Nov 13 15:33:25 2021
Last write time: Sat Nov 13 15:33:25 2021
Mount count: 13
Maximum mount count: -1
Last checked: Tue Mar 9 16:04:59 2021
Check interval: 0 (<none>)
Lifetime writes: 1197 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 3c93562b-f6e2-4371-80c7-24abf89ae161
Journal backup: inode blocks
Checksum type: crc32c
Checksum: 0xd2ed93c8
Journal features: journal_incompat_revoke journal_64bit journal_checksum_v3
Journal size: 16M
Journal length: 4096
Journal sequence: 0x000001f2
Journal start: 1
Journal checksum type: crc32c
Journal checksum: 0xd5a4d75b

# Verificando sem existe badblock (não existe):
$ sudo dumpe2fs -b /dev/vda1
dumpe2fs 1.45.5 (07-Jan-2020)

Com a informação acima, podemos ver os recursos do File System, como o Journal (somente o ext3 e ext4 possuem Journal) ,quanto do disco está reservado, normalmente para Log, essa informação de quanto do disco fica reservado não aparece ao usar o comando df.


Sempre que temos uma partição, e vamos consultar quanto tem de espaço nessa partição, o valor mostrado é menor do que o valor que formatamos a partição.

# Verificando recursos do File System:
$ sudo dumpe2fs -h /dev/vda1 | grep -i 'filesystem features'
dumpe2fs 1.45.5 (07-Jan-2020)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum

# Verificando o espaço reservado:
$ sudo dumpe2fs -h /dev/vda1 | grep -i 'reserved block count'
dumpe2fs 1.45.5 (07-Jan-2020)
Reserved block count: 6233

Podemos ver também quando foi criado, montado, quantas vezes foi montado, última vez que teve escrita no file system, podemos ver a opção Maximum Mount Counts que mostra quantas montagens vão ser realizadas para que aconteça uma verificação da partição.

$ sudo dumpe2fs -h /dev/vda1 | grep -i 'maximum'
dumpe2fs 1.45.5 (07-Jan-2020)
Maximum mount count: -1

# No caso esse recurso está desativado.


TUNE2FS​


Reveja aqui.



DEBUGFS​


Usado para acessar uma Shell do File System, era muito usado para fazer recuperação de dados no EXT2, mas hoje em dia quase não é mais usado.



FSCK​


Reveja aqui.



BTRFS - B-Tree File System​


O BTRFS é um File System moderno, seu foco é em tolerância a falhas e facilidade de administração e reparo. É desenvolvido por um grupo de empresas, sendo eles: Oracle, RedHat, Fujitsu, Intel, Suse, Facebook e muitos outras.


Recursos​


O BTRFS possui:

  • RAID

    Suporta RAID 0,1 e 10 (5 e 6 em breve).

  • SubVolumes

    Suporta o Subvolumes, Snapshot, compressão direta no File System (usando ZLIB ou LZO).

  • Conversão

    Possui conversão nativa de file system ext{3,4} para btrfs.


Utilização​


Normalmente o BTRFS é carregado no Sistema como um módulo, além disso, temos que instalar as ferramentas necessárias para trabalhar com esse File System.

# Verificando se é um módulo:
$ sudo modinfo btrfs | grep filename
filename: /lib/modules/5.4.0-90-generic/kernel/fs/btrfs/btrfs.ko

# Caso o módulo não esteja carregado, você pode carregar ele assim:
$ sudo modprobe btrfs

# Instale as ferramentas necessárias para trabalhar com o btrfs:
$ sudo apt install -y btrfs-tools

# Caso não funcione, instale o pacote abaixo:
$ sudo apt install -y btrfs-progs

Vamos instalar o BTRFS numa partição para fazer alguns testes:

# Instalando o btrfs:
$ sudo mkfs.btrfs -f /dev/vdb1
btrfs-progs v5.4.1
See http://btrfs.wiki.kernel.org for more information.

Label: (null)
UUID: c3439b85-c6e1-4d3c-8848-64bc1ce21ecc
Node size: 16384
Sector size: 4096
Filesystem size: 5.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 256.00MiB
System: DUP 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Checksum: crc32c
Number of devices: 1
Devices:
ID SIZE PATH
1 5.00GiB /dev/vdb1

# Mostrar as partições com BTRFS:
$ sudo btrfs filesystem show
Label: none uuid: c3439b85-c6e1-4d3c-8848-64bc1ce21ecc
Total devices 1 FS bytes used 128.00KiB
devid 1 size 5.00GiB used 536.00MiB path /dev/vdb1

Label: none uuid: 50774876-cea7-43b5-a2f7-caf96887871b
Total devices 1 FS bytes used 128.00KiB
devid 1 size 5.00GiB used 536.00MiB path /dev/vdb2

# Vamos montar a partição:
$ sudo mount /dev/vdb1 /mnt/

# Vamos criar um subvolume chamado 'btrfs-sv1':
$ sudo btrfs subvolume create /mnt/btrfs-sv1
Create subvolume '/mnt/btrfs-sv1'

# Lista todos os volumes criados:
$ sudo btrfs subvolume list /mnt/
ID 257 gen 7 top level 5 path btrfs-sv1

# Mostrando mais detalhes:
$ sudo btrfs subvolume show /mnt/
/
Name: <FS_TREE>
UUID: ea8a1707-0768-4b12-a1fb-733030bb3072
Parent UUID: -
Received UUID: -
Creation time: 2021-11-14 16:32:48 +0000
Subvolume ID: 5
Generation: 7
Gen at creation: 0
Parent ID: 0
Top level ID: 0
Flags: -
Snapshot(s):

# Exibindo de uma forma diferente:
sudo btrfs subvolume list -t /mnt/
ID gen top level path
-- --- --------- ----
257 7 5 btrfs-sv1

Com o SubVolume criado, podemos montar apenas o subvolume:

# Desmonte a partição montada:
$ sudo umount /dev/vdb1

# Monte apenas o volume:
$ sudo mount -o subvol=btrfs-sv1 /dev/vdb1 /mnt/


## OU monte com o device montade ##

# Desmonte a partição montada:
$ sudo umount /dev/vdb1

# Crie uma pasta '/mnt/subvol'
$ sudo mkdir /mnt/device

# Crie uma pasta '/mnt/subvol1'
$ sudo mkdir /mnt/subvol1

# Monte a partição:
$ sudo mount /dev/vdb1 /mnt/device

# Monte o subvolume em /mnt/subvol1:
$ sudo mount -o subvol=btrfs-sv1 /dev/vdb1 /mnt/subvol1

# Veja que foi montado:
df -hT | grep mnt
/dev/vdb1 btrfs 5.0G 3.6M 4.5G 1% /mnt/device
/dev/vdb1 btrfs 5.0G 3.6M 4.5G 1% /mnt/subvol1

Subvolumes são como partições de um File System e podem ser montados separadamente.


Vamos criar um snapshot para ver como funciona, primeiro crie alguns arquivos/diretórios no subvolume criado:

# Criando diretórios:
$ sudo mkdir /mnt/subvol1/{a..z}

# Criando arquivos dentro desses diretórios:
$ sudo touch /mnt/subvol1/{a..z}/arquivo{1..3}.txt

# Depois de aplicado os comandos, a estrutura ficaria mais ou menos assim:
$ sudo ls -lR /mnt/subvol1/ | tac | head -20
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo3.txt
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo2.txt
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo1.txt
total 0
/mnt/subvol1/z:

-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo3.txt
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo2.txt
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo1.txt
total 0
/mnt/subvol1/y:

-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo3.txt
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo2.txt
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo1.txt
total 0
/mnt/subvol1/x:

-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo3.txt
-rw-r--r-- 1 root root 0 Nov 14 18:03 arquivo2.txt

Agora faça o snapshot:

$ sudo btrfs subvolume snapshot /mnt/subvol1 /mnt/device/snapshot-teste
Create a snapshot of '/mnt/subvol1' in '/mnt/device/snapshot-teste'

# Verifique (é "exatamente" o que temos no 'subvol1'):
$ sudo ls -lh /mnt/device/snapshot-teste
total 0
drwxr-xr-x 1 root root 72 Nov 14 18:03 a
drwxr-xr-x 1 root root 72 Nov 14 18:03 b
drwxr-xr-x 1 root root 72 Nov 14 18:03 c
drwxr-xr-x 1 root root 72 Nov 14 18:03 d
drwxr-xr-x 1 root root 72 Nov 14 18:03 e
drwxr-xr-x 1 root root 72 Nov 14 18:03 f
drwxr-xr-x 1 root root 72 Nov 14 18:03 g
drwxr-xr-x 1 root root 72 Nov 14 18:03 h
drwxr-xr-x 1 root root 72 Nov 14 18:03 i
drwxr-xr-x 1 root root 72 Nov 14 18:03 j
drwxr-xr-x 1 root root 72 Nov 14 18:03 k
drwxr-xr-x 1 root root 72 Nov 14 18:03 l
drwxr-xr-x 1 root root 72 Nov 14 18:03 m
drwxr-xr-x 1 root root 72 Nov 14 18:03 n
drwxr-xr-x 1 root root 72 Nov 14 18:03 o
drwxr-xr-x 1 root root 72 Nov 14 18:03 p
drwxr-xr-x 1 root root 72 Nov 14 18:03 q
drwxr-xr-x 1 root root 72 Nov 14 18:03 r
drwxr-xr-x 1 root root 72 Nov 14 18:03 s
drwxr-xr-x 1 root root 72 Nov 14 18:03 t
drwxr-xr-x 1 root root 72 Nov 14 18:03 u
drwxr-xr-x 1 root root 72 Nov 14 18:03 v
drwxr-xr-x 1 root root 72 Nov 14 18:03 w
drwxr-xr-x 1 root root 72 Nov 14 18:03 x
drwxr-xr-x 1 root root 72 Nov 14 18:03 y
drwxr-xr-x 1 root root 72 Nov 14 18:03 z

# Apague tudo dentro de 'subvol1':
$ sudo rm -r /mnt/subvol1/*

# Volte o Snapshot:
$ sudo cp -r /mnt/device/snapshot-teste/* /mnt/subvol1/

Para que a criação do Snapshot funcione, você deve salvar o snapshot num device que seja do tipo BTRFS, se tentar salvar em outro tipo de File System, vai dar erro.


Criando RAID com BTRFS:

# Primeiro, formate as partições que pertenceram ao RAID, informando qual RAID será usado:
$ sudo mkfs.btrfs -d raid1 /dev/vdb1 /dev/vdb2 -f
btrfs-progs v5.4.1
See http://btrfs.wiki.kernel.org for more information.

Label: (null)
UUID: bd2e1c02-bdd6-44f0-a590-32635ab6d5ba
Node size: 16384
Sector size: 4096
Filesystem size: 10.00GiB
Block group profiles:
Data: RAID1 511.94MiB
Metadata: RAID1 256.00MiB
System: RAID1 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Checksum: crc32c
Number of devices: 2
Devices:
ID SIZE PATH
1 5.00GiB /dev/vdb1
2 5.00GiB /dev/vdb2

Quando você for montar, você pode escolher qual montar, pode ser o vdb1 ou vdb2, mas no comando df, você sempre verá o primeiro device sendo montado.

# Monte o device 'vdb2':
$ sudo mount /dev/vdb2 /mnt/device

# Verifique qual device ele montou:
$ sudo df -hT | sed -n '1p; /vdb/p'
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 btrfs 5.0G 3.4M 4.8G 1% /mnt/device


XFS​


Reveja aqui.



ZFS​


O ZFS é um sistema de arquivos avançado criado originalmente pela Sun Microsystems para o sistema Solaris. Atualmente, é mantido pela Oracle sob uma licença não compatível com o kernel Linux, mas existe uma versão de código aberto chamada OpenZFS, que é amplamente usada em distribuições como FreeBSD, TrueNAS, e também no Linux via módulos externos (como o zfs-dkms).


O ZFS foi projetado com foco em:

  • Integridade dos dados: utiliza checksums para detectar e corrigir corrupção silenciosa de dados.
  • Gerenciamento simplificado: combina as funções de volume manager e filesystem em uma única arquitetura.
  • Escalabilidade massiva: suporta enormes volumes de dados, snapshots, clones e compressão transparente.
  • Resiliência: possui suporte nativo a RAID-Z, uma implementação própria de RAID com proteção contra corrupção de dados e escrita inconsistente.

O ZFS agrupa dispositivos físicos em um storage pool (chamado de zpool). Em cima desse pool, você pode criar múltiplos sistemas de arquivos ZFS ou volumes (ZVOLs).

  • O zpool gerencia os discos.
  • Os sistemas de arquivos ZFS e volumes são criados a partir desse pool.
  • O gerenciamento é dinâmico, sem necessidade de particionamento tradicional.


SMART​


O SMART monitora o dispositivo de armazenamento, verificando erros e possíveis problemas no dispositivo de armazenamento, normalmente Discos Rígidos e SSDs. Para que essa funcionalidade possa funcionar, o dispositivo de armazenamento deve suportar esse recurso, e existem dispositivo de armazenamento que possuem mais informações no smart do que outros.


Para trabalhar com isso, será necessário instalar a ferramenta smartmontools.


O daemon é chamado de smartd e o cliente usado para emitir os comandos é chamado de smartctl, sua configuração fica em /etc/smartd.conf.


OpçãoDescrição
--test=short (device)Faz uma verificação rápida no Disco.
-H (device)Mostra a saúde do disco.
-a (device)Mostra o resultado após ter sido feita a verificação.

# Faça uma verificação rápida do disco:
$ sudo smartctl --test=short /dev/sda
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-90-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Sun Nov 28 11:23:26 2021 -03
Use smartctl -X to abort tes


# Verifique o resultado:
$ sudo smartctl -a /dev/sda
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-90-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Toshiba 2.5" HDD XXXX...
Device Model: TOSHIBA XXXX
Serial Number: XXXX
LU WWN Device Id: 5 000039 821682bcf
Firmware Version: XXXX
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 5400 rpm
Form Factor: 2.5 inches
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS (minor revision not indicated)
SATA Version is: SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Sun Nov 28 11:24:14 2021 -03
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 120) seconds.
Offline data collection
capabilities: (0x5b) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 227) minutes.
SCT capabilities: (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 128
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000b 100 100 050 Pre-fail Always - 0
3 Spin_Up_Time 0x0027 100 100 001 Pre-fail Always - 1767
5 Reallocated_Sector_Ct 0x0033 100 100 050 Pre-fail Always - 0
9 Power_On_Hours 0x0032 081 081 000 Old_age Always - 7742
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 2564
191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 274
192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 231
193 Load_Cycle_Count 0x0032 092 092 000 Old_age Always - 83768
194 Temperature_Celsius 0x0022 100 100 000 Old_age Always - 30 (Min/Max 13/47)
199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0
240 Head_Flying_Hours 0x0032 089 089 000 Old_age Always - 4533
241 Total_LBAs_Written 0x0032 100 100 000 Old_age Always - 34215537707
242 Total_LBAs_Read 0x0032 100 100 000 Old_age Always - 48368352668
254 Free_Fall_Sensor 0x0032 100 100 000 Old_age Always - 0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 7742 -
# 2 Short offline Completed without error 00% 7236 -
# 3 Short offline Completed without error 00% 6419 -
# 4 Short offline Completed without error 00% 6419 -
# 5 Short offline Completed without error 00% 2942 -
# 6 Short offline Completed without error 00% 2526 -
# 7 Short offline Completed without error 00% 1992 -
# 8 Short offline Completed without error 00% 986 -
# 9 Short offline Completed without error 00% 615 -
#10 Short offline Completed without error 00% 1 -

SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.