Saturday, October 18, 2014

LVM Документация, Пример на loop устройствах, lvm.bash

LVM Документация

Содержание

 [убрать

Links

Основы

Дисковое пространство для LVM представлено физическими томами (Physical Volume, PV). Это могут быть винчестеры, разделы или любые другие блочные устройства. Физические тома дробятся на блоки (Physical Extent, PE) заранее заданного размера. Все полученные блоки образуют группу томов (Volume Group, VG). Из имеющихся в группе томов блоков можно собрать новое виртуальное устройство — логический том (Logical Volume, LV). В простейшем случае каждый блок логического тома (Logical Extent, LE) располагается на некотором блоке физического тома.
  • Physical Volume, PV - физический том
  • Physical Extent, PE - диапазоны (обычно несколько мегабайт) физического диска, подобные кластерам
  • Volume Group, VG - группа томов
  • Logical Volume, LV - логический том, который можно уже форматировать...

Базовые команды

Создание - pvcreate

Работа с LVM начинается с создания физических томов с помощью команды pvcreate. В нашем примере необходимо вызвать эту команду дважды:
pvcreate /dev/sda
pvcreate /dev/sdb

Вывести список всех доступных физических томов - pvs

pvs

Создать группу томов - vgcreate

vgcreate -s 32M vg /dev/sda /dev/sdb
Опция -s задаёт размер физического блока. По умолчанию он равен 4 MiB, но нет смысла дробить дисковое пространство так мелко.

Создать логические тома - lvcreate

Теперь можно создать логические тома:
lvcreate -n first -L 20G vg
lvcreate -n second -L 30G vg
Эти команды создадут устройства /dev/vg/first и /dev/vg/second размером 20 GiB и 30 GiB соответственно. Список всех логических томов можно увидеть с помощью команды lvs.

Список всех логических томов - lvs

lvs

Активация группы томов - vgchange

После перезагрузки системы или выполнения команды vgchange -an, ваши группы томов и логические тома находятся в неактивном состоянии. Для их активации необходимо выполнить команду
vgchange -a y vg

Удалить логический том - lvremove

lvremove vg/first
Удалить можно только неиспользующийся том. Если том содержит файловую систему, то сначала её нужно отмонтировать.

Добавить новый винчестер в группу томов - vgextend

pvcreate /dev/sdc
vgextend vg /dev/sdc

Убрать из группы томов винчестер - pvmove, vgreduce, pvremove

# Уводим данные с тома
pvmove /dev/sda
# Смотрим статус переноса
pvmove -v
# Отключаем от группы
vgreduce vg /dev/sda
# Снимаем с него следы lvm
pvremove /dev/sda
Команда pvmove переносит все используемые физические блоки с указанного физического тома на другие физические тома, имеющие достаточное количество свободных блоков.
pvmove может занять некоторое время. Для просмотра статуса выполнения переноса данных pvmove -v.

Изменить размер логического тома - lvresize

Уменьшим логический том vg/second, содержащий ReiserFS, до 20 GiB:
resize_reiserfs -s 19G /dev/vg/second
lvresize -L 20G vg/second
resize_reiserfs /dev/vg/second
 
# Теперь увеличим тот же том до 40 GiB:
lvresize -L 40G vg/second
resize_reiserfs /dev/vg/second

Ext3

# Отмонтируем
umount /mnt/tmp
 
# Преобразовыаем ext3 в ext2
tune2fs -O ^has_journal /dev/vg/second
e2fsck -v -f /dev/vg/second
 
# Увеличиваем размер диска 
lvresize -L 20G vg/second
 
# Переразмечаем
resize2fs /dev/vg/second
 
# Преобразовываем обратно в ext3
tune2fs -j /dev/vg/second
e2fsck -v -f /dev/vg/second

Зеркалирование данных

Для повышения надёжности можно использовать зеркалирование данных. При этом каждому логическому блоку соответствует не один физический блок, а два или более на разных физических томах.
Создать логический том с одним зеркалом можно с помощью команды
lvcreate -n data -m 1 -l 10 vg
При этом должно быть достаточное количество физических блоков на трёх физических томах: 10 для самого логического тома, 10 для зеркала и 1 для журнала. С помощью команды lvconvert можно добавлять или удалять зеркала и журнал, связанные с уже имеющимся логическим томом.

Восстановление после сбоя

Если один из физических томов недоступен, то инициализировать группу томов с помощью команды vgchange невозможно. В этом случае можно поступить так:
vgreduce --removemissing vg
vgchange -a y vg
Первая команда удалит из группы томов вышедший из строя физический том и каждый логический том, хотя бы один блок которого целиком располагался на удалённом физическом томе.
При наличии достаточного количества свободных физических блоков и томов конфигурацию зеркалированного логического тома можно сразу же вернуть в прежнее состояние с помощью команды lvconvert.

Установка Linux на LVM

Большинство современных дистрибутивов Linux дают возможность на этапе установки настроить LVM. Но обычно существует ряд серьёзных ограничений:
  • физические тома можно создавать только на разделах винчестеров, а не на целом винчестере;
  • можно создавать только простые (linear) логические тома;
  • нельзя размещать каталог /boot внутри LVM.

Пример использования

# Для начала надо на каких-либо устройствах 
# выделить место под LVM. В нашем случае 
# это будут /dev/sda3 /dev/sdb1.
fdisk /dev/sda << EOF
n
p
3
 
 
 
t
8e
w
EOF
 
fdisk /dev/sdb << EOF
n
p
1
 
 
 
t
8e
w
EOF
 
# Создание физических томов
pvcreate /dev/sda3 /dev/sdb1
 
# Создание группы томов
vgcreate vg /dev/sda3 /dev/sdb1
 
# Посмотреть информацию о созданных группах
vgs
 
# Создание логических томов
# lvcreate -n Имя_логического_тома -L Размер Имя_группы
lvcreate -n first -L 20G vg
 
# Посмотреть информацию о созданных логических томах
lvs
 
# Используем lvm
# Форматируем диск
# mkfs.ext2 /dev/Имя_группы/Имя_логического_тома
mkfs.ext2 /dev/vg/first
 
# Теперь монтируем
mount /dev/vg/first /mnt/first -t ext2
 
# Деактивация группы томов
# vgchange -an Имя_группы
vgchange -an vg

Пример на loop устройствах

#Создаем сами файлы, имитирующие устройства
 
mkdir /mnt/sdc1/lvm
cd /mnt/sdc1/lvm
dd if=/dev/zero of=./d01 count=1 bs=1G
dd if=/dev/zero of=./d02 count=1 bs=1G
dd if=/dev/zero of=./d03 count=1 bs=1G
dd if=/dev/zero of=./d04 count=1 bs=1G
 
#Создаем loopback устройства из файлов
losetup -f --show ./d01
losetup -f --show ./d02
losetup -f --show ./d03
losetup -f --show ./d04
 
#Создаем физические тома (Physical Volume, PV)
#Внимание! обратите на названия loop устройств (они могут отличаться от приведенных здесь)
pvcreate /dev/loop0
pvcreate /dev/loop1
pvcreate /dev/loop2
pvcreate /dev/loop3
 
#Теперь можно посмотреть, что там у нас получилось
pvs
#У меня вывелось что-то типа
#  PV         VG   Fmt  Attr PSize PFree
#  /dev/loop0      lvm2 --   1,00G 1,00G
#  /dev/loop1      lvm2 --   1,00G 1,00G
#  /dev/loop2      lvm2 --   1,00G 1,00G
#  /dev/loop3      lvm2 --   1,00G 1,00G
 
#Создадим группу томов
vgcreate -s 32M vg /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3
#Опция -s задаёт размер физического блока. По умолчанию он равен 4 MiB, но нет смысла дробить дисковое пространство так мелко.
#vg - это соответственно ее имя
 
#Создаем логический том
#даже парочку
lvcreate -n first -L 200M vg
lvcreate -n second -L 400M vg
#Эти команды создадут устройства /dev/vg/first и /dev/vg/second размером 200M и 400M соответственно. 
 
#Список всех логических томов можно увидеть с помощью команды lvs.
lvs
#  LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Convert
#  first  vg   -wi-a- 224,00M                                      
#  second vg   -wi-a- 416,00M  
 
#Теперь эти устройства можно использовать как диски.
#Форматировать и тд....
mkfs.ext3 /dev/vg/first
mkfs.ext3 /dev/vg/second
 
mkdir /mnt/first
mkdir /mnt/second
 
mount /dev/vg/first /mnt/first -t ext3 
mount /dev/vg/second /mnt/second -t ext3 
 
df -h 
#Файловая система Разм  Исп  Дост  Исп% смонтирована на
#.....
#/dev/mapper/vg-first 217M  6,1M  200M   3% /mnt/first
#/dev/mapper/vg-second 403M   11M  372M   3% /mnt/second
 
#Изменяем размер наших дисков
#Отмонтируем
umount /dev/vg/first
umount /dev/vg/second
 
#Посмотрим на инфу дисков
fsck -n /dev/vg/first
fsck -n /dev/vg/second
 
#Превращаем их в ext2, удалив журнал
tune2fs -O ^has_journal /dev/vg/first
tune2fs -O ^has_journal /dev/vg/second
 
#Делаем принудительную проверку
e2fsck -f /dev/vg/first
e2fsck -f /dev/vg/second
 
#Попробуем уменьшить каждый диск 
resize2fs /dev/vg/first 150M
resize2fs /dev/vg/second 150M
 
#А теперь и каждый логический том
#Соответственно, при увеличении надо делать наоборот 
#(увеличить логический том, а потом файловую систему)
lvresize -L 150M vg/first
lvresize -L 150M vg/second
 
#Не забываем создать журнальчик
#А то наша система так и останется ext2
tune2fs -j /dev/vg/first
tune2fs -j /dev/vg/second
 
#Монтируем и проверяем
mount /dev/vg/first /mnt/first -t ext3 
mount /dev/vg/second /mnt/second -t ext3 
df -h
#Файловая система Разм  Исп  Дост  Исп% смонтирована на
#...
#/dev/mapper/vg-first 146M   37M  102M  27% /mnt/first
#/dev/mapper/vg-second 146M   93M   46M  68% /mnt/second
 
#Выводим диски из под LVM
#Посмотрели, подумали, у нас используется только 300 метров
#А задействованы 4 loop диска по гигу. Можно-же все перенести в один!
 
#Отмонтируем
umount /dev/vg/first
umount /dev/vg/second
 
#Посмотрим, что у нас есть
pvs
#  PV         VG   Fmt  Attr PSize   PFree  
#  /dev/loop0 vg   lvm2 a-   992,00M 832,00M
#  /dev/loop1 vg   lvm2 a-   992,00M 832,00M
#  /dev/loop2 vg   lvm2 a-   992,00M 992,00M
#  /dev/loop3 vg   lvm2 a-   992,00M 992,00M
 
#Уберем все, акромя /dev/loop0
#Команда pvmove переносит все используемые физические блоки с указанного 
#физического тома на другие физические тома, имеющие достаточное 
#количество свободных блоков.
#vgreduce - вычеркивает наш диск из группы томов
pvmove /dev/loop1
vgreduce vg /dev/loop1
 
pvmove /dev/loop2
vgreduce vg /dev/loop2
 
pvmove /dev/loop3
vgreduce vg /dev/loop3
 
#Посмотрим, что у нас есть
pvs
#  PV         VG   Fmt  Attr PSize   PFree  
#  /dev/loop0 vg   lvm2 a-   992,00M 672,00M
#  /dev/loop1      lvm2 --     1,00G   1,00G
#  /dev/loop2      lvm2 --     1,00G   1,00G
#  /dev/loop3      lvm2 --     1,00G   1,00G
 
#Oтключаем лишние /dev/loop1
losetup -d /dev/loop1
losetup -d /dev/loop2
losetup -d /dev/loop3
 
#Удаляем сами файлы (диски)
cd /mnt/sdc1/lvm
rm d02
rm d03
rm d04
 
#Теперь создадим маленький файл (диск) в 500 метров
#И перетащим наши данные туда
dd if=/dev/zero of=./d02 count=1 bs=500M
losetup -f --show ./d02
pvcreate /dev/loop1
pvs
 
#Добавляем диск в группу
vgextend vg /dev/loop1
 
#Переносим данные с loop0 на loop1 и выводим 
pvmove /dev/loop0
vgreduce vg /dev/loop0
 
#примонтируем диски и проверим, на месте-ли наша инфа
mount /dev/vg/first /mnt/first -t ext3 
mount /dev/vg/second /mnt/second -t ext3

lvm.bash

Создание зеркалированного lvm на базе нескольких loop-дисков.

Для чего это нужно

Лично у меня несколько винчестеров и на каждом из них есть свободное место. Кроме того есть данные (резервные копии), которые нуждаются в зеркалировании.
Создавать RAID-массивы не представляется возможным по нескольким причинам. Вот и возникло желание: использовать куски свободного места на разных винтах для создания lvm с зеркалированием. Чтоб не париться вручную был написан сей примитивный скрипт.

Сам скрипт

#!/bin/bash
 
# Путь к файлу логу
logFile="./lvmLog.txt"
 
# Пути к файлам дисков
disks=( /mnt/trash/disk1 /mnt/trash/disk2 /mnt/trash/disk3 /mnt/trash/disk4 /mnt/trash/disk5 )
 
# Размер диска (bs)
diskBs="10M"
 
# Размер диска в (count)
diskCount=2
 
# Имя группы томов
groupName="vgg"
 
# Имя логического тома
logicName="data"
 
# Размер логического диска 
# (bs*count) - зеркалированием
# (bs*count)*кол-во дисков - простого
logicSize='60m'
 
# Точка монтирования
mountPoint=/mnt/lvm
 
# Фаил с перечислениями примонтированных loop
loopFile='./loopFile'
 
loopDisks=''
 
 
# Записываем свои действия в лог
log()
{
 echo `date` - $1 >> $logFile
 echo `date` - $1
}
 
# Создаем диск
# Не забваем указать к нему путь в $disk
createdisk(){
 if [ -z "$1" ] # Длина параметра #1 равна нулю?
   then
     log "В функцию  createdisk() не передан параметр, а именно - путь к диску!!!!"
     exit 1
   fi
 disk=$1
 log "Запуск createdisk, disk = ${disk}"
 log "Создаем сам файл ${disk}"
 dd if=/dev/zero of=${disk} count=${diskCount} bs=${diskBs};
 
 log "Создаем loopback устройство $disk"
 loopF=`losetup -f --show ${disk}`
 log "loopback устройство создано; disk = ${disk}; loopF = ${loopF}"
 log "Создаем физический том; disk = ${disk}; loopF = ${loopF}"
 pvcreate ${loopF}
 log "Отключаем ${loopF}"
 losetup -d ${loopF}
}
 
# Монтируем диск
# Не забваем указать к нему путь
mountdisk(){
 if [ -z "$1" ] # Длина параметра #1 равна нулю?
   then
     log "В функцию  mountdisk() не передан параметр, а именно - путь к диску!!!!"
     exit 1
   fi
 disk=$1
 log "Запуск mountdisk, disk = ${disk}"
 log "Создаем loopback устройство ${disk}"
 loopF=`losetup -f --show ${disk}`
 echo "${loopF}" >> ${loopFile}
 loopDisks="${loopDisks} ${loopF}"
 log "loop-disk подключен; disk = $disk; loopF = $loopF; loopDisks = $loopDisks"
}
 
# CREATE - СОЗДАЕМ ДИСКИ
lvmCreate(){
 log "create"
 log "Создаем папки"
 mkdir ${mountPoint}
 rm -f ${loopFile}
 
 log "Начало создания файлов"
 for i in "${disks[@]}"
  do
   createdisk ${i}
  done
 log "Монтируем диски"
 loopDisks=''
 for i in "${disks[@]}"
  do
   mountdisk ${i}
  done
 
 log "Создадаем группу томов: vgcreate ${groupName} ${loopDisks}"
 vgcreate ${groupName} ${loopDisks}
 
 #log "Создаем логический том с зеркалом: lvcreate -n ${logicName} -L ${logicSize} -m 1 ${groupName}"
 #lvcreate -n ${logicName} -L ${logicSize} -m 1 ${groupName}
 
 log "Создаем логический том без зеркал: lvcreate -n ${logicName} -L ${logicSize} ${groupName}"
 lvcreate -n ${logicName} -L ${logicSize} ${groupName}
 
 
 log "Форматируем том: mkfs.ext3 /dev/${groupName}/${logicName}"
 mkfs.ext3 /dev/${groupName}/${logicName}
 
 log "Mонтируем группу: mount /dev/${groupName}/${logicName} ${mountPoint} -t ext3"
 mount /dev/${groupName}/${logicName} ${mountPoint} -t ext3
}
 
 
# MOUNT - монтируем
lvmMount(){
 log "lvmMount"
 log "Стартуем скрипт"
 log "Монтируем диски"
 rm -f ${loopFile}
 
 for i in "${disks[@]}"
  do
   mountdisk ${i}
  done
 sleep 3
 log "Mонтируем группу: mount /dev/${groupName}/${logicName} ${mountPoint} -t ext3"
 #mount /dev/${groupName}/${logicName} ${mountPoint} -t ext3
}
 
# UMOUNT - отмонтируем диски
lvmUmount(){
 log "lvmUmount()"
 log "Стартуем скрипт"
 log "Отмонтируем: umount /dev/${groupName}/${logicName}"
 umount /dev/${groupName}/${logicName}
 log "Деактивируем группу: vgchange -an ${groupName}"
 vgchange -an ${groupName}
 log "Отключаем loop-диски: $loopFile"
 for i in `cat $loopFile`
 do
  losetup -d ${i}
 done
 rm -f ${loopFile}
}
 
case "$1" in
 create )
  lvmCreate 
  ;;
 mount )
  lvmMount
  ;;
 umount )
  lvmUmount
  ;;
 * )
  echo "Неизвестная команда."
  echo "Используйте одну из следующих:"
  echo " create - создание дисков и всего остального"
  echo " mount - монтирование уже существующих"
  echo " umount - отмонтирование, деактивация и отключение дисков"
esac
exit 0

No comments: