Среди огромного набора вопросов, которые могут решаться администратором, периодически возникает такая необходимость задача, как расширение корневой файловой системы. Если у Вас используется Solaris на платфоре x86/amd64 и корневая файловая система расположена на ZFS, то это не просто, а очень просто.
Задача не самая сложная, более того, естественным образом некоторой частью пересекается со статьёй моего коллеги по клонированию корневого пула, но, имеет некоторое количество существенных отличий, и, учитывая количество шагов для её выполнения, точная последовательность действий не повредит.
Приступим. Начать лучше с проверки состояния корневого пула:
# zpool status rpool
pool: rpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c0t0d0s0 ONLINE 0 0 0
c0t1d0s0 ONLINE 0 0 0
errors: No known data errors
Что позволит убедиться в отсутствии проблем на момент начала работ и позволит вспомнить имена используемых устройств.
Если всё хорошо, то рубим сук, на котором сидим отключаем одну из половинок зеркала:
# zpool split rpool rpool1 c0t1d0s0
И отключаем диск от системы:
# cfgadm -c unconfigure c0::dsk/c0t1d0
После чего идём к серверу и заменяем отключенный диск новым, имеющим больший объём.
Если используются SCSI диски, то потребуется сконфигурировать диск обратно:
# cfgadm -c configure c0::dsk/c0t1d0
Для SAS и FC дисков это действие не нужно и достаточно убедиться в том, что система увидела новый диск:
# cfgadm -v c0::dsk/c0t1d0
Ap_Id Receptacle Occupant Condition Information
When Type Busy Phys_Id
c0::dsk/c0t1d0 connected configured unknown SEAGATE ST91000640SS
unavailable disk n /devices/pci@0,0/pci1022,7450@2/pci1000,3060@3:scsi::dsk/c0t1d0
Далее, если встален новый диск, потребуется создать таблицу разделов:
# fdisk c0t1d0p0
No fdisk table exists. The default partition for the disk is:
a 100% "SOLARIS System" partition
Type "y" to accept the default partition, otherwise type "n" to edit the
partition table.
Так как размеры и геометрия старого маленького и нового большого дисков не совпадает, руками создаём на новом диске слайс для корневой файловой системы:
# format c0t1d0
selecting c0t1d0
[disk formatted]
FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
fdisk - run the fdisk program
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
volname - set 8-character volume name
!<cmd> - execute <cmd>, then return
quit
format> partition
PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
!<cmd> - execute <cmd>, then return
quit
partition> print
Current partition table (original):
Total disk cylinders available: 60797 + 2 (reserved cylinders)
Part Tag Flag Cylinders Size Blocks
0 unassigned wm 0 0 (0/0/0) 0
1 unassigned wm 0 0 (0/0/0) 0
2 backup wu 0 - 60796 931.46GB (60797/0/0) 1953407610
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 15.69MB (1/0/0) 32130
9 unassigned wm 0 0 (0/0/0) 0
partition> 0
Part Tag Flag Cylinders Size Blocks
0 unassigned wm 0 0 (0/0/0) 0
Enter partition id tag[unassigned]: root
Enter partition permission flags[wm]:
Enter new starting cyl[1]:
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 60796c
partition> print
Current partition table (unnamed):
Total disk cylinders available: 60797 + 2 (reserved cylinders)
Part Tag Flag Cylinders Size Blocks
0 root wm 1 - 60796 931.44GB (60796/0/0) 1953375480
1 unassigned wm 0 0 (0/0/0) 0
2 backup wu 0 - 60796 931.46GB (60797/0/0) 1953407610
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 15.69MB (1/0/0) 32130
9 unassigned wm 0 0 (0/0/0) 0
partition> label
Ready to label disk, continue? y
Также важно не забыть установить на диск загрузчик:
# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0t1d0s0
stage1 written to partition 0 sector 0 (abs 32130)
stage2 written to partition 0, 273 sectors starting at 50 (abs 32180)
Подключаем зеркалом к нашему старому маленькому диску новый большой диск:
# zpool attach -f rpool c0t0d0s0 c0t1d0s0
Make sure to wait until resilver is done before rebooting.
Ключ -f необходимо указать, так как в противоположном случае ZFS не нравится тот факт, что слайсы 0 (для пула) и 2 (исторический для резервного копирования) пересекаются между собой.
Теперь можно убедиться в том, что началось сведение зеркала:
# zpool status -x
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 Wed Aug 29 13:51:50 2012
15,7G scanned out of 40,8G at 11,0M/s, 0h39m to go
15,7G scanned out of 40,8G at 11,0M/s, 0h39m to go
15,7G resilvered, 38,43% done
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c0t0d0s0 ONLINE 0 0 0
c0t1d0s0 ONLINE 0 0 0 (resilvering)
errors: No known data errors
И откинуться на спинку табуретки и выпить рюмку чая. Наслаждаться этим потребуется до тех пор, пока не закончится синхронизация зеркала:
# zpool status -x
all pools are healthy
Включаем автоматическое увеличение размера пула:
# zpool set autoexpand=on rpool
Проверяем его размер:
# zpool list rpool
NAME SIZE ALLOC FREE CAP HEALTH ALTROOT
rpool 68G 40,8G 27,2G 59% ONLINE -
И отключаем от зеркала старый диск:
# zpool split rpool rpool0 c0t0d0s0
О чудо:
# zpool list rpool
NAME SIZE ALLOC FREE CAP HEALTH ALTROOT
rpool 931G 40,8G 890G 4% ONLINE -
Размер пула увеличился!
Немного прокомментирую собственно момент увеличения размера пула.
Во-первых, даже при выключенном autoexpand, то после отключения от зеркала маленького диска его уже нельзя будет вернуть обратно:
# zpool attach -f rpool c0t1d0s0 c0t0d0s0
cannot attach c0t0d0s0 to c0t1d0s0: device is too small
Во-вторых, если не включать autoexpand, то увеличение размера пула всё равно произойдёт после экспорта и импорта пула (что невозможно для корневого пула) или после перезагрузки системы.
В-третьих, если собственно autoexpand можно включить и после отключения маленького диска, размер пула при этом увеличится после его включения.
В-четвёртых, в достаточно старых версиях ZFS свойства autoexpand пул не имел, и расширение пула происходило всегда сразу после отключения маленького диска.
После того, как размер пула был увеличен, авторасширение можно отключить:
# zpool set autoexpand=off rpool
Теперь можно отключить второй диск:
# cfgadm -c unconfigure c0::dsk/c0t0d0
Заменить его на новый, и приступить к его подготовке к влючению в зеркало:
# fdisk c0t0d0p0
No fdisk table exists. The default partition for the disk is:
a 100% "SOLARIS System" partition
Type "y" to accept the default partition, otherwise type "n" to edit the
partition table.
Копируем таблицу слайсов со второго диска:
# prtvtoc /dev/dsk/c0t1d0s2 | fmthard -s - /dev/rdsk/c0t0d0s2
И не забываем про загрузчик:
# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0t0d0s0
stage1 written to partition 0 sector 0 (abs 32130)
stage2 written to partition 0, 273 sectors starting at 50 (abs 32180)
Завершаем операцию подключением диска обратно в зеркало:
# zpool attach -f rpool c0t1d0s0 c0t0d0s0
После чего можно оставить систему сводить зеркало, а самим поставить галочку об успешном завершении работ по расширению корневой файловой системы.