null

Расширение корневого пула на Solaris

Среди огромного набора вопросов, которые могут решаться администратором, периодически возникает такая необходимость задача, как расширение корневой файловой системы. Если у Вас используется 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

После чего можно оставить систему сводить зеркало, а самим поставить галочку об успешном завершении работ по расширению корневой файловой системы.

Коротко о себе:

Работаю в компании Tune-IT и тьютором кафедры Вычислительной техники в СПбГУИТМО.

Очень люблю команду cat, core solaris и IPv6.