Сегодня система оповещения прислала сообщение, что на физическом сервере 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
pvcreate /dev/sdb5
# создаем физический раздел в LVM с новым диском;pvdisplay
# смотрим, что раздел добавился;vgdisplay
# смотрим имеющиеся volume group, нужная нам называется ubuntu-vg;vgextend ubuntu-vg /dev/sdb5
# расширяем нашу volume group на второй физический диск;pvmove /dev/sda5 /dev/sdb5
# перемещаем все разделы со всеми данными со старого диска на новый.vgreduce ubuntu-vg /dev/sda5
# убираем старый физический диск из нашей volume group;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.