Добавляем диски в LVM
pvcreate /dev/sdX1 /dev/sdY1
Создаём группу vgdata
из двух дисков
vgcreate raid1vg0 /dev/sdX1 /dev/sdY1
Создаём логический диск с RAID 1 под именем lvmirror
на 3ГБ:
lvcreate --mirrors 1 --type raid1 -l 100%FREE --nosync -n swap raid1vg0
можно указать флаг --nosync
, чтобы пропустить синхронизацию пустого зеркала.
Смотрим что получилось
lvs -a -o +devices
Колонка Cpy%Sync
показывает, процент синхронизации, а Devices
, устройства, на которых находятся данные логического диска.
SWAP
Осталось создать swap раздел:
mkswap /dev/raid1vg0/swap
И добавить в fstab:
/dev/raid1vg0/swap swap swap defaults,noatime,discard 0 0
Тестируем LVM RAID 1 и учимся чинить
Как можно доверять свои данные технологии, когда ты не знаешь, что произойдёт в случае нештатной ситуации и как всё починить без потери данных.
Для начала, посмотрим, как у нас всё выглядит до начала тестов:
lvs -a -o +devices,lv_health_status
LV VG Attr LSize Cpy%Sync Devices Health lvmirror vgdata rwi-aor--- 3.00g 100.00 lvmirror_rimage_0(0),lvmirror_rimage_1(0)
[lvmirror_rimage_0] vgdata iwi-aor--- 3.00g /dev/sdX1(1) [lvmirror_rimage_1] vgdata iwi-aor--- 3.00g /dev/sdY1(1)
[lvmirror_rmeta_0] vgdata ewi-aor--- 4.00m /dev/sdX1(0)
[lvmirror_rmeta_1] vgdata ewi-aor--- 4.00m /dev/sdY1(0)
Теперь мы можем приступать к тестированию, но сначала:Предупреждение
Убедитесь, что вы используете верный диск в командах, так как это может привести к потере данные на диске!
Отвал диска (ресинхронизация) и его замена
В данном случае, мы будем симулировать отвал диска, через изменение его состояния
Отключаем диск sdX
:
echo offline > /sys/block/sdX/device/state
Теперь, чтобы LVM понял, что с диском что-то не то, нужно записать на диск данные.
Если FS есть:
echo test > /mnt/test.txt
Если FS нет(эта команда уничтожит FS, если она есть!):
dd if=/dev/zero of=/dev/vgdata/lvmirror count=10
Смотрим результат:
lvs -a -o +devices,lv_health_status
/dev/sdX: open failed: No such device or address /dev/sdX: open failed: No such device or address /dev/sdX: open failed: No such device or address WARNING: Couldn't find device with uuid VkIceg-2ZVd-tTuZ-HgHz-EblT-5GwQ-oH3gKM. WARNING: VG vgdata is missing PV VkIceg-2ZVd-tTuZ-HgHz-EblT-5GwQ-oH3gKM (last written to /dev/sdX1). WARNING: Couldn't find all devices for LV vgdata/lvmirror_rmeta_0 while checking used and assumed devices. WARNING: Couldn't find all devices for LV vgdata/lvmirror_rimage_0 while checking used and assumed devices. LV VG Attr LSize Cpy%Sync Devices Health lvmirror vgdata rwi-aor-p- 3.00g 100.00 lvmirror_rimage_0(0),lvmirror_rimage_1(0) partial [lvmirror_rimage_0] vgdata iwi-aor-p- 3.00g [unknown](1) partial [lvmirror_rimage_1] vgdata iwi-aor--- 3.00g /dev/sdY1(1) [lvmirror_rmeta_0] vgdata ewi-aor-p- 4.00m [unknown](0) partial [lvmirror_rmeta_1] vgdata ewi-aor--- 4.00m /dev/sdY1(0)
Обратите внимание, статус Health
стал partial
Теперь запишем рандомные данные на диск, чтобы можно было увидеть рассинхронизацию:
FS есть, пишем в файл /mnt/random.file
:
dd if=/dev/urandom of=/mnt/random.file bs=10M count=10
FS нет(эта команда уничтожит FS, если она есть!):
dd if=/dev/urandom of=/dev/vgdata/lvmirror bs=10M count=10
Включаем диск sdX
обратно:
echo running > /sys/block/sdX/device/state
Смотрим результат:
1 | lvs -a -o +devices,lv_health_status |
1 2 3 4 5 6 | LV VG Attr LSize Cpy%Sync Devices Health lvmirror vgdata rwi-aor-r- 3.00g 100.00 lvmirror_rimage_0(0),lvmirror_rimage_1(0) refresh needed [lvmirror_rimage_0] vgdata Iwi-aor-r- 3.00g /dev/sdX1(1) refresh needed [lvmirror_rimage_1] vgdata iwi-aor--- 3.00g /dev/sdY1(1) [lvmirror_rmeta_0] vgdata ewi-aor-r- 4.00m /dev/sdX1(0) refresh needed [lvmirror_rmeta_1] vgdata ewi-aor--- 4.00m /dev/sdY1(0) |
Ошибки и предупреждения об отсутствии диска пропали, но статус Health
изменился на refresh needed
Чиним
Запускаем синхронизацию командой:
1 | lvchange --refresh /dev/vgdata/lvmirror |
Но если диск выпал, я бы рекомендовал его заменить на новый, проинициализировав его и добавив в PV и VG:
1 2 | pvcreate /dev/sdZ1 vgextend vgdata /dev/sdZ1 |
И заменив диск у зеркала:
1 | lvconvert --replace /dev/sdX1 /dev/vgdata/lvmirror /dev/sdZ1 |
Замена мёртвого диска
Теперь давайте просимулируем замену мёртвого диска, для этого нам придётся стереть заголовок нашего диска, чтобы он выглядел как новый:
Эта команда уничтожит данные на диске!
1 | dd if=/dev/zero of=/dev/sdX bs=10M count=1 |
При вызове
1 | lvs -a -o +devices,lv_health_status |
Мы увидим тот же результат, что и при отвале диска, статус Health
стал partial
, но чинится это по другому.
Чиним
Удалим старый диск из VG
1 | vgreduce --removemissing --force vgdata |
Так как мы стёрли заголовки диска, нам придётся проинициализировать диск заново и добавить его в PV и VG:
1 2 | pvcreate /dev/sdX1 vgextend vgdata /dev/sdX1 |
И нужно починить наше зеркало
1 | lvconvert --repair /dev/vgdata/lvmirror |
Автоматически запуститься ресинхронизация.
Конвертируем логический диск из RAID 1 в обычный
1 | lvconvert -m0 /dev/vgdata/lvmirror |
Конвертируем логический диск из обычного в RAID 1
1 | lvconvert -m1 /dev/vgdata/lvmirror |
Увеличиваем размер диска с зеркалом
1 2 3 4 5 | umount /dev/vgdata/lvmirror # Добавляем 5GB к диску lvresize --resizefs --size +5G /dev/vgdata/lvmirror # Смотрим результат lvs |
Уменьшаем размер диска с зеркалом
1 2 3 4 5 | umount /dev/vgdata/lvmirror # Делаем диск равным 4GB lvresize --resizefs --size 4G /dev/vgdata/lvmirror # Смотрим результат lvs |