
cron을 사용하여 ZFS 풀의 주기적인 스크럽을 예약하고 비교적 짧은 시간에 실행하고 싶습니다.스크럽이 끝난 후, 나에게 상태 보고서를 이메일로 보내세요. 이 방법의 목적은 수동으로 문제를 찾지 않고도(당기기보다는 밀어서) 문제를 파악하는 것입니다.
첫 번째 부분은 쉽습니다. zpool scrub $POOL
특정 상황에서 합리적인 간격으로 루트로 실행되도록 크론 작업을 설정하기만 하면 됩니다.
두 번째 부분은 어떻게 해야 할지 잘 모르겠습니다. zpool scrub
즉시 반환된 다음 스크러빙은 시스템에 의해 백그라운드에서 실행됩니다. 이는 터미널에서 관리자가 스크러빙을 시작한 경우 확실히 바람직한 동작입니다. zpool status
상태 보고서를 제공하고 종료됩니다(스크럽이 실행되는 동안 종료 코드는 0입니다. 아직 완료되지 않았으므로 완료되면 종료 상태가 변경되는지는 알 수 없지만 의심스럽습니다). zpool 스크럽에 대해 문서화된 유일한 매개변수는 -s
"스크러빙 중지"용입니다.
주요 문제는 상태 변화를 감지하는 것입니다.닦고에게닦기를 마쳤다.이를 감안할 때 나머지는 제자리에 있어야합니다.
이상적으로는 스크럽이 끝날 때까지 돌아오지 말라고 말하고 싶지만 zpool scrub
그렇게 할 방법이 없습니다. (단순히 cron 하기가 너무 쉬워집니다 zpool scrub --wait-until-done $POOL; zpool status $POOL
.)
실패할 경우 스크럽이 현재 진행 중인지 시스템에 묻고 싶습니다. 가급적이면 업그레이드나 구성 변경으로 인해 중단될 위험이 크지 않은 방식으로 이전에 실행 중인지 여부에 대해 조치를 취할 수 있습니다. 스크럽이 완료되었습니다(스크럽 상태가 스크러빙에서 스크러빙 없음으로 바뀔 때 zpool 상태 실행).
이 특정 설정은 워크스테이션 시스템용이므로 Nagios와 같은 모니터링 도구는아마문제를 해결하는 추가 기능이 있으므로 이 한 가지 작업에만 그러한 도구를 설치하는 것은 다소 과잉이라고 느껴집니다.누군가 문제에 대한 낮은 수준의 기술 솔루션을 제안할 수 있습니까?
답변1
~에Linux의 ZFS, 로 시작버전 0.6.3이것은 다음을 사용하여 매우 우아하게 처리될 수 있습니다.ZFS 이벤트 데몬(zed).이벤트 데몬은 커널 이벤트를 직접 모니터링함으로써 발생하는 모든 이벤트에 거의 즉각적으로 반응할 수 있으며 다른 명령 출력의 지속적인 폴링 및 구문 분석에 의존하지 않습니다.
/etc/zfs/zed.d/scrub.finish
(예: ) 로 시작하는 파일 이름을 사용하여 쉘 스크립트를 작성하십시오 scrub.finish-custom.sh
. 해당 스크립트는 이메일 보내기, 어딘가에 로그 항목 쓰기, 시스템이 노래하고 춤추게 만드는 등 적절한 조치를 취할 수 있습니다. 출발점을 제공할 수 있는 예가 제공됩니다.
원하는 것이 스크럽이 완료되었을 때 이메일을 받는 것이라면 제공된 scrub.finish-email.sh
스크립트가 이를 훌륭하게 수행할 것입니다. 간단히 /etc/zfs/zed.d/zed.rc를 편집하여 이메일을 보낼 위치와 이메일을 보내야 하는지 여부를 표시하고 풀에 문제가 없는 경우 scrub.finish
/etc에서 이름 뒤에 아무 것도 없는지 확인하세요. /zfs/zed.d로 연결되어 부팅 시 zed가 시작되는지 확인하세요.
답변2
이 질문은 Linux에만 해당되지만 다음을 검색할 때 Google에서 처음으로 검색한 결과입니다."스크럽이 끝날 때까지 기다려주세요"따라서 Linux(일반 Solaris도 작동해야 하지만 그곳에서는 테스트하지 않았습니다) 대신 OpenSolaris(OmniOS에서 테스트했지만 SmartOS, Illumos 등은 유사해야 함)를 실행하는 사람들을 위한 몇 가지 유용한 정보를 추가하고 싶습니다.
syseventadm
커널 이벤트를 등록하는 데 사용할 수 있습니다 . 전체 목록은 다음에서 찾을 수 있습니다 /usr/include/sys/sysevent/eventdefs.h
(이 파일에서 "ZFS"를 검색하면 됩니다). 이벤트를 추가한 후 서비스를 다시 시작해야 합니다. 예:
syseventadm add -c EC_zfs -s ESC_ZFS_scrub_finish /path/to/script.sh \$pool_name
syseventadm restart
이렇게 하면 풀 스크러빙이 완료되면 스크립트가 시작됩니다. $1
원하는 풀 이름과 같은지 스크립트 내부를 확인해야 합니다. 그래도 폴링보다 오버헤드가 훨씬 적습니다.
답변3
저는 이메일로 상태 보고를 스크러빙하기 위해 이 간단한 스크립트를 사용합니다.
전환을 감지해야 하는 경우 scrub running
출력 필드를 scrub finished
확인합니다 . 이 같은:state
zpool status
# start scrubbing
zpool scrub ZPOOL
# wait till scrub is finished
while zpool status ZPOOL | grep 'scan: *scrub in progress' > /dev/null; do
echo -n '.'
sleep 10
done
# send a report
zpool status | mail -s "zpool status: ZPOOL" RECIPIENT
답변4
최신 ZFS 버전에는 OP가 요청한 내용이 정확하게 추가되었습니다. -w
돌아오기 전에 스크럽이 완료될 때까지 기다리는 데 사용합니다. 예를 들어:
zpool scrub tank -w ; zpool status tank | mail -s "report" [email protected]