Как отключить жесткий диск от LVM в Linux?
LVM очень хорош. Но бывают ситуации, когда нужно освободить один HDD от LVM и вытащить его из сервера. Вроде простая задача, но все инструкции в интернете не дают полного понимая, как запустить этот процесс и успешно его выполнить.
У меня в LVM находятся разделы 4 HDD -дисков:
- /dev/sdb1 — на 1.8Tb;
- /dev/sdc1 — на 1.8Tb;
- /dev/sde1 — на 3.7Tb;
- /dev/sdg1 — на 3.7Tb.
Все диски образуют один большой раздел 1.8Tb + 1.8Tb + 3.7Tb + 3.7Tb = 11Tb. Общий виртуальный диск примонтирован к директории /mnt/lvm.
Увидеть какие диски задействованы в LVM можно командой pvs :
Мне нужно забрать из LVM /dev/sdg (3,7Tb) и оставить работоспособную LVM после себя.
Освобождаем место
Для начала нужно удостовериться, что общий размер данных меньше, чем оставшееся место. Если нам нужно освободить от LVM жесткий диск емкостью 3.7Tb, то свободное место lvm-раздела должно быть чуть больше этого значения. К примеру 4Tb ровно.
Отмонтируем раздел
С примонтированным разделом Вы не сможете ничего сделать:
Проверяем диск на ошибки
Это обязательный шаг. Если его не сделать, то последующие команды, Вам об этом скажут и не будут ничего делать.
Изменяем размер файловой системы
Это самый долгий процесс. У меня он занял 20 часов. Команда ниже уменьшает раздел ФС на все доступное дисковое пространство:
- -p — это псевдо-графический прогресс работы. Полоска из тире должна заполниться Х и процесс будет завершен. Это важный параметр, так как процесс может занимать очень продолжительное время.
- -M — позволяет уменьшить раздел на все свободное пространство.
Данные никуда не исчезнут. Даже если что-то пойдет не так и процесс аварийно завершиться, данные останутся на месте. В этом случае, Вам нужно повторно проверить диск на ошибки и заново запустить процесс.
Уменьшаем раздел
Уменьшаем размер раздела lvm-диска. В итоге наш «освобождаемый» жесткий диск 3.7Tb, нам нужно отрезать немного больше. 4Tb в самый раз:
Система предупреждает, что процесс необратим. Мы смело на это соглашаемся.
На всякий случай привожу команду, которая расширяет раздел на всю доступную файловую систему:
Она нужна, если Вы случайно отрезали больше.
Изменяем размер файловой системы до раздела
Размер файловой системы и размер раздела теперь не совпадают. Чтобы место не пропадало попусту, изменяем размер файловой системы до размера раздела:
Перемещаем данные с физического диска
Данные lvm-раздела могут храниться на всех дисках, поэтому необходимо перенести данные с раздела диска, который нужно освободить:
В данном примере все данные размещаются на остальных дисках. Освобождаемый диск не используется.
Исключаем диск из LVM
Стираем метаданные с диска
Чтобы диском пользоваться с максимальной эффективностью, удаляем все таблицы LVM с его поверхности:
Проверяем результат
Запустив команду pvs мы можем увидеть, что наш LVM существует без /dev/sdg1:
Что означает dev sdg1
Библиотека сайта rus-linux.net
Группировка физических носителей — это специальное обозначение операции группировки множества блочных устройств (жестких дисков, а также устройств iSCSI и.т.д.) в рамках одного виртуального логического устройства для хранения данных. При возникновении необходимости в расширении этой логической группы устройств в нее впоследствии могут быть добавлены дополнительные блочные устройства (включая их разделы).
Размеры томов LVM в этой физической группе устройств не зависят от размеров отдельных устройств. Общий размер группы устройств является пределом.
Одной из наиболее ценных возможностей системы управления логическими томами LVM является возможность изменения размеров логических томов. Вы можете увеличить размер логического тома LVM в некоторых случаях даже без перезагрузки системы. Кроме того, вы можете инициировать миграцию данных с выходящего из строя жесткого диска, зеркалирование данных, а также создавать снимки разделов.
11.1. Знакомство с LVM
11.1.1. Недостатки стандартных разделов
Существует несколько недостатков стандартных разделов жестких дисков, которые чаще всего выявляются в процессе эксплуатации последних. Рассмотрим систему с дисками малого и большого размера, на которых созданы разделы таким образом, как показано на иллюстрации ниже. Первый диск (представленный файлом устройства /dev/sda) разделен на два раздела, а второй диск (представленный файлом устройства /dev/sdb) — также разделен на два раздела, причем часть диска остается не размеченной.
Продолжая рассмотрение приведенного выше примера, подумайте о том, каким образом можно поступить в случае возникновения необходимости увеличения дискового пространства, доступного по пути /srv/project42 . Какое действие вы можете предпринять? Любое ваше решение будет связано в размонтированием файловой системы, созданием резервной копии хранящихся в ней данных, удалением и повторным созданием разделов, восстановлением данных из резервной копии и повторным монтированием файловой системы.
11.1.2. Решение в случае использования LVM
В случае использования LVM будет создана виртуальная прослойка между смонтированными файловыми системами и аппаратными устройствами. Эта виртуальная прослойка позволит администратору увеличить размер смонтированной файловой системы в процессе ее эксплуатации. При корректном использовании LVM не возникает необходимости в размонтировании файловой системы для увеличения ее размера в ручном режиме.
11.2. Терминология LVM
11.2.1. Физический том (physical volume — pv)
Физическим томом является любое блочное устройство (файл устройства, соответствующий диску, разделу на диске, дисковому массиву RAID или даже устройству iSCSI). Все эти устройства могут быть добавлены в группу томов .
Команды, используемые для управления физическими томами , всегда начинаются с символов pv.
11.2.2. Группа томов (volume group — vg)
Группа томов является уровнем абстракции между блочными устройствами и логическими томами .
Команды, используемые для управления группами томов , начинаются с символов vg.
11.2.3. Логический том (logical volume — lv)
Логический том создается в рамках группы томов . Каждый логический том может содержать файловую систему, которая может монтироваться. Методика использования логических томов аналогична методике использования разделов дисков и предусматривает работу с тем же набором стандартных утилит (mkfs, mount, fsck, df, ).
Команды, используемые для управления логическими томами , начинаются с символов lv.
11.3. Пример: работа с LVM
В данном примере показана методика использования дискового устройства (в нашем примере дисковое устройство представлено файлом устройства /dev/sdc, но оно также может быть представлено и файлом устройства /dev/sdb, и любым другим файлом устройства, соответствующим другому дисковому устройству или разделу на таком устройстве) при работе с технологией LVM и даны пояснения относительно создания группы томов (vg), а также создания и использования логического тома (vg/lvol0).
В первую очередь необходимо создать физические тома, которые впоследствии будут объединены в рамках группы томов с помощью утилиты pvcreate . Данная утилита модифицирует раздел дискового устройства таким образом, чтобы он мог использоваться в рамках групп томов. В примере ниже показано, как задействовать диск SCSI при работе с технологией LVM.
Примечание: Технология LVM будет отлично работать и в случае использования устройств вместо специализированных разделов на них, но другая операционная система, установленная на этом же компьютере (или в этой же сети хранения данных) наверняка не сможет определить, что устройство используется в рамках группы томов LVM и, скорее всего, пометит блочное устройство как устройство без данных! Вы можете избежать такого поведения сторонней операционной системы, создав раздел на всей доступной поверхности дискового устройства и использовав утилиту pvcreate по отношению к этому разделу, а не к дисковому устройству.
После этого следует воспользоваться утилитой vgcreate для создания группы томов, содержащей том с одного дискового устройства. Учтите, что в эту группу томов впоследствии могут быть добавлены тома с других устройств.
Последний шаг заключается в использовании утилиты lvcreate для создания логического тома.
Теперь в логическом томе, представленном файлом устройства /dev/vg/lvol0, может быть создана файловая система ext3, которая впоследствии может монтироваться и использоваться по назначению.
Логический том очень похож на раздел дискового устройства; в нем может быть создана файловая система, которая впоследствии может монтироваться и использоваться для хранения данных пользователей.
11.4. Пример: расширение логического тома
Логический том может быть расширен без отмонтирования файловой системы. Возможность расширения логического тома определяется возможностями используемой рамках этого тома файловой системы. Смонтированные тома с файловыми системами vfat и ext2 не могут быть расширены, поэтому в данном примере мы будем использовать файловую систему ext3.
Утилита fdisk выводит информацию о недавно добавленных дисках SCSI, которые будут содержать данные нашего тома LVM. Впоследствии этот том может быть расширен. В первую очередь давайте рассмотрим параметры этих дисков.
Вы уже знаете о том, как создаются разделы на дисковых устройствах, поэтому при ознакомлении со следующим фрагментом вывода можете сделать вывод о том, что разделы созданы лишь на первом диске (точнее один первичный раздел большого размера), в то время, как второй диск остался не тронутым.
Также вы знаете о том, как готовить диски к работе с технологией LVM с помощью утилиты pvcreate , а также о том, как создавать группу томов с помощью утилиты vgcreate . В данном примере в группу томов с именем vg2 добавляется как диск с разделами, так и диск без них.
Вы можете использовать утилиту pvdisplay , чтобы убедиться в том, что как диск, так и раздел принадлежат к одной и той же группе томов.
Кроме того, вы должны быть знакомы как с утилитой lvcreate , предназначенной для создания логических томов, так и с утилитой mke2fs , предназначенной для создания файловой системы ext3 в рамках этих томов.
Как вы можете увидеть, нам удалось создать и смонтировать логический том размер которого, в соответствии с информацией от утилиты df , составляет практически 200 МБ.
Расширение тома осуществляется достаточно просто с помощью утилиты lvextend .
Но, как вы можете увидеть, возникла небольшая проблема: кажется утилита df не может вывести информацию о полном размере расширенного тома. Это происходит из-за того, что файловая система создавалась в рамках тома, размер которого увеличился после расширения.
Однако, в случае использования утилиты lvdisplay мы можем увидеть реальный размер тома после расширения.
Для завершения процесса расширения тома необходимо воспользоваться утилитой resize2fs , которая позволяет распространить файловую систему во всем пространстве, выделенном для логического тома.
Поздравляю, вы только что успешно расширили логический том.
11.5. Пример: изменение размера физического тома
Ниже представлено краткое описание методики изменения размера физического тома средствами LVM (после изменения его размера с помощью утилиты fdisk). Описание начинается с получения информации о разделе дискового устройства размером в 100 МБ, представленном файлом устройства /dev/sde1. Мы заранее использовали утилиту fdisk для создания и проверки размера этого раздела.
Теперь мы можем использовать утилиту pvcreate для создания физического тома, а также утилиту pvs для проверки корректности его создания.
На следующем шаге следует использовать утилиту fdisk для увеличения размера раздела (на самом деле будет осуществляться удаление этого раздела и повторное создание раздела с дополнительными цилиндрами, который будет представлен файлом устройства /dev/sde1).
Если мы используем сейчас утилиты fdisk и pvs для проверки размеров раздела и физического тома, мы обнаружим различие в значениях. В рамках LVM все еще используется старый размер раздела.
Утилита pvresize, примененная по отношению к физическому тому, уведомит LVM об изменении размера раздела дискового устройства. Информация о корректном размере также может быть получена с помощью утилиты pvs.
11.6. Пример: зеркалирование логического тома
Начнем работу с создания трех физических томов LVM. После этого проверим корректность создания и размеры этих томов с помощью утилиты pvs. Мы создаем три физических диска по той причине, что в LVM два диска используются для хранения данных с зеркалированием, а третий том — для хранения данных журнала зеркалирования!
После этого создадим группу томов и проверим корректность ее создания с помощью ранее использованной утилиты pvs. Учтите, что три физических тома теперь принадлежат к группе томов с именем vg33, причем размеры этих томов округляются в меньшую сторону (на шаг, равный размеру экстента, в нашем случае 4МБ).
Последний шаг заключается в создании логического тома с помощью утилиты lvcreate . Обратите внимание на параметр -m 1 , предназначенный для выделения одного дискового устройства для хранения данных журнала зеркалирования. Также обратите внимание на изменение значений свободного пространства на каждом из трех физических томов!
Вы можете получить информацию о состоянии процесса зеркалирования данных, воспользовавшись утилитой lvs. В данном примере создана 100-процентная копия данных.
11.7. Пример: снимок логического тома
Снимком называется виртуальная копия всех данных, хранящихся на разделе дискового устройства в данный момент времени. Снимок логического раздела будет содержать копию всех измененных файлов с используемого для создания снимка логического тома.
В примере ниже создается снимок логического тома под названием bigLV.
Изучив вывод утилиты lvs, вы можете убедиться в том, что снимок snapLV действительно является снимком логического тома bigLV. Спустя непродолжительное время после создания снимка, происходит несколько модификаций данных на логическом томе bigLV (0.02 процента).
Но в процессе последующего использования тома bigLV объем модификаций увеличивается. Это означает, что в рамках логического тома снимка должен храниться больший объем оригинальных данных (10.22 процента).
Теперь вы можете использовать обычные инструменты для резервного копирования данных (dump, tar, cpio, ) с целью создания резервной копии логического тома снимка. Эта резервная копия будет содержать все данные, хранящиеся в рамках логического тома bigLV в момент создания снимка. После создания резервной копии вы можете удалить логический том снимка.
11.8. Проверка существующих физических томов
11.8.1. Утилита lvmdiskscan
Для получения списка блочных устройств, которые могут использоваться для работы с технологией LVM следует использовать утилиту lvmdiskscan . В примере ниже для вывода информации исключительно об устройствах SCSI используется утилита grep.
11.8.2. Утилита pvs
Простейший способ получения информации о том, используется ли технология LVM для работы с определенными устройствами, заключается в использовании утилиты pvs . При рассмотрении фрагмента вывода данной утилиты, приведенного в примере ниже, можно сделать вывод о том, что технология LVM используется исключительно для работы с разделом дискового устройства, представленным файлом устройства /dev/sda2. В выводе утилиты также содержится информация о том, что раздел дискового устройства, представленный файлом устройства /dev/sda2, состоит в группе томов с именем Volgroup00 и имеет размер, равный практически 16 Гб. Кроме того, в выводе утилиты содержится информация о дисковых устройствах, представленных файлами устройств /dev/sdc и /dev/sdd, которые состоят в группе томов с именем vg33. Технология LVM может использоваться и для работы с дисковым устройством, представленным файлом устройства /dev/sdb, но это устройство на данный момент не относится к каким-либо группам томов.
11.8.3. Утилита pvscan
Утилита pvscan позволяет осуществить сканирование всех дисковых устройств в поисках существующих физических томов. Данная утилита выводит информацию, аналогичную той, которую выводит утилита pvs, а также строку с информацией об общем размере обнаруженных физических томов.
11.8.4. Утилита pvdisplay
Используйте утилиту pvdisplay для получения дополнительной информации о физическом томе. Также вы можете использовать утилиту pvdisplay без аргументов для вывода информации обо всех физических томах (LVM).
11.9. Проверка существующих групп томов
11.9.1. Утилита vgs
По аналогии с утилитой pvs , утилита vgs может использоваться для вывода краткой информации обо всех группах томов. В выводе данной утилиты, приведенном в примере ниже, содержится информация только об одной группе томов с именем VolGroup00, размер которой равен практически 16 Гб.
11.9.2. Утилита vgscan
Утилита vgscan позволяет осуществить сканирование всех дисковых устройств в поисках существующих групп томов. Также данная утилита обновляет содержимое файла /etc/lvm/.cache . В данном файле содержится список всех устройств, для работы с которыми на данный момент используется технология LVM.
В случае использования технологии LVM утилита vgscan будет запускаться автоматически в процессе загрузки системы, поэтому в том случае, если вы будете осуществлять горячее подключение дисковых устройств, вам придется самостоятельно запускать утилиту vgscan для добавления в файл /etc/lvm/.cache информации о новых устройствах.
11.9.3. Утилита vgdisplay
Утилита vgdisplay предоставляет более подробную информацию о группе томов (или обо всех группах томов, если вы не будете передавать ей каких-либо аргументов).
11.10. Проверка существующих логических томов
11.10.1. Утилита lvs
Используйте утилиту lvs для получения краткой информации обо всех существующих логических томах. В выводе данной утилиты, приведенном в примере ниже, вы можете обнаружить информацию о двух логических томах с именами LogVol00 и LogVol01.
11.10.2. Утилита lvscan
Утилита lvscan позволяет осуществить сканирование всех дисковых устройств в поисках существующих логических томов.
11.10.3. Утилита lvdisplay
Более подробная информация о логических томах может быть получена с помощью утилиты lvdisplay(1) .
11.11. Управление логическими томами
11.11.1. Утилита pvcreate
Используйте утилиту pvcreate для добавления устройств, работа с которыми должна осуществляться посредством технологии LVM. В данном примере показана методика перевода дискового устройства (или устройства из аппаратного массива RAID) в разряд устройств LVM.
В следующем примере показана методика перевода раздела дискового устройства в разряд устройств, работа с которыми должна осуществляться посредством технологии LVM.
Также вы можете передавать утилите pvcreate пути к множеству файлов устройств, представляющих дисковые устройства и их разделы. В данном примере для работы посредством технологии LVM выделяются три диска.
11.11.2. Утилита pvremove
Используйте утилиту pvremove для удаления физических томов из списка физических томов LVM. Соответствующие устройства не должны использоваться.
11.11.3. Утилита pvresize
После того, как вы воспользовались утилитой fdisk для изменения размера раздела на диске, вы должны использовать утилиту pvresize для определения нового размера физического тома, представляющего рассматриваемый раздел диска, на уровне LVM.
11.11.4. Утилита pvchange
С помощью утилиты pvchange вы можете предотвратить резервирование физического тома в рамках новой группы томов или логического тома. Это обстоятельство может оказаться полезным в том случае, если вы планируете впоследствии удалить этот физический том.
В следующем примере содержится описание методики повторной активации физического тома для его последующего резервирования, которая может быть осуществлена в случае необходимости отмены вашего предыдущего решения.
11.11.5. Утилита pvmove
С помощью утилиты pvmove вы можете перемещать логические тома в рамках группы томов в сторонние физические тома. Эта операция должна выполняться перед удалением физического тома.
11.12. Управление группами томов
11.12.1. Утилита vgcreate
Используйте утилиту vgcreate для создания группы томов. Вы можете сразу же передать информацию о путях к файлам устройств физических томов, которые должны быть добавлены в создаваемую группу томов.
11.12.2. Утилита vgextend
Используйте утилиту vgextend для расширения существующей группы томов путем добавления в нее нового физического тома.
11.12.3. Утилита vgremove
Используйте утилиту vgremove для удаления групп томов LVM. Удаляемые группы томов не должны использоваться.
11.12.4. Утилита vgreduce
Используйте утилиту vgreduce для удаления физического тома из группы томов.
В следующем примере осуществляется добавление физического тома, представленного файлом устройства /dev/sdg, в группу томов с именем vg1 средствами утилиты vgextend. После этого данный логический том удалятся из группы томов с помощью утилиты vgreduce.
11.12.5. Утилита vgchange
Используйте утилиту vgchange для изменения значений параметров группы томов.
В данном примере показана методика предотвращения добавления или удаления физических томов из группы томов с именем vg1.
Также вы можете использовать утилиту vgchange для изменения значений большинства других параметров группы томов. В данном примере осуществляется изменение максимального количества логических томов, а также максимального количества физических томов, которые могут функционировать в рамках группы томов с именем vg1.
11.12.6. Утилита vgmerge
Объединение двух групп томов в рамках одной группы может осуществляться с помощью утилиты vgmerge . В следующем примере происходит объединение группы томов с именем vg2 с группой томов с именем vg1 с сохранением всех значений параметров группы томов с именем vg1.
11.13. Управление логическими томами
11.13.1. Утилита lvcreate
Используйте утилиту lvcreate для создания логических томов в рамках группы томов. В данном примере в рамках группы томов с именем vg42 создается логический том размером в 8 Гб.
Как вы видите, LVM автоматически присваивает логическому разделу имя lvol0. В следующем примере в рамках группы томов с именем vg42 создается логический том с именем MyLV размером в 200 Мб.
В следующем примере выполняется та же операция, но используется отличный синтаксис команды.
А в этом примере создается логический том, который будет занимать ровно 10 процентов дискового пространства группы томов.
В этом же примере создается логический том, который будет занимать 30 процентов оставшегося в рамках группы томов свободного дискового пространства.
11.13.2. Утилита lvremove
Используйте утилиту lvremove для удаления логических томов из группы томов. Для удаления логического тома потребуется имя группы томов.
В случае удаления множества логических томов будут выводиться запросы подтверждений перед удалением каждого из указанных томов.
11.13.3. Утилита lvextend
Расширение логического тома может осуществляться достаточно просто средствами утилиты lvextend . В следующем примере логический том размером в 200 Мб расширяется на 100 Мб.
В следующем примере создается логический том размером в 100 Мб, который впоследствии расширяется до 500 Мб.
А в данном примере размер логического тома удваивается.
11.13.4. Утилита lvrename
Переименование логического тома осуществляется с помощью утилиты lvrename . В данном примере осуществляется смена имени логического тома из группы томов vg42 с extLV на bigLV.
11.14. Практическое задание: LVM
1. Создайте группу томов, которая будет содержать все пространство дискового устройства и раздел с другого дискового устройства.
2. Создайте два логических тома (малого и большего размера) в рамках данной группы томов. Создайте в них файловую систему ext3, смонтируйте их и скопируйте какие-либо файлы на них.
3. Попытайтесь получить информацию о заполнении созданных томов, воспользовавшись утилитами fdisk, mount, pvs, vgs, lvs, pvdisplay, vgdisplay, lvdispaly и df. Получили ли вы какую-либо информацию о томах LVM от утилиты fdisk?
4. Расширьте логический том малого размера на 50 процентов и проверьте корректность выполнения операции!
5. Рассмотрите другие утилиты, имена которых начинаются с символов vg*, pv* и lv*.
6. Создайте зеркальный логический том (mirrored) и логический том с чередованием (striped).
7. Преобразуйте линейный логический том (linear) в зеркальный (mirrored).
8. Преобразуйте зеркальный логический том (mirrored) в линейный (linear).
9. Создайте снимок логического тома, а также резервную копию этого снимка. После этого удалите некоторые файлы с логического тома и восстановите том из резервной копии его снимка.
10. Переместите вашу группу томов на другое дисковое устройство (оставьте логические тома смонтированными).
11. При наличии времени разделите группу томов с помощью утилиты vgsplit, после чего снова объедините результирующие группы с помощью утилиты vgmerge.
11.15. Корректная процедура выполнения практического задания: LVM
1. Создайте группу томов, которая будет содержать все пространство дискового устройства и раздел с другого дискового устройства.
Шаг 1: выбор дисковых устройств
В данном случае я выбрал дисковые устройства, представленные файлами устройств /dev/sdb и /dev/sdc.
Шаг 2: создание разделов на устройстве, представленном файлом устройства /dev/sdc
Шаг 3: Работа с утилитами pvcreate и vgcreate
2. Создайте два логических тома (малого и большего размера) в рамках данной группы томов. Создайте в них файловую систему ext3, смонтируйте их и скопируйте какие-либо файлы на них.
Монтирование файловых систем и копирование файлов:
3. Попытайтесь получить информацию о заполнении созданных томов, воспользовавшись утилитами fdisk, mount, pvs, vgs, lvs, pvdisplay, vgdisplay, lvdispaly и df. Получили ли вы какую-либо информацию о томах LVM от утилиты fdisk?
Используйте все упомянутые утилиты (ниже приведены примеры использования только двух из них), и ответьте «нет» на поставленный вопрос.
4. Расширьте логический том малого размера на 50 процентов и проверьте корректность выполнения операции!
5. Рассмотрите другие утилиты, имена которых начинаются с символов vg*, pv* и lv*.
6. Создайте зеркальный логический том (mirrored) и логический том с чередованием (striped).
7. Преобразуйте линейный логический том (linear) в зеркальный (mirrored).
8. Преобразуйте зеркальный логический том (mirrored) в линейный (linear).
9. Создайте снимок логического тома, а также резервную копию этого снимка. После этого удалите некоторые файлы с логического тома и восстановите том из резервной копии его снимка.
10. Переместите вашу группу томов на другое дисковое устройство (оставьте логические тома смонтированными).
11. При наличии времени разделите группу томов с помощью утилиты vgsplit, после чего снова объедините результирующие группы с помощью утилиты vgmerge.
Представление устройства в системе
В лекции Этапы загрузки системы говорилось о том, что аппаратный профиль компьютера определяется ядром на ранних этапах загрузки системы или в процессе подключения модуля. Это не означает, что устройство, не распознанное ядром, задействовать невозможно. Если неизвестным ядру устройством можно управлять по какому-нибудь стандартному протоколу, вполне возможно, что среди пакетов Linux найдётся утилита или служба, способная с этим устройством работать. Например, программа записи на лазерный диск cdrecord знает великое множество разнообразных устройств, отвечающих стандарту SCSI, в то время как ядро, как правило, только позволяет работать с таким устройством как с обычным лазерным приводом (на чтение), и передавать ему различные SCSI-команды.
К сожалению, иногда и обратное неверно: если производитель создаёт новое устройство, управлять которым нужно по-новому, а распознаётся оно как одно из старых, ошибки неизбежны. Многие стандарты внешних устройств предусматривают строгую идентификацию модели, однако хорошего мало и тут: незначительно изменив схемотехнику, производитель меняет и идентификатор, и устройство перестаёт распознаваться до тех пор, пока автор соответствующего модуля Linux не заметит это и не добавит новый идентификатор в список поддерживаемых.
Большинству распознанных устройств, если они должны поддерживать операции чтения/записи или хотя бы управления ( ioctl() , описанный ниже), соответствует файл-дырка в каталоге /dev или одном из его подкаталогов. В зависимости от того, выбрана ли в системе статическая или динамическая схема именования устройств, файлов-дырок в /dev может быть и очень много, и относительно мало. При статической схеме именования то, что ядро распознало внешнее устройство, никак не соотносится с тем, что в /dev имеется для этого устройства файл-дырка:
Пример 1. Обращение к несуществующему устройству
Здесь Мефодий попытался прочитать что-либо из устройства /dev/sdg14 , что соответствует четырнадцатому разделу SCSI-диска под номером семь. Такого диска в этой машине, конечно, нет, а файл-дырка для него заведён на всякий случай: вдруг появится? Поскольку появиться может любое из поддерживаемых Linux устройств, таких файлов «на всякий случай» в системе бывает и десять тысяч, и двадцать. Файл-дырка не занимает места на диске, однако использует индексный дескриптор, поэтому в корневой фаловой системе, независимо от её объёма, индексных дескрипторов должен быть изрядный запас.
При динамической схеме именования применяется специальная виртуальная файловая система, которая либо полностью подменяет каталог /dev , либо располагается в другом каталоге (например, /sys ), имеющем непохожую на /dev иерархизированную структуру; в этом случае файлы-дырки в /dev заводит специальная служба. Этот способ гораздо удобнее и для человека, который запустил команду ls /dev , и для компьютера (в случае подключения внешних устройств, например, съёмных жёстких дисков, «на лету»). Однако он требует соблюдать дополнительную логику «привязки» найденного устройства к имени, иногда весьма запутанную из-за той же нечёткой идентификации. Поскольку происходить это должно в самый ответственный момент, при загрузке системы, динамическую схему именования используют с осторожностью.
виртуальная файловая система Механизм отображения в виде файловой системы любых иерархически организованных данных. Существенно упрощает доступ к таким данным, так как позволяет применять обычные операции ввода-ввывода: открытие и закрытие файла, чтение и запись и т. п.
Файлы-дырки и другие типы файлов
Кое-какие идеи динамического именования устройств присутствуют и в статической схеме. Так, файлы /dev/mouse или /dev/cdrom , на самом деле — символьные ссылки на соответствующие файлы-дырки. Если тип мыши или лазерного привода изменится, достаточно изменить эти ссылки и перезапустить соответствующие службы.
Пример 2. Идентификация внешних устройства в /dev/
Файл-дырка, как и всякая дырка, не имеет никакого размера: сколько в неё не записывай, в файл на диске ничего не попадёт. Вместо этого ядро передаёт всё записанное драйверу, отвечающему за файл-дырку, а тот по-своему обрабатывает эти данные. Точно так же работает и чтение из файла-дырки: все запрашиваемые данные в неё подсовывает драйвер. Большинство драйверов — дисковые, звуковые последовательных и параллельных портов и т. п. — обращаются за данными к какому-нибудь внешнему устройству или передают их ему. Но есть и такие, кто сам всё выдумывает: это и /dev/null , чёрная дыра, в которую что угодно можно записать, и оно пропадёт безвозвратно, и /dev/zero , из которого можно считать сколько угодно нулей (на запись оно ведёт себя как /dev/null ), и /dev/urandom , из которого можно считать сколько угодно относительно случайных байтов.
Изучив выдачу команды ls -lL (ключ « -L » заставляет ls выводить информацию не про символьную ссылку, а про файл, на который она указывает), Мефодий обнаружил, что та вместо размера файла-дырки (который равен нулю) выводит два числа. Первое из этих чисел называется старшим номером устройства (major device number), оно, грубо говоря, соответствует драйверу, отвечающему за устройство. Второе называется младшим номером устройства (minor device number), оно соответствует способу работы с устройством, а для дисковых носителей — разделу. В частности, из примера видно, что устройствами /dev/random и /dev/urandom занимается один и тот же драйвер со старшим номером 1 . При этом часть устройств (по преимуществу — дисковые) имеет тип «b», а другая часть — «c» (этот тип имеют, например, терминалы). Тип указан в атрибутах файла первым символом. Это блочные (block) устройства, обмен данными с которыми возможен только порциями (блоками) определённого размера, и символьные (character) устройства, запись и чтение с которых происходит побайтно. Блочные устройства, вдобавок, могут поддерживать команды прямого доступа вида «прочитать блок номер такой-то » или «записать данные на диск, начиная с такого-то блока».
Блочные и символьные устройства — полноправные объекты файловой системы, такие же, как файлы, каталоги и символьные ссылки. Есть ещё два типа специальных файлов — каналы и сокеты. Канал-файл (или fifo) называют еще именованным каналом (named pipe): это такой же объект системы, как и тот, что используется командной оболочкой для организации конвейера (его называют неименованным каналом), разница между ними в том, что у fifo есть имя, он зарегистрирован в файловой системе. Это — типичный файл-дырка, причём дырка двухсторонняя: любая программа может записать в канал (если позволяют права доступа) и любая программа может оттуда прочитать. Создать именованный канал можно с помощью команды mkfifo :
Пример 3. Использование именованного канала
Здесь важно, что утилита head показывает начало не «файла» hole а именно последней записываемой порции данных, как и подобает трубе.
Если стандартный вывод ошибок всего конвейера перенаправлен в /dev/null , то командный интерпретатор не выводит сообщений о запуске и остановке фонового процесса.
канал Объект Linux, используемый в межпроцессном взаимодействии. Доступен в виде двух дескрипторов: один открыт на запись, другой — на чтение. Все данные, записываемые в первый дескриптор, немедленно можно прочитать из второго. Различают неименованный канал, уничтожаемый с закрытием обоих дескрипторов, и именованный канал (FIFO) — файл-дырку, создаваемый в файловой системе.
Что же касается сокетов, то это — более сложные объекты, предназначенные для связи двух процессов и передачи информации в обе стороны. Сокет можно представить в виде двух каналов (один «туда», другой «обратно»), однако стандартные файловые операции открытия/чтения/записи на нём не работают. Процесс, открывший сокет, считается сервером: он постоянно «слушает», нет ли в нём новых данных, а когда те появляются, счтывает их, обрабатывает, и, возможно, записывает в сокет ответ. Процесс-клиент может подключиться к сокету, обменяться информацией с процесом-сервером и отключиться. Точно так же можно передавать данные и по сети, в этом случае указывается не путь к сокету на файловой системе (т. н. unix domain socket), а сетевой адрес и порт удалённого компьютера (например internet socket, если подключаться с помошью сети Internet).
Драйверы устройств
Как уже говорилось в лекции Этапы загрузки системы, часть системы, отвечающая за взаимодействие с каким-нибудь внешним устройством и называемая «драйвер», в Linux либо входит в ядро, либо оформляется в виде модуля ядра, и подгружается по необходимости. Следовательно, файл-дырка, обращение к которому приводило к «no such device or address», вполне может и заработать (в этом одна из причин огромного количества устройств в /dev ). Гуревич наотрез отказался объяснять Мефодию «как добавить новый драйвер» до тех пор, пока тот не будет лучше разбираться в архитектуре компьютеров вообще и в аппаратной части IBM-совместимых компьютеров в частности. Поэтому всё, что смог понять Мефодий, не имея таких знаний, сводилось к следующему. Во-первых, если существуют различия между тем, как по умолчанию загружает модули система и тем, как на самом деле это необходимо делать, различия должны быть описаны в файле /etc/modules.conf . Во-вторых, после изменения этого файла, добавления нового устройства, обновления самих модулей и т. п. следует запускать утилиту depmod , которая заново выстраивает непротиворечивую последовательность загрузки модулей. В-третьих, интересно (но в отсутствие знаний — малопознавательно) запускать утилиту lspci , которая показывает список устройств (распознаваемых по стандарту PCI), найденных на компьютере.
Работа с устройствами
Все файлы-дырки подчиняются одним и тем же правилам работы с файлами: их можно открывать для записи или чтения, записывать данные или считывать их стандартными средствами, а по окончании работы — закрывать. Открытие и закрытие файла (системные вызовы open() и close() ) в командном интерпретаторе не представлено отдельной операцией, оно выполняется автоматически при перенаправлении ввода (открытие на чтение) или вывода (на запись). Это позволяет работать и с устройствми, и с каналами, и с файлами совершенно одинаково, что активно используется в Linux программами-фильтрами. Каждый тип файлов имеет свою специфику, например, при записи на блочное устройство данные накапливаются ядром в специальном буфере размером в один блок, и только после заполнения буфера записываются. Если при закрытии файла буфер неполон, он всё равно передаётся целиком: часть — данные, записанные пользователем, часть — данные, оставшиеся от предыдущей операции записи). Это, конечно, не означает, что из файла, находящегося на блочном устройстве, легко по ошибке прочитать такой «мусор»: длина файла известна, и ядро само следит за тем, чтобы программа не прочла лишнего.
Даже такие (казалось бы) простые устройства, как жёсткие диски, поддерживают гораздо больше различных операций, чем просто чтение или запись. Пользователю, как минимум, может потребоваться узнать размер блока (для разных типов дисков он разный) или объём всего диска в блоках. Для многих устройств собственно передача данных — лишь итог замысловатого общения с управяющей программой или ядром. Скажем, для вывода оцифрованного звука на звуковую карту сначала необходимо настроить параметры звукогенератора: частоту, размер шаблона, количество каналов, формат передаваемых данных и многое другое. Для управления устройствами существует системный вызов ioctl() (iput-output control): устройство надо открыть, как файл, а затем использовать эту функцию. У каждого устройства — свой набор команд управления, поэтому в виде отдельной утилиты ioctl() не встречается, а используется неявно другими утилитами, специализирующимися на определённом типе устройств.
Права доступа к устройствам
Некоторые устройства просто обязаны быть доступны ползователю на запись и чтение. Например, виртуальная консоль, за которой работает Мефодий, доступна пользователю methody на запись и на чтение, именно поэтому команднный интерпретатор Мефодия может посылать туда символы и считывать их оттуда. В то же время, терминал, за которым работает Гуревич, пользователю недоступен, а терминалы, за которыми не работает никто, доступны только суперпользователю:
Пример 4. Кому принадлежат терминалы?
Права на владение терминалом передаются с помощью chown пользователю программой login после успешной региситрации в системе. Она же выставляет право записи на терминал членам группы tty. «Настоящих» пользователей в этой группе может и не быть, зато есть setGID-программы, например, write , которая умеет выводить сообщения сразу на все активные терминалы.
Множество устройств в системе, используемой как рабочая станция, также отдаются во владение — на этот раз, первому пользователю, зарегистрировавшемуся в системе. Предполагается, что компьютер служит в качестве рабочей станции именно этого пользователя, а все последующие доступа к этим устройствам не получат.
Что называется, «кто первым встал — того и тапки».
Как правило, так поступают с устройствами, которые могут понадобиться только одному человеку, сидящему за монитором: звуковыми и видеокартами, лазерными приводами, дисководом и т. п.:
Пример 5. Кому принадлежат устройства?
При этом для того, чтобы обеспечить и другим — псевдо- или настоящим — пользователям, такие устройства также принадлежат определённым группам с соответствующими правами. Практика «раздачи» устройств группам вообще очень удобна: даже если доступ к устройству имеет только суперпользователь, существует возможность написать setGID-программу, которая, не получая суперпользовательских прав, сможет до этого устройства добраться (а можно и просто включить опытного пользователя в такую группу).
RHCSA and RHCE Chapter 3 Disks and Partitioning
Before we keep going with disk and partitioning, I want to setup the RHEL Install DVD as a Software Repository (I will cover this in more detail in chapter 6) since I will need to install parted and I currently don’t have that installed:
- If you are using a physical DVD, insert the disc into your computer.
- If you are not already root, switch users to the root account: su —
- Create a mount point for the repository: mkdir -p /path/to/repo where /path/to/repo is a location for the repository, for example, /mnt/repo
-
Mount the DVD on the mount point that you just created. If you are using a physical disc, you need to know the device name of your DVD drive. You can find the names of any CD or DVD drives on your system with the command cat /proc/sys/dev/cdrom/info.
The first CD or DVD drive on the system is typically named sr0. When you know the device name, mount the DVD: mount -r -t iso9660 /dev/device_name /path/to/repo For example: mount -r -t iso9660 /dev/sr0 /mnt/repo If you are using an ISO image file of a disc, mount the image file like this: mount -r -t iso9660 -o loop /path/to/image/file.iso /path/to/repo
For example: mount -r -o loop /home/root/Downloads/RHEL6-Server-i386-DVD.iso /mnt/repo
Note that you can only mount an image file if the storage device that holds the image file is itself mounted. For example, if the image file is stored on a hard drive that is not mounted automatically when the system boots, you must mount the hard drive before you mount an image file stored on that hard drive. Consider a hard drive named /dev/sdb that is not automatically mounted at boot time and which has an image file stored in a directory named Downloads on its first partition:
- Choose a name for the repo file and open it as a new file with the vi text editor. For example: vi /etc/yum.repos.d/dvd.repo
- Press the I key to enter insert mode.
-
Supply the details of the repository. For example:
Here is what I did to setup up a local repo. First I mounted the iso to my VM and then I found out what is the disk device of my cd-rom:
And then mounting the disk, I did the following:
Now checking if it’s mounted, I saw the following:
I didn’t want to keep mounting the iso so I just copied the contents of the cd to /root/repo. I would usually use rsync to copy to the data, but I didn’t have that installed yet, so I used cp:
That kept going for a while. After it was done these were the contents of /root/repo:
Now creating the yum repository configuration file:
Here are the contents of my repo file:
Now checking if the repo was added:
Now to see if parted is part of the dvd repository:
That looks good. If you want to know which repo provides a certain package you can run ‘yum list’ like so:
Now to install the package:
Hard Disks
- A small percentage of the drive’s available space is used to store file system-related data and can be considered as overhead.
- A file system splits the remaining space into small, consistently-sized segments. For Linux, these segments are known as blocks.
- The points on the disk where the partition starts and ends
- Whether the partition is “active”
- The partition’s type Let us take a closer look at each of these characteristics. The starting and ending points actually define the partition’s size and location on the disk. The “active” flag is used by some operating systems’ boot loaders. In other words, the operating system in the partition that is marked “active” is booted.
Partitioning with Fdisk
Now to partitioning with fdisk. From this old “Partitioning with fdisk” guide:
- Four primary partitions
- Mixed primary and logical partitions
- p print the partition table
- n create a new partition
- d delete a partition
- q quit without saving changes
- w write the new partition table and exit
Here is how my partition table looked like on 1st SCSI disk:
And back to guide:
The first line shows the geometry of your hard drive. It may not be physically accurate, but you can accept it as though it were. The hard drive in this example is made of 32 double-sided platters with one head on each side (probably not true). Each platter has 2610 concentric tracks. A 3-dimensional track (the same track on all disks) is called a cylinder. Each track is divided into 63 sectors. Each sector contains 512 bytes of data. Therefore the block size in the partition table is 64 heads * 63 sectors * 512 bytes er…divided by 1024. The start and end values are cylinders.
Then the guide has an example of how to create 4 primary partitions with fdisk.
Partitioning with Fdisk Example
So here is my second SCSI disk:
There are currently no partitions on it and it’s size is 8GB. So let’s create 3 partitions of size 2GB and mark them as ext3 and 1 partition of size 2GB and mark it as a swap partition. The creation of the first one looks like this:
Now if we keep going and add another one, it will look like this:
And here is how the third one looks like:
and lastly here is partition 4:
Notice for the last one I just selected the default so it takes all the available space. Here is how the final partition table looks like:
The ‘Id’ for all the partitions is ‘83’. To see the list of all the Ids we can do this:
So we can see that ‘83’ is Linux which is usually EXT3. Now for swap the id is 82. So let’s change that for the 4th partition:
Now to write the partition we can do this:
Now checking the partition table we see this:
If the table didn’t show up properly, we could run partprobe to re-check the partition table of disk:
Here is how the output looks like:
We had 4 partitions so that looks good. To delete a partition with fdisk, we can do this:
So I deleted the 3rd partition. So let’s see how fdisk looks like now:
Notice there is a gap between End of the 2nd partition and the Start of the 4th partition.
Now let’s do similar functions with parted.
Partitioning with parted
- View the existing partition table
- Change the size of existing partitions
- Add partitions from free space or additional hard drives
- ext2
- ext3
- fat16
- fat32
- hfs
- jfs
- linux-swap
- ntfs
- reiserfs
- hp-ufs
- sun-ufs
- xfs
Now let’s actually create some partitions:
- Before creating a partition, boot into rescue mode (or unmount any partitions on the device and turn off any swap space on the device).
- Start parted, where /dev/sda is the device on which to create the partition: # parted /dev/sda
- View the current partition table to determine if there is enough free space: # print
The changes start taking place as soon as you press Enter, so review the command before executing to it. After creating the partition, use the print command to confirm that it is in the partition table with the correct partition type, file system type, and size. Also remember the minor number of the new partition so that you can label any file systems on it. You should also view the output of cat /proc/partitions after parted is closed to make sure the kernel recognizes the new partition.
Partitioning with parted Example
So let’s use parted to remove the rest of partitions on /dev/sdb and then create 3 partitions of equal size, 2 of which are ext and 1 is swap. First to list the partitions:
Now to remove the partitions:
Now let’s create the first one, taking 33% of the space:
Now for the second one:
Now the last one:
As soon as your quit the parted utility it writes the new partition table:
Now to check the partition table:
Logical Volume Manager (LVM)
The underlying physical storage unit of an LVM logical volume is a block device such as a partition or whole disk. This device is initialized as an LVM physical volume (PV).
To create an LVM logical volume, the physical volumes are combined into a volume group (VG). This creates a pool of disk space out of which LVM logical volumes (LVs) can be allocated. This process is analogous to the way in which disks are divided into partitions. A logical volume is used by file systems and applications (such as databases).
Figure 1.1, “LVM Logical Volume Components” shows the components of a simple LVM logical volume:
And here more information regarding each layer:
LVM Physical Volumes
2.1. Physical Volumes
The underlying physical storage unit of an LVM logical volume is a block device such as a partition or whole disk. To use the device for an LVM logical volume the device must be initialized as a physical volume (PV). Initializing a block device as a physical volume places a label near the start of the device.
By default, the LVM label is placed in the second 512-byte sector. You can overwrite this default by placing the label on any of the first 4 sectors. This allows LVM volumes to co-exist with other users of these sectors, if necessary.
An LVM label provides correct identification and device ordering for a physical device, since devices can come up in any order when the system is booted. An LVM label remains persistent across reboots and throughout a cluster.
The LVM label identifies the device as an LVM physical volume. It contains a random unique identifier (the UUID) for the physical volume. It also stores the size of the block device in bytes, and it records where the LVM metadata will be stored on the device.
The LVM metadata contains the configuration details of the LVM volume groups on your system. By default, an identical copy of the metadata is maintained in every metadata area in every physical volume within the volume group. LVM metadata is small and stored as ASCII.
Currently LVM allows you to store 0, 1 or 2 identical copies of its metadata on each physical volume. The default is 1 copy. Once you configure the number of metadata copies on the physical volume, you cannot change that number at a later time. The first copy is stored at the start of the device, shortly after the label. If there is a second copy, it is placed at the end of the device. If you accidentally overwrite the area at the beginning of your disk by writing to a different disk than you intend, a second copy of the metadata at the end of the device will allow you to recover the metadata.
LVM Logical Volumes
2.2. Volume Groups
Physical volumes are combined into volume groups (VGs). This creates a pool of disk space out of which logical volumes can be allocated.
Within a volume group, the disk space available for allocation is divided into units of a fixed-size called extents. An extent is the smallest unit of space that can be allocated. Within a physical volume, extents are referred to as physical extents. A logical volume is allocated into logical extents of the same size as the physical extents.
The extent size is thus the same for all logical volumes in the volume group. The volume group maps the logical extents to physical extents.
LVM Logical Volumes
2.3. LVM Logical Volumes
In LVM, a volume group is divided up into logical volumes. There are three types of LVM logical volumes: linear volumes, striped volumes, and mirrored volumes.
LVM Administration
Here are the command utilities used to manage LVMs:
4.2. Physical Volume Administration
This section describes the commands that perform the various aspects of physical volume administration.
4.2.1. Creating Physical Volumes
The following subsections describe the commands used for creating physical volumes.
4.2.1.2. Initializing Physical Volumes
Use the pvcreate command to initialize a block device to be used as a physical volume. Initialization is analogous to formatting a file system. The following command initializes /dev/sdd, /dev/sde, and /dev/sdf as LVM physical volumes for later use as part of LVM logical volumes.
To initialize partitions rather than whole disks: run the pvcreate command on the partition. The following example initializes the partition /dev/hdb1 as an LVM physical volume for later use as part of an LVM logical volume.
4.2.1.3. Scanning for Block Devices You can scan for block devices that may be used as physical volumes with the lvmdiskscan command.
4.2.2. Displaying Physical Volumes
There are three commands you can use to display properties of LVM physical volumes: pvs, pvdisplay, and pvscan.
The pvdisplay command provides a verbose multi-line output for each physical volume. It displays physical properties (size, extents, volume group, etc.) in a fixed format.
The pvscan command scans all supported LVM block devices in the system for physical volumes.
4.2.5. Removing Physical Volumes
If a device is no longer required for use by LVM, you can remove the LVM label with the pvremove command. Executing the pvremove command zeroes the LVM metadata on an empty physical volume.
If the physical volume you want to remove is currently part of a volume group, you must remove it from the volume group with the vgreduce command.
Now onto Volume Groups:
4.3.1. Creating Volume Groups
To create a volume group from one or more physical volumes, use the vgcreate command. The vgcreate command creates a new volume group by name and adds at least one physical volume to it.
The following command creates a volume group named vg1 that contains physical volumes /dev/sdd1 and /dev/sde1.
When physical volumes are used to create a volume group, its disk space is divided into 4MB extents, by default. This extent is the minimum amount by which the logical volume may be increased or decreased in size. Large numbers of extents will have no impact on I/O performance of the logical volume.
You can specify the extent size with the -s option to the vgcreate command if the default extent size is not suitable. You can put limits on the number of physical or logical volumes the volume group can have by using the -p and -l arguments of the vgcreate command.
LVM volume groups and underlying logical volumes are included in the device special file directory tree in the /dev directory with the following layout:
For example, if you create two volume groups myvg1 and myvg2, each with three logical volumes named lvo1, lvo2, and lvo3, this create six device special files:
4.3.3. Adding Physical Volumes to a Volume Group
To add additional physical volumes to an existing volume group, use the vgextend command. The vgextend command increases a volume group’s capacity by adding one or more free physical volumes.
The following command adds the physical volume /dev/sdf1 to the volume group vg1.
4.3.4 . Displaying Volume Groups
There are two commands you can use to display properties of LVM volume groups: vgs and vgdisplay
The vgscan command, which scans all the disks for volume groups and rebuilds the LVM cache file, also displays the volume groups. The vgs command provides volume group information in a configurable form, displaying one line per volume group.
The vgs command provides a great deal of format control, and is useful for scripting.
The vgdisplay command displays volume group properties (such as size, extents, number of physical volumes, etc.) in a fixed form.
4.3.6. Removing Physical Volumes from a Volume Group
To remove unused physical volumes from a volume group, use the vgreduce command. The vgreduce command shrinks a volume group’s capacity by removing one or more empty physical volumes. This frees those physical volumes to be used in different volume groups or to be removed from the system.
The following command removes the physical volume /dev/hda1 from the volume group my_volume_group.
4.3.9. Removing Volume Groups
To remove a volume group that contains no logical volumes, use the vgremove command.
Lastly onto the Logical Volumes:
4.4.1. Creating Linear Logical Volumes
To create a logical volume, use the lvcreate command. If you do not specify a name for the logical volume, the default name lvol# is used where # is the internal number of the logical volume.
When you create a logical volume, the logical volume is carved from a volume group using the free extents on the physical volumes that make up the volume group. Normally logical volumes use up any space available on the underlying physical volumes on a next-free basis. Modifying the logical volume frees and reallocates space in the physical volumes.
The following command creates a logical volume 10 gigabytes in size in the volume group vg1.
The following command creates a 1500 MB linear logical volume named testlv in the volume group testvg, creating the block device /dev/testvg/testlv.
You can use the -l argument of the lvcreate command to specify the size of the logical volume in extents. You can also use this argument to specify the percentage of the volume group to use for the logical volume. The following command creates a logical volume called mylv that uses 60% of the total space in volume group testvol.
You can also use the -l argument of the lvcreate command to specify the percentage of the remaining free space in a volume group as the size of the logical volume. The following command creates a logical volume called yourlv that uses all of the unallocated space in the volume group testvol.
You can use -l argument of the lvcreate command to create a logical volume that uses the entire volume group. Another way to create a logical volume that uses the entire volume group is to use the vgdisplay command to find the “Total PE” size and to use those results as input to the lvcreate command.
The following commands create a logical volume called mylv that fills the volume group named testvg.
The underlying physical volumes used to create a logical volume can be important if the physical volume needs to be removed, so you may need to consider this possibility when you create the logical volume.
To create a logical volume to be allocated from a specific physical volume in the volume group, specify the physical volume or volumes at the end at the lvcreate command line. The following command creates a logical volume named testlv in volume group testvg allocated from the physical volume /dev/sdg1,
4.4.7. Resizing Logical Volumes
To reduce the size of a logical volume, use the lvreduce command. If the logical volume contains a file system, be sure to reduce the file system first (or use the LVM GUI) so that the logical volume is always at least as large as the file system expects it to be.
The following command reduces the size of logical volume lvol1 in volume group vg00 by 3 logical extents.
4.4.10. Removing Logical Volumes
To remove an inactive logical volume, use the lvremove command. If the logical volume is currently mounted, unmount the volume before removing it. In addition, in a clustered environment you must deactivate a logical volume before it can be removed.
The following command removes the logical volume /dev/testvg/testlv from the volume group testvg. Note that in this case the logical volume has not been deactivated.
You could explicitly deactivate the logical volume before removing it with the lvchange -an command, in which case you would not see the prompt verifying whether you want to remove an active logical volume.
4.4.11. Displaying Logical Volumes There are three commands you can use to display properties of LVM logical volumes: lvs, lvdisplay, and lvscan.
The lvs command provides logical volume information in a configurable form, displaying one line per logical volume. The lvs command provides a great deal of format control, and is useful for scripting.
The lvdisplay command displays logical volume properties (such as size, layout, and mapping) in a fixed format.
The lvscan command scans for all logical volumes in the system and lists them.
4.4.12. Growing Logical Volumes
To increase the size of a logical volume, use the lvextend command.
When you extend the logical volume, you can indicate how much you want to extend the volume, or how large you want it to be after you extend it.
The following command extends the logical volume /dev/myvg/homevol to 12 gigabytes.
The following command adds another gigabyte to the logical volume /dev/myvg/homevol.
As with the lvcreate command, you can use the -l argument of the lvextend command to specify the number of extents by which to increase the size of the logical volume. You can also use this argument to specify a percentage of the volume group, or a percentage of the remaining free space in the volume group. The following command extends the logical volume called testlv to fill all of the unallocated space in the volume group myvg.
After you have extended the logical volume it is necessary to increase the file system size to match
LVM Example
I don’t want to add my other disks, do let’s partition my one drive (sdb) into 3 different partitions and first add the first 2 as Physical Volumes. Then let’s create a Volume Group and add both of the Physical Volumes to it. Then let’s create a Logical Volume from our Logical Group. Lastly let’s extend the Volume Group with the 3rd partition and then extend the Logical Volume as well. Here is how my partitioning looked like for sdb:
Now let’s add the first two into the LVM (Logical Volume Manager):
The top partition (/dev/sda2) was setup by the system install, so let’s not mess with that. Now let’s add both into a Volume Group and call the volume group kvg:
Now let’s create a Logical Volume called kvol and make it 60% of the total size:
Now let’s add the third partition into the LVM:
Now let’s extend Volume Group kvg with the 3rd partition:
Now let’s extend our Logical Volume to use all the available space:
Checking out the device, I see the following:
So it looks like it’s taking up all the space. Of course this was a round about way of doing it. First partition the drive then create a volume group that spans all the partitions, but it made a good working example to show how LVM works.
- Enhances speed
- Increases storage capacity using a single virtual disk
- Minimizes data loss from disk failure
- Multi-threaded design
- Portability of arrays between Linux machines without reconstruction
- Backgrounded array reconstruction using idle system resources
- Hot-swappable drive support
- Automatic CPU detection to take advantage of certain CPU features such as streaming SIMD support
- Automatic correction of bad sectors on disks in an array
- Regular consistency checks of RAID data to ensure the health of the array
- Proactive monitoring of arrays with email alerts sent to a designated email address on important events
- Write-intent bitmaps which drastically increase the speed of resync events by allowing the kernel to know precisely which portions of a disk need to be resynced instead of having to resync the entire array
- Resync checkpointing so that if you reboot your computer during a resync, at startup the resync will pick up where it left off and not start all over again
- The ability to change parameters of the array after installation. For example, you can grow a 4-disk RAID5 array to a 5-disk RAID5 array when you have a new disk to add. This grow operation is done live and does not require you to reinstall on the new array.
RAID Levels
16.4. RAID Levels and Linear Support RAID supports various configurations, including levels 0, 1, 4, 5, 6, 10, and linear. These RAID types are defined as follows:
Level 0
RAID level 0, often called “striping,” is a performance-oriented striped data mapping technique. This means the data being written to the array is broken down into strips and written across the member disks of the array, allowing high I/O performance at low inherent cost but provides no redundancy.
Many RAID level 0 implementations will only stripe the data across the member devices up to the size of the smallest device in the array. This means that if you have multiple devices with slightly different sizes, each device will get treated as though it is the same size as the smallest drive. Therefore, the common storage capacity of a level 0 array is equal to the capacity of the smallest member disk in a Hardware RAID or the capacity of smallest member partition in a Software RAID multiplied by the number of disks or partitions in the array.
Level 1
RAID level 1, or “mirroring,” has been used longer than any other form of RAID. Level 1 provides redundancy by writing identical data to each member disk of the array, leaving a “mirrored” copy on each disk. Mirroring remains popular due to its simplicity and high level of data availability. Level 1 operates with two or more disks, and provides very good data reliability and improves performance for read-intensive applications but at a relatively high cost.
The storage capacity of the level 1 array is equal to the capacity of the smallest mirrored hard disk in a Hardware RAID or the smallest mirrored partition in a Software RAID. Level 1 redundancy is the highest possible among all RAID types, with the array being able to operate with only a single disk present.
Level 5
This is the most common type of RAID. By distributing parity across all of an array’s member disk drives, RAID level 5 eliminates the write bottleneck inherent in level 4. The only performance bottleneck is the parity calculation process itself. With modern CPUs and Software RAID, that is usually not a bottleneck at all since modern CPUs can generate parity very fast. However, if you have a sufficiently large number of member devices in a software RAID5 array such that the combined aggregate data transfer speed across all devices is high enough, then this bottleneck can start to come into play.
As with level 4, level 5 has asymmetrical performance, with reads substantially outperforming writes. The storage capacity of RAID level 5 is calculated the same way as with level 4.
Level 10
This RAID level attempts to combine the performance advantages of level 0 with the redundancy of level 1. It also helps to alleviate some of the space wasted in level 1 arrays with more than 2 devices. With level 10, it is possible to create a 3-drive array configured to store only 2 copies of each piece of data, which then allows the overall array size to be 1.5 times the size of the smallest devices instead of only equal to the smallest device (like it would be with a 3-device, level 1 array).
The number of options available when creating level 10 arrays (as well as the complexity of selecting the right options for a specific use case) make it impractical to create during installation. It is possible to create one manually using the command line mdadm tool. For details on the options and their respective performance trade-offs, refer to man md.
Linux Raid Subsystems
16.5. Linux RAID Subsystems
RAID in Linux is composed of the following subsystems:
Linux Hardware RAID controller drivers
Hardware RAID controllers have no specific RAID subsystem in Linux. Because they use special RAID chipsets, hardware RAID controllers come with their own drivers; these drivers allow the system to detect the RAID sets as regular disks.
mdraid
The mdraid subsystem was designed as a software RAID solution for Linux; it is also the preferred solution for software RAID under Linux. This subsystem uses its own metadata format, generally referred to as native mdraid metadata. mdraid also supports other metadata formats, known as external metadata. Red Hat Enterprise Linux 6 uses mdraid with external metadata to access ISW / IMSM (Intel firmware RAID) sets.
mdraid sets are configured and controlled through the mdadm utility. dmraid Device-mapper RAID or dmraid refers to device-mapper kernel code that offers the mechanism to piece disks together into a RAID set. This same kernel code does not provide any RAID configuration mechanism.
dmraid is configured entirely in user-space, making it easy to support various on-disk metadata formats. As such, dmraid is used on a wide variety of firmware RAID implementations. dmraid also supports Intel firmware RAID, although Red Hat Enterprise Linux 6 uses mdraid to access Intel firmware RAID sets.
RAID Device with mdadm
From an older guide “Red Hat Enterprise Linux 5 Installation Guide”, here is an example of creating a raid configuration with dmadm:
22.3.1. Creating a RAID Device With mdadm
To create a RAID device, edit the /etc/mdadm.conf file to define appropriate DEVICE and ARRAY values:
- /dev/sda1
- /dev/sdb1
- /dev/sdc1
- /dev/sdd1
Next, use the above configuration and the mdadm command to create a RAID 0 array:
Once created, the RAID device can be queried at any time to provide status information. The following example shows the output from the command mdadm -detail /dev/md0:
RAID with mdadm Example
So let’s create a raid 5 configuration with my 3 previously created partitions and then pretend to replace one since it failed. First let’s go ahead and remove my partitions from the LVM setup. Here is the Logical Volume that I created:
Let’s remove the Logical Volume:
Now here is the Volume Group that I had:
First let’s remove all the Physical Volumes from this Volume Group and then remove the Volume Group. Here are the three partitions inside the Volume Group:
Now to remove them:
Now to remove the Volume Group:
Now to finally remove the partitions (Physical Volumes) from LVM:
Now let’s install the mdadm utility:
Now let’s create the raid configuration:
and more information:
So let’s get to it:
Now checking the status of our raid, we see the following:
We can see that the devices are getting initialized, after it’s done the output will look similar to this:
You can always check the information regarding the raid device with mdadm, like so:
Now let’s say that device /dev/sdb3 needed to be replaced cause it’s gone bad. So first let’s set the disk as faulty:
Now checking the status of our raid, we see the following:
We can see the device is set as faulty. Now let’s remove the disk completely from the raid:
Now checking the status:
The device is gone now. Now to re-add a brand new disk to the raid configuration:
And now checking the status:
We can see that the disk is added to configuration and then rebuild process has started. When it’s done our /proc/mdstat will look like this:
Since we are coming to the end of partitions let’s remove all the raid configurations and partitions to have a clean drive. To remove the raid configuration, let’s set all the drives as faulty:
Then let’s remove all the drives:
Finally let’s stop the md0 raid:
Now checking the status:
Nothing is utilized. Now using parted let’s remove all the partitions: