Имеем FreeBSD 9.0 RELEASE установленную в в качестве гостевой операционной системы с VMWare vSphere 5.0. Файловая система ZFS. Основной диск 100 Гб — маловат — задача перехать на диск большего объема — 200 Гб.
Мы уже рассматривали такой вариант — там мы просто средствами платформы виртуализации увеличивали объем диска. А если реальное железо? Пробуем тоже самое — но с заменой дисков.
Имеем:
# dmesg | grep da0 da0 at mpt0 bus 0 scbus2 target 0 lun 0 da0: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device da0: 320.000MB/s transfers (160.000MHz, offset 127, 16bit) da0: Command Queueing enabled da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C) # gpart show => 34 209715133 da0 GPT (100G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G) # zpool status -v pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da0p2 ONLINE 0 0 0 errors: No known data errors
Идем VMWare vShere Client выбираем Inventory — Virtual Machine — Edit Settings. Закладка Hardware — кнопка Add. Добавляем еще один жесткий диск объемом 200 Гб. Тут же получаем:
# tail /var/log/messages | grep da1 kernel: da1 at mpt0 bus 0 scbus2 target 1 lun 0 kernel: da1: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device kernel: da1: 320.000MB/s transfers (160.000MHz, offset 127, 16bit) kernel: da1: Command Queueing enabled kernel: da1: 204800MB (419430400 512 byte sectors: 255H 63S/T 26108C)
Размечаем новый диск с помощью gpart.
# gpart create -s gpt da1 da1 created # gpart add -b 34 -s 94 -t freebsd-boot da1 da1p1 added # gpart add -t freebsd-zfs -l disk0 da1 da1p2 added # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da1 bootcode written to da1
Смотрим что получилось.
# gpart show => 34 209715133 da0 GPT (100G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G) => 34 419430333 da1 GPT (200G) 34 94 1 freebsd-boot (47k) 128 419430239 2 freebsd-zfs (200G)
Смотрим состояние переменной autoexpand нашего пула zroot.
# zpool get autoexpand zroot NAME PROPERTY VALUE SOURCE zroot autoexpand off default
Разрешаем автоувеличение пула.
# zpool set autoexpand=on zroot # zpool get autoexpand zroot NAME PROPERTY VALUE SOURCE zroot autoexpand on local
Присоединяем новый диск в массив.
# zpool attach zroot da0p2 da1p2 Make sure to wait until resilver is done before rebooting. If you boot from pool 'zroot', you may need to update boot code on newly attached disk 'da1p2'. Assuming you use GPT partitioning and 'da0' is your new boot disk you may use the following command: gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
Смотрим что получилось.
# zpool status -v pool: zroot 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 Dec 3 10:08:52 2012 1.40G scanned out of 3.14G at 23.4M/s, 0h1m to go 1.40G resilvered, 44.48% done config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 da0p2 ONLINE 0 0 0 da1p2 ONLINE 0 0 0 (resilvering) errors: No known data errors
Идет перенос данных (ресилвер). Хоть мы и записывали загрузчик на новый диск в самом начале — но раз просит — обновим его везде, эту операцию можно производить прямо во время переноса данных.
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0 bootcode written to da0 # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da1 bootcode written to da1
Перенос данных проходит быстро. На моем оборудовании 3 Гб данных было перенесено за 1 минуту.
# zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 da0p2 ONLINE 0 0 0 da1p2 ONLINE 0 0 0 errors: No known data errors
Удаляем старый диск из пула.
# zpool detach zroot da0p2
Смотрим что получилось.
# zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da1p2 ONLINE 0 0 0 errors: No known data errors # df -h zroot Filesystem Size Used Avail Capacity Mounted on zroot 189G 350M 189G 0% /
Возвращаем значения по умолчанию.
# zpool set autoexpand=off zroot # zpool get autoexpand zroot NAME PROPERTY VALUE SOURCE zroot autoexpand off default
Удаляем старый диск.
# tail /var/log/messages kernel: mpt0: Rescan Port: 0 kernel: (da0:mpt0:0:0:0): lost device - 0 outstanding kernel: (da0:mpt0:0:0:0): removing device entry # gpart show => 34 419430333 da1 GPT (200G) 34 94 1 freebsd-boot (47k) 128 419430239 2 freebsd-zfs (200G) # zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da1p2 ONLINE 0 0 0 errors: No known data errors
Ну и для очистки совести контрольная перезагрузка.
# gpart show => 34 419430333 da0 GPT (200G) 34 94 1 freebsd-boot (47k) 128 419430239 2 freebsd-zfs (200G) # zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da0p2 ONLINE 0 0 0 errors: No known data errors # df -h zroot Filesystem Size Used Avail Capacity Mounted on zroot 189G 350M 189G 0% /
Данный способ подходит для любого типа реального железа — более того, если у вас оборудование позволяет менять жесткие диски на горячую — мы можем произвести данную операцию без остановки обслуживания.