LinuxForum.Fans
Тема

Скрипт для восстановления RAID 1

Автор: akakernel 5 сообщений 2124 просмотров
#74144

Хочу поделиться с вами своим скриптом на python, который самостоятельно восстанавливает массив при падении одного винта. Для этого достаточно заменить винт и запустить скрипт. Он самостоятельно найдет новый винт, выполнит разметку разделов и добавит нужный раздел в нужное виртуальное устройство, например в /dev/md1 были /dev/sda5 и /dev/sdb5, заменили /dev/sdb, скрипт добавит именно /dev/sdb5 в /dev/md1. Так же, если в существующую систему добавить еще один винт и запустить скрипт, то винт будет добавлен в массив.

Очень бы хотелось послушать замечания по поводу кода, т.к. в python я новичек

text
#!/usr/bin/env python

import re import commands import os.path

mass_num = {} hards_arr = [] ndev = 0 file = open('/proc/mdstat') f = file.readlines() device = re.compile("md\d|sd[a-z]\d|sd[a-z]\d")

# Здесь мы считываем и парсим /proc/mdstat на предмет виртуальных устройств и номеров разделов, которые к ним крепятся

for i in range(len(f)): f[i].rsplit() if device.match(f[i]): devs = [] devs = device.findall(f[i]) hards_arr = re.findall('sd[a-z]', f[i]) mass_num[devs[0]] = re.findall ("\d", devs[1])

hards = []

# здесь определяем все винты в системе

for i in re.findall("Disk.\/dev\/sd[a-z]:", commands.getoutput("fdisk -l")): hards.append(re.split('\s\/dev\/', i.strip(':'))[1])

# Если есть новое устройство, то определим его и добавим в массив

if hards>hards_arr: for i in range(len(hards)): for y in range(len(hards_arr)): if hards[i]!=hards_arr[y]: ndev = hards[i] else: print "No new devices"

if ndev != 0: for i in hards[:]: if i != ndev: print "Output: %s" % ("sfdisk -d /dev/%s | sfdisk /dev/%s:\n" % (i, ndev)) print commands.getoutput("sfdisk -d /dev/%s | sfdisk /dev/%s" % (i, ndev)) for i in mass_num.keys(): print "mdadm --zero-superblock /dev/%s%s:" % (ndev, mass_num[i][0]) print commands.getoutput("mdadm --zero-superblock /dev/%s%s" % (ndev, mass_num[i][0])), "\n" for i in mass_num.keys(): print "mdadm --add /dev/%s /dev/%s%s:" % (i, ndev, mass_num[i][0]) print commands.getoutput("mdadm --add /dev/%s /dev/%s%s" % (i, ndev, mass_num[i][0])), "\n" print "Installing grub\n", commands.getoutput("grub-install --no-floppy /dev/%s" % ndev)

#74206
text
Так же, если в существующую систему добавить еще один винт и запустить скрипт, 
то винт будет добавлен в массив. 

Хм... Если Raid 5, то еще понятно, а если у меня Raid 1, куда он будет добавлять? :D

#74216

Будет третьим зеркалом

#74217

Если скрипт работает, то добавлю в закладочки. Как раз собираю всб нужную мне инфу для масива в лине. Будет не лишним..... Тьфу тьфу тьфу... хоть бы не пригодился smile

#74230

Мне самому проще все ручкам сделать. Но начальство захотело, чтобы это можно было делать и в мое отсутствие, одним действием. Вот и пришлось городить.

Войдите или зарегистрируйтесь, чтобы ответить.