Управление дисковым пространством с помощью LVM

В статье рассказывается, как создать файловый сервер с использованием LVM (с RAID и без RAID). Рассмотрены вопросы расширения дискового пространства, замены дисков, выбора файловой системы.

[Bryce Harrington и Kees Cook. Перевод: Сгибнев Михаил (www.dreamcatcher.ru)]

Управление дисковым пространством с помощью LVM

Original

Перевод: Сгибнев Михаил

Linux Logical Volume Manager (LVM) является механизмом виртуализации дисков. Он позволяет создавать "виртуальные" дисковые разделы на одном или нескольких жестких дисках, которые в дальнейшем можно увеличивать, уменьшать или перемещать с диска на диск сообразно вашим потребностям. Также появляется возможность преодолеть ограничение на размер раздела, накладываемое размером жесткого диска.

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

В этой статье сперва рассматриается файловый сервер начального уровня, затем внесем некоторые изменения, добавив избыточность с помощью RAID 1. Также рассмотрим аспекты применения LVM для домашних пользователей.

Установка LVM

Система LVM включает в себя компонет ядра, овечающий за файловую систему и пользовательские утилиты. Для включения компонента ядра, установите следущие опции:
    Device Drivers --> Multi-device support (RAID and LVM)
    
        [*] Multiple devices driver support (RAID and LVM)
        < >   RAID support
        <*>   Device mapper support
        < >     Crypt target support (NEW)
    
Пользовательские утилиты устанавливаются с помощью системы пакетов вашего дистрибутива Linux. В Gentoo, утилиты LVM входят в сотав пакета lvm2. Обратите внимание, что вы можете увидеть пакет LVM-1 (второе его название lvm-user). Можете установить оба пакета, но для работы потребуется LVM-2.

Основы LVM

Чтобы использовать LVM, вам необходимо понять несколько моментов. Вот есть у вас жесткие диски. Дисковое пространство на этих устройствах нарублено на разделы. Наконец, файловая система записывается поверх этих разделов. Для сравнения, в LVM, Volume Groups (VGs) разделены на логические тома (LVs), где файловые системы, в конечном счете, и находятся (Рис. 1).

Каждый VG составлен из пула Физических Томов (PVs). Вы можете расширить (или уменьшить), размер Volume Groups добавляя или удаляя так много PVs, как вам будет угодно, если есть достаточное количество PVs для хранения содержимого всех выделенных LVs. Пока есть доступное пространство в VG, вы можете увеличивать или сокращать размер ваших логических томов (хотя большинство файловых систем не любит сжиматься).

Пример: простой файловой сервер

Простой пример использования LVM - традиционный файловый сервер, на котором храняться резервные копии, медиа-файлы и общие файлы для компьютеров нескольких членов семьи. Гибкость - ключевое требование; кто знает, какие требования к объемам дисков принесет селдующий год?

Для примера, предъявим следущие требования к разделам:
    400G  - Large media file storage
     50G  - Online backups of two laptops and three desktops (10G each)
     10G  - Shared files
    
В конечном счете, эти требования могут увеличиться многократно за следующий год или два, но сказать точно, какой раздел и на сколько - нельзя.

Диски

Традиционно, файловый сервер использует диски SCSI, но сегодня диски SATA предлагают привлекательное соотношение скорости и низкой цены. На момент написания этой статьи, диски SATA на 250 Гбайт по стоимости примерно равны 100 $, таким образом, стоимость одного терабайта составит около 400 $.

Диски SATA именуются не ATA классификацией (hda, hdb), а SCSI (sda, sdb). Как только наша система загрузилась с поддержкой SATA, у нас появится четыре готовых к работе физических устройства:
    /dev/sda  251.0 GB
    /dev/sdb  251.0 GB
    /dev/sdc  251.0 GB
    /dev/sdd  251.0 GB
    
Теперь подготовим их для работы с LVM. Вы можете сделать это с помощью fdisk, определяя "Linux LVM" как тип раздела 8e.
    # fdisk -l /dev/sdd
    
    Disk /dev/sdd: 251.0 GB, 251000193024 bytes
    255 heads, 63 sectors/track, 30515 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device            Start   End      Blocks      Id  System
    /dev/sdd1         1       30515    245111706   8e  Linux LVM
    

Создание виртуального тома

Иниицилизируйте каждый диск с помощью команды "pvcreate" :
    # pvcreate /dev/sda /dev/sdb /dev/sdc /dev/sdd
    
Эта команда настроит все разделы для использование под LVM и позволит создать группы томов. Для проверки доступности PVs используйте команду "pvdisplay". Здесь мы будем использовать единственный том под названием "datavg":
    # vgcreate datavg /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
    
Используйте vgdisplay, чтобы видеть недавно созданный VG "datavg" с четырьмя дисками, объединенными вместе. Теперь создайте логические тома:
    # lvcreate --name medialv  --size 400G
    # lvcreate --name backuplv --size  50G
    # lvcreate --name sharelv  --size  10G
    
Без LVM вы могли бы распределить все доступное дисковое пространство по разделам, которые вы создаете, но с LVM, можно быть более консервативным, распределяя только половину доступного пространства согласно текущим требованиям. Как правило, проще расширить файловую систему, чем уменьшить, таким образом, мы выбрали хорошую стратегию распределения пространства. Этот метод также дает вам возможность создания новых томов, когда возникнет такая потребность (например, для хранения зашифрованных данных). Чтобы просмотреть созданные тома, используйте команду "lvdisplay":

Теперь у вас есть несколько понятно названных логических томов:
    /dev/datavg/backuplv     (also /dev/mapper/datavg-backuplv)
    /dev/datavg/medialv      (also /dev/mapper/datavg-medialv)
    /dev/datavg/sharelv      (also /dev/mapper/datavg-sharelv)
    

Выбор файловой системы

Теперь, когда устройства созданы, необходимо создать файловые системы, коих существует великое множество. На чем остановить свой пылающий взор?

Типичными файловыми системами настольных компьютеров является ext2 и ext3. Ext2 была стандартной, надежной рабочей лошадью для Linux в минувшие годы. Ext3 - модернизация ext2, поддерживающая журналирование и улучшенные механизмы проверки после сбоя. Сбалансированность ext3 в плане производительности, надежности и скорости восстановления делает ее прекрасным выбором для систем общего назначения. Поскольку ext2 и ext3 были файловыми системами, используемыми по умолчанию, в течение долгого времени, то ext3 будет хорошим выбором, если вы хотите получить большую надежность. Для того, чтобы хранить резервные копии, надежность намного более важна чем скорость. Главным недостатком ext2/ext3 является то, что для того, чтобы увеличить(уменьшить) ФС, необходимо ее отмонтировать.

Однако, другие файловые системы обеспечивают некоторые преимущества в определенных ситуациях, например, при больших размерах файла, большом количестве файлов или произволительности файловой системы. Поскольку основное использование LVM - для сценариев, когда вы нуждаетесь в критическом количестве файлов, чрезвычайно больших файлах, и/или потребности изменять размеры ваших файловых систем, следует рассмотреть другие файловые системы.

Для большого количества маленьких файлов превосходным выбором будет ReiserFS. Для потокового, некэшируемого ввода/вывода, эта ФС занимает верхние строки тестов и может быть на несколько порядков быстрее, чем ext3. Однако, исторически, она оказалась не столь стабильной, как ext3. Этот вывод сделан на основании достаточно устаревших данных, возможно, сейчас ситуация изменилась, но неприятный осадок остался.

Если вы планируете создать файловый сервер, который будет содержать большие файлы, типа видео файлов, скачанных с MythTV, приоритетной может стать скорость удаления файлов. С ext3 или ReiserFS, удаление большого файла может занять несколько секунд, чтобы отметить все освобожденные блоки данных. Если ваша система в этот момент делает запись на диск или обрабатывает видео, эта задержка могла бы вызвать сбои. JFS и XFS лучший выбор в этой ситуации, хотя XFS имеет преимущество из-за большей надежности и общей лучшей работы.

Итак, приняв все сказанное во внимание:
    # mkfs.ext3 /dev/datavg/backuplv
    # mkfs.xfs /dev/datavg/medialv
    # mkfs.reiserfs /dev/datavg/sharelv
    

Монтирование

Наконец, чтобы примонтировать файловые системы, добавьте следующие строки к /etc/fstab:
    /dev/datavg/backuplv   /var/backup     ext3       rw,noatime    0 0
    /dev/datavg/medialv    /var/media      xfs        rw,noatime    0 0
    /dev/datavg/sharelv    /var/share      reiserfs   rw,noatime    0 0
    
создаем и активируем точки монтирования:
    # mkdir /var/media /var/backup /var/share
    # mount /var/media /var/backup /var/share
    
Теперь ваш сервер готов к предоставлению сервисов.

Добавляем избыточность с помощью RAID

Пока в использовании LVM все достаточно просто. Однако естьодин главный недостаток: при сбое любого из дисков, ваши данные окажутся в опасности. Очень сложно создать резервную копию половины терабайта данных.

Для компенсации такого риска необходимо добавить избыточность, используя RAID 1. RAID (Redundant Array of Independent Disks) является низкоуровневой технологией комбинирования дисков различными способами (уровнями). RAID 1 зеркалирует данные на двух (или более) дисках. Помимо повышения надежности, с использованием RAID 1 возрастает производительность, поскольку на дисках содержатся идентичные данные и операции чтения/записи могут быть разделены между ними.

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

RAID 5, с четырмя дисками, совсем другой коленкор. Он позволяет восстанавливать часть дискового пространства, но добавляет сложности в использовании. Кроме того, показывая неплохую производительность на операциях чтения, этот тип сильно проигрывает на операциях записи. Поскольку диски сейчас довольно дешевы, не стоит мучится ради выгод, даваемых RAID 5.

Хотя имело бы смысл сразу начать с установки системы с использованием RAID, мы ждали, чтобы мы могли продемонстрировать, как мигрировать с обычных дисков на RAID без отмонтирования файловых систем.

Сейчас мы объединим четыре диска в две пары RAID 1: /dev/sda + /dev/sdd and /dev/sdb + /dev/sdc. Причина для такого специфического объединения заключается в том, что sda и sdd являются первым и вторым дисками на разных контроллерах; поэтому, в случае отказа контроллера, вы сможете обращаться к двум дискам на оставшемся контроллере. При использовании таких пар относительные скорости доступа балансированы так, что ни один тип RAID не медленнее, чем другой. Возможно так же повышение производительности от распределения операций чтения/записи между двумя контроллерами.

Сначала, выведите два диска SATA (sdb и sdd) из datavg VG:
    # modprobe dm-mirror 
    # pvmove /dev/sdb1 /dev/sda1 
    # pvmove /dev/sdd1 /dev/sdc1 
    # vgreduce datavg /dev/sdb1 /dev/sdd1 
    # pvremove /dev/sdb1 /dev/sdd1
    
Теперь изменим тип разделов на этих двух дисках, выбрав тип fd (Linux raid autodetect):
    Device Boot      Start         End      Blocks    Id  System
    /dev/sdb1          1          30515    245111706  fd  Linux raid autodetect
    
Теперь создадим зеркало RAID 1, указывая md, что другая "половина" зеркала отсутствует (потому что два других диска еще не готовы для добавления в RAID).
    # mdadm --create /dev/md0 -a -l 1 -n 2 /dev/sdd1 missing
    # mdadm --create /dev/md1 -a -l 1 -n 2 /dev/sdb1 missing
    
Добавляем это битое зеркало в LVM:
    # pvcreate /dev/md0 /dev/md1
    # vgextend datavg /dev/md0 /dev/md1
    
Затем, переносим оставшиеся диски в зеркало:
    # pvmove /dev/sda1 /dev/md0 
    # pvmove /dev/sdc1 /dev/md1 
    # vgreduce datavg /dev/sda1 /dev/sdc1 
    # pvremove /dev/sda1 /dev/sdc1
    
В заключение, меняем типы дисков на fd и получаем битое зеркало, но с полностью зеркальной информацией:
    # fdisk /dev/sda1
    # fdisk /dev/sdc1
    # mdadm --manage /dev/md0 --add /dev/sda1
    # mdadm --manage /dev/md1 --add /dev/sdc1
    
Хотя и приложив много усилий для создания RAID 1, мы защитили LVM без повторной переустановки, копирования, отмонтирования ФС или перезагрузки системы.

Доступ к файлам по сети

Польза файлового сервера сомнительна, если вы не можете легко получить доступ к файлам. Есть много способов сделать это, но наиболее распространенным является Сетевая Файловая система (NFS). NFS позволяет другим *nix машинам монтировать общие ресурсы для прямого использования, к тому же, она очень легко конфигурируется в Linux.

Сперва убедитесь, что на вашем файловом сервере в ядре разрешен NFS (в данном примере 2.6.15):
    File systems
     Network File Systems
    
     <*> NFS file system support
      [*]   Provide NFSv3 client support
      <*> NFS server support
      [*]   Provide NFSv3 server support
    
Соберите и переустановите ядро, после чего перезапустите сервер. Если перезагрузка нежелательна, то соберите NFS как модуль и затем загрузите его с помощью modprobe nfsd.

Запускаем сервер NFS. Для этого, в вашем дистрибутиве Linux имеется система init. Например, в Gentoo, вы увидите:
    /etc/init.d/nfs start 
     * Starting portmap ...      [ ok ]
     * Mounting RPC pipefs ...   [ ok ]
     * Starting NFS statd ...    [ ok ]
     * Starting NFS daemon ...   [ ok ]
     * Starting NFS mountd ...   [ ok ]
    
Вы можете повторно проверить, запущен ли NFS, запрашивая portmapper командой rpcinfo-p | grep nfs:
    program  vers proto port  service
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    
Затем вы должны определить, какие каталоги NFS должна экспортировать. Добавьте их в /etc/exports:
    /var/backup    192.168.0.0/24(rw,sync)
    /var/media     192.168.0.0/24(rw,sync)
    /var/share     192.168.0.0/24(rw,sync)
    
Это список каталогов, предназначенных для общего доступа с указанием сети, из которой разрешен доступ и несколько дополнительных опций. Опции rw и sync подразумевают под собой разрешение на чтение/запись и осуществление синхронизации каталогов, что предотвращает нарушение целостности данных, если сервер был перезагружен в середине записи файла, хотя и мы и лишимся преимуществ async режима.

Эхпортируем эти NFS ресурсы:
    # exportfs -av
    exporting 192.168.0.0/24:/var/backup
    exporting 192.168.0.0/24:/var/media
    exporting 192.168.0.0/24:/var/share
    
Теперь подмонтируйте эти русурсы на каждой машине, которая будет использовать их. Добавим соотвествующие строки с параметром fileserv в /etc/fstab клиентской машины:
    # Device               mountpoint    fs-type   options    dump  fsckorder
    fileserv:/var/backup   /var/backup   nfs       defaults   0     0
    fileserv:/var/media    /var/media    nfs       defaults   0     0
    fileserv:/var/share    /var/share    nfs       defaults   0     0
    
В заключение, создаем точки монтирования и монтируем ресурсы:
    # mkdir /var/backup /var/media /var/share
    # mount /var/backup /var/media /var/share
    
Теперь все машины вашей сети имеют доступ к большому, надежному и расширяемому дисковому пространству!

Стратегия создания резервных файлов

При использовании LVM могут возникнуть проблемы резервного копирования данных. Использование RAID защищает от дисковых отказов, но эта технология беззащитна от пожара, воровства или случайного удаления файлов.

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

rsync - мощная утилита для того, чтобы копировать файлы с одной системы на другую и она достаточно хорошо работает через Интернет. Вы можете установить дублирующую систему в фирме друга в другом городе и периодически послать резервные копии туда. Это можно сделать с помощью cronjob:
    04 4 * * 4  rsync --delete -a /var/backup/ fileserv.myfriend.org:/backup/myself/backup \
        > /var/log/crontab.backup.log 2>&1
    
Другой подход состоит в том, чтобы прикрепить к вашему серверу пару внешних RAID 1 жестких дисков через Firewire, USB или eSATA. Добавьте один диск к /dev/md0 и второй к /dev/md1. Как только зеркалирование пройдет, отключите их и сохраните в безопасном месте. Подключайте диски еженедельно или ежемесячно, в зависимости от ваших потребностей.

Расширение и перераспределение

Предположим, что на следующий год вам понадобятся дополнительные объемы дисковой памяти. Первоначально можно использовать зарезервированное пространство, например для того, чтобы расширить пространство для общих файлов с 10GB до 15GB, выполните следущую команду:
    # lvextend -L15G /dev/datavg/sharelv
    # resize_reiserfs /dev/datavg/sharelv
    
Но когда свободного места не останется, нам придется заменить 250G диски на диски емкостью 800G.

В случае использования RAID 1, миграция является довольно простым процессом. Для того, что бы пометить диск каждого зеркала как "битый", а затем удалить его, используйте команду mdadm:
    # mdadm --manage /dev/md0 --fail /dev/sda1
    # mdadm --manage /dev/md0 --remove /dev/sda1
    # mdadm --manage /dev/md0 --fail /dev/sdc1
    # mdadm --manage /dev/md0 --remove /dev/sdc1
    
Извлеките диски sda и sdc, а затем замените их новыми. Далее разбейте 800G диски на два раздела по 250G и 550G, используя fdisk и добавьте разделы обратно, к md0 и md1:
    # fdisk /dev/sda
    # fdisk /dev/sdc
    # mdadm --manage /dev/md0 --add /dev/sda1
    # mdadm --manage /dev/md1 --add /dev/sdc1
    
Повторите вышеупомянутый процесс с дисками sdd и sdb, чтобы заменить их на новые, затем создайте третье и четвертое устройство RAID, md2 и md3, используя новое пространство:
    # mdadm --create /dev/md2 -a -l 1 -n 2 /dev/sda2 /dev/sdd2
    # mdadm --create /dev/md3 -a -l 1 -n 2 /dev/sdb2 /dev/sdc2
    
В заключение, добавим их в LVM:
    # pvcreate /dev/md2 /dev/md3
    # vgextend datavg /dev/md2 /dev/md3
    
Файловый сервер теперь имеет 1.6TB дисковой памяти.

LVM и рабочая станция

Пока мы говорили об использовании LVM и RAID для управления дисковым пространством файлового сервера, но что если вы хотите установить LVM на своей рабочей машине? Это можно сделать, но стоит принять во внимание несколько аспектов.

Во первых, некоторые дистрибутивы Linux на этапе установки или обновления не поддерживают RAID или LVM, что может доставить неудобства. Стоит обратить на это внимание.

Во вторых, наличие корневой файловой системы на LVM может усложнить восстановление поврежденных файловых систем. Поскольку загрузчики не поддерживают LVM, раздел /boot должен быть не LVM (хотя может быть на устройстве RAID 1).

В третьих, вам необходимо свободное дисковое пространство для нового раздела LVM. Если такового у вас нет, то попробуйте обрезать корневой раздел, как описано в LVM HOWTO.

В этом примере мы рассмотрим ситуацию, когда у вас есть swap и /boot на собственных разделах, вне LVM. Мы заострим внимание на том, как перенести корневой раздел внутрь LVM раздела /dev/hda4. Проверьте, что тип файловой системы на hda4 - LVM (тип 8e).

Инициализируйте LVM и создайте новый физический том:
    # vgscan
    # pvcreate /dev/hda4
    # vgcreate rootvg /dev/hda4
    
Теперь создайте логический том размером в 5G, отформатированный в xfs:
    # lvcreate rootvg ---name rootlv -size 5G
    # mkfs.xfs /dev/rootvg/rootlv
    
Скопируйте файлы с существующей корневой файловой системы на новый LVM:
    # mkdir /mnt/new_root
    # mount /dev/rootvg/rootlv /mnt/new_root
    # cp -ax /. /mnt/new_root/
    
Затем, модифицируем /etc/fstab для монтирования / в /dev/rootvg/root вместо /dev/hda3.

Самая хитрая часть заключается в пересборке initrd для включения поддержки LVM. Этот процесс очень сильно зависит от дистрибутива, например mkinitrd или yaird. Ваш образ initrd должен загрузить модуль LVM, в противном случае корневая файловая система будет недоступна. На всякий случай, сохраните образ initrd и новый сделайте с другим именем, например /boot/initrd-lvm.img.

В заключение, обновите bootloader. Добавьте новый раздел для новой корневой файловой системы, продублировав старую строку загрузки. В новой строке измените root с /dev/hda3 на /dev/rootvg/rootlv и замените initrd на новый. Если вы используете lilo, убедитесь, что запустили lilo, как только сделали изменения. Например, с grub мы будем иметь:
    title=Linux
      root (hd0,0)
      kernel /vmlinuz root=/dev/hda3 ro single
      initrd /initrd.img
    
Добавим новую секцию:
    title=LinuxLVM
      root (hd0,0)
      kernel /vmlinuz root=/dev/rootvg/root ro single
      initrd /initrd-lvm.img
    

Заключение

LVM является одной из многих технологий Linux, доступной пользователям. LVM позволяет достич большей гибкости в управлении дисковым пространством и объединенная с RAID 1, NFS и хорошей стратегией бэкапа пожет дать пуленепробиваемый, легко управляемый способ хранить и совместно использовать любое количество файлов.

Статья взята с сайта DreamCatcher.

[ опубликовано 01/06/2006 ]

Bryce Harrington и Kees Cook. Перевод: Сгибнев Михаил (www.dreamcatcher.ru) - Управление дисковым пространством с помощью LVM   Версия для печати