Перенос lvm на raid

Обновлено: 06.07.2024

Менеджер логических томов (LVM) - мощный и удобный инструмент, позволяющий гибко управлять дисковым пространством в Linux. Он позволяет абстрагироваться от физических носителей, выстраивая поверх них единую логическую структуру, налету изменять размеры разделов, добавлять или убирать диски. Еще одним распространенным сценарием является перенос группы томов LVM на новую систему, в данном материале мы расскажем, как сделать это правильно и безопасно.

Как мы помним из теории, LVM состоит из трех уровней абстракции:

  • PV, Physical volume, физический том - это физический диск, либо раздел на диске, если мы не можем использовать его целиком.
  • VG, Volume group, группа томов - группа томов объединяет в себя физические тома и является следующим уровнем абстракции, представляя собой единое пространство хранения, которое может быть размечено на логические разделы. Эквивалентен обычному диску в классической системе.
  • LV, Logical volume, логический том - логический раздел в группе томов, аналогичен обычном разделу, представляет из себя блочное устройство и может содержать файловую систему.

Система и пользователь работают с самым верхним - логическим томом, ниже лежит группа томов, которая объединяет в себя физические носители. Если у нас возникает необходимость переместить структуру LVM в другую систему, то сделать это мы можем только с группой томов (VG, Volume group). Это логично, так как физический том не является самостоятельной единицей хранения данных в LVM, а логический том может располагаться на разных физических дисках.

В первую очередь следует выяснить какие физические диски входят в интересующую нас группу томов, это можно сделать командой:

Данная команда покажет все физические тома - PV и группы томов - VG, в которые они входят.

LVM-VG-move-001.jpg

В нашем случае есть две группы томов: ubuntu-vg в который входит раздел sda3 и test-vg включающий в себя диски sdb и sdc. Обратите внимание, если группа томов включает в себя разделы, то перенести ее на другую систему мы не сможем, либо придется переместить туда с физическим диском и остальные разделы. Но такая структура - явление достаточно редкое и обычно используется при установке системы для корневого раздела, который обычно никуда переносить не нужно.

В данном примере мы будем переносить группу томов test-vg и здесь сразу встает вопрос - как правильно отключить ее от системы? Для этого, прежде всего нужно выяснить какие службы используют логические тома, расположенные на этой группе томов. Это можно узнать при помощи команды:

В показанном ниже примере из реально работающей системы логический том смонтирован в /video и его используют службы сервера видеонаблюдения Xeoma и Яндекс.Диск.

LVM-VG-move-002.jpg

Если группа томов содержит несколько LV, то выполняем данную команду для каждой точки монтирования.

Выяснив, какие службы используют группу томов их следует остановить и, возможно, отключить из автозагрузки, по крайней мере до тех пор, пока вы их не перенастроите. Для этого используйте команды:

где my_service - имя интересующей службы.

Остановив службы можно попробовать отмонтировать логические тома, для этого выполните:

Если операция не удалась, то повторно запускаем lsof и смотрим кто еще использует данный логический том. Не забудьте также удалить или закомментировать записи для монтирования томов в /etc/fstab, в противном случае система не сможет загрузиться после переноса группы томов.

После того как вы отмонтировали все логические тома деактивируем группу томов:

где vg-test - имя переносимой группы томов. После чего группу томов можно экспортировать:

Теперь систему можно выключить и физически перенести относящиеся к группе томов физические диски в новую систему.

В новой системе убедимся, что все подключенные физические тома определились системой:

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

LVM-VG-move-003.jpg

Импортируем группу томов:

И активируем ее:

Затем попробуем смонтировать в нужное расположение (указанная директория должна существовать):

где test-vg - имя группы томов (VG), testvolume - имя логического тома (LV), а /test - точка монтирования. Если все прошло успешно, то можно вносить запись для постоянного монтирования раздела в /etc/fstab и настраивать нужные службы. Перенос группы томов можно считать успешной.

Как видим, LVM - это просто и удобно. Вы можете не только гибко управлять своими устройствами хранения в рамках локальной системы, но и быстро переносить их между системами с сохранением данных и их структуры.

есть работающая система с виртуалками(под vmmgr) на 1 диске, на котором появились бэд сектора. Купил пару дисков, хочу на них собрать рейд1 и перенести систему.

Но система нетиповая с lvm, и немогу найти инструкции. А знаний что бы боюсь нехватит(я начинающий админ в мелкой конторе) и могу только на ночь сервер положить, днем в работе находится.

прошу вашей помощи в настройке, может инструкцию или еще что…

сейчас конфиг такой:


Вот инструкция от Dimez , как переезжать с одиночного диска на Raid1. В Вашем случае все несколько проще, потому что Вы сразу же имеете пару чисты дисков для сборки полноценного Raid1.

Соответственно, алгоритм простой - разбиваете новые диски на разделы, создаете RAID1, на нужном разделе (видимо, /dev/md2, аналог Вашего /dev/sda3) cоздаете тома lvm (такие же, как и на исходном диске), монтируете их в исходную систему, далее копируете данные, ставите груб или любой другой загрузчик на raid1, правите /etc/fstab.

Serge10 ★★★★★ ( 01.12.19 19:04:19 )
Последнее исправление: Serge10 01.12.19 19:04:42 (всего исправлений: 1)

Если не разбираешься в raid, то используй raid в рамках lvm. Преобразуешь lv в raid1 тип с тремя зеркалами, указав два новых диска. Для этого достаточно документацию почитать. Остается переустановить загрузчик. Потом старый диск можно убрать, но не забыть перенастроить на два зеркала.

На самом деле у тебя довольно простой случай. Нужно разметить sdb и sdc, затем сделать примерно следующее (я пишу команды, но не нужно их бездумно копировать в терминал)

Ты всегда можешь воткнуть 3 дешёвых флешки в любой комп с линуксом и потренироваться на них.

Всё это можно сделать не прерывая работы сервера и не отключая клиентов, в рабочее время. LVM делает операции с томами с нониженным приоритетом, так что в типичной конторе «рога и копыта» пользователи не должны заметить просадку производительности. Но вот переезд они тебе замедлят.

Ещё важный момент: я не коснулся переноса /boot который у тебя вне LVM. Я не знаю, у тебя там UEFI или GRUB но все их потроха придётся вручную скопировать на каждый из дисков. Иначе система не сможет загрузиться без старого диска, а тебе наверное надо, чтобы грузилась с любым одним из двух новых. Я у себя заленился это делать и забил, гружусь с одного диска.

При перезагрузках sda, sdb и sdc могут поменяться местами, будь бдителен!

legolegs ★★★★★ ( 01.12.19 19:58:03 )
Последнее исправление: legolegs 01.12.19 20:02:39 (всего исправлений: 1)


Как уже писали выше - делаешь рейд, копируешь туда с помощью rsync всё, что было. Затем чрутишься, правишь fstab, ставишь загрузчик.

Офигеть, я и сам про неё забыл уже.

Делаешь raid1 (mdadm)

Делаешь 2 раздела, для /boot 512m, для PV все остальное (parted)

Добавляешь новый PV в существующую VG (vgextend)

Переносишь данные со старого диска (pvmove)

Выкидываешь старый диск из VG (vgreduce)

Копируешь /boot (dd, rsync, …). правишь /etc/fstab

И grub-install /dev/md0 (или как там новый raid называться будет)

Зачем вы все ему советуете mdadm если там уже есть живой LVM?

При зеркале на LVM работает только один диск для всех потоков (при чтении), а на mdadm потоки разбросает по дискам (при чтении)

futurama ★★★★★ ( 02.12.19 16:21:35 )
Последнее исправление: futurama 02.12.19 16:22:10 (всего исправлений: 1)

:). Сеть помнит все и про всех ;).

А надо не lvc*e -m Number --type mirror использовать, а --type raid1, или вообще явно не задавать, т.к. он уже лет 6 по умолчанию. А вести он должен себя почти так же.

man lvmraid

LVM RAID uses both Device Mapper (DM) and Multiple Device (MD) drivers from the Linux kernel. DM is used to create and manage visible LVM devices, and MD is used to place data on physical devices.

boowai ★★★★ ( 02.12.19 17:27:26 )
Последнее исправление: boowai 02.12.19 17:37:51 (всего исправлений: 2)

милчеловек, ты попробуй на практике, тогда и поговорим. Я пробовал и теперь у меня под LVM живет mdadm, хоть решение на уровне LVM и гибче, но менее производительно.

Если читает один процесс, то ускорения действительно нет наблюдается. А если два - то они друг другу не мешают.

действовал таким образом:

sgdisk /dev/sda -R /dev/sdb sgdisk /dev/sda -R /dev/sdc

mdadm –create –verbose /dev/md0 –level=0 –raid-devices=2 /dev/sdb /dev/sdc

vgextend centos /dev/md2

pvmove /dev/sda3 /dev/md2

после окончания сервер сам ребутнулся и больше lvm не доступен.

vgchange -ay пробовал, не работает. lvscan пишет что все активны.

что можно предпринять? работа сервера встала. прошу вашей помощи

Пойти покушать и повеситься (с)

Не считая всего бреда, непонятно одно, откуда взялся /dev/md2 ?

а где grub-install ?

iostat запускал? видел распределение нагрузки по дискам?

то в обоих случаях lvm/mdadm, работает только один диск к сожалению. А при нескольких потоках … как я говорил ранее mdadm лучше.

Может за последние 5-10 лет что-то изменилось в lvm, но я сомневаюсь.

Если ты не понимаешь, что и как делать, то в первую очередь нужно сделать backup.

А затем, перед выполнением команд на целевой системе потренироваться на кошках, например на другом ПК или виртуалке.

Если система не загружается, то тебе придётся грузиться с любого LiveCD / LiveUSB и выполнять команды с него.

делал по мануалам, было примерно так:

sgdisk /dev/sda -R /dev/sdb sgdisk /dev/sda -R /dev/sdс

mdadm –create –verbose /dev/md1 –level=0 –raid-devices=2 /dev/sdb2 /dev/sdc2 mdadm –create –verbose /dev/md2 –level=0 –raid-devices=2 /dev/sdb3 /dev/sdc3

последний шаг длился сутки, и вчера под вечер сервер сам ребутнулся и больше диски виртуалок в lve не появились.

загрузчик еще не менял, грузится со старого (sda2).

sda1 это 1 мбайт отступа в начале диска.

все lve томы активны, но не видны почему то. Немогу найти может где то точки монтирования нужно поменять, но хотя вроде нет, я же просто расширил существующий.

единственное что мне непонятно, почему номера md после ребута поменялись. может в этом проблема? но сейчас lvm видно 7 терабайт, т.е. старый диск полностью и рейд полностью.


Ну и насоветовал.

и вчера под вечер сервер сам ребутнулся

Почему это произошло?

И была ли к этому моменту завершена процедура переноса физического тома?

Все-таки я отстал от жизни, LVM mirror таки распределяет потоки по дискам (нашел одну систему с lvm mirror, RHEL 6.6)

проблем с питанием не было, стоит ИБП. Другие серверы не ребутались, значит просадки тож не было.

в 21:30 уже идут записи ио загрзке…

kernel panic и подобного нет.

самого вывода консиоли в момент ребута не видел, но примерно в это время и должен был закончитс перенос. В районе 18 часов смотрел было около 80%.

Ну как было примерно так видимо примерно и получилось.

В данной статье речь пойдет о переносе системы с одного диска на RAID1 из двух дисков, поверх которого находится LVM. Изначально работа велась с GRUB2 1.96, но столкнувшись с проблемами, напрямую не связанными с данной версией, было произведено обновление до версии 1.98. Все дальнейшие шаги проводились с этой верси GRUB2. Возможно, что с 1.96 все также будет работать.


Итак, изначально система находится на диске /dev/sda. Второй диск, который будет затем в "зеркале" - /dev/sdb

Contents

Подготовка диска под RAID1

Для того, что бы можно было установить GRUB2, достаточно что бы на диске была таблица разделов. Создаем таблицу и добавляем в нее один раздел, занимающий весь диск. Без создания этого раздела GRUB2 не работал (или, возможно, я что-то делал неверно)

Создаем RAID1

Создаем RAID1 с одним устройством, используя для этого раздел /dev/sdb1

Создаем LVM

Форматируем разделы

Монтируем новые ФС

Копируем данные

  • создаем файл со списком каталогов, которые надо исключить /root/rsync-filter:
  • Сделаем dry-run, что бы посмотреть, что будет скопировано. Ключ -x означает, что не выходить за границы файловой системы
  • Копируем:
  • Аналогично копируем остальные файловые системы:
  • Создаем оставшиеся каталоги:

Установка GRUB2

И уже в chroot'ed-системе выполняем:

Для того, что бы витдеть, что происходит при установке GRUB2, его можно запустить с ключом --debug:

Одной из команд, которая выполняется при установке, является:

При этом создается core.img, который в себе содержит модули, необходимые GRUB2 для доступа к соответствующим разделам.

И, затем, перегенерируем файл /boot/grub/grub.cfg:

mdadm, fstab, initramfs

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

и указав в качестве массива, который должен быть запущен для монтирования корневой файловой системы, md2. Также надо указать автоматический запуск массивов, неуказанных в /etc/mdadm/mdadm.conf

В итоге, файл /etc/defaults/mdadm приобрел вид:

а файл /etc/mdadm/mdadm.conf:

Поле ARRAY можно не заполнять, т.к. настроено автоматическое сканирование всех разделов на предмет наличия в них суперблоков MD (правда при этом при загузке или, например, при создании initramfs будет ругань на предмет отсутствия описанных массивов в данном файла).

Также настоятельно рекомендую ознакомится с документаций mdadm - /usr/share/doc/mdadm/ . Особенно - README.upgrading-2.5.3.

Согласно инструкциям из последнего файла я удалил /var/lib/mdadm/CONF-UNCHECKED

Затем правим файл /etc/fstab (также в chroot'e):

На всякий случай пересоздаем все образы initramfs:

и убеждаемся, что в них включена поддержка mdraid и lvm (путем разглядывания вывода предыдущей команды)

Подключение второго диска

Копируем таблицу разделов с /dev/sdb на /dev/sda

Убеждаемся, что ядро перечитало таблицу разделов:

Теперь расширяем массив:

(после перезагрузки имя диска сменилось с /dev/sda -> /dev/sde)

Далее будет происходить процесс восстановления, состояние которого можно отслеживать через /proc/mdstat:

Перенос системы Linux с LVM разделами с одного жесткого диска на другой без перезагрузки

Краткая вводная информация: в сервере был один жесткий диск, без RAID1 (или более высоких уровней), система установлена на LVM

Первым делом мы добавили в сервер hdd на 500 gb и с помощью утилиты hpacucli создали новый логический диск с использованием опции RAID0 (аналог JBOD в других RAID-контроллерах).

Немного об hpacucli, из названия следует, что HP Array Configuration Utility Command Line Interface — это консольная утилита для конфигурирования RAID-контроллеров HP. Этот незаменимый инструмент позволяет выполнять все настройки контроллера прямо из загруженной операционной системы, "на горячую", не заходя в настройки контроллера в меню загрузки сервера.

=> ctrl all show status
Smart Array P212 in Slot 1
Controller Status: OK
Cache Status: OK

После того как мы проверили состояние контроллера, проверяем состояние дисков командой " => ctrl slot=1 pd all show status ", а так же узнаем название физического диска с которым дальше будем работать, наш диск "1I:1:2".

=> ctrl slot=1 pd all show status
physicaldrive 1I:1:1 (port 1I:box 1:bay 1, 250 GB): OK
physicaldrive 1I:1:2 (port 1I:box 1:bay 2, 500 GB): OK

Перед началом создания нового массива просмотрим с помощью команды " => ctrl slot=1 ld all show " доступные в системе массивы. На данный момент в системы мы видим только массив А объемом 232.9 gb типа RAID0 с единственным диском.

=> ctrl slot=1 ld all show
Smart Array P212 in Slot 1
array A
logicaldrive 1 (232.9 GB, RAID 0, OK)

Собрав необходимые данные для дальнейшей работы приступаем к созданию нового массива с помощью команды " => ctrl slot=1 create type=ld drives=1I:1:2 raid=0 ", данная команда создает RAID0 из физического диска "1I:1:2". После чего снвоа вводим команду " => ctrl slot=1 ld all show " и видим, что наш массив В объемом 465.7 gb создан.

=> ctrl slot=1 ld all show
Smart Array P212 in Slot 1
array A
logicaldrive 1 (232.9 GB, RAID 0, OK)
array B
logicaldrive 2 (465.7 GB, RAID 0, OK)

Disk /dev/sdb: 465.7 GiB, 500074307584 bytes, 976707632 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 1AEE5A35-69CD-405F-B6CC-81A02647C796

А также видим старый диск:

Disk /dev/sda: 232.9 GiB, 250023836160 bytes, 488327805 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7c4f802b

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 999423 997376 487M 83 Linux
/dev/sda2 1001470 488327167 487325698 232.4G 5 Extended
/dev/sda5 1001472 488327167 487325696 232.4G 8e Linux LVM

Наша задача - перенести работающую систему с диска /dev/sda на диск /dev/sdb Для этого нужно создать на новом диске аналогичные разделы, как на старом, перенести /boot, загрузчик и массивы LVM на новый диск.

Устанавливаем флаг bootable для первого раздела командой "a":

Command (m for help): a
Selected partition 1
The bootable flag on partition 1 is enabled now.

Создаем второй раздел, при создание второго раздела на пункте Partion type выбираем "e" все остальные пункты оставляем по дефолту (аналогично диску /dev/sda):

Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): e
Partition number (2-4, default 2): 2
First sector (999424-976707631, default 999424):
Last sector, +sectors or +size (999424-976707631, default 976707631):
Created a new partition 2 of type 'Extended' and of size 465.3 GiB.

Создаем третий раздел (логический внутри Extended области), которому присваивается первый свободный номер для логических разделов (5):

Command (m for help): n
All space for primary partitions is in use.
Adding logical partition 5
First sector (1001472-976707631, default 1001472):
Last sector, +sectors or +size (1001472-976707631, default 976707631):
Created a new partition 5 of type 'Linux' and of size 465.3 GiB.

Все три раздела созданы, с помощью команды "p" проверяем созданные нами разделы:

Command (m for help): p
Disk /dev/sdb: 465.7 GiB, 500074307584 bytes, 976707632 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xace84bbc

Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 999423 997376 487M 83 Linux
/dev/sdb2 999424 976707631 975708208 465.3G 5 Extended
/dev/sdb5 1001472 976707631 975706160 465.3G 83 Linux

У последнего созданного нами раздела тип Linux, что нам не подходит, меняем на Linux LVM, для этого выбираем команду t, и с помощью L выводим список доступных ID разделов, и находим там Linux LVM (8e) (Или, если известно заранее, просто вписываем сразу 8e, как в нашем случае)

Command (m for help): t
Partition number (1,2,5, default 5): 5
Partition type (type L to list all types): 8e
Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): p
Disk /dev/sdb: 465.7 GiB, 500074307584 bytes, 976707632 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xace84bbc

Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 999423 997376 487M 83 Linux
/dev/sdb2 999424 976707631 975708208 465.3G 5 Extended
/dev/sdb5 1001472 976707631 975706160 465.3G 8e Linux LVM

Делаем перенос LVM

После этого у нас все данные будут физически на новом диске;

Дожидаемся окончания операции. Все данные теперь на новом диске, остается только установить загрузчик на новый диск: " grub-install /dev/sdb ".

Теперь нам остается перезагрузить сервер и поменять порядок загрузки дисков в bios (или, в нашем случае, просто вынимаем старый диск и перезагружаемся - загрузка пойдет с единственного активного в RAID-контроллере диска) Данный способ позволяет перенести всю систему с одного диска на другой с одной перезагрузкой сервера. Или же вообще без перезагрузки - перезагрузка требуется только для того, чтобы убедиться, что всё сделали правильно. Если на сервере работают критичные приложения - можно обойтись без перезагрузки - ядро уже в памяти, все данные перенесены на новый диск, при следующей плановой перезагрузке сервера просто произойдет загрузка уже с нового жесткого диска.

Осталась одна маленькая необязательная деталь. Так как старый диск был 250 Gb, а новый - 500 Gb, мы можем спокойно увеличить раздел, используя свободное место на жестком диске.

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

Дисклеймер: автор текста не несет никакой ответственности за выши данные на серверах. В конце статьи приведены ссылки на гайды, откуда кусочно был скомпонован алгоритм, опробованный в деле.

Процесс настройки будет производится с учетом используемого в текущий момент диска /dev/sda и свежего незадействованного диска /dev/sdb. Помимо всего прочего в системе используется LVM. Диск разбит на 2 части: первый раздел /boot небольшого размера, остальное отдано под LVM.

Для начала установим mdadm.

После установки необходимо проиницализировать все необходимые модули. Это избавит нас от необходимости лишний раз перезагружать сервер:

Теперь скопируем структуру разделов с действующего диска на новый

Делаем RAID1 для первого раздела на новом диске

Повторяем для остальных

Форматируем партиции в нужные файловые системы

Теперь перенесем содержимое первого раздела в зеркало, так как там только папка /boot, скопируем её

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

Так как существующий раздел /dev/sda5 расположен на LVM, создаем LVM физический том в рейде

Расширяем существующую группу томов с учетом md1

Переносим туда наш текущий раздел с данными

Выбрасываем из группы томов одиночный раздел

Добавляем освободившийся раздел к зеркалу, дожидаемся сборки массива

После всех этих процедур, если система не предложила сделать это ранее, вносим изменения в файлы конфигурации mdadm, добавляя туда данные о созданных нами массивах

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

Читайте также: