Aula #12 - Recursos de sistemas de arquivo: Atributos, Criação, Verificação, Montagem



Recursos importantes de sistemas de arquivo incluem inodes, arquivos de diretórios, e hard e soft links. Atributos estendidos expandem as permissões tradicionais dos sistemas de arquivo UNIX. Ferramentas específicas para sistemas de arquivo são responsáveis por tarefas como criar e formatar, procurar e corrigir erros, e montar e desmontar durante a inicialização ou depois.




Inodes


Um inode é uma estrutura de dados armazenada em disco que descreve e armazena atributos de arquivos, incluindo a localização. Cada arquivo está associado com a seu próprio inode. As informações armazenadas no inode incluem:

    Permissões

    Usuário e Grupo associado ao arquivo

    Tamanho

    Timestamps (nanosegundos)
    - ​Hora do último acesso
    - Hora da última modificação (dados)
    - Hora de alteração (metadados)

Nota: nomes de arquivos não são armazenados no inode, mas no arquivo de diretório.

Toda atividade de I/O que afeta um arquivo também reflete no inode do arquivo porque os metadados são atualizadas.




Arquivos de Diretórios


Um arquivo de diretório (directory file) é um tipo de arquivo especial que é usado para associar nomes de arquivos a inodes. Há duas maneiras de associar (ou criar um link) um nome de arquivo com um inode:





    Link Hard (duro, direto) aponta para um inode.


    Link Soft (mole, indireto) (ou simbólico) aponta para um nome de arquivo. Este link é indireto porque para se chegar ao conteúdo do arquivo (para se chegar ao inode), é necessário ler e seguir o link simbólico, e então, ler e seguir o nome de arquivo que finalmente tem um inode associado.

A associação entre o conteúdo de um arquivo de diretório e um inode é conhecido como um link. Links adicionais podem ser criados usando o ln. Isso significa que mais de um link hard pode existir para um único inode.

Logo, é possível, e comum, que dois ou mais nomes de arquivos apontem para o mesmo inode com hard links. O que significa que o conteúdo de um arquivo será conhecido por vários nomes, cada um com o seu próprio lugar na estrutura de diretórios. No entanto, ele só pode ter um inode não importa qual nome está sendo usado.



Quando um processo pede por um arquivo na árvore de diretórios, o kernel faz uma busca para encontrar o inode correto. Depois que o nome do arquivo com o caminho é traduzido para um número de inode, o inode é carregado na memória e é usado para as solicitações futuras.





ATRIBUTOS EXTENDIDOS, LSATTR e CHATTR


Atributos Extendidos associam metadados a arquivos. Esses metadados não são diretamente interpretados pelo sistema de arquivos.  Existem quatro namespaces: user (usuário), trusted (confiado), security (segurança) e system (sistema). Nós veremos em breve que o namespace system é usado para access control lists (ACLs) e o namespace security é usado pelo SELinux.

Flags são armazenadas nos inodes e só podem ser modificadas pelo root. Os atributos extendidos podem ser visualizados com o comando lsattr e alterados com o chattr.

Na camada do usuário, flags podem ser definidas para arquivos:


    i: immutable (imutável)
    Um arquivo com o atributo (i) não pode ser alterado (nem pelo root). Não pode ser renomeado nem apagado. Links hard não podem ser criados e nenhum dado pode ser adicionado ao arquivo. Apenas o superusuário pode remover este atributo.


    a: append-only (apenas-acrescentar)
    Um arquivo com o atributo (a) só pode ser aberto no modo de escrita para acrescentar. Apenas o superusuário pode alterar este atributo.

    d: no-dump
    Um arquivo com o atributo (d) é ignorado pelo programa dump . Isso é útil para arquivos de swap e de cache que você não quer   gastar tempo e recursos para fazer backup.


    A: No atime update (Sem atualização atime)
    Um arquivo com o atributo (A) não vai modificar seu campo de meta dados atime (access time, ou hora do último acesso) quando o arquivo é acessado. Isso pode aumentar o desempenho em alguns sistemas por reduzir a quantidade de operações de I/O.


Observe que existem outras flags que podem ser definidas; o comando man chattr vai mostrar toda a lista. O formato para o chattr é:

$ chattr [+|-|=modo] arquivo

lsattr é usado para exibir os atributos para um arquivo:

$ lsattr arquivo




CRIAÇÃO E FORMATAÇÃO DE SISTEMAS DE ARQUIVOS


Todo sistema de arquivos tem ferramentas para formatar (criar) o sistema de arquivos em uma partição. O nome genérico para estas ferramentas é mkfs. Mas na verdade este nome é apenas um atalho para outros aplicativos:



$ ls -lh /sbin/mkfs*

-rwxr-xr-x 1 root root  11K Apr 10 03:50 /sbin/mkfs
-rwxr-xr-x 1 root root 181K Oct 15  2012 /sbin/mkfs.btrfs
-rwxr-xr-x 1 root root  26K Apr 10 03:50 /sbin/mkfs.cramfs
-rwxr-xr-x 5 root root  68K Jul 16 15:31 /sbin/mkfs.ext2
-rwxr-xr-x 5 root root  68K Jul 16 15:31 /sbin/mkfs.ext3
-rwxr-xr-x 5 root root  68K Jul 16 15:31 /sbin/mkfs.ext4
-rwxr-xr-x 5 root root  68K Jul 16 15:31 /sbin/mkfs.ext4dev
lrwxrwxrwx 1 root root    7 Dec  6  2011 /sbin/mkfs.msdos -> mkdosfs
lrwxrwxrwx 1 root root   12 Sep 28  2011 /sbin/mkfs.ntfs -> /sbin/mkntfs
lrwxrwxrwx 1 root root    7 Dec  6  2011 /sbin/mkfs.vfat -> mkdosfs



Logo os dois comandos a seguir são na verdade o mesmo comando:

$ sudo mkfs -t ext4 /dev/sda10
$ sudo mkfs.ext4 /dev/sda10

O formato geral para o mkfs é:


mkfs [-t tipo] [opções] [dispositivo]


em que [dispositivo] é normalmente um dispositivo como /dev/sda3 ou /dev/vg/lvm1.


Cada tipo de sistema de arquivos tem suas próprias opções específicas que podem ser definidas na formatação. Por exemplo o ext4 tem várias opções de journalling, que incluem a definição do tamanho do jornal e se deve ou não usar um arquivo externo.


Como de costume, a man page para cada um dos mkfs.* é rica em detalhes.



 VERIFICANDO E REPARANDO OS SISTEMAS DE ARQUIVOS


 Cada sistema de arquivos tem um utilitário para verificar se há erros (e, que corrige os que são encontrados). O nome genérico para esses utilitários é fsck. No entanto, esse é apenas um front-end para as versões específicas para cada sistema de arquivos:


$ ls -l /sbin/fsck*
-rwxr-xr-x 1 root root  34680  Apr 10 03:50 /sbin/fsck
-rwxr-xr-x 1 root root  15976  Apr 10 03:50 /sbin/fsck.cramfs

-rwxr-xr-x 5 root root 197352  Jul 16 15:31 /sbin/fsck.ext2
-rwxr-xr-x 5 root root 197352  Jul 16 15:31 /sbin/fsck.ext3
-rwxr-xr-x 5 root root 197352  Jul 16 15:31 /sbin/fsck.ext4
-rwxr-xr-x 5 root root 197352  Jul 16 15:31 /sbin/fsck.ext4dev
lrwxrwxrwx 1 root root      7  Dec  6  2011 /sbin/fsck.msdos -> dosfsck
lrwxrwxrwx 1 root root     13  Sep 28  2011 /sbin/fsck.ntfs -> ../bin/ntfsck
lrwxrwxrwx 1 root root      7  Dec  6  2011 /sbin/fsck.vfat -> dosfsck

Logo os dois comandos são completamente equivalentes:


$ sudo fsck -t ext4 /dev/sda10
$ sudo fsck.ext4 /dev/sda10


O fsck é executado automaticamente após um determinado número de montagens; após um intervalo de tempo que conta desde a última verificação; e depois de um desligamento anormal. Ele só deve ser executado em sistemas de arquivos desmontados. Você pode forçar uma verificação no próximo boot, de todos os sistemas de arquivos montados, fazendo:



$ sudo touch /forcefsck
$ sudo reboot


O arquivo /forcefsck irá desaparecer depois de uma verificação bem sucedida. Este truque é valioso quando você quiser rodar o fsck no sistema de arquivos  root, que é difícil de fazer durante a execução do sistema.


O formato geral para o fsck é:

fsck [-t fstype] [opções] [device-file]


em que [device-file] é o nome de um dispositivo como /dev/sda3 ou /dev/vg/lvm1. Normalmente não é necessário especificar o tipo de sistema de arquivos, já que o fsck consegue descobrir sozinho examinando os superblocks no início da partição.


É possível controlar se os erros encontrados serão corrigidos um por um com a opção -r, ou automaticamente da melhor forma possível com a opção -a . Adicionalmente cada sistema de arquivos pode ter suas próprias opções específicas.

Sistemas de arquivos com journalling são muito mais rápidos para verificar do que as gerações antigas por dois motivos:

  •     Raramente é necessário verificar toda a partição porque tudo menos menos as poucas últimas ações foram feitas e confirmadas, então é muito rápido de verificar.
  •     Mesmo que seja necessário verificar todo o sistema de arquivos, os projetos mais novos foram feitos para permitir um fsck rápido; sistemas de arquivos mais antigos não se preocupavam tanto, porque os tamanhos eram bem menores.


Veja a man page para cada fsck.* para ver os detalhes.



MOTANDO E DESMONTANDO SISTEMAS DE ARQUIVOS


 Todos os arquivos acessíveis no Linux são organizadas em uma grande estrutura em formato de árvore com a cabeça da árvore sendo o diretório raiz (/). No entanto, é comum ter mais de uma partição (cada uma com seu próprio sistema de arquivos) juntas na mesma árvore de sistemas arquivos. Essas partições também podem estar em dispositivos físicos diferentes, ou mesmo na rede.

O programa mount permite anexar um sistema de arquivos a qualquer ponto da estrutura da árvore; Já o umount permite separá-los.

O ponto de montagem é o diretório onde os sistemas de arquivos se conectam. Ele deve existir para que o mount possa usá-lo; O mkdir pode ser usado para criar um diretório vazio. Se um diretório pré-existente contém arquivos antes de ser usado como um ponto de montagem, os arquivos pré-existentes serão escondidos após a montagem. Esses arquivos não são apagados, e voltarão a aparecer quando o sistema de arquivos for desmontado.


Somente o root pode montar e desmontar sistemas de arquivos.


Cada sistema de arquivos é montado em um diretório como em:

$ sudo mount -t ext4 /dev/sdb4 /home


    Monta um sistema de arquivos ext4.
    O sistema de arquivos está em uma partição específica no sistema (/dev/sdb4).
    O sistema de arquivos é montado na posição /home na estrutura de diretórios atual.
    Qualquer arquivo presente na pasta /home antes da montagem ficaram escondidos até que o diretório seja desmontado.

Observe que neste exemplo usamos um nó de dispositivo para escolher qual sistema de arquivos montar. No entanto também é possível montar usando um  label ou um UUID. Logo os comandos abaixo são equivalentes:

$ sudo mount /dev/sda2     /home
$ sudo mount LABEL=home   /home
$ sudo mount         -L home   /home
$ sudo mount UUID=26d58ee2-9d20-4dc7-b6ab-aa87c3cfb69a /home
$ sudo mount   -U 26d58ee2-9d20-4dc7-b6ab-aa87c3cfb69a /home


Labels são configurados com ferramentas como o e2label, e os UUIDs são atribuídos quando a partição é formatada.

Enquanto qualquer um desses três métodos para especificar o dispositivo pode ser usado, os sistemas modernos evitam usar nós de dispositivo porque os nomes podem mudar de de formas imprevisíveis. Os labels são uma melhoria, mas em raras ocasiões, pode-se ter duas partições que acabam com o mesmo label. Já os UUIDs sempre serão únicos.

mount aceita muitas opções, algumas genéricas como -a (monta todos os sistemas de arquivos listados no /etc/fstab) e muitas são específicas de um sistema de arquivos; ele tem uma man page muito longa. Um exemplo comum:

$ sudo mount -o remount,ro /myfs

que remonta um sistema de arquivos com o atributo somente-leitura.


esli-nux ~ # mount --help
Uso:   mount -V                 : mostra versão
       mount -h                 : mostra esta ajuda
       mount                    : lista sistemas de arquivos montados
       mount -l                 : idem, incluindo rótulos de volumes
Estas eram as opções de informação. Agora as de montagem.
O comando é "mount [-t tipoSA] alguma-coisa algum-lugar".
Detalhes encontrados em /etc/fstab podem ser omitidos.
       mount -a                 : monta tudo contido em /etc/fstab
       mount dispositivo        : monta dispositivo no lugar conhecido
       mount diretório          : monta dispositivo conhecido aqui
       mount -t tipo dev dir    : comando normal de montagem
Note que não se monta realmente um dispositivo, monta-se um
sistema de arquivos (de um determinado tipo) encontrado no dispositivo.
Pode-se montar também em outro lugar uma árvore de diretórios
anteriormente visível:
       mount --bind dir-antigo dir-novo
É possível alterar o tipo de montagem contendo o diretório:
       mount --make-shared diretório
       mount --make-slave diretório
       mount --make-private diretório
       mount --make-unbindable diretório
É possível alterar o tipo de todas as montagens em uma subárvore de montagem
contendo o diretório:
       mount --make-rshared diretório
       mount --make-rslave diretório
       mount --make-rprivate diretório
       mount --make-runbindable diretório
Um dispositivo pode ser informado pelo nome, digamos /dev/hda1 ou /dev/cdrom,
ou por um rótulo, usando -L rótulo ou por uuid, usando -U uuid.
Outras opções: [-nfFrsvw] [-o opções].
Para mais detalhes, consulte "man 8 mount".


Sistemas de arquivo podem ser desmontados seguindo o exemplo:

$ umount [arquivo de dispositivo(Ex.: /dev/sda1) OU ponto de montagem]

 Abaixo alguns exemplos de como desmontar um sistema de arquivos:


    Desmontar o sistema de arquivos /home:

          $ sudo umount /home

    Desmontar o dispositivo /dev/sda3 :

          $ sudo umount /dev/sda3



Observe que o comando para desmontar é umount (e não unmount!).

 Assim como o mount, o umount tem muitas opções, e muitas delas são feitas para sistemas de arquivos específicos. Mais uma vez, as man pages são a melhor fonte de informação sobre opções específicas.

O erro mais comum encontrado ao desmontar um sistema de arquivos é tentar fazer isso em um sistema de arquivos atualmente em uso; ou seja, existem aplicações usando arquivos.

Isso pode ser algo como ter uma janela de terminal aberta em um diretório no sistema de arquivos montado. Para este caso basta usar o comando cd nessa janela, para que seja possível desmontar o sistema de arquivos.

No entanto, se existem outros processos que estão causando o erro, você terá que matá-los antes de desmontar o sistema de arquivos. Você pode usar o fuser para descobrir quais usuários estão usando o sistema de arquivos e matá-los (mas cuidado, pode ser uma boa ideia avisar os usuários antes de matar os processos). Você também pode usar lsof ("ls open files, ou ls para arquivos em uso") para tentar ver quais arquivos estão sendo usados e atrapalhando a desmontagem.

Durante o boot o comando mount -a é executado e monta todos os sistemas de arquivos listados no arquivo de configuração /etc/fstab.  Sistemas de arquivos locais e remotos podem ser montados neste momento.

Abaixo um exemplo mostrando como montar todos os sistemas de arquivos listados no arquivo de configuração /etc/fstab durante a inicialização do sistema:


$ cat /etc/fstab

LABEL=RHEL6-64          /                       ext4    defaults        1 1
LABEL=RHEL6-32          /RHEL6-32               ext4    defaults        1 2
LABEL=boot              /boot                   ext3    defaults        1 2
....
LABEL=local             /usr/local              ext4    defaults        1 2
LABEL=tmp               /tmp                    ext4    defaults        1 2
LABEL=src               /usr/src                ext4    defaults        1 2
LABEL=VIRTUAL           /VIRTUAL                ext4    defaults        1 2
LABEL=BEAGLE            /BEAGLE                 ext4    defaults        1 2
/dev/sda1               /c                      ntfs-3g uid=500,gid=500 0 0

/teaching/FTP/LFT       /var/ftp/pub2           none    bind            0 0

laptop:/share           /share                  nfs     defaults        0 0

LABEL=SWAP              swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
debugfs                 /sys/kernel/debug       debugfs defaults        0 0


Este arquivo mostra qual sistema de arquivos deve ser montado automaticamente durante o boot e onde eles podem ser encontrados na máquina local ou na rede. É possível especificar quem podem montar e com quais permissões, além de outras opções relevantes. Algumas linhas são para sistemas de arquivos virtuais como o proc, sys e devpts.

Cada linha no arquivo contém campos que são separados por espaços ou tabs:

  •     Caminho do dispositivo no /dev (device node), nome (label), ou UUID. (Para sistemas de arquivo virtuais, que não são lidos de um dispositivo como uma partição como o tmpfs, proc e o sysfs, este campo não é relevante; as vezes você vai encontrar a palavra 'none' que significa 'nenhum'.
  •     Ponto de montagem. (Este também pode ser ignorado em casos como o swap, que não é montado em um local específico.)
  •     Identificação do tipo de Sistema de Arquivos.
  •     Uma lista de opção das opções de montagem.
  •     A frequência com que o comando dump será usado. O valor pode ser zero.
  •     Ordem de verificação para o fsck (ou 0 significando que não será verificado durante o boot).

Os utilitários mont e umount podem utilizar a informação do arquivo /etc/fstab; o que permite usar

$ sudo mount /usr/src

ao invés de
$ sudo mount LABEL=src /usr/src

no exemplo acima.




A lista do sistemas de arquivo montados pode ser vista com:

esli-nux ~ # mount
/dev/sda4 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
none on /sys/fs/pstore type pstore (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=epsilva)
/dev/sda2 on /media/epsilva/Dados type ext4 (rw,nosuid,nodev,uhelper=udisks2)

Mais vistos no mês:

As melhores distribuições Linux para 2017

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Teste de Performance de Rede com Iperf

DHCP - Guia Completo

OPNsense - Firewall Open Source

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

Ophcrack: Descubra todas as senhas do Windows

SSD no linux

Oracle Linux 7.0 Server com Xfce - Instalação e configurações iniciais