Здесь размещено описание одного из функциональных блоков инструкций управления самодельным сетевым хранилищем на сочетании технологий "MDADM + LVM + XFS + NFS + MHDDFS" через простейшие BASH-скрипты. Отдельно неприменимо.
Создадим конфигурационный файл перечнем и описанием характеристик ресурсов, готовых к инициализации и использованию:
# vi /usr/local/etc/storage/cnf.d/lvm.cnf
....
lvm.physical=md0
lvm.physical=md1
lvm.physical=md2
lvm.group=vg0
lvm.group.vg0.volume=lvstorage0
....
lvm.physical=md0
lvm.physical=md1
lvm.physical=md2
lvm.group=vg0
lvm.group.vg0.volume=lvstorage0
....
Фрагмент кода автоматизации функционала LVM подсистемы хранения:
# vi /usr/local/etc/storage/fnc.d/lvm.fnc
#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell)
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell)
# Функция запуска (сборки) вручную подготовленных LVM-томов
function start-lvm() {
# Сканируем все доступные блочные устройства на предмет обнаружения изменений "мета"-данных
vgscan >/dev/null 2>&1
# Перебираем все строки именований физических томов LVM
for LPHYSICALS in `grep --ignore-case "^lvm.physical=" "${CONF}" | uniq` ; do
LPHYSICAL=`echo ${LPHYSICALS} | awk -F = '{print $2}'`
# Проверяем доступность физических томов LVM
STATE=`pvs --noheadings | grep --count --ignore-case "^[ ]*/dev/${LPHYSICAL}[ ]*"`
if [ ! -b "/dev/${LPHYSICAL}" ] || [ "${STATE}" -eq "0" ] ; then
send-report "LVM" "Physical volume /dev/${LPHYSICAL} is unavailable. Aborting."
echo "${DATE}: Physical volume /dev/${LPHYSICAL} is unavailable. Aborting." >> "${LOG}"
return 1
fi
done
# Перебираем все строки именований групп томов LVM
for LGROUPS in `grep --ignore-case "^lvm.group=" "${CONF}" | uniq` ; do
LGROUP=`echo ${LGROUPS} | awk -F = '{print $2}'`
# Проверяем доступность группы томов LVM
STATE=`vgs --noheadings | grep --count --ignore-case "^[ ]*${LGROUP}[ ]*"`
if [ "${STATE}" -eq "0" ] ; then
send-report "LVM" "Volume group LVM ${LGROUP} is unavailable. Aborting."
echo "${DATE}: Volume group LVM ${LGROUP} is unavailable. Aborting." >> "${LOG}"
return 1
else
# Проверяем, не инициирована ли уже целевая группа томов LVM
if [ ! -d "/dev/${LGROUP}" ] ; then
# Активируем целевую группу томов LVM
vgchange --available y "${LGROUP}" >/dev/null 2>&1
# Проверяем успешность завершения операции
if [ "${?}" -ne "0" ] ; then
send-report "LVM" "Error activating LVM group ${LGROUP}. Aborting."
echo "${DATE}: Error activating LVM group ${LGROUP}. Aborting." >> "${LOG}"
return 1
fi
# Даём системе пару секунд на осознание места нового устройства
sleep 2
# Проверяем успешность отрабатывания операции инициализации группы томов LVM
if [ -d "/dev/${LGROUP}" ] ; then
echo "${DATE}: Volume group LVM ${LGROUP} successfully activated." >> "${LOG}"
else
send-report "LVM" "Activating a volume group LVM ${LGROUP} failed. Aborting."
echo "${DATE}: Activating a volume group LVM ${LGROUP} failed. Aborting." >> "${LOG}"
return 1
fi
else
echo "${DATE}: Volume group LVM ${LGROUP} is already active." >> "${LOG}"
fi
# Перебираем все строки именований логических томов LVM в рамках группы
for LVOLUMES in `grep --ignore-case "^lvm.group.${LGROUP}.volume=" "${CONF}" | uniq` ; do
LVOLUME=`echo ${LVOLUMES} | awk -F = '{print $2}'`
# Проверяем доступность логических томов LVM
STATE=`lvs --noheadings | grep --count --ignore-case "^[ ]*${LVOLUME}[ ]*${LGROUP}[ ]*"`
if [ -b "/dev/${LGROUP}/${LVOLUME}" ] && [ "${STATE}" -ne "0" ] ; then
echo "${DATE}: Logical volume /dev/${LGROUP}/${LVOLUME} active." >> "${LOG}"
else
send-report "LVM" "Logical volume /dev/${LGROUP}/${LVOLUME} unavailable. Aborting."
echo "${DATE}: Logical volume /dev/${LGROUP}/${LVOLUME} unavailable. Aborting." >> "${LOG}"
return 1
fi
done
fi
done
# Создаём файл блокировки, показывающий на состояние работы подсистемы
touch "${LOCK}/lvm.lck"
return $?
}
# Функция остановки вручную подготовленных LVM-томов
function stop-lvm() {
# Перебираем все строки именований групп томов LVM
for LGROUPS in `grep --ignore-case "^lvm.group=" "${CONF}" | uniq` ; do
LGROUP=`echo ${LGROUPS} | awk -F = '{print $2}'`
# Если группа томов LVM доступна, то деактивируем её
[ -d "/dev/${LGROUP}" ] && vgchange --available n "${LGROUP}" >/dev/null 2>&1
done
# Удаляем файл блокировки, показывающий на состояние работы подсистемы
rm --force "${LOCK}/lvm.lck"
return $?
}
# Функция проверки состояния вручную подготовленных LVM-томов
function check-lvm() {
# Удостоверимся в том, что активация томов LVM прошла успешно (в противном случае проверку не запускаем - бессмысленно)
if [ -f "${LOCK}/lvm.lck" ]; then
echo "check"
fi
return $?
}
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell)
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell)
# Функция запуска (сборки) вручную подготовленных LVM-томов
function start-lvm() {
# Сканируем все доступные блочные устройства на предмет обнаружения изменений "мета"-данных
vgscan >/dev/null 2>&1
# Перебираем все строки именований физических томов LVM
for LPHYSICALS in `grep --ignore-case "^lvm.physical=" "${CONF}" | uniq` ; do
LPHYSICAL=`echo ${LPHYSICALS} | awk -F = '{print $2}'`
# Проверяем доступность физических томов LVM
STATE=`pvs --noheadings | grep --count --ignore-case "^[ ]*/dev/${LPHYSICAL}[ ]*"`
if [ ! -b "/dev/${LPHYSICAL}" ] || [ "${STATE}" -eq "0" ] ; then
send-report "LVM" "Physical volume /dev/${LPHYSICAL} is unavailable. Aborting."
echo "${DATE}: Physical volume /dev/${LPHYSICAL} is unavailable. Aborting." >> "${LOG}"
return 1
fi
done
# Перебираем все строки именований групп томов LVM
for LGROUPS in `grep --ignore-case "^lvm.group=" "${CONF}" | uniq` ; do
LGROUP=`echo ${LGROUPS} | awk -F = '{print $2}'`
# Проверяем доступность группы томов LVM
STATE=`vgs --noheadings | grep --count --ignore-case "^[ ]*${LGROUP}[ ]*"`
if [ "${STATE}" -eq "0" ] ; then
send-report "LVM" "Volume group LVM ${LGROUP} is unavailable. Aborting."
echo "${DATE}: Volume group LVM ${LGROUP} is unavailable. Aborting." >> "${LOG}"
return 1
else
# Проверяем, не инициирована ли уже целевая группа томов LVM
if [ ! -d "/dev/${LGROUP}" ] ; then
# Активируем целевую группу томов LVM
vgchange --available y "${LGROUP}" >/dev/null 2>&1
# Проверяем успешность завершения операции
if [ "${?}" -ne "0" ] ; then
send-report "LVM" "Error activating LVM group ${LGROUP}. Aborting."
echo "${DATE}: Error activating LVM group ${LGROUP}. Aborting." >> "${LOG}"
return 1
fi
# Даём системе пару секунд на осознание места нового устройства
sleep 2
# Проверяем успешность отрабатывания операции инициализации группы томов LVM
if [ -d "/dev/${LGROUP}" ] ; then
echo "${DATE}: Volume group LVM ${LGROUP} successfully activated." >> "${LOG}"
else
send-report "LVM" "Activating a volume group LVM ${LGROUP} failed. Aborting."
echo "${DATE}: Activating a volume group LVM ${LGROUP} failed. Aborting." >> "${LOG}"
return 1
fi
else
echo "${DATE}: Volume group LVM ${LGROUP} is already active." >> "${LOG}"
fi
# Перебираем все строки именований логических томов LVM в рамках группы
for LVOLUMES in `grep --ignore-case "^lvm.group.${LGROUP}.volume=" "${CONF}" | uniq` ; do
LVOLUME=`echo ${LVOLUMES} | awk -F = '{print $2}'`
# Проверяем доступность логических томов LVM
STATE=`lvs --noheadings | grep --count --ignore-case "^[ ]*${LVOLUME}[ ]*${LGROUP}[ ]*"`
if [ -b "/dev/${LGROUP}/${LVOLUME}" ] && [ "${STATE}" -ne "0" ] ; then
echo "${DATE}: Logical volume /dev/${LGROUP}/${LVOLUME} active." >> "${LOG}"
else
send-report "LVM" "Logical volume /dev/${LGROUP}/${LVOLUME} unavailable. Aborting."
echo "${DATE}: Logical volume /dev/${LGROUP}/${LVOLUME} unavailable. Aborting." >> "${LOG}"
return 1
fi
done
fi
done
# Создаём файл блокировки, показывающий на состояние работы подсистемы
touch "${LOCK}/lvm.lck"
return $?
}
# Функция остановки вручную подготовленных LVM-томов
function stop-lvm() {
# Перебираем все строки именований групп томов LVM
for LGROUPS in `grep --ignore-case "^lvm.group=" "${CONF}" | uniq` ; do
LGROUP=`echo ${LGROUPS} | awk -F = '{print $2}'`
# Если группа томов LVM доступна, то деактивируем её
[ -d "/dev/${LGROUP}" ] && vgchange --available n "${LGROUP}" >/dev/null 2>&1
done
# Удаляем файл блокировки, показывающий на состояние работы подсистемы
rm --force "${LOCK}/lvm.lck"
return $?
}
# Функция проверки состояния вручную подготовленных LVM-томов
function check-lvm() {
# Удостоверимся в том, что активация томов LVM прошла успешно (в противном случае проверку не запускаем - бессмысленно)
if [ -f "${LOCK}/lvm.lck" ]; then
echo "check"
fi
return $?
}
Переход к подготовке символических ссылок, используемых при сборке XFS.