Meu sistema funcionará quando eu reiniciar?

20

... e como eu descubro?

Digamos que estou prestes a reiniciar um servidor. Gostaria de minimizar o tempo de inatividade, portanto, pensando em agrupar a reinicialização em um pseudônimo que diz "espere um amigo, você acessará um fsck na inicialização".

Próxima pergunta ... qual é a melhor maneira de dizer "vamos fazer da próxima vez?" definir a data da última verificação?

Eu sei que o tune2fs pode definir vários parâmetros, mas como eu os pegaria?

Tom Newton
fonte
Qual sistema operacional você está executando e qual sistema de arquivos?
2177 Alan H Alan
Bom ponto - as versões do Linux (principalmente deb & derivados) e ext2 ou ext3
Tom Newton

Respostas:

19

Se tudo o que você deseja fazer é evitar um fsck, adicionar a opção -f ao desligamento deve ajudar nisso. shutdown -F para forçar o fsck.

tune2fs -l /dev/foo lhe dirá as informações interessantes.

Aqui está um começo para extrair exatamente o que você precisa:

mount -l -t ext3,ext2 | cut -d' ' -f1 | xargs -n1 tune2fs -l | egrep -i 'state|mount|check'

Se a data "Próxima verificação depois" estiver no passado, haverá um fsck.

Se o estado do sistema de arquivos não estiver limpo, haverá um fsck. (isso também pode acontecer se houver um problema com o sistema durante a reinicialização / desligamento que impeça uma desmontagem limpa)

Se a contagem de montagem atingiu a contagem máxima de montagem, haverá um fsck.

freiheit
fonte
Obrigado - se eu usar o desligamento -f, a próxima reinicialização receberá o fsck?
Tom Newton
Supondo que seu sistema atualmente atenda a um dos critérios para obter um fsck, sim, a próxima reinicialização receberá o fsck. "shutdown -f" cria um arquivo que informa à inicialização do sistema para ignorar o fsck, mas a inicialização do sistema também remove esse arquivo.
Freiheit
10

Usando tune2fs -l /path/to/device:

  • Se "Contagem de montagem" for maior que "Contagem máxima de montagem", use -cpara alterar o máximo ou -Cpara alterar a contagem
  • Se "Última verificação" não for recente o suficiente para o "Intervalo de verificação" use -ipara alterar o intervalo ou -Tpara alterar a última verificação
brian-brazil
fonte
Isso pressupõe ext2 ou ext3, mas é uma suposição bastante boa.
David Pashley
David: a questão faz tune2fs referir ...
Freiheit
6

a outra opção é que você pode pular manualmente as verificações do fsck na inicialização, atualizando o sexto campo no seu / etc / fstab:

/dev/sda2  /  ext3  defaults,errors=remount-ro 0       1

É semelhante ao que a maioria das fstabs terá 1 significa que deve ser verificada e é um sistema de arquivos raiz, 2 significa que deve ser verificada, mas será feita em paralelo com outros sistemas de arquivos e 0 significa ignorar verificação

isso também é verdade, não importa o sistema de arquivos

Brendan
fonte
1

Se você não quer adivinhar, faça o seguinte:

touch / fastboot

e você evitará verificações lentas (ou pior - uma falha total se uma verificação falhar e a reinicialização for interrompida)


fonte
1

Eu uso o seguinte script perl para verificar quando o próximo fsck ocorrerá:

#!/usr/bin/perl -w

use strict;

my $mountcount = 0;
my $maxmount = 0;
my $dev;
my $mountpoint;
my $fstype;
my $debug = 0;

my $cmd = "mount";

open MOUNT, sprintf ( "%s |", $cmd ) or die sprintf ( "ERROR: Cannot execute %s - %s\n", $cmd, $! );
while ( <MOUNT> ) {
    chomp;
    ( $dev, undef, $mountpoint, undef, $fstype, undef ) = split;
    printf "Found device %s\n", $dev if ( $debug > 0 );

    if ( $fstype =~ /^ext/i ) {
        $cmd = sprintf "dumpe2fs -h %s 2>&1", $dev;
        open DUMPE2FS, sprintf ( "%s |", $cmd ) or die sprintf ( "ERROR: Unable to execute %s - %s\n", $cmd, $! );
        while ( <DUMPE2FS> ) {
            chomp;
            if ( /^Mount count:/ ) {
                ( undef, $mountcount ) = split /:/;
                $mountcount =~ s/\s*//g;
                printf "Mount count = %s\n", $mountcount if ( $debug > 0 );
            }
            if ( /^Maximum mount count:/ ) {
                ( undef, $maxmount ) = split /:/;
                $maxmount =~ s/\s*//g;
                printf "Maximum mount count = %s\n", $maxmount if ( $debug > 0 );
            }
        }
        close DUMPE2FS;

        printf "Filesystem %s, mounted on %s will be checked in %s mounts\n", $dev, $mountpoint, $maxmount - $mountcount;
    }
}
close MOUNT;

Eu o tenho executado no meu ~ / .bashrc, então eu sempre sei quando meus sistemas de arquivos serão verificados, embora eu use o ext4 agora que não sofre com os tempos de fsck prolongados, ainda é bom saber.

Saída típica é algo como:

Filesystem /dev/sda1, mounted on / will be checked in 5 mounts
user@localhost ~ $
RivieraKid
fonte
Aparentemente, seu script não avalia os atributos "Próxima verificação depois:"!
xebeche
0

Uso regularmente o tunefs para redefinir a contagem e o tempo de inicialização antes de fazer uma reinicialização no meio do dia, para evitar o fsck. A diferença no tempo de inicialização é impressionante. Afterwords eu as redefino para permitir que a próxima inicialização fsck.

kmarsh
fonte
0

Pensei em como obter uma lista de sistemas de arquivos mais confortavelmente:

for D in $(mount -l -t ext3,ext2 | cut -d' ' -f1 ) ; do \
echo --- $D; tune2fs -l $D | egrep -i 'mount (count|time)|check' ; done \
| awk '
  /^--- / { mydev=$2; checked=0 }
  /^Mount count:/ { mycnt=$3 }
  /^Maximum mount count:/ { if (mycnt >= $3) checked=1 }
  /^Next check after:/ {
    cmd=("date +%s -d\"" $4 FS $5 FS $6 FS $7 FS $8"\"");
    cmd | getline mydate; close(cmd);
    if ((mydate <= (systime()+120)) || (checked == 1)) print mydev;
  }
'

Eu acho que poderia ser feito de forma mais elegante, mas de qualquer maneira aqui está. Se alguém colocar isso em xargs -r df -hum, também poderá ver rapidamente o tamanho dos sistemas de arquivos.

Observe que, no código acima, o tempo de "Próxima verificação" é comparado a (AGORA + 120 segundos), assumindo que leva algum tempo até que o sistema volte a funcionar.

HTH

xebeche
fonte
0

Aqui está um script que verifica seu sistema de arquivos em busca de fsck ( fonte ):

for x in $(df -t ext4 -t ext3 -t ext2 | tr -s ' ' | cut -d " " -f1 | grep -v "^$" | tail -n +2); do mmc=$(tune2fs -l $x | grep 'mount count' | tr -s ' ' | cut -d ' ' -f4) ; mc=$(tune2fs -l $x | grep 'Mount count' | tr -s ' ' | cut -d ' ' -f3) ; if [ `expr $mmc - $mc` -le 0 ] ; then fsck="0" ; else fsck="1"; fi ; CT=`date +%s` ; LCT=`date -d "\`tune2fs -l $x | grep "Last checked" | tr -s ' '| cut -d" " -f3-\`" +%s` ; CI=`tune2fs -l $x | grep "Check interval"| tr -s ' '| cut -d" " -f3` ; if [ `let $CT-$LCT` -gt `let $CI*3600*24` ] && [ $CI -gt 0 ] || [ $fsck -eq 1 ];  then echo "There will be forced fsck for $x"; else echo "There will be no fsck for $x" ; fi ; done
# Alternative script from friend with sed
# mount -t ext2,ext3,ext4|while read i j; do tune2fs -l $i|sed -n '/[Mm]ount count/{s/.*: *//;p}'|(read c; read m; [ $m -gt 0 -a $m -le $c ] && echofsck,count,$i); c="$(tune2fs -l $i|sed -n '/Next check/{s/.*r: *//;p}')"; [ -z "$c" ] || ([ `date +%s` -ge `date -d"$c" +%s` ] && echo fsck,time,$i); done
Avyd
fonte
11
Não basta postar links para sites externos - copie informações úteis e forneça o link para referência.
Frederik Nielsen