добавил статью про отказоустойчивый раздел в ubuntu
This commit is contained in:
@@ -0,0 +1,244 @@
|
||||
---
|
||||
date: "2026-03-04T17:34:29+03:00"
|
||||
draft: false
|
||||
title: "Отказоустойчивый системный раздел на Ubuntu"
|
||||
tags: ["linux", "howto", "ubuntu"]
|
||||
categories: ["selfhosting"]
|
||||
---
|
||||
|
||||
Привет, товарищь! Решил поделиться опытом, как я настраивал отказоустойчивость на своём сервере. После скоропостижной смерти M2 SSD со всеми конфигами домашней лаборатории мне пришлось начать собрать её заново. Так что если у тебя тоже есть два одинаковых SSD и ты хочешь, чтобы система продолжала работать при отказе одного из них, этот гайд про то как сразу делать по уму точно для тебя.
|
||||
|
||||
Почему я выбрал mdadm
|
||||
|
||||
Есть два основных пути: mdadm и LVM RAID. Я остановился на mdadm. Для нашей задачи это проще и прозрачнее. LVM даёт крутую гибкость в управлении томами, но если нужна именно защита от смерти диска, mdadm справляется лучше. Восстановление после сбоя понятнее, мониторинг проще, и меньше шансов запутаться в конфигурации.
|
||||
|
||||
Важный нюанс про EFI
|
||||
|
||||
Тут есть подвох. UEFI не умеет загружаться с mdadm массивов. Поэтому EFI разделы нельзя объединять в RAID. Я оставил их отдельными на каждом диске. Просто синхронизирую содержимое вручную через rsync. Это небольшая плата за возможность загрузки с любого диска.
|
||||
|
||||
В самом инсталляторе Ubuntu я не догадался выделить отдельный раздел для EFI, чтобы правильно разбить диски при устанвоке. Так что я поставил систему целиком на один диск, а потом на втором создал программный RAID 1, перенёс данные и после этого добавил в RAID первый диск.
|
||||
|
||||
## Пошаговая инстуркция
|
||||
|
||||
После первой загрузки новой системы я сначала проверил какие диски есть в системе:
|
||||
|
||||
```bash
|
||||
lsblk -f
|
||||
# Показывает структуру дисков и файловые системы
|
||||
|
||||
sudo fdisk -l | grep "Disk /dev/sd"
|
||||
# Находим второй диск для RAID. Я ориентировался по размеру.
|
||||
```
|
||||
|
||||
Установил mdadm:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install mdadm
|
||||
# Устанавливаем утилиту управления RAID массивами. В убунте она по-умолчанию уже есть.
|
||||
```
|
||||
|
||||
Скопировал таблицу разделов с первого диска на второй:
|
||||
|
||||
```bash
|
||||
sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdb
|
||||
# Копируем структуру разделов с sda на sdb
|
||||
```
|
||||
|
||||
Создал RAID1 массив. Важный момент - создавал в деградированном режиме, чтобы не затереть работающую систему:
|
||||
|
||||
```bash
|
||||
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb2 missing
|
||||
# Создаём массив пока только с одним диском (sdb2)
|
||||
# Второй диск (sda2) добавим позже
|
||||
```
|
||||
|
||||
Отформатировал и скопировал данные:
|
||||
|
||||
```bash
|
||||
sudo mkfs.ext4 /dev/md0
|
||||
# Создаём файловую систему на новом RAID массиве
|
||||
|
||||
sudo mkdir -p /mnt/new-root
|
||||
sudo mount /dev/md0 /mnt/new-root
|
||||
# Монтируем новый массив
|
||||
|
||||
sudo rsync -axHAWX --numeric-ids --info=progress2 \
|
||||
--exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp \
|
||||
/ /mnt/new-root/
|
||||
# Копируем все данные с сохранением прав и атрибутов
|
||||
# Исключаем виртуальные файловые системы
|
||||
```
|
||||
|
||||
Подготовил chroot и обновил конфигурацию:
|
||||
|
||||
```bash
|
||||
# Монтируем необходимые директории для chroot
|
||||
for dir in /dev /dev/pts /proc /sys /run; do
|
||||
sudo mount --bind $dir /mnt/new-root$dir
|
||||
done
|
||||
|
||||
# Монтируем EFI раздел
|
||||
sudo mount /dev/sda1 /mnt/new-root/boot/efi
|
||||
|
||||
# Заходим в систему
|
||||
sudo chroot /mnt/new-root
|
||||
|
||||
# Внутри chroot обновляем fstab
|
||||
sed -i 's|/dev/sda2|/dev/md0|g' /etc/fstab
|
||||
# Меняем корневой раздел с sda2 на md0
|
||||
|
||||
# Добавляем конфигурацию mdadm
|
||||
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
|
||||
|
||||
# Обновляем initramfs чтобы RAID собрался при загрузке
|
||||
update-initramfs -u -k all
|
||||
|
||||
# Переустанавливаем GRUB
|
||||
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Ubuntu --recheck
|
||||
update-grub
|
||||
|
||||
# Выходим из chroot
|
||||
exit
|
||||
```
|
||||
|
||||
Отмонтировал и перезагрузился для проверки:
|
||||
|
||||
```bash
|
||||
sudo umount -R /mnt/new-root
|
||||
sudo reboot
|
||||
# Перезагружаемся - система должна загрузиться с RAID
|
||||
```
|
||||
|
||||
После успешной загрузки добавил оригинальный диск в массив:
|
||||
|
||||
```bash
|
||||
sudo mdadm /dev/md0 --add /dev/sda2
|
||||
# Добавляем sda2 в массив - начнётся синхронизация
|
||||
|
||||
watch cat /proc/mdstat
|
||||
# Следим за прогрессом синхронизации
|
||||
# Это может занять от одного до четрёх часов. У меня чуть больше часа заняло.
|
||||
```
|
||||
|
||||
Настроил второй EFI раздел:
|
||||
|
||||
```bash
|
||||
sudo mkfs.vfat -F 32 -n EFI /dev/sdb1
|
||||
# Форматируем EFI раздел второго диска в FAT32
|
||||
|
||||
sudo mkdir -p /boot/efi2
|
||||
sudo mount /dev/sdb1 /boot/efi2
|
||||
# Монтируем второй EFI раздел
|
||||
|
||||
sudo rsync -a /boot/efi/EFI/ /boot/efi2/EFI/
|
||||
# Копируем файлы загрузчика
|
||||
|
||||
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi2 --bootloader-id=Ubuntu /dev/sdb
|
||||
# Устанавливаем GRUB на второй диск
|
||||
|
||||
sudo umount /boot/efi2
|
||||
```
|
||||
|
||||
Настроил уведомления:
|
||||
|
||||
```bash
|
||||
sudo apt install postfix
|
||||
# Устанавливаем почтовый сервер
|
||||
# При настройке выбираем "Local only"
|
||||
|
||||
sudo nano /etc/mdadm/mdadm.conf
|
||||
# Добавляем строку: MAILADDR username. Где username это ник твоей учтёки.
|
||||
|
||||
sudo systemctl enable --now mdmonitor
|
||||
# Включаем мониторинг RAID массивов
|
||||
|
||||
sudo mdadm --monitor --test --oneshot /dev/md0
|
||||
# Тестируем отправку уведомлений
|
||||
```
|
||||
|
||||
## Как проверить что всё работает
|
||||
|
||||
После настройки прогони несколько команд для спокойствия:
|
||||
|
||||
```bash
|
||||
cat /proc/mdstat
|
||||
# В строке md0 должны быть две буквы U в скобках [UU]
|
||||
# Это значит что оба диска активны и синхронизированы
|
||||
|
||||
sudo mdadm --detail /dev/md0
|
||||
# State должно быть active
|
||||
# Working Devices должно быть равно 2
|
||||
|
||||
df -h | grep " / "
|
||||
# Корневая файловая система должна быть на /dev/md0
|
||||
|
||||
sudo efibootmgr -v
|
||||
# Проверяем что запись Ubuntu есть в списке загрузочных устройств
|
||||
|
||||
cat /etc/mdadm/mdadm.conf | grep ARRAY
|
||||
# Проверяем что конфигурация массива сохранена
|
||||
```
|
||||
|
||||
## Что делать после обновления ядра
|
||||
|
||||
После apt upgrade файлы загрузчика обновляются только на основном EFI разделе. Нужно вручную синхронизировать второй диск:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /boot/efi2
|
||||
sudo mount /dev/sdb1 /boot/efi2
|
||||
# Монтируем второй EFI раздел
|
||||
|
||||
sudo rsync -a /boot/efi/EFI/ /boot/efi2/EFI/
|
||||
# Синхронизируем файлы загрузчика
|
||||
|
||||
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi2 --bootloader-id=Ubuntu /dev/sdb
|
||||
# Обновляем GRUB на втором диске
|
||||
|
||||
sudo umount /boot/efi2
|
||||
```
|
||||
|
||||
Я добавил эти команды в скрипт /usr/local/bin/sync-efi.sh и если не забуду про его существоавание, то буду запускать его после обновлений. Занимает минуту, зато спокойнее.
|
||||
|
||||
## Что делать при сбое диска
|
||||
|
||||
Если пришло уведомление о проблеме, сначала проверь статус массива:
|
||||
|
||||
```bash
|
||||
cat /proc/mdstat
|
||||
sudo mdadm --detail /dev/md0
|
||||
# Проверяем какой диск вышел из строя
|
||||
```
|
||||
|
||||
Если диск помечен как failed, действуй по плану:
|
||||
|
||||
```bash
|
||||
sudo mdadm /dev/md0 --fail /dev/sdX2 --remove /dev/sdX2
|
||||
# Отмечаем диск как неисправный и удаляем из массива
|
||||
# Замените sdX2 на имя проблемного раздела
|
||||
|
||||
# После физической замены диска добавляем новый:
|
||||
sudo mdadm /dev/md0 --add /dev/sdX2
|
||||
# Добавляем новый диск в массив
|
||||
|
||||
watch cat /proc/mdstat
|
||||
# Следим за восстановлением
|
||||
# Система продолжает работать во время синхронизации
|
||||
```
|
||||
|
||||
## Важные заметки на будущее
|
||||
|
||||
RAID это не бэкап. Он защищает от отказа железа, но не от случайного удаления файлов или вирусов. Настрой отдельное резервное копирование критичных данных.
|
||||
|
||||
Сохрани вывод efibootmgr в файл:
|
||||
|
||||
```bash
|
||||
sudo efibootmgr -v > ~/efiboot-backup.txt
|
||||
# Это поможет восстановить загрузочные записи если настройки UEFI сбросятся
|
||||
```
|
||||
|
||||
Не прерывай синхронизацию массива. Это может повредить данные.
|
||||
|
||||
## Итог
|
||||
|
||||
Настройка заняла пару часов включая время на синхронизацию дисков. Теперь сервер защищён от выхода из строя одного из SSD. Если хочешь сделать так же и возникнут вопросы - пиши, помогу разобраться.
|
||||
Reference in New Issue
Block a user