
Como se sabe, se alguma coisa ruim pode acontecer, ela certamente acontecerá. Provavelmente, todos já tiveram casos em que um arquivo importante foi acidentalmente apagado ou um texto foi selecionado e destruído em um editor de texto.
Se você é um provedor de hospedagem ou dono de um site, provavelmente já lidou com invasões de contas de usuários ou do seu próprio site. Nesses casos, é importante restaurar a cronologia, descobrir a forma de penetração e a vulnerabilidade que o invasor utilizou.
Para resolver esses problemas, o sistema de arquivos NILFS2 é uma ótima solução.
Ele está presente no kernel do Linux desde a versão 2.6.30.
A característica deste sistema de arquivos é que ele é semelhante a um sistema de controle de versões: você pode sempre reverter o estado do sistema para visualizar como ele estava há algum tempo.
Para garantir essa funcionalidade, você não precisa configurar scripts Cron, fazer snapshots, etc. O sistema de arquivos NILFS2 faz tudo isso automaticamente. Ele nunca reescreve dados antigos e sempre grava em novas áreas do disco, se houver espaço livre suficiente. Totalmente de acordo com o princípio Copy-on-Write.
Na prática, qualquer modificação em um arquivo resulta na criação automática de um novo snapshot do sistema de arquivos, permitindo que você use este FS como uma máquina do tempo e retroceda o estado dos arquivos.
Histórico
O NILFS2 foi desenvolvido nas entranhas , uma empresa estatal (que detém o controle acionário) e a maior empresa de telecomunicações do Japão. Mais especificamente, no laboratório CyberSpace Laboratories sob a supervisão de .
Não se sabe exatamente para que foi especificamente desenvolvido, no entanto, pode-se supor que um FS desse tipo, com sua funcionalidade de “máquina do tempo”, é ideal para armazenar dados que possam chamar a atenção dos serviços de segurança, para rever toda a sequência de SMS, e-mails, etc.
O NILFS2 também é, potencialmente, uma ferramenta muito valiosa para agências de segurança interna, pois permite recuperar todos os e-mails apagados em um banco de dados, expor falhas de funcionários que posteriormente podem tentar se encobrir, apagando ou alterando seus arquivos.
Como acompanhar toda a história da correspondênciaNo Linux, em servidores (é exatamente lá que NILFS2 deve ser instalado para fins de segurança interna), o armazenamento de mensagens de e-mail é frequentemente feito através de um método de armazenamento de arquivos. O chamado formato . Basta instalar o e configurar o armazenamento de e-mails em Maildir. Outro formato, , consiste em um grande arquivo de texto que pode ser facilmente analisado em mensagens separadas.
Se o servidor de e-mail usar um banco de dados, o NILFS2 permitirá restaurar o timestamp exato das alterações do banco e a possibilidade de restaurar o banco em qualquer um desses momentos. E, em seguida, será necessário usar as ferramentas do banco de dados para verificar o que havia nele naquele momento…
No entanto, algo deu errado. Ou o governo do Japão desistiu de monitorar todos (à la princípio Yarovaya), ou o desempenho do NILFS2 em HDDs tradicionais revelou-se muito abaixo do esperado, e o NILFS2 foi lançado sob a licença GPL e rapidamente se integrou ao kernel do Linux, uma vez que os desenvolvedores do kernel não tinham queixas significativas sobre o código escrito por profissionais altamente qualificados japoneses.
O que se parece com NILFS2?
Do ponto de vista do uso: como um sistema de controle de versões . Cada checkpoint do sistema de arquivos é um commit, que é feito automaticamente sem o conhecimento do usuário a cada alteração: seja a remoção, a alteração do conteúdo de um arquivo ou permissões. Cada commit tem um número que aumenta linearmente.
Do ponto de vista do programador: se assemelha a um buffer circular. O sistema de arquivos acumula alterações e as grava em um pedaço com aproximadamente 8 MB (2000 * 4096, onde 2000 é o número de elementos em um bloco e 4096 é o tamanho da página de memória). Todo o disco é dividido em tais pedaços. A gravação é feita sequencialmente. Quando o espaço livre se esgota, as capturas mais antigas são excluídas, e os pedaços são regravados.
Principais vantagens do NILFS2
- Versionamento!!!
- O procedimento de recuperação do sistema de arquivos após uma falha é simples: durante a inicialização, o último pedaço com uma soma de verificação válida é encontrado e o superbloco é estabelecido nele. Esta é uma operação praticamente instantânea.
- Como a gravação sempre ocorre linearmente, isso:
- pode mostrar bons resultados ao trabalhar em SSDs, com gravação aleatória lenta.
- O NILFS2 economiza recursos de SSD, uma vez que quase não há fator de multipliação de gravação.
Mais precisamente, não mais do que 2.A questão é que, ao reescrever ciclicamente todo o disco, o NILFS2 moverá dados imutáveis para novos blocos (chunks).Se temos 10% de dados imutáveis no disco, teremos um aumento de 10% na gravação com 1 reescrita completa. E 50% de aumento com 50% de ocupação do dispositivo para 1 reescrita completa do disco.
O fator máximo de ampliação de gravação é 2. Isso é muito baixo, considerando que tudo é escrito sequencialmente. De modo geral, a multiplicação da gravação será menor do que em um sistema de arquivos fragmentado comum com setor de 4096 bytes. (Leva a pensar ).
- A potencial simplicidade de implementação da replicação em um sistema de arquivos NILFS2 remoto
NILFS2 para /home
Em sistemas operacionais semelhantes ao Unix, geralmente há uma pasta /home, onde os dados dos usuários são armazenados. Vários programas salvam suas configurações nessa pasta relacionadas a usuários específicos.
E quem, senão os usuários, costuma cometer erros? Portanto, como se diz, é um sinal divino para usar NILFS2 em /home.
especialmente agora que, com a disseminação generalizada de SSDs, não precisamos mais nos preocupar com uma queda significativa ao usar sistemas de arquivos CoW.
Sim, podemos criar snapshots do sistema de arquivos (snapshots) com a frequência que quisermos tanto no ZFS quanto no BTRFS, mas sempre há o risco de que uma alteração perdida de arquivo ocorra entre os snapshots. E os snapshots ainda precisam ser gerenciados: remover os antigos. No NILFS2, tudo isso ocorre automaticamente, literalmente a cada poucos segundos.
Eu criei um volume lógico usando lvcreate (no grupo de volumes nvme, pool fino thin). Recomendo criar exatamente em um volume LVM, pois posteriormente pode ser facilmente ampliado. Sugiro ter 50% de espaço livre no disco com NILFS2 para uma profundidade decente de versionamento.
lvcreate -V10G -T nvme/thin -n homee o formatei para NILFS2:
mkfs.nilfs2 -L nvme_home /dev/nvme/home
mkfs.nilfs2 (nilfs-utils 2.1.5)
Iniciando a gravação dos dados iniciais do sistema de arquivos no dispositivo
Tamanho do bloco: 4096 Dispositivo: /dev/nvme/home1 Tamanho do dispositivo: 10737418240
Inicialização do sistema de arquivos sucedida!!
Depois disso, é necessário copiar todos os dados do atual /home.
Eu fiz isso logo após ligar o computador, antes de entrar na minha conta, como usuário root. Se eu tivesse acessado como meu usuário, alguns programas teriam aberto sockets e arquivos na pasta do meu usuário /home/user, o que tornaria a cópia limpa difícil. Como é sabido, a pasta home do usuário root geralmente está localizada em /root, portanto, nenhum arquivo será aberto na partição /home.
mkdir /mnt/newhome
mount -t nilfs2 /dev/nvme/home /mnt/newhome
cp -a /home/. /mnt/newhome Sobre a última linha, consulte. .
Em seguida, editamos /etc/fstab, onde o sistema de arquivos para /home é montado, para
/dev/disk/by-label/nvme_home /home nilfs2 noatime 0 0
Opção noatime que é necessário para melhorar o desempenho, para que, a cada acesso a arquivos, o atime não seja alterado. Em seguida, reiniciamos.
Tipos de snapshots no NILFS2.
Um snapshot normal sem proteção contra exclusão é chamado de checkpoint (checkpoint ou ponto de restauração).
Um snapshot com proteção contra exclusão automática é chamado de snapshot, que, daqui em diante, será apenas chamado de snapshot.
A visualização de checkpoints é feita através do comando lscp
Visualização de snapshots (snapshots) lscp -s
Podemos também criar snapshots e checkpoints a qualquer momento usando:
mkcp [-s] dispositivoRestauramos dados.
O NILFS permite montar quantos snapshots antigos forem necessários em paralelo com o trabalho na ramificação principal do FS. Mas apenas em modo de leitura.
A configuração é a seguinte. Checkpoints normais, que o NILFS2 faz, podem ser excluídos automaticamente a qualquer momento (quando o espaço em disco acabar ou de acordo com as regras nilfs_cleanerd), por isso, antes da montagem, precisamos transformar o checkpoint em um snapshot ou, como se diz em russo, fixar o snapshot.
chcp ss número_checkpointApós isso, podemos montar o snapshot, por exemplo, assim:
mount -t nilfs2 -r -o cp=número_checkpoint /dev/nvme/home /mnt/nilfs/número_checkpoint Depois disso, copiamos os arquivos restaurados do snapshot para /home.
E posteriormente removemos a marca de não exclusão do snapshot, para que, no futuro, o coletor de lixo automático possa remover dados obsoletos:
chcp cp número_checkpointUtilitários para NILFS2
Aqui está o problema. Sim, claro, podemos criar FS, mudar seu tamanho online, visualizar a lista de checkpoints, criá-los e excluí-los. O pacote nilfs2-utils oferece um conjunto mínimo de ferramentas.
Como a NTT descontinuou o financiamento, não existem utilitários de baixo nível rápidos que permitem visualizar o histórico de alterações de arquivos, fazer diff entre snapshots.
Meu utilitário n2u
Para preencher esse vazio, escrevi , que consegue exibir o histórico de alterações de um arquivo/diretório específico:
n2u log filenameA saída é mais ou menos assim:
CHECKPOINT DATA HORA TIPO TAMANHO MODO
1787552 2019-11-24 22:08:00 primeiro 7079 cp
1792659 2019-11-25 23:09:05 alterado 7081 cpEle funciona bastante rápido para o método preferido de implementação: busca diferenças entre arquivos usando a técnica de bisseção, montando e comparando rapidamente arquivos/diretórios em diferentes snapshots.
Você pode definir um intervalo de checkpoints usando a chave -cp CP1:CP2 ou -cp {ANO-MM-DD}:{ANO-MM-DD}.
Você também pode ver a diferença entre checkpoints para um arquivo ou diretório específico:
n2u diff -r cp1:cp2 filenameÉ possível exibir todo o histórico de mudanças: todas as diferenças entre os checkpoints de um arquivo/diretório específico:
n2u blame [-r cp1:cp2] filenameO intervalo de datas nesta ordem também é suportado.
Um apelo aos desenvolvedores
Há muitos especialistas no Habr. Por favor, melhorem o NILFS2. Façam replicação, diff de baixo nível rápido entre revisões, reflink e outras funcionalidades!
Links
.
Repositórios:
.
.
Listas de discussão:
. Identificador para assinatura: linux-nilfs.
.
.
.
Agradecimentos:
- Aos desenvolvedores do NILFS2: Ryusuke Konishi, Koji Sato, Naruhiko Kamimura, Seiji Kihara, Yoshiji Amagai, Hisashi Hifumi e Satoshi Moriai. Outros principais contribuintes: Andreas Rohner, Dan McGee, David Arendt, David Smid, dexen deVries, Dmitry Smirnov, Eric Sandeen, Jiro SEKIBA, Matteo Frigo, Hitoshi Mitake, Takashi Iwai, Vyacheslav Dubeyko.
- Às empresas Amblin Entertainment e Universal Pictures pela maravilhosa série de filmes . A primeira imagem do post foi retirada do filme ‘De Volta para o Futuro — 3’.
- À empresa pelo apoio e pela oportunidade de publicação em seu blog no Habr.
P.S. Caso encontre erros, envie uma mensagem privada. Isso melhora minha karma.
Você pode experimentar o NILFS2 encomendando uma máquina virtual com usando o cupom abaixo. Para todos os novos clientes, período de teste gratuito de 3 dias.
Fonte: habr.com
