ZFS 스크럽이 * 완료 *되면 명령을 실행하는 방법은 무엇입니까?


11

cron을 사용하여 ZFS 풀의 정기적 스크럽을 예약 하고 스크럽이 완료된 후 꽤 짧은 시간 에 상태 보고서를 자신에게 전자 메일로 보내려고합니다. 이것의 목적은 수동으로 문제를 찾지 않고도 문제를 포착하는 것입니다 (풀이 아닌 푸시).

첫 번째 부분은 쉽습니다 : zpool scrub $POOL특정 상황에서 합리적인 간격으로 루트 로 실행되도록 cron 작업을 설정하십시오 .

두 번째 부분은 어떻게 해야할지 잘 모르겠습니다. zpool scrub즉시 복귀 한 다음 시스템에서 스크럽을 백그라운드에서 실행합니다 (터미널에서 관리자가 스크럽을 시작한 경우에는 바람직한 동작 임). zpool status나에게 상태 보고서를 제공하고 종료합니다 (스크럽이 실행되는 동안 종료 코드 0으로; 아직 완료되지 않았으므로 종료 상태가 완료되면 변경되는지 알 수 없지만 의심합니다). zpool scrub에 -s대해 문서화 된 유일한 매개 변수는 " 스크럽 중지"입니다.

주요 문제점은 스크러빙 에서 완료된 스크러빙 으로 상태 변경을 감지하는 것입니다 . 주어진 나머지는 제자리에 있어야합니다.

이상적으로 zpool scrub는 스크럽이 끝날 때까지 돌아 가지 말라고하고 싶지만 그렇게 할 수있는 방법을 찾지 못했습니다. (간단히 cron하기가 너무 쉽습니다 zpool scrub --wait-until-done $POOL; zpool status $POOL.)

실패하면, 업그레이드 또는 구성 변경으로 인해 너무 위험하지 않은 방식으로 스크럽이 현재 진행 중인지 시스템에 묻고 싶습니다. 따라서 이전에 실행 중인지 여부에 대해 조치를 취할 수 있습니다. 스크럽이 완료되었습니다 (스크럽 상태가 스크러빙에서 스크러빙하지 않을 때 zpool 상태를 실행하여).

이 특별한 설정은 Nagios의 같은 모니터링 도구가 동안 이렇게, 워크 스테이션 시스템에 대한 아마 문제를 해결할 추가 기능을 가지고, 그냥이 하나 개의 작업을 위해 이러한 도구를 설치하지 않고 과잉 느낀다. 누군가 문제에 대한 최첨단 솔루션을 제안 할 수 있습니까?

답변:


13

ZFS에서 리눅스 로 시작 버전 0.6.3 이를 사용하여 매우 우아하게 처리 할 수 있습니다 (택일) ZFS 이벤트 데몬. 이벤트 데몬은 커널 이벤트를 직접 모니터링하기 때문에 발생하는 모든 이벤트에 거의 즉시 반응 할 수 있으며 다른 명령 출력의 지속적인 폴링 및 구문 분석에 의존하지 않습니다.

로 시작하는 파일 이름으로 쉘 스크립트를 작성하십시오 /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가 시작되었는지 확인하십시오.



3

이 질문은 리눅스에만 해당되지만 "스크럽이 끝날 때까지 기다립니다"를 검색 할 때 처음으로 Google 검색 결과 이므로 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. 원하는 풀 이름과 같은 경우 스크립트 내부를 확인해야합니다 . 여전히 폴링보다 오버 헤드가 훨씬 적습니다.


2

이메일로 상태보고를 스크러빙 할 때이 간단한 스크립트를 사용합니다.

당신의 전환 감지해야하는 경우 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

코드를 살펴 보았지만 스크립트가 실행될 때 상태 만 제공하는 것 같습니다. 상태가 "스크러빙"에서 "완료"로 바뀌면 어떻게 알 수 있습니까?
CVn

@ MichaelKjörling while ... done은이 조건에 대한 루프 점검 으로 인해 스크럽이 진행되는 동안 스크립트가 완료되지 않습니다 .
the-wabbit

나는 이런 식으로 내가 갈 길이라고 생각합니다. 그건 그렇고, grep -q당신의 쉘 스크립트 스 니펫에서도 잘 작동해야하므로 / dev / null로 리디렉션 할 필요가 없습니다. :)
CVn

그렇습니다. POSIX grep을 사용하여 Solaris 10에서이 옵션을 테스트했습니다.
dsmsk80

그래. 그러나 GNU grep에는 원하는 의미가있는 -q가 있습니다.
CVn September

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.