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.
При наличии достаточного количества свободных физических блоков и томов конфигурацию зеркалированного логического тома можно сразу же вернуть в прежнее состояние с помощью команды 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:
Post a Comment