--- date: "2026-03-04T17:34:29+03:00" draft: false title: "Отказоустойчивый системный раздел на Ubuntu" tags: ["linux", "howto", "ubuntu"] categories: ["selfhosting"] cover: image: "hero.svg" --- Привет, товарищь! Решил поделиться опытом, как я настраивал отказоустойчивость на своём сервере. После скоропостижной смерти 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. Если хочешь сделать так же и возникнут вопросы - пиши, помогу разобраться.