Eu li algumas perguntas, que pedem conselhos sobre como rsync
distribuir arquivos esparsos com eficiência, mencionando os arquivos /var/log/lastlog
e /var/log/faillog
. Na verdade, eu mesmo tropecei no fato de esses arquivos serem um "problema", pois o backup via rsync os torna "unsparse".
O que eu me pergunto é, qual é a motivação de necessidade/fundo para ter esses arquivos como arquivos esparsos e enormes (no meu caso, era 1,1 TB)?
Também em relação a isso, um acompanhamento: Como eu estava assumindo que eles eram arquivos de log, não me importo excessivamente em truncar esses arquivos, corrompi alguma coisa ao truncar esses arquivos?
É assim que deve ser.
/var/log/lastlog
não é um arquivo de log como/var/log/syslog
, e seu nome deve ser lido como "última lista de logins" em vez de "último arquivo de log".É mantido pelo
pam_lastlog(8)
módulo e é basicamente um array como este:Os tamanhos dos campos em uma máquina x86-64 típica estão nos comentários; uma entrada deve ser 4 + 32 + 256 = 292 bytes.
Toda vez que um programa que usa o
pam_lastlog(8)
módulo pam faz o login de um usuário, ele buscauid * sizeof(struct lastlog)
e sobrescreve a entrada correspondente a esse usuário.Você corrompeu a saída do
lastlog(1)
comando, que ninguém está usando de qualquer maneira ;-)Eu vi esse comportamento depois que introduzimos alguns (grandes) números UID LDAP coexistindo com números UID UNIX "normais" em uma máquina linux (RHEL 7).
Além disso, na seção "CAVEATS" da página de manual para "lastlog", afirma que
"lastlog" parecerá travar enquanto processa entradas com os UIDs não utilizados intermediários
Talvez isso também possa estar relacionado ao problema observado, pois os números de UID LDAP do FreeIPA atribuídos eram muito maiores que os do Linux
Esses 2 arquivos são arquivos do tipo "dados", se você verificar usando o comando ls -l ou ls -lh, verá que está ocupando uma quantidade muito grande de espaço em disco, mas na verdade não é
"ls -s" é o comando real para verificar o tamanho real desses arquivos.
O tamanho real é de apenas alguns KB, se você verificar com o comando "ls -s".
Ao "truncar o arquivo", sem informar (ou reiniciar) os programas que estão gravando no arquivo de log, VOCÊ causou o arquivo esparso.
A melhor solução é encontrar e corrigir o problema que causa todas essas mensagens de log.
Outra maneira de evitar o problema é interromper o serviço de log, usar
lsof
para garantir que nenhum outro processo tenha o arquivo aberto, truncar o arquivo e reiniciar o log.Conforme solicitado, aqui está um modelo de como (não) funciona:
Um programa abre o arquivo para "anexar", é informado que o arquivo termina no bloco X e escreve o bloco X+1. Você "trunca o arquivo", mas o programa "sabe" que o próximo bloco a escrever é X+2. Assim, o arquivo pode fornecer dados no início, mas definitivamente possui dados no bloco X+2. Ta-Da! Arquivo esparso.