Хочу поделиться с вами своим скриптом на python, который самостоятельно восстанавливает массив при падении одного винта. Для этого достаточно заменить винт и запустить скрипт. Он самостоятельно найдет новый винт, выполнит разметку разделов и добавит нужный раздел в нужное виртуальное устройство, например в /dev/md1 были /dev/sda5 и /dev/sdb5, заменили /dev/sdb, скрипт добавит именно /dev/sdb5 в /dev/md1. Так же, если в существующую систему добавить еще один винт и запустить скрипт, то винт будет добавлен в массив.
Очень бы хотелось послушать замечания по поводу кода, т.к. в python я новичек
#!/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)