smartmontools의 저장장치 오류 알림 메일로 받기

smartmontools 는 SSD 등의 저자장치 상태를 모니터링하는 툴이다. 저장장치에서 오류가 발생했을 때 메일로 오류 알림을 받을 수 있어 서버의 저장장치 오류를 확인하고 대비할 수 있는 방법이 될 수 있다. smartmontools 를 설치하고 메일 알림을 받기 위한 설정이다. 우분투 서버 16.04 x64 환경에서 테스트했다.

sudo apt-get -y install sendmail
sudo apt-get -y install mailutils
sudo apt-get -y install smartmontools

sendmail 등의 메일 패키지와 smartmontools 를 설치한다.

smartd 데몬 실행을 위해 /etc/default/smartmontools 파일을 아래와 같이 수정한다. #start_smartd=yes 의 주석을 제거한다.

# Defaults for smartmontools initscript (/etc/init.d/smartmontools)
# This is a POSIX shell fragment

# List of devices you want to explicitly enable S.M.A.R.T. for
# Not needed (and not recommended) if the device is monitored by smartd
#enable_smart="/dev/hda /dev/hdb"

# uncomment to start smartd on system startup
start_smartd=yes

# uncomment to pass additional options to smartd on startup
#smartd_opts="--interval=1800"

/etc/smartd.conf 에 메일 설정을 한다.

# The word DEVICESCAN will cause any remaining lines in this
# configuration file to be ignored: it tells smartd to scan for all
# ATA and SCSI devices.  DEVICESCAN may be followed by any of the
# Directives listed below, which will be applied to all devices that
# are found.  Most users should comment out DEVICESCAN and explicitly
# list the devices that they wish to monitor.
DEVICESCAN -d removable -n standby -m usermail@gmail.com -M exec /usr/share/smartmontools/smartd-runner

-m root 부분을 -m usermail@gmail.com 으로 변경한다. usermail@gmail.com 은 실제 알림을 받을 메일 주소를 지정한다. 설정 변경 후 smartd 데몬의 설정을 다시 로드 한다.

/etc/init.d/smartmontools reload

smartd 데몬에서 메일이 발송되는지 확인해 보기 위해서는 아래 명령을 실행한다.

sudo echo "/dev/sda -m usermail@gmail.com -M test" > /etc/smartd.conf.test
sudo smartd -c /etc/smartd.conf.test
sudo rm -f /etc/smartd.conf.test

smartmontools 등의 패키지 설치와 메일 발송 테스트를 자동화한 스크립트는 아래와 같다.

#!/bin/bash

# Install mail
sudo apt-get -y install sendmail
sudo apt-get -y install mailutils
sudo apt-get -y install smartmontools

# add email
sudo sed -i "21s/-m root/-m usermail@gmail.com/" /etc/smartd.conf
/etc/init.d/smartmontools reload

# email test
sudo echo "/dev/sda -m usermail@gmail.com -M test" > /etc/smartd.conf.test
sudo smartd -c /etc/smartd.conf.test
sudo rm -f /etc/smartd.conf.test

 

참고자료

우분투 서버 netdata 에 smart_log 차트 표시

운영 중인 서버의 모니터링을 위해 netdata 를 사용하고 있다. 리얼 단독서버인 경우에는 디스크의 오류를 모니터링할 수 있어야 하는데 netdata 에서  S.M.A.R.T 정보를 차트로 표시하기 위해서는 약간의 작업이 필요하다. 우분투 서버에서는 smartmontools 패키지를 설치한다.

sudo apt-get -y install smartmontools

smartd 데몬 실행을 위해 /etc/default/smartmontools 파일을 아래와 같이 수정한다.

# Defaults for smartmontools initscript (/etc/init.d/smartmontools)
# This is a POSIX shell fragment

# List of devices you want to explicitly enable S.M.A.R.T. for
# Not needed (and not recommended) if the device is monitored by smartd
#enable_smart="/dev/hda /dev/hdb"

# uncomment to start smartd on system startup
start_smartd=yes

# uncomment to pass additional options to smartd on startup
smartd_opts="--interval=600 -A /var/log/smartd/"

-A /var/log/smartd/ 옵션을 통해 smartd 로그 파일을 /var/log/smartd/ 디렉토리에 생성한다. netdata 에서 기본으로 smartd 로그를 읽는 위치이다. smartd 디렉토리가 없다면 생성해 둔다. smartd 를 재시작한다.

service smartmontools restart

smartd 로그 파일을 확인할 수 있으면 netdata 를 재시작한다. netdata 에서는 추가적인 설정없어도 smartd_log 차트를 표시할 것이다.

service netdata restart

참고자료

우분투 서버에서 uptime 체크 후 일정일 이상이면 자동 재부팅 스크립트

관리하는 서버가 많아지니 서버의 uptime 체크 후 재부팅하는 것도 일이다. 그래서 각 서버에서 cron 으로 uptime 체크 후 일정일 이상 경과했으면 보안패치 등을 적용하고 자동 재부팅하는 쉘스크립트를 작성했다. 실제 서버에 적용 전이라 오류를 확인해보진 않았다. 적용 후 오류가 발견된다면 코드를 수정할 예정이다.

#!/bin/bash
read -d. seconds < /proc/uptime

# 10일 이상 경과
DATES=10

UPTIME=24*60*60*$DATES

if (( $seconds > $UPTIME )); then
    sudo apt-get -y update
    #sudo apt-get -y upgrade
    DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" dist-upgrade
    sudo apt-get -y autoremove
    sudo reboot
fi

코드에서는 10일 이상 경과했을 경우에 보안패치 등을 적용하고 자동 재부팅한다.

  • 2018-09-18 16:00 업그레이드 때 설정파일 유지 등의 화면 표시가 되지 않고 자동 업그레이드 되도록 코드 수정

[쉘스크립트] 텍스트파일의 라인을 읽어 ip와 id 구분하기

텍스트 파일의 각 라인을 읽어 해당 라인에서 ip 와 id 를 구분해서 출력하는 코드이다. 텍스트의 파일은 아래와 같은 형식이다. ip 와 이름-id 는 탭으로 구분된 상태이다.

192.168.10.100	홍길동-gildong
192.168.10.101	김철수-kcs0297

쉘스크립트 코드는 아래와 같다.

#!/bin/bash
IPS=()
IDS=()

i=0

while IFS='' read -r line || [[ -n "$line" ]]; do
    IFS=$'\t'
	tmp=($line)
	IPS[${i}]=${tmp[0]}

	str=${tmp[1]}

	IFS=$'-'
	tmp=($str)
	IDS[${i}]=${tmp[1]}

	i=${i}+1
done < "$1"

for (( i=0; i<${#IPS[@]}; i++)); do
	echo "${IPS[i]} / ${IDS[i]}"
done

쉘스크립트 실행 방법을 ./read.sh hosts 와 같다. 쉘스크립트 파일과 텍스트 파일을 지정해주면 된다. 실행 결과는 아래와 같다.

192.168.10.100 / gildong
192.168.10.101 / kcs0297

참고
– https://stackoverflow.com/questions/1951506/add-a-new-element-to-an-array-without-specifying-the-index-in-bash
– https://unix.stackexchange.com/questions/410710/splitting-a-line-into-array-in-bash-with-tab-as-delimiter
– https://stackoverflow.com/questions/27291158/split-tab-separated-string-into-array-in-bash
– https://stackoverflow.com/questions/6654849/how-to-split-a-string-in-bash-delimited-by-tab