... 어떻게 알 수 있습니까?
서버를 재부팅하려고한다고 가정 해 봅시다. 가동 중지 시간을 최소화하고 싶습니다. "친구에게 전화를 걸면 부팅시 fsck에 도달하게됩니다"라는 별칭으로 재부팅을 래핑하는 것에 대해 생각합니다.
다음 질문입니다. "다음에하자"라고 말하는 가장 좋은 방법은 무엇입니까? 마지막 확인 날짜를 설정 하시겠습니까?
tune2fs가 많은 매개 변수를 설정할 수 있다는 것을 알고 있지만 어떻게 얻을 수 있습니까?
... 어떻게 알 수 있습니까?
서버를 재부팅하려고한다고 가정 해 봅시다. 가동 중지 시간을 최소화하고 싶습니다. "친구에게 전화를 걸면 부팅시 fsck에 도달하게됩니다"라는 별칭으로 재부팅을 래핑하는 것에 대해 생각합니다.
다음 질문입니다. "다음에하자"라고 말하는 가장 좋은 방법은 무엇입니까? 마지막 확인 날짜를 설정 하시겠습니까?
tune2fs가 많은 매개 변수를 설정할 수 있다는 것을 알고 있지만 어떻게 얻을 수 있습니까?
답변:
fsck를 피하기 만하면 종료에 -f 옵션을 추가하면 도움이됩니다. fsck를 강제 종료하려면 shutdown -F를 종료하십시오.
tune2fs -l /dev/foo
흥미로운 정보를 알려줄 것입니다.
필요한 것을 추출하는 시작은 다음과 같습니다.
mount -l -t ext3,ext2 | cut -d' ' -f1 | xargs -n1 tune2fs -l | egrep -i 'state|mount|check'
"다음 점검 후"날짜가 과거 인 경우 fsck가 있습니다.
파일 시스템 상태가 깨끗하지 않으면 fsck가 있습니다. (재부트 해제를 방해하는 재부팅 / 종료시 시스템에 문제가있는 경우에도 발생할 수 있습니다)
마운트 수가 최대 마운트 수에 도달하면 fsck가 있습니다.
사용 tune2fs -l /path/to/device
:
-c
max -C
를 변경하거나 count를 변경하는 데 사용하십시오.-i
경우 간격 -T
을 변경하거나 마지막으로 확인한 변경을 사용하십시오.추측하지 않으려면 다음을 수행하십시오.
/ fastboot를 터치합니다
느린 검사를 피할 것입니다 (또는 검사가 실패하고 재부팅이 중단되면 총 실패).
다음 fsck가 언제 발생하는지 확인하기 위해 다음 perl 스크립트를 사용합니다.
#!/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;
~ / .bashrc에서 실행하므로 파일 시스템을 언제 확인할지 항상 알 수 있습니다. 확장 된 fsck 시간으로 고통받지 않는 ext4를 사용하지만 알아두면 좋습니다.
일반적인 출력은 다음과 같습니다.
Filesystem /dev/sda1, mounted on / will be checked in 5 mounts
user@localhost ~ $
파일 시스템 목록을 더 편안하게 얻는 방법에 대해 생각했습니다.
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;
}
'
나는 그것이 더 우아하게 이루어질 수 있다고 생각하지만 어쨌든 여기 있습니다. 하나를 파이프로 연결 xargs -r df -h
하면 파일 시스템의 크기를 빠르게 확인할 수 있습니다.
위의 코드에서 "다음 확인"시간은 시스템이 다시 시작될 때까지 시간이 걸린다고 가정하고 (NOW + 120 초)와 비교됩니다.
HTH
다음은 파일 시스템에서 fsck ( source ) 를 확인하는 스크립트입니다 .
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