# Chattr

O chattr, no Linux, é o comando que permite a um usuário definir certos atributos de um arquivo e o lsattr é o comando que exibe os atributos de um arquivo.
A maioria dos sistemas do tipo BSD, incluindo o macOS, sempre tiveram um comando chflags análogo para definir os atributos mas nenhum comando especificamente criado para exibi-los (opções específicas para o comando ls são usadas). O comando chflags apareceu pela primeira vez no 4.4BSD.
O Solaris não possui comandos especificamente criados para definir (ou manipular) os atributos dos arquivos. Os comandos chmod e ls são usados para tal finalidade.
Outros Unixes, em geral, não possuem comandos análogos. Os comandos chatr (do HP-UX) e lsattr (do AIX), que soam semelhantes, existem mas têm funções não relacionadas.
Entre outras coisas, o comando chattr é útil para tornar os arquivos imutáveis, de forma que arquivos de senha e certos arquivos de sistema não possam ser apagados durante atualizações de software.

## Em sistemas Linux (chattr e lsattr)
### Suporte ao sistema de arquivos

As ferramentas de linha de comando chattr (para manipular atributos) e lsattr (para listar atributos) foram originalmente específicos para a segunda família do sistema de arquivos estendido (ext2, ext3, ext4) e estão disponíveis como parte do pacote e2fsprogs.
No entanto, a funcionalidade já foi ampliada (total ou parcialmente) para muitos outros sistemas, incluindo o XFS, o ReiserFS, o JFS e o OCFS2. O sistema de arquivos btrfs inclui a funcionalidade de atributo (incluindo o sinalizador C que desliga o recurso embutido copy-on-write (CoW) devido ao desempenho mais lento associado ao mesmo).

### Descrição do chattr

A forma do comando chattr é:
* -R altera, recursivamente, os atributos de diretórios e seus conteúdos.
* -V é para ser detalhado e imprimir a versão do programa.
* -f suprime a maioria das mensagens de erros.

### Descrição do lsattr

A forma do comando lsattr (GNU 1.41.3):
* -R recursivamente lista os atributos de diretórios e seus conteúdos.
* -V exibe a versão do programa.
* -a lista todos os arquivos em diretórios, incluindo os dotfiles.
* -d lista diretórios como outros arquivos, em vez de listar seu conteúdo.

### Atributos

Alguns atributos incluem:
atributos de arquivo em um sistema de arquivos Linux de acordo com a página de manual do Linux chattr(1) :
| atributo | sinalizador lsattr | opção chattr | semântica e lógica |
| não atualizar o atime | A | +A para definir e -A para remover | quando um arquivo com o atributo A definido é acessado, seu registro atime não é modificado. isso evita uma certa quantidade de operações de E/S de disco. |
| apenas anexar | a | +a para definir e -a para remover | um arquivo com o atributo a definido só pode ser aberto para gravação no modo de anexação. |
| comprimido | c | +c para definir e -c para remover | um arquivo com o atributo c definido é compactado automaticamente no disco pelo kernel. uma leitura desse arquivo retorna dados não compactados. uma gravação neste arquivo compacta os dados antes de armazená-los no disco. |
| sem Copy-on-Write (CoW) | C | +C para definir e -C para remover | um arquivo com o atributo c definido é compactado automaticamente no disco pelo kernel. as atualizações desses arquivos podem não estar sujeitas a instantâneos atômicos e podem não ter algumas informações de confiabilidade em alguns sistemas de arquivos e kernels. |
| atualizações síncronas de diretório | D | +D para definir e -D para remover | quando um diretório com o atributo D definido é modificado, as mudanças são gravadas de forma síncrona no disco. isso é equivalente à opção de montagem dirsync, aplicada a um subconjunto dos arquivos. |
| sem despejo | d | +d para definir e -d para remover | um arquivo com o atributo d definido não é candidato para backup quando o programa de despejo é executado. |
| erro de compressão | E | (indisponível) | o atributo E é usado pelos patches de compactação experimentais para indicar que um arquivo compactado tem um erro de compactação. |
| formato de extensão | e | (indisponível) | o atributo e indica que o arquivo está usando extensões para mapear os blocos no disco. |
| arquivo enorme | h | (indisponível) | o atributo h indica que o arquivo está armazenando seus blocos em unidades do tamanho do bloco do sistema de arquivos em vez de em unidades de setores. isso significa que o arquivo é, ou era, maior do que 2 terabytes (TBs). |
| diretório indexado | I | (indisponível) | o atributo I é usado pelo código do programa htree para indicar que um diretório está sendo indexado usando árvores hash. |
| imutável | i | +i para definir e -i para remover | um arquivo com o atributo i não pode ser modificado. ele não pode ser excluído ou renomeado, nenhum link pode ser criado para este arquivo e nenhum dado pode ser gravado no arquivo. quando definido, impede, até mesmo o superusuário, de apagar ou alterar o conteúdo do arquivo. |
| registro de dados | j | +j para definir e -j para remover | um arquivo com o atributo j tem todos os seus dados gravados no registro ext3 antes de serem gravados no próprio arquivo, se o sistema de arquivos for montado com as opções " data=ordered " ou " data=writeback ". Quando o sistema de arquivos é montado com a opção " data= journal ", todos os dados do arquivo já estão registrados, portanto, este atributo não tem efeito. |
| exclusão segura | s | +s para definir e -s para remover | quando um arquivo com o atributo s definido é excluído, seus blocos são zerados e gravados de volta no disco. |
| atualizações síncronas | S | +S para definir e -S para remover | quando um arquivo com o atributo S definido é modificado, as alterações são gravadas de forma síncrona no disco. isso é equivalente à opção de montagem sync aplicada a um subconjunto de arquivos. |
| topo da hierarquia de diretório | T | +T para definir e -T para remover | um diretório com o atributo T será considerado o topo das hierarquias de diretório para os propósitos do alocador de blocos Orlov. esta é uma dica para o alocador de bloco usado pelo ext3 e pelo ext4 de que os subdiretórios neste diretório não estão relacionados e, portanto, devem ser separados para fins de alocação. por exemplo: é uma boa ideia definir o atributo T no diretório /home, de forma que /home/john e /home/mary sejam colocados em grupos de blocos separados. para diretórios onde este atributo não é definido, o alocador de bloco Orlov tentará agrupar os subdiretórios mais próximos, sempre que possível. |
| sem fusão de cauda | t | +t para definir e -t para remover | para aqueles sistemas de arquivos que suportam mesclagem final, um arquivo com o atributo t não terá um fragmento de bloco parcial no final do arquivo mesclado com outros arquivos. isso é necessário para aplicativos como o LILO, que lê o sistema de arquivos diretamente e não entende arquivos mesclados no final. |
| não eliminável | u | +u para definir e -u para remover | quando um arquivo com o atributo u definido é excluído, seu conteúdo é salvo. isso permite que o usuário solicite sua retração. |
| acesso à compressão bruta | X | (indisponível) | o atributo X é usado pelos patches de compactação experimentais para indicar que o conteúdo bruto de um arquivo compactado pode ser acessado diretamente. |
| arquivo sujo compactado | Z | (indisponível) | o atributo Z é usado pelos patches de compactação experimentais para indicar que um arquivo compactado está "sujo". |
| número da versão / geração | -v | -v versão | número da versão / geração do arquivo. |

#### Notas

* 1 2 apenas o superusuário ou um processo que possui o recurso CAP_LINUX_IMMUTABLE pode definir ou remover esses atributos.
* 1 2 3 Esses atributos não são respeitados pelos sistemas de arquivos ext2 e ext3 conforme implementados na linha principal atual dos kernels Linux.
* ↑ Esses atributos só fazem sentido para sistemas de arquivos Copy-on-Write, como o btrfs.
* ↑ apenas o superusuário ou um processo que possui o recurso CAP_SYS_RESOURCE pode definir ou remover este atributo.
* ↑ Este atributo não é respeitado pelo sistema de arquivos ext4 implementado nos kernels Linux da linha principal atual, conforme relatado no bug #17872 (em inglês).

## Em sistemas do tipo BSD (chflags)

O comando chflags não é específico para sistemas de arquivos particulares. O UFS (em sistemas BSD) o APFS, o HFS+, o SMB, o AFP e o FAT (em macOS) suportam pelo menos alguns sinalizadores.

### Descrição do chflags

A forma do comando chflags é:
* -H se a opção -R for especificada, links simbólicos na linha de comando serão seguidos. Links simbólicos encontrados na travessia da árvore não são seguidos.
* -L se a opção -R for especificada, todos os links simbólicos serão seguidos.
* -P se a opção -R for especificada, nenhum link simbólico será seguido. Este é o padrão.
* -R muda os sinalizadores de arquivo para as hierarquias de arquivo enraizadas nos arquivos em vez de apenas os próprios arquivos.

### Exibição

Os sistemas do tipo BSD, em geral, não possuem um comando padrão em nível de usuário voltado especificamente para exibir os sinalizadores de um arquivo. O comando ls funcionará com os sinalizadores -lo ou -lO, dependendo do sistema, com os sinalizadores passados.

### Atributos

Todos os atributos tradicionais podem ser definidos ou removidos pelo superusuário. Alguns também podem ser definidos ou removidos pelo proprietário do arquivo. Alguns atributos incluem:
atributos de arquivo :
| atributo | sinalizador ls | sinalizador chflags | definível pelo proprietário | sistema operacional que suporta | semântica e lógica |
| arquivado | arch | arch, archived | Não | todos | o arquivo é arquivado |
| opaco | opaque | opaque | Sim | todos | o diretório é opaco quando visto por meio de uma montagem de união |
| sem despejo | nodump | nodump | Sim | todos | o arquivo não pode ser despejado |
| apenas anexar pelo sistema | sappnd | sappnd, sappend | Não | todos | os dados existentes no arquivo não podem ser substituídos e o arquivo não pode ser truncado |
| apenas anexar pelo usuário | uappnd | uappnd, uappend | Sim | todos | os dados existentes no arquivo não podem ser substituídos e o arquivo não pode ser truncado |
| imutável pelo sistema | schg | schg, schange, simmutable | Não | todos | o arquivo não pode ser alterado, renomeado, movido ou removido |
| imutável pelo usuário | uchg | uchg, uchange, uimmutable | Sim | todos | o arquivo não pode ser alterado, renomeado, movido ou removido |
| sem desvinculação pelo sistema | sunlnk | sunlnk, sunlink | Não | todos | o arquivo não pode ser removido, renomeado ou montado. No macOS, este sinalizador precisa ser definido ou removido a partir do modo de usuário único |
| sem desvinculação pelo usuário | uunlnk | uunlnk, uunlink | Sim | alguns | o arquivo não pode ser removido, renomeado ou montado. Não suportado pelo macOS |
| oculto | hidden | hidden | Não | FreeBSD | o arquivo é oculto por padrão na GUI (mas não em ls) |
| oculto do usuário | uhidden | uhidden | Sim | FreeBSD | o arquivo é oculto por padrão na GUI (mas não em ls) |
| oculto | hidden | hidden | Sim | macOS | o arquivo é oculto por padrão na GUI (mas não em ls) |
| monitorado / rastreado | tracked | tracked | Sim | macOS | modificações e exclusões de arquivos são monitoradas / rastreadas |
| restrito | restricted | restricted | Não | macOS | o arquivo é protegido pela proteção de integridade do sistema (SIP, rootless), acompanhado pelo atributo estendido com.apple.rootless e o sinalizador precisa ser definido ou removido a partir do modo de recuperação |
| comprimido | compressed | | Não | macOS | o arquivo é compactado em HFS (sinalizador somente leitura). Não disponível em volumes formatados em APFS |
| cofre de dados | | | Não | macOS | sinalizador de privacidade oculto definido pelo sistema central para proibir qualquer acesso sem direitos especiais desde o macOS Mojave |
Os sistemas BSD oferecem sinalizadores adicionais como o offline, o snapshot, o sparse e o uarchive.