Aleksey Salow (w00dy) wrote,
Aleksey Salow
w00dy

Category:
  • Mood:

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.

Tags: freebsd, zfs
Subscribe

  • О датах

    Запишем даты в список проклятых тем в этом вашем вайти в которые никто не умеет. У всех с этими датами, временем, таймзонами выходит какая-то херня…

  • Ремонт: часть 3, электрификация всей страны

    Советы по электрической части. Без философских рассуждений, строго по делу. Выбирая вот это всё, я руководствовался двумя простыми правилами: не…

  • Ремонт: часть 2, генплан

    В основе ремонта должен быть план. Что где стоит, куда подключено, куда сливает, и ответы на прочие насущные вопросы. Так уж получилось, что…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments