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


Foi criado pela Sun Microsystems INC para uso no Solaris, hoje é mantido pela Oracle, possui uma alternativa de código aberto chamada OpenZFS.


Possui foco na integridade dos dados, Facilidade de Gerenciamento, o File System em pools/Escalabilidade e tem suporte a RAID.


O ZFS cria volumes virtuais (storage pool) sobre os discos, e a partir dos volumes é criado os discos.



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.