Пользователь
0,0
рейтинг
17 августа 2009 в 18:04

Администрирование → LVM — это просто!

Собственно, хочется просто и доступно рассказать про такую замечательную вещь как Logical Volume Management или Управление Логическими Томами.
Поскольку уже давно пользуюсь LVM-ом, расскажу что он значит именно для меня, не подглядывая в мануалы и не выдёргивая цитаты из wiki, своими словами, чтобы было понятно именно тем кто ничего о нем не знает. Постараюсь сразу не рассказывать о всяческих «продвинутых» функциях типа страйпов, снапшотов и т.п.

LVM — это дополнительный слой абстракции от железа, позволяющий собрать кучи разнородных дисков в один, и затем снова разбить этот один именно так как нам хочется.

есть 3 уровня абстракции:
1. PV (Physical Volume) — физические тома (это могут быть разделы или целые «неразбитые» диски)
2. VG (Volume Group) — группа томов (объединяем физические тома (PV) в группу, создаём единый диск, который будем дальше разбивать так, как нам хочется)
3. LV (Logical Volume) — логические разделы, собственно раздел нашего нового «единого диска» ака Группы Томов, который мы потом форматируем и используем как обычный раздел, обычного жёсткого диска.
это пожалуй вся теория. :) теперь практика:
для работы нужны пакеты lvm2 и возможность работать с привелегиями root поэтому:
$ sudo bash
# apt-get install lvm2

допустим у нас в компе есть жёсткий диск на 40Гб и нам удалось наскрести немного денег и наконец-то купить себе ТЕРАБАЙТНИК! :))) Система уже стоит и работает, и первый диск разбит одним разделом (/dev/sda1 как / ), второй — самый большой, который мы только подключили — вообще не разбит /dev/sdb…
Предлагаю немножко разгрузить корневой диск, а заодно ускорить (новый диск работает быстрее старого) и «обезопасить» систему с помощью lvm.
Можно делать на втором диске разделы и добавлять их в группы томов (если нам нужно несколько групп томов),
а можно вообще не делать на диске разделы и всё устройство сделать физическим разделом (PV)

root@ws:~# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created

Создаём группу томов с говорящим названием, например по имени машины «ws», чтобы когда мы перетащим данный диск на другую машину небыло конфликтов с именами групп томов:

root@ws:~# vgcreate ws /dev/sdb
Volume group «vg0» successfully created

желательно внести с корневого раздела такие папки как /usr /var /tmp /home, чтобы не дефрагментировать лишний раз корневой раздел и ни в коем случае его не переполнить, поэтому создаём разделы:

root@ws:~# lvcreate -n usr -L10G ws # здесь мы создаём раздел с именем «usr», размером 10Gb
Logical volume «usr» created
по аналогии делаем то же для /var, /tmp, /home:
root@ws:~# lvcreate -n var -L10G ws
root@ws:~# lvcreate -n tmp -L2G ws
root@ws:~# lvcreate -n home -L500G ws
у нас ещё осталось немного свободного места в группе томов (например для будущего раздела под бэкап)
посмотреть сколько именно можно командой:
root@ws:~# vgdisplay
информацию по созданным логическим томам
root@ws:~# lvdisplay
информацию по физическим томам
root@ws:~# pvdisplay

разделы что мы создали появятся в папке /dev/[имя_vg]/, точнее там будут ссылки на файлы,
lrwxrwxrwx 1 root root 22 2009-08-10 18:35 swap -> /dev/mapper/ws-swap
lrwxrwxrwx 1 root root 21 2009-08-10 18:35 tmp -> /dev/mapper/ws-tmp
lrwxrwxrwx 1 root root 21 2009-08-10 18:35 usr -> /dev/mapper/ws-usr
lrwxrwxrwx 1 root root 21 2009-08-10 18:35 var -> /dev/mapper/ws-var
и т.д…

дальше lvm уже почти кончается… форматируем наши разделы в любимые файловые системы:
root@ws:~# mkfs.ext2 -L tmp /dev/ws/tmp
root@ws:~# mkfs.ext4 -L usr /dev/ws/usr
root@ws:~# mkfs.ext4 -L var /dev/ws/var
root@ws:~# mkfs.ext4 -L home /dev/ws/home

кстати, не плохо было бы сделать раздел подкачки:
root@ws:~# lvcreate -n swap -L2G ws
root@ws:~# mkswap -L swap /dev/ws/swap
root@ws:~# swapon /dev/ws/swap

создаём папку и подключая по очереди новообразовавшиеся тома, копируем в них нужное содержимое:
root@ws:~# mkdir /mnt/target
root@ws:~# mount /dev/ws/home /mnt/target
копируем туда всё из папки /home своим любимым файловым менеджером (с сохранением прав доступа), например так ;):
root@ws:~# cp -a /home/* /mnt/target/
root@ws:~# umount /mnt/target/
кстати, для папки temp необходимо только поправить права, копировать туда что-либо необязательно:
root@ws:~# mount /dev/ws/tmp /mnt/target && chmod -R a+rwx /mnt/target && umount /mnt/target/
добавляем нужные строчки в /etc/fstab, например такие:
/dev/mapper/ws-home /home ext4 relatime 0 2
/dev/mapper/ws-tmp /tmp ext2 noatime 0 2
/dev/mapper/ws-swap none swap sw 0 0
и перезагружаемся… (продвинутые господа могут обойтись без перезагрузки ;))

На вкусное, хочу предложить более продвинутую штуку:
допустим у нас есть система с разделом на LVM, а жёсткий диск начал сбоить, тогда мы можем без перезагрузки переместить всю систему на другой жёсткий диск/раздел:

# On-line добавление/удаление жёстких дисков с помощью LVM (пример)

root@ws:~# pvcreate /dev/sda1 # наш эмулятор сбойного диска
Physical volume "/dev/sda1" successfully created

root@ws:~# pvcreate /dev/sdb1 # наш эмулятор спасательного диска
Physical volume "/dev/sdb1" successfully created

root@ws:~# vgcreate vg0 /dev/sda1 # создаю группу томов vg0
Volume group «vg0» successfully created

root@ws:~# lvcreate -n test -L10G vg0 #создаю раздел для «важной» инфы
Logical volume «test» created

root@ws:~# mkfs.ext2 /dev/vg0/test # создаю файловую систему на разделе
root@ws:~# mount /dev/mapper/vg0-test /mnt/tmp/ #монтирую раздел
… # заполняю его информацией, открываю на нем несколько файлов и т.п.

root@ws:~# vgextend vg0 /dev/sdb1 # расширяю нашу групу томов на «спасательный» диск
Volume group «vg0» successfully extended

root@work:~# pvmove /dev/sda1 /dev/sdb1 #передвигаю содержимое с «умирающего» диска на «спасательный»
/dev/sda1: Moved: 0.9%
/dev/sda1: Moved: 1.8%

/dev/sda1: Moved: 99.7%
/dev/sda1: Moved: 100.0%

root@work:~# vgreduce vg0 /dev/sda1 # убираю «умирающий» диск из группы томов.
Removed "/dev/sda1" from volume group «vg0»

Итого:
Я создал логический раздел, отформатировал его, примонтировал и заполнил нужными данными, затем переместил его с одного устройства на другое, при этом раздел остался примонтирован и данные всё время оставались доступны!
Подобным образом мне удавалось без перезагрузки перенести всю систему с умирающего диска на рэид-массив. :)

А это моя любимая ссылка по LVM: xgu.ru/wiki/LVM

P.S. Прошу простить за опечатки, меня постоянно отвлекали =))

P.P.S. Ах, да!!! Самое главное и самый большой минус LVM — он не читается grub'ом
поэтому раздел /boot должен находиться вне LVM на отдельном разделе жёсткого диска,
иначе система не загрузится.
nycmoma @nycmoma
карма
24,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (74)

  • 0
    Хороший материал.
    Как интересно как с поддержкой всего этого дело под виндами?
    • 0
      Вроде максимум что можно добиться — чтение с таких разделов.
      • 0
        А я хотел при помощи такой штуки объеденить три своих харда поставить порой винду и линух, жаль. отя как время подойдет переставлять все, я еще раз почиаю.
        • 0
          *парой *Хотя
        • +1
          Вам в RAID нада тогда уж.
        • 0
          Возьмите LVM, насоздавайте разделов и скормите их винде, установленной под XEN.
          • 0
            Тонко, посмеялся:)
    • +2
      под win есть «динамические диски» — как мне показалось, практически то же самое… только мышкой и не так понятно :)
    • 0
      Динамические диски. Только аккуратней с ними — если что-нибудь случится с одним из винтов, ни одна утилита Вам не поможет восстановить данные со всех(!) дисков. (Если я не ошибаюсь :)
      • 0
        Ну это нормальная ситуация в любом подобном решении.
      • 0
        Есть unionfs — позволяет объединять логические разделы в один большой, с последовательным заполнением.
        Т.е. есть 2 диска по 100 Gb — объединяем — первые 100 Gb пишутся на первый диск, следующие — на второй.
        Прогиб по скорости, НО — если что-то умрет — оно умрет только со своим куском данных.
        Погуглите.
        • 0
          Хотите сказать unionfs работает в windows?
          P.S. Я не пользуюсь windows, просто интересно, если это действительно так. :)
          • 0
            ? Я???
            Нет, я мало того что не хочу этого говорить, так еще и не скажу!
            Unionfs работает только в *BSD и Linux, ну может еще куда-то спортировали.
            какой-такой виндувс…
        • 0
          Еще есть такая удобная штука rm.pp.ru/info/mhddfs
  • 0
    Спасибо, уважаемый!
    Давно хотел изучить эту тему, а тут Вы. Как раз во время и очень доходчиво. Вам +, а материал в закладки.
  • 0
    О как раз пришлось перепродать часть серва, собрал остатки свободного места воедино при помощи LVM и получил 100гб =)
    • 0
      «Поздравляю, Шарик, ты балбес!» ©

      Страйп-массив на сервере — это что-то!
      • 0
        а причём тут страйп?
        • –1
          Потому что страйп-массив — это логический эквивалент «обрал остатки свободного места воедино».
  • –2
    Сравнение Ext3 LVM2 и ZFS: Solaris ZFS and Red Hat Enterprise Linux Ext3 File System Performance White Paper.

    После такого на LVM не захочется смотреть. (А что делать?)
    • 0
      Ждать btrfs или шагов от Oracle по изменению лицензионной политики ZFS.
      • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Из топика в топик, ну толсто же.
      • 0
        Вроде первый раз ссылку запостил, нет?
    • 0
      использовать *BSD/*SunOS*? а зачем что-то еще?
  • 0
    Вот кстати, а как с производительностью у LVM? Интересует личный опыт.

    Вроде, кстати, LVM умеет шифровать. Так вот, а при включённом шифровании какова производительность?
    • 0
      По поводу производительности, отличий «на глаз» не заметил. По моим тестам тоже всё в районе погрешностей.
      С шифрованием у меня как-то не срослось, я его попробовал и понял что мне оно не надо — у меня практически нет никакой ценной инфы на локальных машинах…
    • 0
      LVM не умеет шифровать. Но для шифрования диска используется вот по какой причине. Для линукса нужно хотя бы 2 раздела: / и swap. Так вот, если шифровать 2 раздела по отдельности, то придётся два раза вводить пароль при загрузке. Можно конечно при каждой загрузке перешифровывать /swap заново сгенерированным ключом, но тогда suspend не получится использовать.

      Так что обычно создают LVM, его шифруют и в получившемся зашифрованном устройстве создают уже / и /swap.

      Таким образом, пароль при запуске вводится один раз, а зашифрованных разделов может быть несколько.

    • 0
      ыы производительность норм, шифровать lvm не умеет сам, я шифровал разделы отдельно, потом поверх них идет lvm
      • 0
        собственно да, для шифрования используется luks (по крайней мере в моём случае).
    • 0
      А 6 HDD тут при чем? Давно уже по меткам модно монтировать, бубунта по дефолту так и делает.
      • 0
        Да там и по меткам пробовали — не плучается. Винчестеры стартуют вразнобой, система им отдаёт разные устройства /dev. Цитата: "(монтирование по UUID почему-то вообще не срабатывает — будто бы идентификаторы одинаковые)".
        • 0
          Еще один наводящий вопрос — при чем тут LVM.
          • +1
            По второй ссылке нет ничего про LVM. Признаю, ошибся.
    • 0
      6hdd не актуально, ибо lvm основывается на uuid'ах устройств и метадате, потому абсолютно не важно как будут называться блочные устройства.
    • 0
      Волков боятся — в лес не ходить :)
    • +1
      Кстати, про восстановление — там винт сломался, если кусочек ФС на винте лежит без дублирование то восстановление вне зависимости от LVM будет тем еще счастьем.
      • 0
        Невнимательный идиот!
        дублирования,
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    LVM это не так просто, как glusterfs.
    gluster.org/
  • 0
    Не знаю мне гораздо проще скопировать систему на новый винт с livecd (cp -a на много более юзабельное шаманство ;)). Так и не понял в чем «безопасность» и в чем прикол такой организации на десктопе. в прочем «кто как хочет — так и дрочит» (с) из к/ф «Брат»
    • 0
      Под «безопасностью» я имел ввиду вынос /tmp и /home на отдельный раздел из корня, чтобы не получилось так что машина не грузится потому, что диск переполнен.
  • 0
    Можно ли с ним сделать такое:
    Создать раздел на 16 гиг, чтобы на нем работала и жила система, и реплицировать этот раздел на флешку 16 гиг, чтобы можно было вытащить его и получить копию минутной например давности?
    • 0
      можно с помощью снапшотов.., обычно это делается так:

      # lvcreate -s -n snap_home -L2G /dev/ws/home # в той же группе томов создаётся снапшот нужного раздела.

      # mount /dev/ws/snap_home /mnt/snapshots # полученый раздел прицепляется в папку,

      # tar -cvzf home.tgz /mnt/snapshots # с него забирается инфа (например можно всё сразу залить в архив).

      # umount /dev/ws/snap_home # отцепляем раздел

      # lvremove /dev/ws/snap_home # удаляем за ненадобностью.

      • 0
        А реплицировать «на лету» оно не может, чтобы не делать долгое копирование? Зеркалирование не поможет?
        • 0
          Честно говоря не совсем понимаю, что имеется в виду под «реплицировать «на лету»» и получить копию минутной например давности.
          Если нужен «снимок» в конкретный момент времени — делаем снапшот, если 2 обновляемые в реальном времени копии fs — зеркалирование… можно делать и то и другое при желании.
          Средствами lvm можно делать, как snapshots, так и зеркалирование отдельных lv.
      • 0
        извините,
        снапшот таром?
        • 0
          простите, был неправ. осилил замысел :)
  • +1
    Вон там отличный мануал с картинками

    www.ibm.com/developerworks/ru/library/l-lvm2/index.html
  • 0
    Это всё, конечно, хорошо. Ровно до тех пор, как у вас один из дисков накроется :) Потом будет очень много танцев с бубнами вокруг того, чтобы восстановить данные.
    • +1
      опыт показывает что, если нет мониторинга винтов и устойчивого к сбоям рэида или зеркалирования (можно даже lvm'ом) — танцы с бубном чтобы восстановить данные будут в любом случае. ;)
      • 0
        Ну. Там будут танцы вокруг повреждённого диска. А тут сбой одного диска повреждает вообще весь массив. Это совсем не ice какой-то.
        • 0
          Никаких танцев. Если резервирования не было, то меняешь винт на чистый, запускаешь проверку диска, исчезнувшие данные помечаются в системе как отсутствующие, а все остальное продолжает работать. Результат тот же самый, что и без LVM. Просто тут немного подольше будут сохранившиеся данные возвращаться в онлайн.
      • +2
        Я, как человек с жопой с гораздо более толстым слоем ракушек, могу сказать, что RAID от исполнения танцев тоже не спасает, просто несколько снижает вероятность, зато значительно усложняет исполняемые па. ;(
        • 0
          Как человек собственной жопой прочувствовавший, что уровень рейда не влияет на качество фарша из данных, если того захотел контроллер — поддерживаю!
          Террабайт белого шума из 4-х хардов на 5-ом рейде начисто отучили доверять передачу данных устройствам сложнее шлейфа.
  • +2
    чот поздновато статейка вышла… лет эдак на 8 минимум :)
    вспоминаю молодость на AIX :)
  • 0
    Я побаиваюсь делать ЛВМ на несколько дисков без райда, ведь если умрёт один диск из массива, то с остальных инфу скорее всего уже не вытащишь.

    Хотя у меня около 1.5 лет проработала связка 500+500 физические тома => 1000 логический том
    • –1
      зачем делать лвм на рейде? буквально выходит рейд на рейде ?!
      • 0
        Затем, что если в /var/lib/mysql, к примеру, место кончится, то туда можно налету добавить гуляющий шмат из /home.
        • 0
          В ZFS-пуле (грубо говоря — это размеченное пространство), например, можно создать отдельную файловую систему (ZFS или UFS). Потом ещё одну, ещё и ещё — сколько нужно. При этом каждая файловая система будет иметь столько свободного места, сколько осталось в пуле.

          LVM может распределить тома, чтобы в каждом томе было столько же свободного места (виртуально, разумеется), сколько осталось на дисках?
          • +1
            Увы, будь это FS — может, и смог бы. А так — нет. На нем нарезаются разделы, которые форматятся уже в нужную фс. А-ля слайсы на разделе, которые потом форматить (раз уж вспомнили о UFS).

            Меня эта задача, точнее ее решение под линухом, также интересует. Нет, я знаю про ZFS через FUSE. Но это ж не то.
          • 0
            Если не критична скорость, можно создать lvm на файлах 'с дырками' (sparce) когда файл на диске занимает ровно столько места, сколько в него записывали, а не сколько выделено с помощью seek.
            Тормоза будут из-за реализации loop (хотя на сколько я понимаю есть альтернативы) и повышенной фрагментации (два уровня — дырявый файл фрагментируется и фрагментация самой фс).
      • 0
        LVM это не RAID, а менеджер логических томов.
  • 0
    >> GRUB has support for LVM and RAID since version 1.95.
    grub.enbug.org/LVMandRAID
  • 0
    Все здорово, а можно ли с помощью ЛВМ сделать RAID1?
    • 0
      да, можно зеркалировать один логический раздел на несколько физических
      правда я всё же предпочитаю RAID1 + LVM без зеркалирования, мне кажется это проще мониторить.
  • 0
    Пересилил лень и решил в общем треде напомнить про unionfs, которая живет под *BSD и есть нативный порт под Linux.
    Если рассуждать в масштабах проблем автора, то алгоритм такой.
    Цепляем новенький террабайтник.
    Форматируем и создаем на нем /home_new
    Переименовываем /home в /home_old
    Создаем новый /home
    Unionfs монитируем на /home /home_old с правами RO и /home_new RW
    Получаем х+500Gb данных
    Радостно ждем, когда загнется старый диск.
    Достаем новый диск (500Gb) из компа и цепляем к ноуту — «Смотри мама, все живо!»
    • 0
      «террабайтник» читать как «полу-террабайтник» или предположить, что мы от него только половину отформотировали под /home_new. (*иногда полезно самого себя перечитывать. иногда уже поздно*)
  • 0
    P.P.S. Ах, да!!! Самое главное и самый большой минус LVM — он не читается grub'ом
    поэтому раздел /boot должен находиться вне LVM на отдельном разделе жёсткого диска,
    иначе система не загрузится.


    Хочу напомнить, что кроме grub, есть ещё и lilo который может загрузить систему даже если /boot расположен на lvm.
  • 0
    root@ws:~# vgcreate ws /dev/sdb
    Volume group «vg0» successfully created

    тут небольшой глюк — создана «ws», а не «vg0»
  • 0
    Ситуация:
    Сделал файл, к которому привязано блочное устройство, из которого делается pvcreate, vgcreate, lvcreate, блаблабла, далее mount и ф.с. видна, дальше ей пользуется виртуалка. mount прописан в /etc/fstab/ После перезагрузки блочное устройство пропадает, физ, логические тома -тоже
    Вопрос: как прописать создание блочного устройства, а затем физического тома, группы, логического тома при загрузке?
    • 0
      наверно не туда вопрос. Прописывать pvcreate, vgcreate, lvcreate при загрузке не нужно, один раз выполнил — и если привязать блочн. устр-во к файлу, то все тома и файловые системы на нем уже есть.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.