четверг, 3 января 2008 г.

Создание Solaris зоны в пуле ZFS

Собственно сегодня хочу показать как создать пул ZFS и запустить в нем зону (Solaris Zones/Containers). Все действия само собой производятся на ОС Sun Solaris. У меня это Sun OpenSolaris Express Community Edition (x86/x86_64), но все описаное ниже уже давно работает в официальных релизах, например Sun Solaris 10 8/07.

1. Создание пула ZFS.

Сама по себе процедура довольна легкая так что начнем.
Для начала нам нужно создать пул памяти ZFS. Собственно тут есть несколько вариантов.

1. Пул может быть файлом, который в последующем можно использовать как файловую систему ZFS. Но этот способ я использовал когда у меня не было достаточно жестких дисков для тестов и в боевой системе это нам не подойдет.
bash-3.2# mkfile 2G /somefile
2. Использование слайсов диска например c0t0d0s5 и c0t0d0s6.
3. Использование целых дисков. Например c0t0d0 и c0t0d1 итд.

Что же мы будем использовать 2 и 3 способы в качестве показательных выступлений возможности ZFS и Zones. Но для начала давайте посмотрим какие диски у нас есть.
bash-3.2# format
Searching for disks...done
AVAILABLE DISK SELECTIONS:
0. c0d0
/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0
1. c1d1
/pci@0,0/pci-ide@7,1/ide@1/cmdk@1,0
Specify disk (enter its number): ^D
Мы будем использовать c1d1 в качестве диска для нашей зоны которую мы назовем - oracle. Этот диск является отдельным диском. А c0d0 будет у нас иметь слайс 6 - который имеет объем более 40 Гб и данный слайс мы подключим как домолнительный диск к нашей зоне oracle.
Проверяем установлены ли пакеты ZFS на нашей системе.
bash-3.2# pkginfo | grep zfs
system SUNWzfskr ZFS Kernel (Root)
system SUNWzfsr ZFS (Root)
system SUNWzfsu ZFS (Usr)
Если пакеты не найдены то ознакомтесь с версией вашей операционой системы так как ZFS официально пришел в Solaris 10 только в версии 6/06. Если с версией все нормально то пробуйте установить пакеты с установочных CD.

Итак создаем пул памяти и смотрим что у нас получилось
bash-3.2# zpool create zones c1d1
bash-3.2# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
zones 19.4G 94K 19.4G 0% ONLINE -
bash-3.2# df -h /zfs
Filesystem size used avail capacity Mounted on
zones 19G 18K 19G 1% /zones
Как мы видим после создания пул автоматически монтируется в корневой каталог с тем же именем что и название пула. Давайте поменяем точку монтирования для нашей файловой системы.
bash-3.2# mkdir /zfs
bash-3.2# zfs set mountpoint=/zfs zones
bash-3.2# zfs get mountpoint zones
NAME PROPERTY VALUE SOURCE
zones mountpoint /zfs local
bash-3.2# df -h /zfs
Filesystem size used avail capacity Mounted on
zones 19G 18K 19G 1% /zfs
Теперь давайте создадим файловую систему внутри нашего пула для зоны oracle.
bash-3.2# zfs create zones/oracle
bash-3.2# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zones 142K 19.1G 19K /zfs
zones/oracle 18K 19.1G 18K /zfs/oracle
Отлично! Теперь давайте ограничем дисковый объем для данной файловой системы. Как мы видим после создание файловой системы она принимает объем всего пула. Но для зоны нам допустим необходимо 7 Гб.
bash-3.2# zfs set quota=7G zones/oracle
bash-3.2# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zones 142K 19.1G 19K /zfs
zones/oracle 18K 7.00G 18K /zfs/oracle
bash-3.2# df -h /zfs/oracle
Filesystem size used avail capacity Mounted on
zones/oracle 7.0G 18K 7.0G 1% /zfs/oracle
Теперь включаем сжатие и смотрим его продуктивность.
bash-3.2# zfs set compression=on zones/oracle
bash-3.2# zfs get compression zones/oracle
NAME PROPERTY VALUE SOURCE
zones/oracle compression on local
bash-3.2# zfs get compressratio zones/oracle
NAME PROPERTY VALUE SOURCE
zones/oracle compressratio 1.00x -
Осталось подготовить для нашей зоны дополнительное дисковое пространство, которым будет выступать c0t0d6.
bash-3.2# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0d0
/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0
1. c1d1
/pci@0,0/pci-ide@7,1/ide@1/cmdk@1,0
Specify disk (enter its number): 0
selecting c0d0
Собственно не описывая всей процедуры выделения свободного слайса у нас получилось вот это
partition> p
Current partition table (unnamed):
Total disk cylinders available: 9726 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 4 - 665 5.07GB (662/0/0) 10635030
1 swap wu 666 - 796 1.00GB (131/0/0) 2104515
2 backup wm 0 - 9725 74.50GB (9726/0/0) 156248190
3 usr wm 797 - 1841 8.01GB (1045/0/0) 16787925
4 var wm 1842 - 2886 8.01GB (1045/0/0) 16787925
5 home wm 2887 - 3548 5.07GB (662/0/0) 10635030
6 unassigned wm 3549 - 9724 47.31GB (6176/0/0) 99217440
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 7.84MB (1/0/0) 16065
9 alternates wu 2 - 3 15.69MB (2/0/0) 32130
После этого мы сохраняем настройки и выходим.
partition> label
Ready to label disk, continue? y
partition> qq
Создадим из этого слайса ZFS-Pool и проведем первоначальную конфигурацию.
bash-3.2# zpool create oradata c0d0s6
bash-3.2# zfs set mountpoint=legacy oradata
bash-3.2# zfs get mountpoint oradata
NAME PROPERTY VALUE SOURCE
oradata mountpoint legacy local
bash-3.2# df -h | grep oradata
bash-3.2#
bash-3.2# zfs set compression=on oradata
Здесь мы установили значение монтирования для c0d0s6 как legacy, а это значит что устройство не будет автоматически монтироваться что нам и нужно, ведь мы отдадим его зоне oracle.
Давайте посмотрим теперь что у нас получилось.
bash-3.2# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
oradata 47.2G 123K 47.2G 0% ONLINE -
zones 19.4G 146K 19.4G 0% ONLINE -
bash-3.2# zfs list
NAME USED AVAIL REFER MOUNTPOINT
oradata 118K 46.5G 18K legacy
zones 142K 19.1G 19K /zfs
zones/oracle 18K 7.00G 18K /zfs/oracle
bash-3.2# zpool status -v
pool: oradata
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
oradata ONLINE 0 0 0
c0d0s6 ONLINE 0 0 0
errors: No known data errors

pool: zones
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
zones ONLINE 0 0 0
c1d1 ONLINE 0 0 0
errors: No known data errors
2. Создание зоны.

Теперь создадим зону и проверяем её учитывая настройки которые мы проводили выше.
bash-3.2# zonecfg -z oracle
oracle: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:oracle> create
zonecfg:oracle> set autoboot=true
zonecfg:oracle> set zonepath=/zfs/oracle
zonecfg:oracle> add net
zonecfg:oracle:net> set physical=rtls1
zonecfg:oracle:net> set address=192.168.1.223
zonecfg:oracle:net> end
zonecfg:oracle> info
zonename: oracle
zonepath: /zfs/oracle
brand: native
autoboot: true
bootargs:
pool:
limitpriv:
scheduling-class:
ip-type: shared
inherit-pkg-dir:
dir: /lib
inherit-pkg-dir:
dir: /platform
inherit-pkg-dir:
dir: /sbin
inherit-pkg-dir:
dir: /usr
net:
address: 192.168.1.223
physical: rtls1
zonecfg:oracle> verify
zonecfg:oracle> commit
zonecfg:oracle> exit
bash-3.2# chmod 700 /zfs/oracle
Проверяем состояние зоны
bash-3.2# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- oracle configured /zfs/oracle native shared
После этого устанавливаем в нашу зону операционую систему.
bash-3.2# zoneadm -z oracle install
A ZFS file system has been created for this zone.
Preparing to install zone .
Creating list of files to copy from the global zone.
Copying <3910> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1052> packages on the zone.
Initialized <1052> packages on zone.
Zone is initialized.
The file contains a log of the zone installation.
bash-3.2# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- oracle installed /zfs/oracle native shared
Теперь добавим в конфигурацию нашей зоны пул oradata.
bash-3.2# zonecfg -z oracle
zonecfg:oracle> add fs
zonecfg:oracle:fs> set dir=/oradata
zonecfg:oracle:fs> set special=oradata
zonecfg:oracle:fs> set type=zfs
zonecfg:oracle:fs> end
zonecfg:oracle> verify
zonecfg:oracle> commit
zonecfg:oracle> exit
Ну собственно все. Давайте теперь запустим наше зону и опустив все формальности первоначальных настроек проверем все ли нормально.
bash-3.2# zoneadm -z oracle boot
bash-3.2# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
4 oracle running /zfs/oracle native shared
bash-3.2# zlogin -C oracle
[Connected to zone 'oracle' console]
Loading smf(5) service descriptions: 139/139
Reading ZFS config: done.
System identification is completed.
rebooting system due to change(s) in /etc/default/init

[NOTICE: Zone rebooting]

SunOS Release 5.11 Version snv_78 32-bit
Copyright 1983-2007 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
Hostname: oracle.alb.kz
Reading ZFS config: done.

oracle console login: root
Password:
Jan 2 15:26:13 oracle.alb.kz login: ROOT LOGIN /dev/console
Sun Microsystems Inc. SunOS 5.11 snv_78 October 2007
# bash
bash-3.2# zonename
oracle
bash-3.2# df -h /oradata
Filesystem size used avail capacity Mounted on
oradata 0K 18K 47G 1% /oradata
Собственно на сегодня это все. То есть это самое простейшее что я смог написать по теме ZFS + Conteiners (Zones). В следующий раз попробую по тестить BrandZ. До встречи!

Комментариев нет: