From 30053ef2d8148fba8035ce285d14d9cddf937932 Mon Sep 17 00:00:00 2001 From: Storozhenko Evgeny Vladimirovich aka kpa39l Date: Wed, 4 Mar 2026 18:46:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8E=20=D0=BF=D1=80=D0=BE=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=D0=BE=D1=83=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B9=D1=87=D0=B8=D0=B2=D1=8B=D0=B9=20=D1=80=D0=B0=D0=B7=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=20=D0=B2=20ubuntu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20260304 ubuntu_system_raid1/index.md | 244 ++++++++++++++++++ content/posts/test-post/index.md | 1 + 2 files changed, 245 insertions(+) create mode 100644 content/posts/20260304 ubuntu_system_raid1/index.md diff --git a/content/posts/20260304 ubuntu_system_raid1/index.md b/content/posts/20260304 ubuntu_system_raid1/index.md new file mode 100644 index 0000000..3ea296f --- /dev/null +++ b/content/posts/20260304 ubuntu_system_raid1/index.md @@ -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. Если хочешь сделать так же и возникнут вопросы - пиши, помогу разобраться. \ No newline at end of file diff --git a/content/posts/test-post/index.md b/content/posts/test-post/index.md index 1a66a1e..333c574 100644 --- a/content/posts/test-post/index.md +++ b/content/posts/test-post/index.md @@ -2,6 +2,7 @@ title: "Тестовая статья" date: 2026-01-31T22:45:00+03:00 draft: false +tags: ["hugo"] --- ## Тестовая статья