LVM RAID 1

Картинка
Обновлено: 2024-10-18 13:51:04

Всегда отдавал предпочтение православной, СКУФ'ской разметке диска и никогда не воспринимал LVM всерьёз, но однажды его попробовав, я уже не мог остановиться...=)

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

Опустим простой LVM и сделаем конфигурацию серьёзнее

Для написания этой статьи, все действия создавались в виртуальной машине, но моя домашняя лаба как раз работает на такой конфигурации жёстких дисков.

Смотрим разметку

lsblk

NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0                  11:0    1 1024M  0 rom  
vda                 254:0    0   10G  0 disk 
├─vda1              254:1    0  487M  0 part /boot
├─vda2              254:2    0    1K  0 part 
└─vda5              254:5    0  9.5G  0 part 
  └─test--vg-root   253:0    0  8.5G  0 lvm  /
vdb                 254:16   0   20G  0 disk 
vdc                 254:32   0   20G  0 disk

Лепить вольюм групп будем из двух физических дисков vdb и vdc

Много кто советует инициализировать не диски для LVM, а разделы на них. Так и поступим. Создадим сперва разделы на дисках

fdisk /dev/vdb

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0xc3b09434.

Command (m for help):

Жмём g для получения GPT

Created a new GPT disklabel (GUID: C00D60DE-27E0-7047-861D-156F8D036A4F).

Затем n и далее по умолчанию enter, enter, enter

Command (m for help): n
Partition number (1-128, default 1): 
First sector (2048-41943006, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943006, default 41940991): 

Created a new partition 1 of type 'Linux filesystem' and of size 20 GiB.

Command (m for help):

Далее t чтобы указать тип разметки и 43 для выбора разметки LVM

Command (m for help): t

Selected partition 1
Partition type or alias (type L to list all): 43
Changed type of partition 'Linux LVM' to 'Linux LVM'.

и сохраняем изменения нажатием клавиши w

Повторяем процедуру на втором диске

Добавляем созданные на предыдущем этапе разделы физических дисков в менеджер томов
pvcreate /dev/vdb1 /dev/vdc1

Посмотреть что получилось можно командой
pvdisplay

Далее создаём группу томов с именем vgdata из добавленных двух разделов диска
vgcreate vgdata /dev/vdb1 /dev/vdc1

Аналогично смотрим что у нас получилось
vgdisplay

Теперь можно создавать логические диски
lvcreate --size 3G --name test vgdata

Не забываем про вывод
lvdisplay

Но это простой логический диск, а мы хотим отказоустойчивость, поэтому попросим менеджера томов создать нам диск raid-1
lvcreate --size 3G --name test-mirror --mirrors 1 vgdata

и наблюдаем что получилось
lvs -a -o +devices

В колонке Cpy%Sync отображён, процент синхронизации, а Devices, показывает устройства, на которых находятся данные логического диска.
Аналогично командой lsblk можно посмотреть на каких физических дисках расположены логические.

Создаём файловую систему
mkfs.ext4 /dev/vgdata/test-mirror

Монтируем и юзаем
mount /dev/vgdata/test-mirror /mnt/
mkdir /mnt/test-folder
echo "test" >> /mnt/test-folder/test.txt

Настало время протестировать нашу отказоустойчивость. Сперва посмотрим в каком состоянии у нас конфигурация хранилища и зафиксируем в голове.
lvs -a -o +devices,lv_health_status

LV                     VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices                                         Health         
root                   test-vg -wi-ao----   8.54g                                                     /dev/vda5(0)                                                   
swap_1                 test-vg -wi-ao---- 976.00m                                                     /dev/vda5(2187)                                                
test                   vgdata  -wi-a-----   3.00g                                                     /dev/vdb1(0)                                                   
test-mirror            vgdata  rwi-aor---   3.00g                                    100.00           test-mirror_rimage_0(0),test-mirror_rimage_1(0)                
[test-mirror_rimage_0] vgdata  iwi-aor---   3.00g                                                     /dev/vdb1(769)                                                 
[test-mirror_rimage_1] vgdata  iwi-aor---   3.00g                                                     /dev/vdc1(1)                                                   
[test-mirror_rmeta_0]  vgdata  ewi-aor---   4.00m                                                     /dev/vdb1(768)                                                 
[test-mirror_rmeta_1]  vgdata  ewi-aor---   4.00m                                                     /dev/vdc1(0)                                                   

Смоделируем отвал диска

На реальном железе будет выглядеть так
echo offline > /sys/block/sdX/device/state

Но у меня это виртуальная машина, поэтому я просто отключу диск

Смотрим что произошло
lvs -a -o +devices,lv_health_status

WARNING: Couldn't find device with uuid 9e1vgn-E0LC-tKy5-oUBJ-XvU5-9sab-aQ7WO0.
WARNING: VG vgdata is missing PV 9e1vgn-E0LC-tKy5-oUBJ-XvU5-9sab-aQ7WO0 (last written to /dev/vdc1).
LV                     VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices                                         Health         
root                   test-vg -wi-ao----   8.54g                                                     /dev/vda5(0)                                                   
swap_1                 test-vg -wi-ao---- 976.00m                                                     /dev/vda5(2187)                                                
test                   vgdata  -wi-------   3.00g                                                     /dev/vdb1(0)                                                   
test-mirror            vgdata  rwi---r-p-   3.00g                                                     test-mirror_rimage_0(0),test-mirror_rimage_1(0) partial        
[test-mirror_rimage_0] vgdata  Iwi---r---   3.00g                                                     /dev/vdb1(769)                                                 
[test-mirror_rimage_1] vgdata  Iwi---r-p-   3.00g                                                     [unknown](1)                                    partial        
[test-mirror_rmeta_0]  vgdata  ewi---r---   4.00m                                                     /dev/vdb1(768)                                                 
[test-mirror_rmeta_1]  vgdata  ewi---r-p-   4.00m                                                     [unknown](0)                                    partial        

Статус в колоне Health стал partial и что меня малость притормозило, что при попытке подмонтировать диск командой
mount /dev/vgdata/test-mirror /mnt
я получил ошибку

mount: /mnt: special device /dev/vgdata/test-mirror does not exist.

Группа томов vgdata куда-то проебалась.
Те, кто умеет в LVM, конечно же сейчас улыбнулись и подумали что это мелочь...=)
Смотрим что у нас есть вообще из физических дисков
pvscan

WARNING: Couldn't find device with uuid 9e1vgn-E0LC-tKy5-oUBJ-XvU5-9sab-aQ7WO0.
WARNING: VG vgdata is missing PV 9e1vgn-E0LC-tKy5-oUBJ-XvU5-9sab-aQ7WO0 (last written to [unknown]).
PV /dev/vdb1   VG vgdata          lvm2 [<20.00 GiB / 13.99 GiB free]
PV [unknown]   VG vgdata          lvm2 [<20.00 GiB / 16.99 GiB free]
PV /dev/vda5   VG test-vg         lvm2 [<9.52 GiB / 24.00 MiB free]
Total: 3 [49.51 GiB] / in use: 3 [49.51 GiB] / in no VG: 0 [0   ]

Один из перешёл в статус неизвестный. Ну в принципе логично. А вот группа томов vgdata есть! Нам просто необходимо активировать её командой
vgchange -ay vgdata

Смотрим
lsblk

NAME                                     MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0                                       11:0    1 1024M  0 rom  
vgdata-test--mirror_rmeta_1-missing_0_0  253:5    0    4M  0 lvm  
└─vgdata-test--mirror_rmeta_1            253:6    0    4M  0 lvm  
  └─vgdata-test--mirror                  253:9    0    3G  0 lvm  
vgdata-test--mirror_rimage_1-missing_0_0 253:7    0    3G  0 lvm  
└─vgdata-test--mirror_rimage_1           253:8    0    3G  0 lvm  
  └─vgdata-test--mirror                  253:9    0    3G  0 lvm  
vda                                      254:0    0   10G  0 disk 
├─vda1                                   254:1    0  487M  0 part /boot
├─vda2                                   254:2    0    1K  0 part 
└─vda5                                   254:5    0  9.5G  0 part 
  ├─test--vg-root                        253:0    0  8.5G  0 lvm  /
  └─test--vg-swap_1                      253:1    0  976M  0 lvm  [SWAP]
vdb                                      254:16   0   20G  0 disk 
└─vdb1                                   254:17   0   20G  0 part 
  ├─vgdata-test                          253:2    0    3G  0 lvm  
  ├─vgdata-test--mirror_rmeta_0          253:3    0    4M  0 lvm  
  │ └─vgdata-test--mirror                253:9    0    3G  0 lvm  
  └─vgdata-test--mirror_rimage_0         253:4    0    3G  0 lvm  
    └─vgdata-test--mirror                253:9    0    3G  0 lvm  

Мнотируем диск
mount /dev/vgdata/test-mirror /mnt

Смотрим содержимое
ls -la /mnt

drwxr-xr-x 2 root root  4096 Oct 19 06:44 1
drwx------ 2 root root 16384 Oct 19 06:43 lost+found
drwxr-xr-x 2 root root  4096 Oct 19 06:50 test-folder

Фух...! Всё на месте

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

Я добавил в виртуальную машину диск, ёмкостью на 25% больше, чем был в группе томов

lsblk

NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0                  11:0    1 1024M  0 rom  
vda                 254:0    0   10G  0 disk 
├─vda1              254:1    0  487M  0 part /boot
├─vda2              254:2    0    1K  0 part 
└─vda5              254:5    0  9.5G  0 part 
  ├─test--vg-root   253:0    0  8.5G  0 lvm  /
  └─test--vg-swap_1 253:1    0  976M  0 lvm  [SWAP]
vdb                 254:16   0   20G  0 disk 
└─vdb1              254:17   0   20G  0 part 
vdc                 254:32   0   25G  0 disk 

Инициализируем его fdisk'ом, создаём раздел, как в начале статьи и добавляем его в физическую группу и группу томов LVM командами
pvcreate /dev/vdc1
vgextend vgdata /dev/vdc1

Удаляем запись группы томов
vgreduce --removemissing --force vgdata

Запустим копирование нашего логического диска на добавленный ранее диск
lvconvert --repair /dev/vgdata/test-mirror

Всё...!