August 3rd, 2009

VR

FreeBSD + ZFS: ZPool migration

Есть у меня машинка под FreeBSD. Выполняет она роль домашнего сервера со всеми возможными и невозможными функциями. Пережила она уже много всяких переездов и апгрейдов, включая недавний переезд с ufs на zfs-root (вместе с ufs-boot, почитать о подробностях такого можно тут: Root on ZFS configuration with UFS /boot). Всё бы ничего, но вдруг в одном из страйпов забарахлил веник – начали сыпаться DMA timeout-ы, редко, но метко. На замену был куплен веник и появилась другая проблема: корректно перенести пока ещё живой zpool на другой веник. Заодно было решено отказаться от ufs-boot и перейти полностью на загрузку с zfs, благо фряха это позволяет с некотрых пор. В принципе документации на эту тему не то чтобы много, но что-то найти можно. Относительно zfsboot разные решения можно посмотреть здесь: ZFS boot on zfs mirror, Root on ZFS configuration (zfsboot), Setting up a zfs-only system.

Итак, исходные данные: два zpool-а построенные поверх gstripe: luna (system, 2x320, одна из которых сыпется) и tera (2x500). Переехать нужно будет на uranus (1TB, сюда переедет tera) и neptune (mirror, 2x500, на него переедет luna). При этом необходимо сохранить все свойства навешанные на файловые системы.

Этап первый, tera –> uranus.

Для этого пришлось написать небольшой скрипт. Работа достаточно проста: берём датасет из исходного пула, создаём аналогичный в приёмнике, переносим все нужные свойства и данные. Не переопределяются только mountpoint-ы, но в данном случае это было не смертельно, т.к. в данном случае dataset-ы не переопределяли точку монтирования. После переноса оставалось только поправить ссылки на новые mountpoint-ы и всё. Судя по ману всё подобную работу может сделать ключик –R у zfs send (если верить ману), но у меня было выпадение в корку где-то в дебрях libzfs и особо разбираться желания не было, проще было скрипт написать.

  1. #! /bin/sh
  2.  
  3. SRC=tera
  4. DST=uranus
  5.  
  6. ZFS=zfs
  7.  
  8. zfs list -H | grep "^$SRC" | while read line
  9. do
  10. SRCDSET=`echo $line | cut -f 1 -d ' '`
  11. SIZE=`echo $line | cut -f 2 -d ' ' | sed -E -e 's/(,[[:digit:]]+)//'`
  12.  
  13. echo Processing dataset $SRCDSET
  14. DSTDSET=`echo $SRCDSET | sed -E -e "s/^$SRC/$DST/"`
  15.  
  16. echo '==>' Creating dataset $DSTDSET
  17. $ZFS create $DSTDSET
  18.  
  19. echo '==>' Moving props
  20. zfs get -H all $SRCDSET | grep -E -v '(-|default|temporary)$' | grep -E -v 'inherited from' | while read prop
  21. do
  22. NAME=`echo $prop | cut -f 2 -d ' '`
  23. VALUE=`echo $prop | cut -f 3 -d ' '`
  24.  
  25. if [ "$NAME" = "mountpoint" ]
  26. then
  27. VALUE=`echo $VALUE | sed -E -e s/$SRC/$DST/`
  28. continue
  29. fi
  30.  
  31. echo '====>' Seting prop "$NAME" to "$VALUE"
  32. $ZFS set $NAME=$VALUE $DSTDSET
  33. done
  34.  
  35. echo '==>' Moving data
  36. echo '====>' Creating snapshot
  37. $ZFS snapshot $SRCDSET@migration
  38.  
  39. echo '====>' Copy data
  40. $ZFS send $SRCDSET@migration | pv -s $SIZE | $ZFS receive -F $DSTDSET
  41.  
  42. echo '====>' Cleanup
  43. $ZFS destroy $SRCDSET@migration
  44. $ZFS destroy $DSTDSET@migration
  45.  
  46. echo 'Done!'
  47. echo
  48. done



Этап второй, luna –> neptune, будет немного позже. Stay tuned.

VR

FreeBSD + ZFS: zfs only system

Появилась другая задача: поставить FreeBSD на zfs без каких либо разделов и прочего – zpool размером с винчестер и всё на нём. В предыдущем посте есть ссылки на инструкции по установке на различные конфигурации, а вот установку на zfs only пришлось додумывать самаму, ибо местами были разбросаны камни о которых никто не упоминал.

Collapse )
  • Current Music
    Liv Kristine - In the Heart of Juliet
  • Tags
    ,