UMGUM.COM (лучше) 

Автоматизация LVM ( Автоматизация сведения блочных устройств в единое в рамках локальной системы. )

18 сентября 2012  (обновлено 17 июля 2019)

Эта публикация отнесена в архив. Она неактуальна.

OS: "Linux Debian 5/6/7 (Lenny/Squeeze/Wheezy)".


Создадим конфигурационный файл перечнем и описанием характеристик ресурсов, готовых к инициализации и использованию:

# 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 подсистемы хранения:

# 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 $?
}

Переход к подготовке символических ссылок, используемых при сборке XFS.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )