Здесь размещено описание одного из функциональных блоков инструкций управления самодельным сетевым хранилищем на сочетании технологий "MDADM + LVM + XFS + NFS + MHDDFS" через простейшие BASH-скрипты. Отдельно неприменимо.
Устанавливаем пакет утилит файловой системы MHDDFS:
# aptitude install mhddfs
Заранее готовим точку монтирования:
# mkdir -p /mnt/storage-core0
Создадим конфигурационный файл с перечнем и описанием характеристик ресурсов, готовых к инициализации и использованию.
# vi /usr/local/etc/storage/cnf.d/mhddfs.cnf
....
mhddfs.target=/mnt/storage-core0
mhddfs.source=/mnt/import/node0
mhddfs.source=/mnt/import/node1
mhddfs.source=/mnt/import/node2
mhddfs.source=/mnt/import/node3
....
mhddfs.target=/mnt/storage-core0
mhddfs.source=/mnt/import/node0
mhddfs.source=/mnt/import/node1
mhddfs.source=/mnt/import/node2
mhddfs.source=/mnt/import/node3
....
Фрагмент кода автоматизации функционала сборки в единую точку файловых систем подсистемы хранения:
# vi /usr/local/etc/storage/fnc.d/mhddfs.fnc
#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell)
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell)
# Функция сбора разрозненых файловых систем хранилища в одну точку монтирования
function start-mhddfs() {
# Вычленяем адрес точки сбора файловых систем
MTARGET=`grep --ignore-case "^mhddfs.target=" "${CNF}" | awk -F = '{print $2}'`
# Проверяем наличие пути к точку сбора файловых систем
if [ ! -d "${MTARGET}" ] ; then
echo "${DATE}: Collection point file system is not available. Aborting." | tee -a "${LOGT}"
return 1
fi
# Проверяем, не смонтирована ли уже сборная файловая система
STATE=`mount | grep --count --ignore-case "on[ ]*${MTARGET}[ ]*type[ ]*fuse.mhddfs"`
if [ "${STATE}" -eq "0" ] ; then
MHDDFS=""
# Перебираем все строки адресов собираемых файловых систем
for MSOURCES in `grep --ignore-case "^mhddfs.source=" "${CNF}" | uniq`; do
MSOURCE=`echo ${MSOURCES} | awk -F = '{print $2}'`
# Проверяем наличие пути к собираемым файловым системам
if [ ! -d "${MSOURCE}" ] ; then
echo "${DATE}: Mounted file system ${MSOURCE} is not available. Aborting." | tee -a "${LOGT}"
return 1
fi
# Добавляем точку монтирования в список
MHDDFS=${MHDDFS}",${MSOURCE}"
done
# Отрезаем лишнюю запятую впереди строки
MHDDFS=`echo "${MHDDFS}" | cut -c 2-`
# Собираем файловые системы в единой точке монтирования (-o logfile=...)
nice --adjustment=-1 mhddfs -o mlimit=100G,direct_io,async,noatime,allow_other "${MHDDFS}" "${MTARGET}" >/dev/null 2>&1
# Проверяем успешность завершения операции
if [ "${?}" != "0" ] ; then
echo "${DATE}: Mounting file systems into a single point with error. Aborting." | tee -a "${LOGT}"
return 1
fi
# Даём системе пару секунд на завершение монтирования
sleep 2
# Проверяем успешность монтирования сборной файловой системы
STATE=`mount | grep --count --ignore-case "on[ ]*${MTARGET}[ ]*type[ ]*fuse.mhddfs"`
if [ "${STATE}" -ne "0" ] ; then
echo "${DATE}: Team of the file system is successfully installed." | tee -a "${LOGT}"
else
echo "${DATE}: Mounting the file system team with error. Aborting." | tee -a "${LOGT}"
return 1
fi
else
echo "${DATE}: Team of the file system is already installed at ${MTARGET}." | tee -a "${LOGT}"
fi
# Создаём файл блокировки, показывающий на состояние работы подсистемы
touch "${LOCK}/mhddfs.lck"
return $?
}
# Функция разбора разрозненых файловых систем хранилища из единой точки монтирования
function stop-mhddfs() {
# Вычленяем адрес точки сбора файловых систем
MTARGET=`grep --ignore-case "^mhddfs.target=" "${CNF}" | awk -F = '{print $2}'`
[ -d "${MTARGET}" ] && fusermount -uz "${MTARGET}"
# Удаляем файл блокировки, показывающий на состояние работы подсистемы
rm --force "${LOCK}/mhddfs.lck"
return $?
}
# Функция проверки состояния сборной файловой системы
function check-mhddfs() {
# Удостоверимся в том, что публикация ресурсов прошла успешно (в противном случае проверку не запускаем - бессмысленно)
if [ -f "${LOCK}/mhddfs.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)
# Функция сбора разрозненых файловых систем хранилища в одну точку монтирования
function start-mhddfs() {
# Вычленяем адрес точки сбора файловых систем
MTARGET=`grep --ignore-case "^mhddfs.target=" "${CNF}" | awk -F = '{print $2}'`
# Проверяем наличие пути к точку сбора файловых систем
if [ ! -d "${MTARGET}" ] ; then
echo "${DATE}: Collection point file system is not available. Aborting." | tee -a "${LOGT}"
return 1
fi
# Проверяем, не смонтирована ли уже сборная файловая система
STATE=`mount | grep --count --ignore-case "on[ ]*${MTARGET}[ ]*type[ ]*fuse.mhddfs"`
if [ "${STATE}" -eq "0" ] ; then
MHDDFS=""
# Перебираем все строки адресов собираемых файловых систем
for MSOURCES in `grep --ignore-case "^mhddfs.source=" "${CNF}" | uniq`; do
MSOURCE=`echo ${MSOURCES} | awk -F = '{print $2}'`
# Проверяем наличие пути к собираемым файловым системам
if [ ! -d "${MSOURCE}" ] ; then
echo "${DATE}: Mounted file system ${MSOURCE} is not available. Aborting." | tee -a "${LOGT}"
return 1
fi
# Добавляем точку монтирования в список
MHDDFS=${MHDDFS}",${MSOURCE}"
done
# Отрезаем лишнюю запятую впереди строки
MHDDFS=`echo "${MHDDFS}" | cut -c 2-`
# Собираем файловые системы в единой точке монтирования (-o logfile=...)
nice --adjustment=-1 mhddfs -o mlimit=100G,direct_io,async,noatime,allow_other "${MHDDFS}" "${MTARGET}" >/dev/null 2>&1
# Проверяем успешность завершения операции
if [ "${?}" != "0" ] ; then
echo "${DATE}: Mounting file systems into a single point with error. Aborting." | tee -a "${LOGT}"
return 1
fi
# Даём системе пару секунд на завершение монтирования
sleep 2
# Проверяем успешность монтирования сборной файловой системы
STATE=`mount | grep --count --ignore-case "on[ ]*${MTARGET}[ ]*type[ ]*fuse.mhddfs"`
if [ "${STATE}" -ne "0" ] ; then
echo "${DATE}: Team of the file system is successfully installed." | tee -a "${LOGT}"
else
echo "${DATE}: Mounting the file system team with error. Aborting." | tee -a "${LOGT}"
return 1
fi
else
echo "${DATE}: Team of the file system is already installed at ${MTARGET}." | tee -a "${LOGT}"
fi
# Создаём файл блокировки, показывающий на состояние работы подсистемы
touch "${LOCK}/mhddfs.lck"
return $?
}
# Функция разбора разрозненых файловых систем хранилища из единой точки монтирования
function stop-mhddfs() {
# Вычленяем адрес точки сбора файловых систем
MTARGET=`grep --ignore-case "^mhddfs.target=" "${CNF}" | awk -F = '{print $2}'`
[ -d "${MTARGET}" ] && fusermount -uz "${MTARGET}"
# Удаляем файл блокировки, показывающий на состояние работы подсистемы
rm --force "${LOCK}/mhddfs.lck"
return $?
}
# Функция проверки состояния сборной файловой системы
function check-mhddfs() {
# Удостоверимся в том, что публикация ресурсов прошла успешно (в противном случае проверку не запускаем - бессмысленно)
if [ -f "${LOCK}/mhddfs.lck" ]; then
echo "check"
fi
return $?
}