решение нестандартных проблем и не только

Блог нашего Дата-центра

делимся информацией и опытом в решении нерядовых задач

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

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

Сегодня система оповещения прислала сообщение, что на физическом сервере HP под управлением Ubuntu Server 16.04 на жестком диске начали появляться поврежденные сектора (бэдблоки). В ходе чего было принято решение переноса системы с одного hdd на 250 gb на другой hdd на 500 gb и мы приступили к решению возникшей проблемы.

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

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

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

Для запуска утилиты введем команду # hpacucli, она отображает приглашение "=>", где мы можем ввести все команды hpacucli. Командой "=> ctrl all show status" мы проверяем состояние контроллера, а так же можем понять в какой слот у нас подключены диски, в нашем случае в Slot 1. (также можно использовать утилиту напрямую: hpacucli ctrl all show status, в этом случае после выполнения команды утилита завершится и передаст управление оболочке)

=> 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)

Завершаем нашу работу в данной утилите командой "=>exit" и переходим к настройке разделов на новом жестком диске. В системе вводим команду "# fdisk -l" для того чтобы убедиться, что наша система увидела созданный выше массив, а также чтобы проверить текущую разметку действующего диска на 250Gb, и в сообщении выданном системой в самом низу видим наш массив:

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 на новый диск.

С помощью утилиты fdisk - утилита, которая работает с дисками, переходим к созданию разделов на диске sdb командой "# fdisk /dev/sdb". В данной утилите с помощью команды "m" выводим список доступных команд. Для начала создаем пустую таблицу разделов типа DOS командой "o", (т.к. на старом диске использовалась именно разметка MBR, а не GPT, то сделаем аналогичную разметку) Создаем загрузочный раздел (/boot), выбираем "n", выбираем Partition type - primary "p", Partion number "1" или жмем "Enter" тем самым значение 1 выбирается по дефолту, First sector так же, по дефолту и Last sector вводим необходимое нам значение (такое же, как на /dev/sda1), в нашем случае 999423, жмем Enter и наблюдаем создание раздела:

Using default response p.
Partition number (1-4, default 1): 1
First sector (2048-976707631, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-976707631, default 976707631): 999423
Created a new partition 1 of type 'Linux' and of size 487 MiB.

Устанавливаем флаг 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{K,M,G,T,P} (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{K,M,G,T,P} (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

Данное изменение применилось, теперь все разделы созданы, записываем изменения и выходим из данной утилиты "w", "q" Когда все разделы созданы, необходимо скопировать /boot раздел с sda1 на sdb1, выполняем это с помощью утилиты dd следующей командой "#dd if=/dev/sda1 of=/dev/sdb1", теперь sdb1 точная копия раздела sda1. (включая ID раздела, это можно проверить командой blkid) Важно, чтобы сохранился ID раздела, т.к. он используется в конфигах grub, и если он изменится, то нужно будет внести соответствующие правки в конфиг grub.

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

  1. pvcreate /dev/sdb5 # создаем физический раздел в LVM с новым диском;
  2. pvdisplay # смотрим, что раздел добавился;
  3. vgdisplay # смотрим имеющиеся volume group, нужная нам называется ubuntu-vg;
  4. vgextend ubuntu-vg /dev/sdb5 # расширяем нашу volume group на второй физический диск;
  5. pvmove /dev/sda5 /dev/sdb5 # перемещаем все разделы со всеми данными со старого диска на новый.
  6. После этого у нас все данные будут физически на новом диске;

  7. vgreduce ubuntu-vg /dev/sda5 # убираем старый физический диск из нашей volume group;
  8. premove /dev/sda5 # удаляем из списка физических разделов LVM старый жесткий диск.

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

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

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

Для этого:

  • pvdisplay # Проверяем, что действительно не всё место задействовано
  • lvdisplay # Смотрим, какие у нас есть logical volume в системе
  • Нужный нам logical volume называется lv_root, увеличим его размер на всё доступное свободное место: lvextend -l+100%FREE /dev/ubuntu-vg/lv_root
  • После успешного завершения этой операции нужно расширить файловую систему, проверим, какая файловая система используется: df -T
  • Мы видим точку монтирования /dev/ubuntu-vg/lv_root / - корневой раздел, и её тип - ext4
  • Для ext4 существует утилита по увеличению размера онлайн: resize2fs /dev/ubuntu-vg/lv_root
  • Теперь мы можем убедиться (df -h), что размер нашего корневого раздела 450 Gb.

   31.10.2018 |
Рейтинг:
(0)
Автор статьи:
Скачков Павел Вадимович ©