Сегодня клиент обратился с задачей: необходимо превратить уже установленную систему на одном ZFS-диске в зеркало (RAID1), после добавления второго диска. Для Proxmox VE, установленного на ZFS на одном диске, процедура расширения до зеркала требует нескольких шагов. Пройдём по ним на примере реального сервера. В данной статье мы изучим как на Proxmox VE безопасно перейти с ZFS single disk на ZFS mirror — пошаговая инструкция с примерами и настройкой загрузчика. Proxmox ZFS mirror это аналог RAID1. Те же самые шаги можно сделать на чистом Debian, только процесс установки загрузчика будет немного другим — если интересно, пишите в комментариях, и мы рассмотрим данный вариант.
- Что мы знаем о системе
- Проверка текущего состояния Proxmox
- Для начала взглянем что у нас с ZFS:
- Взглянем что у нас с дисками
- Проверка текущего типа загрузки
- Очистка второго диска
- Клонирование разметки с первого диска
- Присоединение нового диска к зеркалу ZFS
- Настройка загрузчика
- Проверка:
- Тестирование отказоустойчивости
- Итог
Что мы знаем о системе
- Proxmox установлен на одном диске (/dev/sdb) с ZFS
- Системный пул называется rpool
- Новый диск подключён как /dev/sda
- Используется UEFI загрузка
Проверка текущего состояния Proxmox
Для начала взглянем что у нас с ZFS:
zpool status
Пример вывода:
pool: rpool
state: ONLINE
scan: scrub repaired 0B in 00:00:26 with 0 errors on Sun May 11 00:24:27 2025
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
ata-SuperMicro_SSD_SMC0515D90722CB44445-part3 ONLINE 0 0 0
Мы видим что системный том действительно называется rpool и состоит из одного диска. Точнее даже не диска целиком а одной из партиций диска — part3 . Так как у нас в ZFS используется Disk-ID, проверим какому диску этот Disk-ID соответствует :
ls -l /dev/disk/by-id/ata-SuperMicro_SSD_SMC0515D90722CB44445
И мы видим что данный ID это символическая ссылка на диск sdb, то есть информация по диску от клиента верна :
lrwxrwxrwx 1 root root 9 May 26 13:12 /dev/disk/by-id/ata-SuperMicro_SSD_SMC0515D90722CB44445 -> ../../sdb
Взглянем что у нас с дисками
Для начала диск который в данный момент используется как системный (в вашем случае это может быть другой диск) :
fdisk -l /dev/sdb
Получаем следующую информацию :
Disk /dev/sdb: 59 GiB, 63350767616 bytes, 123731968 sectors
Disk model: SuperMicro SSD
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 95BC74E5-551A-47EB-ADC5-BA2D85CEB4CF
Device Start End Sectors Size Type
/dev/sdb1 34 2047 2014 1007K BIOS boot
/dev/sdb2 2048 2099199 2097152 1G EFI System
/dev/sdb3 2099200 83886080 81786881 39G Solaris /usr & Apple ZFS
Это стандартная разбивка системного диска для Proxmox 7/8, под UEFI используется 2 раздел. Очень хорошо, продолжаем. Теперь надо понять какой диск поставили для зеркала, клиент написал что это sda :
fdisk -l /dev/sda
Видим чистый диск такого же размера как и наш системный — 64гб. Это диски Supermicro SATA DOM, предназначенные для серверных систем с питанием на 8 пине. Очень хорошие и надежные.
Disk /dev/sda: 59 GiB, 63350767616 bytes, 123731968 sectors
Disk model: SuperMicro SSD
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Проверка текущего типа загрузки
Убедитесь, что используется proxmox-boot:
proxmox-boot-tool status
Пример вывода:
Re-executing '/usr/sbin/proxmox-boot-tool' in new private mount namespace..
System currently booted with uefi
BC5B-E6D6 is configured with: uefi (versions: 5.15.158-2-pve, 6.8.12-10-pve, 6.8.12-11-pve)
Загрузчик нам показывает что системы работает с UEFI а не legacy boot. То есть вся информация предоставленная нам изначально клиентом подтвердилась и мы можем приступать к нашей задаче
Очистка второго диска
В нашем случае диск пришел на замену по рекламации, он мог быть в тестировании или использован как то, поэтому очистим все следы которые могли на нем остаться :
sgdisk --zap-all /dev/sda
wipefs -a /dev/sda
partprobe /dev/sda
Клонирование разметки с первого диска
Тут как говорится надо не перепутать диски — sdb у нас существующий, sda новый
sgdisk -R=/dev/sda /dev/sdb
sgdisk -G /dev/sda
lsblk -o NAME,SIZE,TYPE,PARTLABEL /dev/sda
Присоединение нового диска к зеркалу ZFS
Если ваш ZFS-пул использует раздел /dev/sdb3, уточните это:
zpool status
pool: rpool
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
ata-SuperMicro_SSD_SMC0515D90722CB44445-part3 ONLINE 0 0 0
errors: No known data errors
После нам надо узнать ID нового диска, точнее его 3 раздела :
ls -l /dev/disk/by-id/ | grep -i sda
lrwxrwxrwx 1 root root 9 May 26 14:29 ata-SuperMicro_SSD_SMC0515D94317CHE5147 -> ../../sda
lrwxrwxrwx 1 root root 10 May 26 14:29 ata-SuperMicro_SSD_SMC0515D94317CHE5147-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 May 26 14:29 ata-SuperMicro_SSD_SMC0515D94317CHE5147-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 May 26 14:29 ata-SuperMicro_SSD_SMC0515D94317CHE5147-part3 -> ../../sda3
А далее нам надо присоединить ata-SuperMicro_SSD_SMC0515D94317CHE5147-part3 к нашему rpool в котором есть ata-SuperMicro_SSD_SMC0515D90722CB44445-part3 :
zpool attach rpool \
ata-SuperMicro_SSD_SMC0515D90722CB44445-part3 \
ata-SuperMicro_SSD_SMC0515D94317CHE5147-part3
Проверка:
zpool status
Вы увидите, как идёт ресинхронизация (resilvering).
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon May 26 14:34:50 2025
8.56G / 8.56G scanned, 136M / 8.56G issued at 68.2M/s
125M resilvered, 1.56% done, 00:02:06 to go
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-SuperMicro_SSD_SMC0515D90722CB44445-part3 ONLINE 0 0 0
ata-SuperMicro_SSD_SMC0515D94317CHE5147-part3 ONLINE 0 0 0 (resilvering)
errors: No known data errors
Когда перестроение закончится , мы увидим красивую картину — наша система сейчас работает в RAID1:
pool: rpool
state: ONLINE
scan: resilvered 8.74G in 00:01:37 with 0 errors on Mon May 26 14:36:27 2025
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-SuperMicro_SSD_SMC0515D90722CB44445-part3 ONLINE 0 0 0
ata-SuperMicro_SSD_SMC0515D94317CHE5147-part3 ONLINE 0 0 0
errors: No known data errors
Настройка загрузчика
С самой системой мы разобрались — теперь всё работает, остается разобраться с загрузчиком. Напомним, что в UEFI используется второй раздел диска, поэтому будем работать с ним.
Важно: format /dev/sda2, а не /dev/sda!
proxmox-boot-tool format /dev/sda2
Это:
создаст новую ESP (EFI System Partition),
отформатирует её в FAT32,
настроит её как загрузочную.
Убедитесь, что /dev/sda2 — это EFI-раздел на новом диске. Если вы клонировали таблицу разделов с помощью sgdisk -R, он уже существует.
Синхронизация содержимого proxmox-boot:
proxmox-boot-tool init /dev/sda2
proxmox-boot-tool refresh
Это:
установит GRUB и необходимые файлы EFI,
синхронизирует ядра и initrd на новом диске.
Проверка:
После выполнения:
proxmox-boot-tool status
Ожидаемый вывод — оба диска настроены на загрузку:
Re-executing '/usr/sbin/proxmox-boot-tool' in new private mount namespace..
System currently booted with uefi
3579-98A0 is configured with: uefi (versions: 5.15.158-2-pve, 6.8.12-10-pve, 6.8.12-11-pve)
BC5B-E6D6 is configured with: uefi (versions: 5.15.158-2-pve, 6.8.12-10-pve, 6.8.12-11-pve)
Проверьте так же :
efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0000,0002,0008,0003,0007
Boot0000* Linux Boot Manager
Boot0002* Linux Boot Manager
Boot0003* UEFI: Built-in EFI Shell
Boot0007 Hard Drive
Boot0008* UEFI OS
Мы видим что Linux Boot Manager установлен уже на 2 дисках.
Тестирование отказоустойчивости
Перезагрузитесь, отключите один из дисков и проверьте, что система успешно загружается с другого.
Итог
- Система теперь работает в зеркале ZFS (RAID1)
- Оба диска настроены как загрузочные
- Используется proxmox-boot-tool для управления загрузкой
Напишите в комментариях, если есть вопросы или что то осталось не понятно.