最近服務器壞了,雖然用btrfs做了raid,但兩塊硬盤都出問題了,這種倒黴事也讓我遇上真是無語。爲了今後的幸福生活,考慮對服務器做自動備份和磁盤健康檢查,如果硬盤健康度不符合預期,則發送郵件提醒。這樣也算是稍微再安全一些。寫了個腳本自動維護,在此記錄一下。
backup.py
#!/usr/bin/env python3
# 備份
import os
# 清空目標文件夾
os.system('rm -Rf /home/usr/target/*')
import datetime
# 備份到目標文件夾
os.system('cp -R /home/usr/src/* /home/usr/target/')
now = datetime.datetime.now()
print(now, "backup completed successfully!")
# 檢查磁盤健康度
import subprocess
import re
command = 'echo %s | sudo -S smartctl -a /dev/sdb' % "填寫sudo用戶密碼"
try:
result = subprocess.run(command, shell=True, capture_output=True, text=True)
if (result.returncode == 0):
output = result.stdout.splitlines()
for line in output:
# 由於每家硬盤SMART信息不同,此處僅做一示例,意義不大
if ('169' in line):
health = re.split(r'\s+', line)
print("current disk health: ", health[-1], "%")
else:
print("smartctl can not run! error code: ", result.returncode)
except FileNotFoundError as e:
print("smartctl is not installed!", str(e))
# 發送郵件
if (True): # 此處僅用於測試,實際應改爲根據xxxx條件,比如health[-1] < 0.8
import smtplib
smtp_server = 'smtp.xxxx.com'
smtp_port = 465
mail_sender = '[email protected]'
mail_sender_password = '填寫郵箱登陸密碼'
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.login(mail_sender, mail_sender_password)
receiver_email = '[email protected]'
message = "\n".join([
"Subject: [Warning " + str(now) + "] The disks on server are broken!",
"To: {}".format(receiver_email),
"From: {}".format(mail_sender),
"",
"the disks are healthless, please check and change new ones as soon as possible!"
])
server.sendmail(mail_sender, receiver_email, message)
print(now, " Email sent successfully.")
之後在crontab中創建定時任務,每天進行備份即可。
需要注意的是,此處備份依然在同一臺服務器上,只是備份到不同的磁盤上,這同樣是不安全的。既然兩塊硬盤可以一起壞掉,那就難保整臺服務器上的所有硬盤都因爲某種原因掛掉。原則上應該採用rsync進行遠程備份,但因爲文件比較大,怕帶寬不夠導致備份時間長。目前先這樣,將來再搞一臺備份服務器用來備份好了。
--------------------------------------------------------------
下面介紹一下smartctl的用法。此應用程序用於查看磁盤SMART信息,可用於檢查磁盤健康狀態。但因爲各家硬盤信息可能存在差異,特別是國內各種雜牌小廠的ssd,其SMART信息要麼不全,要麼就是擺設,所以需要先自行研究一下所用的硬盤SMART信息,再根據總結出來的結果完善上面給出的腳本。
要使用smartctl,首先安裝smartmontools
sudo apt install smartmontools
可用如下指令進行磁盤檢查:
sudo smartctl -t long /dev/sdb # 長時間測試,若干小時
sudo smartctl -t short /dev/sdb # 短時間測試,若干分鐘
最常用的查看方式有如下三種:
smartctl -a /dev/sdb # 查看所有信息
smartctl -l devstat /dev/sdb # 查看設備信息,其中可能包含ssd壽命,但可能不準
smartctl -H /dev/sdb # 查看健康狀態,但可能不準
--------------------------------------------------------------------------
接下來順便列出btrfs的一些修復命令便於查詢。以下內容來自:
https://zhuanlan.zhihu.com/p/620733061?utm_id=0
基本順序是先執行scrub檢查磁盤是否存在錯誤
mount /dev/sda1 /mnt # 掛載硬盤
btrfs scrub start /mnt # 檢查
btrfs scrub status /mnt # 查看進度
若無法掛載則可直接執行scrub,或者用如下指令掛載
mount -o degraded,usebackuproot /dev/sda1 /mnt
其中degraded用於單塊raid1磁盤掛載,否則缺失磁盤無法掛載。
然後是嘗試check和rescue指令檢查並修復
btrfs check /dev/sda1 # 檢查磁盤
btrfs rescue super-recover /dev/sda1
btrfs rescue zero-log /dev/sda1
btrfs rescue chunk-recover /dev/sda1
實在不行就備份後修復
btrfs restore /dev/sda1 /mnt/backup # 先備份
btrfs check --repair /dev/sda1 # 後修復