Table of Contents

Было

Диски HDD разбиты одиаково на три партиции (EFI, boot, data).
Разделы data - в зеркальном массиве mdadm. На нем лежит два lvm - корень системы и lvm с данными под ZFS.
Диски SSD - по одному разделу, в зеркальном массиве mdadm, поверх массива - LVM, а lmv используются как swap, zfs ZIL и ZFS L2ARC.
Зеркальные массивы mdadm на 2-х дисках HDD и 2-х SSD.
На массивах - LVM. На LVM - ZFS.

диски

sda, sdb - HDD
sdc, sdd - SSD

mdsdtat

cat /proc/mdstat 
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid1 sda3[0] sdb3[1]
      1953250304 blocks [2/2] [UU]
      bitmap: 7/15 pages [28KB], 65536KB chunk

md2 : active raid1 sdd1[0] sdc1[1]
      97683584 blocks [2/2] [UU]
      
unused devices: <none>

pvdisplay

 
  --- Physical volume ---
  PV Name               /dev/md1
  VG Name               pve
  PV Size               <1.82 TiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              476867
  Free PE               0
  Allocated PE          476867
  PV UUID               rCzF98-PuUS-Meer-8Ger-vffN-vBXQ-kNciWH
   
  --- Physical volume ---
  PV Name               /dev/md2
  VG Name               pve
  PV Size               <93.16 GiB / not usable 2.12 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              23848
  Free PE               0
  Allocated PE          23848
  PV UUID               8d4I3j-p4UL-k8dq-bolM-pC8w-z21H-HoOZcv

lvdisplay -m

  --- Logical volume ---
  LV Path                /dev/pve/swap
  LV Name                swap
  VG Name                pve
  LV UUID                dGxWuM-iYbO-QHLU-SILo-LVJa-2NMX-ZWf2fe
  LV Write Access        read/write
  LV Creation host, time proxmox, 2018-10-24 22:47:17 +0300
  LV Status              available
  # open                 0
  LV Size                32.00 GiB
  Current LE             8192
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
   
  --- Segments ---
  Logical extents 0 to 8191:
    Type                linear
    Physical volume     /dev/md1
    Physical extents    0 to 8191
   
   
  --- Logical volume ---
  LV Path                /dev/pve/root
  LV Name                root
  VG Name                pve
  LV UUID                a7G2ko-sOhu-iM4f-kYQb-2Y8M-u9J2-dlLEQX
  LV Write Access        read/write
  LV Creation host, time proxmox, 2018-10-24 22:47:17 +0300
  LV Status              available
  # open                 1
  LV Size                16.00 GiB
  Current LE             4096
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
   
  --- Segments ---
  Logical extents 0 to 4095:
    Type                linear
    Physical volume     /dev/md1
    Physical extents    8192 to 12287
   
   
  --- Logical volume ---
  LV Path                /dev/pve/swap-ssd
  LV Name                swap-ssd
  VG Name                pve
  LV UUID                oS0M42-tXl0-0Lal-SJva-6ejX-kucf-xyfuC0
  LV Write Access        read/write
  LV Creation host, time proxmox, 2019-02-16 01:00:38 +0300
  LV Status              available
  # open                 2
  LV Size                32.00 GiB
  Current LE             8192
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
   
  --- Segments ---
  Logical extents 0 to 8191:
    Type                linear
    Physical volume     /dev/md2
    Physical extents    0 to 8191
   
   
  --- Logical volume ---
  LV Path                /dev/pve/data-zfs-lvm
  LV Name                data-zfs-lvm
  VG Name                pve
  LV UUID                0MBZHE-D1q2-A4Bd-VZPy-RUgb-l8es-erxcyy
  LV Write Access        read/write
  LV Creation host, time proxmox, 2019-08-14 13:14:39 +0300
  LV Status              available
  # open                 1
  LV Size                1.77 TiB
  Current LE             464579
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3
   
  --- Segments ---
  Logical extents 0 to 464578:
    Type                linear
    Physical volume     /dev/md1
    Physical extents    12288 to 476866
   
   
  --- Logical volume ---
  LV Path                /dev/pve/zfs-zil
  LV Name                zfs-zil
  VG Name                pve
  LV UUID                kOW2k0-MhrC-97Fp-6kVf-qkdl-Jn35-3vXC6h
  LV Write Access        read/write
  LV Creation host, time proxmox, 2019-08-15 11:36:09 +0300
  LV Status              available
  # open                 1
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4
   
  --- Segments ---
  Logical extents 0 to 2047:
    Type                linear
    Physical volume     /dev/md2
    Physical extents    8192 to 10239
   
   
  --- Logical volume ---
  LV Path                /dev/pve/zfs-l2arc
  LV Name                zfs-l2arc
  VG Name                pve
  LV UUID                waJkhg-nRfS-rqTg-tvQk-Zpt3-30gm-t6bqTG
  LV Write Access        read/write
  LV Creation host, time proxmox, 2019-08-15 11:36:54 +0300
  LV Status              available
  # open                 1
  LV Size                <53.16 GiB
  Current LE             13608
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:5
   
  --- Segments ---
  Logical extents 0 to 13607:
    Type                linear
    Physical volume     /dev/md2
    Physical extents    10240 to 23847

ZFS

zpool status
  pool: pve-data
 state: ONLINE
  scan: scrub repaired 0B in 1 days 01:47:53 with 0 errors on Mon May 11 02:11:55 2020
config:

        NAME            STATE     READ WRITE CKSUM
        pve-data        ONLINE       0     0     0
          data-zfs-lvm  ONLINE       0     0     0
        logs
          zfs-zil       ONLINE       0     0     0
        cache
          zfs-l2arc     ONLINE       0     0     0

errors: No known data errors

Стало

диски

На каждом HDD - четыре раздела:

  1. EFI
  2. boot
  3. root
  4. data

На каждом SSD три раздела:

  1. swap
  2. ZIL
  3. L2ARC

mdadm

Должны остаться два массива - первый root на HDD под LVM, второй - swap на SSD без LVM.

LVM

Одинственный pv - mdadm массив на HDD под root.

ZFS

Все функции зеркалирования для данных переезжают на ZFS.

Что делаем

Перенос будет происходить на живой системе.

SSD

Примерный порядок:

  1. отключаем весь функционал на SSD (swap, ZIL, L2ARC).
    zpool remove pve-data /dev/pve/zfs-zil
    zpool remove pve-data  /dev/pve/zfs-l2arc
    swapoff -a

  2. переразбиваем диски. Размер раздела под ZIL - вычисляется по формуле 'скорость записи на SSD' * 'интервал сброса изменений на диск'. Дефолтный интервал сброса данных (commit interval) - 5 секунд. ТО есть в случае с SATA SSD размер ZIL должне быть 250MB/s * 5s = 1250 Mb. Получилось примерно так:

    Device        Start       End   Sectors  Size Type
    /dev/sdd1      2048  67110911  67108864   32G Linux swap
    /dev/sdd2  67110912  75499519   8388608    4G Linux filesystem
    /dev/sdd3  75499520 195369421 119869902 57.2G Linux filesystem

  3. создаем mdadm-массив, создаем на нем swap, прописываем в /etc/fstab и включаем

    sudo mdadm --create /dev/md2 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdc1 /dev/sdd1
    sudo mkswap /dev/md2
    swapon -a

  4. Включаем обратно ZIL в зеркальном режиме

    sudo zpool add pve-data log mirror /dev/sdc2 /dev/sdd2

    и L2ARC в обычном режиме (zfs не поддерживает cache в зеркальном режиме )

    sudo zpool add pve-data cache /dev/sdc3 /dev/sdd3

    .

HDD

Примерный порядок:

  1. изымаем один из дисков из массива mdadm.
    sudo mdadm /dev/md1 -r /dev/sda3

  2. переразбиваем (количество разделов должно стать 4 - третий раздел должен разделиться на два - root и data).

    sudo sgdisk --zap-all /dev/sda
    sudo sgdisk -n 1:2048:4095 /dev/sda
    sudo sgdisk -t 1:EF02 /dev/sda
    sudo sgdisk -n 2:4096:528383 /dev/sda
    sudo sgdisk -t 2:EF00 /dev/sda
    sudo sgdisk -n 3:528384:+16394MiB /dev/sda
    sudo sgdisk -t 3:FD00 /dev/sda
    sudo sgdisk -n 4:34103296:0 /dev/sda

    Было:

    Number  Start (sector)    End (sector)  Size       Code  Name
       1            2048            4095   1024.0 KiB  EF02  
       2            4096          528383   256.0 MiB   EF00  
       3          528384      3907029134   1.8 TiB     FD00

    Стало:

    Number  Start (sector)    End (sector)  Size       Code  Name
       1            2048            4095   1024.0 KiB  EF02  
       2            4096          528383   256.0 MiB   EF00  
       3          528384        34103295   16.0 GiB    FD00  
       4        34103296      3907029134   1.8 TiB     8300

  3. создаем на новом разделе root зеркальный массив mdadm из одного диска.

    sudo mdadm --zero-superblock /dev/sda3
    sudo mdadm --create /dev/md3 --level=1 --raid-devices=2 --metadata=0.90 /dev/sda3 missing
    sudo mdadm --detail --scan | sudo tee /etc/mdadm/mdadm.conf

  4. Добавляем новый зеркальный массив mdadm в Volume Group pve и перемещаем на него root lvm.

    sudo pvcreate /dev/md3
    sudo vgextend pve /dev/md3
    sudo pvmove -n /dev/pve/root /dev/md1 /dev/md3
    update-grub
    update-initramfs -u

  5. В существующий ZFS-pool подключаем новый data раздел в качестве зеркала.

    sudo zpool attach pve-data /dev/pve/data-zfs-lvm /dev/sda4

    и ждем синхронизации. Состояние синхронизации смотрим так:

    sudo zpool status

  6. Изымаем из ZFS-pool старое устрйоство (lvm)

    sudo zpool detach pve-data /dev/pve/data-zfs-lvm

  7. В результате старый массив mdadm (на котором были lvm root и data) освободится и его можно будет остановить:

     sudo lvremove /dev/pve/data-zfs-lvm
    sudo vgreduce pve /dev/md1
    sudo pvremove /dev/md1
    sudo mdadm --stop /dev/md1
    sudo mdadm --zero-superblock /dev/sdb3

  8. Перезбиваем второй диск на четыре раздела, подключаем третий раздел в mdadm-массив, а четвертый в - качестве mirror в zfs-pool:

    sudo sgdisk -d 3 /dev/sdb
    sudo sgdisk -n 3:528384:34103295 /dev/sdb
    sudo partprobe /dev/sdb
    sudo sgdisk  -t 3:FD00 /dev/sdb
    sudo partprobe /dev/sdb
    sudo sgdisk -n 4:34103296:0 /dev/sdb
    sudo partprobe /dev/sdb

    Вот в этом месте надо бы перезагрузиться, поскольку есть сомнения, что таблица разделов хорошая. После ребута добавляем разделы в зеркала (mdadm и zfs)

    sudo zpool attach pve-data /dev/sda4 /dev/sdb4
    sudo mdadm --add /dev/md3 /dev/sdb3

    ждем синхронизации

    sudo mdadm --detail --scan | sudo tee /etc/mdadm/mdadm.conf
    update-grub
    update-initramfs -u

Всё. Тестировать на производительность не тестировал, но логично, что удаление двух промежуточных слоев абстракции (mdadm и lvm) из-под zfs pool должно пойти на пользу.