服務器自動備份和檢查硬盤

最近服務器壞了,雖然用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         # 後修復

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章