Записи с Меткой ‘ linux

Восстановление «Local Storage» после падения XenServer

Habrahabr

Добрый день, данная статья ориентирована на новичков в направлении «Системного администрирования».

Статья состоит из трех пунктов:
описание причины и следствия
анализ системы
восстановление работы

Терминология:
LVM — Logical Volume Manager
PV — Physical Volume
PBD — Physical Block Device
VBD — Virtual Block Device
VG — Virtual Group
VM — Virtual Machine
SR — Storage Repository

Описание причины и следствия

В здании выключили свет на длительное время, после чего начали выключатся серверные UPS’ы, первым выключился UPS мастера в пуле серверов.
Следствие: после возобновления питания и запуска сервера, пул рассыпался.

Анализ системы

При запуске XenServer’а, пул оказался пустым, а VM находились вне пула.
Первым делом смотрел логи запуска пула, что дало следующую информацию «Internal error: there is no bootable device». Как оказалось потерялся «Local Storage». Дабы удостоверится в этом, посмотрел uuid диска через gui и в консоли мастера ввел
# xe sr-list
Данная команда выводит информацию о всех подключенных хранилищах. Команда ничего не вывела, далее проверил список VBD
# xe vbd-list
в пунктах vdi-uuid вместо uuid было и естественно команда
# xe vdi-list
ничего не выводит.

Решил поверить хранилища на уровне LVM, сперва проверил список PV коммандой
# pvscan
Oбнаружил, что PV есть; так же ввел команду
# pvdisplay
И она мне ничего не вернула. То есть после падения потерялись метаданные, а это значит, что физически информация сохранилась и все на месте. Один из полезных пряников LVM состоит в том что, он делает бэкапы метаданных автоматически при создании и наполнении пула, но можно делать их и в ручную коммандой
# xe pool-dump-database.
Далее проверил наличие бэкапа метаданных
# ls -lh /etc/lvm/backup/
бэкап есть, можно начинать восстановление.

Восстановление работы

И так, бэкап есть ввожу команду для восстановления метаданных VG
# vgcfgrestore VG_XenStorage-XXXX
где VG_XenStorage-XXXX — это имя файла бэкапа; но получил ошибку о том, что нет девайса с указанным uuid. Недолго думая решил сравнить PV UUID из вывода команды
# pvdisplay
C ID из файла бэкапа (блок physical_volumes) они не совпадают, но партиция совпадает. И это тоже не беда.
Удалил стратый PV
# pvremove /dev/sdXY
где X — это порядковый номер диска (используются латинские буквы a, b, c, d и т.д.), а Y — порядковый номер партиции на диске (используются цифры 1, 2, 3 и т.д.).
Далее создал новый PV в тот же раздел
# pvcreate /dev/sdXY
Nеперь заменил ID устройства в файле бэкапа, в блоке physical_volumes, на полученный PV UUID нового PV.
Теперь вновь пробую накатить бэкап метаданных
# vgcfgrestore VG_XenStorage-XXXX
комманда вернула успех.

Далее руководствуясь статьей от Citrix добавляем «Local Storage» в пул:
1) Выявляю SR-UUID текущего диска при помощи
# pvscan
команда возвращает VG_XenStorage-XXXX, где XXXX — это и есть необходимый SR-UUID.

2) Далее ввожу SR
# xe sr-introduce uuid=XXXX type=lvm name-label=»Local storage» content-type=user

3) Тперь надо созданить PBD из существующего PV, но для этого надо получить SCSI ID устройства, UUID хоста и SR-UUID (он уже сеть)
3.1) Узнаю SCSI ID
# ls -l /dev/disk/by-id/
Команда вернула: lrwxrwxrwx 1 root root 10 Июн 4 17:35 scsi-SATA_ST32000645NS_Z2939GCT-part3 -> ../../sdXY;
Необходимый SCSI ID это «scsi-SATA_ST32000645NS_Z2939GCT-part3», который расположен на партиции /dev/sdXY — на которой ранее создавали PV.
Примечание: SCSI ID — не будет совпадать с вашим, для примера я использовал свой.

3.2) UUID хота, получаю следующей командой
# xe host-list params=uuid;
Команда выводит только UUID: uuid ( RO): YYYY, где YYYY — это и есть UUID хоста.

3.3.) Теперь кода все есть создаем PBD
# xe pbd-create sr-uuid=XXX device-config:device=/dev/disk/by-id/scsi-SATA_ST380815AS_6QZ5Z1AM-part3 host-uuid=YYYY.
Команда возвращает UUID этой записи.

4) Теперь прикрутим «Local Storage» в XenServer
# xe pbd-plug uuid=ZZZZ, где ZZZZ — это и есть UUID полученный в пункте 3.3.

Теперь пул видит свой «Locale Storage», а в нем есть виртуальные диски, осталось только одно, подключить VM их диски.

Примечание: если у вас пропали имена виртуальных машин, это нестрашно. Методом перебора, подберите диск к VM и через настройки укажите им имена. Тоже касается и имени локального хранилища.

Все действия были произведены на основании документации от RadHat (LVM) и Citrix (XenServer)

Восстановление сбойных секторов на диске

В /var/log/messages очень не понравилась строчка

[sdb] Add. Sense: Unrecovered read error — auto reallocate failed

Стало понятно, что винт такого обращения с собой не потерпел и начал «сыпаться».

Более полный лог из /var/log/messages:

kernel: [ 237.553123] ata6.00: configured for UDMA/100
kernel: [ 237.553161] ata6: EH complete
kernel: [ 239.373067] ata6.00: configured for UDMA/100
kernel: [ 239.373102] ata6: EH complete
kernel: [ 241.196966] ata6.00: configured for UDMA/100
kernel: [ 241.197000] ata6: EH complete
kernel: [ 243.005896] ata6.00: configured for UDMA/100
kernel: [ 243.005927] ata6: EH complete
kernel: [ 244.820846] ata6.00: configured for UDMA/100
kernel: [ 244.820878] ata6: EH complete
kernel: [ 246.637758] ata6.00: configured for UDMA/100
kernel: [ 246.637797] sd 5:0:0:0: [sdb] Unhandled sense code
kernel: [ 246.637801] sd 5:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
kernel: [ 246.637808] sd 5:0:0:0: [sdb] Sense Key : Medium Error [current] [descriptor]
kernel: [ 246.637817] Descriptor sense data with sense descriptors (in hex):
kernel: [ 246.637821] 72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00.
kernel: [ 246.637842] 0f 9e 54 40.
kernel: [ 246.637850] sd 5:0:0:0: [sdb] Add. Sense: Unrecovered read error — auto reallocate failed
kernel: [ 246.637860] sd 5:0:0:0: [sdb] CDB: Read(10): 28 00 0f 9e 54 3f 00 00 08 00
kernel: [ 246.637918] ata6: EH complete

Чтение dmesq позволило узнать номер сбойного сектора:
[32690.514629] ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
[32690.514639] ata6.00: BMDMA2 stat 0x6c0009
[32690.514648] ata6.00: failed command: READ DMA
[32690.514665] ata6.00: cmd c8/00:08:3f:54:9e/00:00:00:00:00/ef tag 0 dma 4096 in
[32690.514668] res 51/40:00:40:54:9e/00:00:00:00:00/ef Emask 0x9 (media error)
[32690.514676] ata6.00: status: { DRDY ERR }
[32690.514682] ata6.00: error: { UNC }
[32690.528582] ata6.00: configured for UDMA/100
[32690.528620] sd 5:0:0:0: [sdb] Unhandled sense code
[32690.528626] sd 5:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[32690.528636] sd 5:0:0:0: [sdb] Sense Key : Medium Error [current] [descriptor]
[32690.528661] Descriptor sense data with sense descriptors (in hex):
[32690.528665] 72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
[32690.528685] 0f 9e 54 40
[32690.528693] sd 5:0:0:0: [sdb] Add. Sense: Unrecovered read error — auto reallocate failed
[32690.528703] sd 5:0:0:0: [sdb] CDB: Read(10): 28 00 0f 9e 54 3f 00 00 08 00
[32690.528721] end_request: I/O error, dev sdb, sector 262034496
[32690.528765] ata6: EH complete

Проверить, действительно ли этот блок поврежден, можно при помощи hdparm:

# hdparm —read-sector 262034496 /dev/sdb

/dev/sdb:
reading sector 262034496: FAILED: Input/output error

Теперь пробуем перезаписать сбойный блок нулями (hdparm умеет обходить системные механизмы чтения/записи на диск):

# hdparm —write-sector 262034496 /dev/sdb

/dev/sdb:
Use of —write-sector is VERY DANGEROUS.
You are trying to deliberately overwrite a low-level sector on the media.
This is a BAD idea, and can easily result in total data loss.
Please supply the —yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.

Утилита нас предупреждает о возможных последствиях и просит подтвердить наши серьезные намерения, запустив ее с параметром «—yes-i-know-what-i-am-doing» («да-я-понимаю-что-делаю«):

# hdparm —write-sector 262034496 —yes-i-know-what-i-am-doing /dev/sdb

/dev/sdb:
re-writing sector 262034496: succeeded

И еще раз проверяем данные в этом секторе:

# hdparm —read-sector 262034496 /dev/sdb

/dev/sdb:
reading sector 262034496: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

Как видим, всё забито нулями.

Ну что же, работа компьютера резко ускорилась, теперь осталось провести тест поверхности
# smartctl -t long /dev/sdb

периодически поглядывая в логи выполнения
# smartctl -l selftest /dev/sdb

радуемся статусам
Completed without error

Local NFS storage xenserver 6.5

1. mkfs -t ext3 /dev/md3
2. mkdir /mnt/nfs{vdisk,iso}
3. mount -t ext3 /dev/md3 /mnt/nfs
4. echo «/dev/md3 /mnt/nfs ext3 defaults 0 0» >> /etc/fstab
5. echo «/mnt/nfs/iso 192.168.0.0/255.255.255.0(rw,no_root_squash,sync)» >> /etc/exports
6. echo «/mnt/nfs/vdisk *(rw,no_root_squash,sync)» >> /etc/exports
7. exportfs -r
8. exportfs
9. lsmod | grep nfs
Если все печально и ничего на выходе нет, то
10. modprobe nfsd
+ echo «modprobe nfsd» >> /etc/rc.local
+ echo «modprobe nfsd» >> /etc/rc.sysinit
>> 9 тест
chkconfig nfs on
chkconfig portmap on

11. sed -i -e ‘s/PMAP_ARGS=-l/PMAP_ARGS=/’ /etc/sysconfig/portmap
Если не проходит и service portmap start валиться с ошибкой нужно привести файл к виду
PMAP_ARGS=»»
12. Раскоментируем /etc/sysconfig/nfs
MOUNTD_PORT=892
!!!
Иначе не достучимся!

13. Добавляем правила iptables для nfs и portmap /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -p tcp -m tcp —dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp —dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp —dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp —dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp —dport 892 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp —dport 892 -j ACCEPT
14. В порядке очереди дергаем службы
service portmap restart & service nfs restart & service iptables restart

15. showmount localhost
16. rpcinfo -p

Жесткое присвоение портов.

Создание Локольного ISO репозитория Xen

Create new partition and file system

# fdisk /dev/sdb
# mkfs.ext3 /dev/sdb1

Mounting the new partition and configure fstab

# mkdir /mnt/isos/
# mount -t ext3 /dev/sdb1 /mnt/isos/
# vi /etc/fstab
/dev/sdb1 /mnt/isos ext3 defaults 0 2

Creating the new local ISO storage repository

# xe sr-create name-label=ISOS type=iso device-config:location=/mnt/isos/ device-config:legacy_mode=true content-type=iso

Copying a new ISO to the new repository

$ scp debian-6.0.5-i386-CD-1.iso root@172.16.201.200:/mnt/isos/

Checking the new local storage is added

# xe sr-list

uuid ( RO) : e85dc938-ea06-e26d-2acd-ceeaa3778f83
name-label ( RW): ISOS
name-description ( RW):
host ( RO): XenServer-1
type ( RO): iso
content-type ( RO): iso

The new library appears in Xen center:

Checking the ISO image copied successfully

# xe vdi-list

uuid ( RO) : d37c744c-7684-4aef-8644-22102346dc5c
name-label ( RW): debian-6.0.5-i386-CD-1.iso
name-description ( RW):
sr-uuid ( RO): e85dc938-ea06-e26d-2acd-ceeaa3778f83
virtual-size ( RO): 678428672
sharable ( RO): false
read-only ( RO): true

 

Замена сбойного диска в Софтовом рейде

========================================================
Замена диска
1. Выключить компьютер и заменить диск
2. Включить компьютер и определить имеющиеся на обоих дисках разделы:
# fdisk /dev/sd -l
3. С помощью fdisk создать на новом диске разделы, идентичные оригиналу
Необходимо пометить нужный раздел нового диска (sda1 или sdb1) как загрузочный до включения в зеркало.
Swap-разделы не подлежат зеркалированию в программном RAID
4.Мониторинг состояния
Информация о всех RAID-массивах:
# more /proc/mdstat
или
# cat /proc/mdstat
Информация о конкретном дисковом разделе:
# mdadm -E /dev/sd<1-10>
например:
# mdadm -E /dev/sdb2
5.Восстановление функционирования
# mdadm -a /dev/md<0-6> /dev/sd<1-10>
например:
# mdadm -a /dev/md0 /dev/sdb1
Нужно быть аккуратным с номерами разделов
В случае ошибки, удалить компонент из RAID командой:
# mdadm -r /dev/md0 /dev/sdb1
получается не всегда — устройство может быть занято
========================================================

Добавление диска как storage в xen

fdisk -l(THIS WILL LIST THE DISKS IN THE SYSTEM)

You will see the following information:

Disk /dev/sda: 128.0 GB, 128035676160 bytes
255 heads, 63 sectors/track, 15566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 523 4194304 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 523 1045 4194304 83 Linux
/dev/sda3 1045 15566 116645255+ 8e Linux LVM

Disk /dev/sdb: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn’t contain a valid partition table

Assuming that /dev/sdb is the drive you want to use

Type the following

[root@system]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won’t be recoverable.

The number of cylinders for this disk is set to 4865.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-4865, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-4865, default 4865): 4865

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 83
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Now what you want to do is to make a SR so you can use it to store virtual machines on.

ls -l /dev/disk/by-id/ (you should see the following)

total 0
lrwxrwxrwx 1 root root 9 May 26 14:50 scsi-SATA_C300-CTFDDAC1280000000010510303CFAA -> ../../sda
lrwxrwxrwx 1 root root 10 May 26 14:50 scsi-SATA_C300-CTFDDAC1280000000010510303CFAA-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 May 26 14:50 scsi-SATA_C300-CTFDDAC1280000000010510303CFAA-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 May 26 14:50 scsi-SATA_C300-CTFDDAC1280000000010510303CFAA-part3 -> ../../sda3
lrwxrwxrwx 1 root root 9 May 26 14:50 scsi-SATA_ST31500341AS_9VS4N7W5 -> ../../sdb
lrwxrwxrwx 1 root root 10 May 26 14:50 scsi-SATA_ST31500341AS_9VS4N7W5-part1 -> ../../sdb1

Assuming that sdb is the one to use type the following

xe sr-create type=lvm content-type=user device-config:device=/dev/disk/by-id/scsi-SATA_ST31500341AS_9VS4N7W5 name-label=»LOCAL SR»

Удаление Storage Xen

1. First, you have to determine the Storage-Repository-UUID:

xe sr-list

-> write down / take note of SR-UUID of the SR to delete

2. Find the corresponding Physical Block Device (PBD):

xe pbd-list sr-uuid=your-SR-uuid

-> write down / take note of PBD-UUID of the PBD to unplug and delete

3. Unplug the PBD:

xe pbd-unplug uuid=your-PBD-uuid

4. Delete PBD:

xe pbd-destroy uuid=your-PBD-uuid

5. Delete the association of your SR and the PBD:

xe sr-forget uuid=your-SR-uuid

Коротко:

xe sr-list name-label=Local\ storage | head -1
uuid ( RO)                : 75264965-f981-749e-0f9a-e32856c46361
# xe pbd-list sr-uuid=75264965-f981-749e-0f9a-e32856c46361 | head -1
uuid ( RO)                  : ff7e9656-c27c-1889-7a6d-687a561f0ad0
# xe pbd-unplug uuid=ff7e9656-c27c-1889-7a6d-687a561f0ad0 
# xe sr-destroy uuid=75264965-f981-749e-0f9a-e32856c46361

 

ssk-keygen

ssh-keygen -t dsa

Оставьте папку по-умолчанию, а пароль сделайте пустым.
Эта команда должна создать в папке ~/.ssh(по умолчанию) два файла — private и public key. private предназначается для локальной машины, pub отправляется на удаленный.

Теперь копируем private key в папку /root/.ssh, чтобы пользователь root так мог пользоваться им

$ cd ~/.ssh
$ sudo mkdir /root/.ssh
$ sudo cp id_dsa /root/.ssh

Теперь надо скопировать public key на удаленную машину, с которой мы хотим копировать данные. Предварительно создайте пользователя backup на удаленной машине(команда adduser). Не забудьте дать этому пользователю права на чтение каталогов, которые вы хотите копировать.

$ cat ~/.ssh/id_dsa.pub | ssh backup@remotehost.ru «cat >> ~/.ssh/authorized_keys»

команды systemd

http://tlhp.cf/systemd-in-action-part-2/

Краткий список основных команд для ZFS

$ man zpool
$ man zfs
Справка по структуре команд и их параметрам

$ su
Password:
# cd /
# mkfile 100m disk1 disk2 disk3 disk5
# mkfile 50m disk4
# ls -l disk*
-rw——T 1 root root 104857600 Sep 11 12:15 disk1
-rw——T 1 root root 104857600 Sep 11 12:15 disk2
-rw——T 1 root root 104857600 Sep 11 12:15 disk3
-rw——T 1 root root 52428800 Sep 11 12:15 disk4
-rw——T 1 root root 104857600 Sep 11 12:15 disk5
Создать несколько «виртуальных устройств» (vdevs как описано в документации к zpool). Они также могут быть реальными разделами диска, если таковые доступны.

# zpool create myzfs /disk1 /disk2
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
myzfs 191M 94K 191M 0% ONLINE —
Создать хранилище (пул устройств) и проверить его размер и использование.

# zpool status -v
pool: myzfs
state: ONLINE
scrub: none requested
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0errors: No known data errors
Более детальная информация о хранилище.

# zpool destroy myzfs
# zpool list
no pools available
Удалить ZFS пул

# zpool create myzfs mirror /disk1 /disk4
invalid vdev specification
use ‘-f’ to override the following errors:
mirror contains devices of different sizes
При попытке создания пула, vdevs которого имеют разичный размер, возникнет ошибка.
Если использовать флаг ‘-f’, то пул создастся, но размер будет соответствовать меньшему устройству.

# zpool create myzfs mirror /disk1 /disk2 /disk3
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
myzfs 95.5M 112K 95.4M 0% ONLINE —
# zpool status -v
pool: myzfs
state: ONLINE
scrub: none requested
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
/disk3 ONLINE 0 0 0errors: No known data errors
Создать «зеркалируемое» хранилище. В данном случае хранилище зеркалируется 3 раза.

# zpool detach myzfs /disk3
# zpool status -v
pool: myzfs
state: ONLINE
scrub: none requested
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0errors: No known data errors
Исключить устройство из пула.

# zpool attach myzfs /disk1 /disk3
# zpool status -v
pool: myzfs
state: ONLINE
scrub: resilver completed with 0 errors on Tue Sep 11 13:31:49 2007
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
/disk3 ONLINE 0 0 0errors: No known data errors
Добавляем устройство в пул. В этом случае мы создадим зеркало, если его до сих пор не было, а если
было, то в зеркале будет 3 устройства.

# zpool remove myzfs /disk3
cannot remove /disk3: only inactive hot spares can be removed
# zpool detach myzfs /disk3
Попытка удалить устройство из пула.
В данном случае устройство используется в составе зеркала, поэтому надо применить команду «zpool detach».

# zpool add myzfs spare /disk3
# zpool status -v
pool: myzfs
state: ONLINE
scrub: none requested
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
spares
/disk3 AVAILerrors: No known data errors
Добавление диска горячей замены к пулу.

# zpool remove myzfs /disk3
# zpool status -v
pool: myzfs
state: ONLINE
scrub: none requested
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0errors: No known data errors
Удаление диска горячей замены из пула.

# zpool offline myzfs /disk1
# zpool status -v
pool: myzfs
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning
in a degraded state.
action: Online the device using ‘zpool online’ or replace the device
with ‘zpool replace’.
scrub: resilver completed with 0 errors on Tue Sep 11 13:39:25 2007
config:NAME STATE READ WRITE CKSUM
myzfs DEGRADED 0 0 0
mirror DEGRADED 0 0 0
/disk1 OFFLINE 0 0 0
/disk2 ONLINE 0 0 0errors: No known data errors
Запретить использование выбранного устройства (состояние offline). Пока устройство не будет возвращено к использованию (состояние online) на него не будет производиться запись и с него не будет производиться чтение. Чтобы временно отключить выбранное устройство используйте ключ -t. Перезагрузка вернет устройство в состояние online.

# zpool online myzfs /disk1
# zpool status -v
pool: myzfs
state: ONLINE
scrub: resilver completed with 0 errors on Tue Sep 11 13:47:14 2007
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0errors: No known data errors
Разрешить использование выбранного устройства (состояние online).

# zpool replace myzfs /disk1 /disk3
# zpool status -v
pool: myzfs
state: ONLINE
scrub: resilver completed with 0 errors on Tue Sep 11 13:25:48 2007
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk3 ONLINE 0 0 0
/disk2 ONLINE 0 0 0errors: No known data errors
Заменить один диск на другой в пуле устройств, например в случае неисправности /disk1.

# zpool scrub myzfs
«Чистка» хранилища. Проверяет все соответствия контрольных сумм. На зеркалируемых или RAID пулах ZFS автоматически исправит повреждения в данных.
ВНИМАНИЕ: «чистка» интенсивно использует операции ввода-вывода.

# zpool export myzfs
# zpool list
no pools available
Экспорт хранилища для последующего импортирования на другой системе.

# zpool import -d / myzfs
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
myzfs 95.5M 114K 95.4M 0% ONLINE —
Импорт экспортированного хранилища.
Если ключ -d не задан, команда ищет /dev/dsk.
Так как в данном примере мы используем файлы, необходимо указать директорию с файлами используемыми хранилищем.

# zpool upgrade
This system is currently running ZFS pool version 8.All pools are formatted using this version.
# zpool upgrade -v
This system is currently running ZFS pool version 8.The following versions are supported:
VER DESCRIPTION
— ———————————————————
1 Initial ZFS version
2 Ditto blocks (replicated metadata)
3 Hot spares and double parity RAID-Z
4 zpool history
5 Compression using the gzip algorithm
6 pool properties
7 Separate intent log devices
8 Delegated administration
For more information on a particular version, including supported
releases, see:

http://www.opensolaris.org/os/community/zfs/version/N

Where ‘N’ is the version number.

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

# zpool iostat 5
capacity operations bandwidth
pool used avail read write read write
———- —— —— —— —— —— ——
myzfs 112K 95.4M 0 4 26 11.4K
myzfs 112K 95.4M 0 0 0 0
myzfs 112K 95.4M 0 0 0 0
Получить статистику по операциям ввода/вывода

# zfs create myzfs/colin
# df -h
Filesystem kbytes used avail capacity Mounted on

myzfs/colin 64M 18K 63M 1% /myzfs/colin
Создать файловую систему и проверить ее стандартной командой df -h. Файловые системы автоматически монтируются в /zfs (по умолчанию). См. раздел Mountpoints в руководстве к zfs.

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 139K 63.4M 19K /myzfs
myzfs/colin 18K 63.4M 18K /myzfs/colin
Получить список файловых систем zfs

# zpool add myzfs /disk1
invalid vdev specification
use ‘-f’ to override the following errors:
mismatched replication level: pool uses mirror and new vdev is file
Попытка добавить одно устройство к зеркалируемому хранилищу провалилась.

# zpool add myzfs mirror /disk1 /disk5
# zpool status -v
pool: myzfs
state: ONLINE
scrub: none requested
config:NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk3 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk5 ONLINE 0 0 0errors: No known data errors
Добавление зеркалируемого набора устройств (vdevs).

# zfs create myzfs/colin2
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 172K 159M 21K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin2 18K 159M 18K /myzfs/colin2
Создать вторую файловую систему. Заметим, что обе файловые системы показывают доступные 159M, т.к. не заданы квоты. Любая из файловых систем может вырасти до размеров всего пула.

# zfs set reservation=20m myzfs/colin
# zfs list -o reservation
RESERV
none
20M
none
Зарезервировать указанное пространство для файловой системы, таким образом остальные пользователи не смогут занять все доступное место.

# zfs set quota=20m myzfs/colin2
# zfs list -o quota myzfs/colin myzfs/colin2
QUOTA
none
20M
Установить и показать квоты.

# zfs set compression=on myzfs/colin2
# zfs list -o compression
COMPRESS
off
off
on
Включить и проверить сжатие.

# zfs set sharenfs=on myzfs/colin2
# zfs get sharenfs myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharenfs on local
Сделать общий ресурс через NFS. При этом, для того, чтобы ресурс был доступен после перезагрузки, не требуется вносить изменения /etc/dfs/dfstab.

# zfs set sharesmb=on myzfs/colin2
# zfs get sharesmb myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharesmb on local
Сделать общий ресурс по протоколу CIFS/SMB. Таким образом мы предоставим доступ к нашей файловой системе ZFS пользователям Windows.

# zfs snapshot myzfs/colin@test
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.2M 139M 21K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin@test 0 — 18K —
myzfs/colin2 18K 20.0M 18K /myzfs/colin2
Создать snapshot под названием test.

# zfs rollback myzfs/colin@test
Откатится к ранее созданному snapshot test.

# zfs clone myzfs/colin@test myzfs/colin3
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.2M 139M 21K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin@test 0 — 18K —
myzfs/colin2 18K 20.0M 18K /myzfs/colin2
myzfs/colin3 0 139M 18K /myzfs/colin3
Напрямую к snapshot’у обращаться нельзя. Необходимо клонировать файловую систему (версии test). Клон может располагаться в любом месте иерархии ZFS и будет сделан того же типа, что и оригинал.

# zfs destroy myzfs/colin2
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.1M 139M 22K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin@test 0 — 18K —
myzfs/colin3 0 139M 18K /myzfs/colin3
Уничтожить выбранную файловую систему.

# zfs destroy myzfs/colin
cannot destroy ‘myzfs/colin’: filesystem has children
use ‘-r’ to destroy the following datasets:
myzfs/colin@test
Попытка уничтожить файловую систему, у которой есть вложения. В данном случае snapshot. Необходимо либо удалить snapshot, либо сделать клона и вынеся его из данной файловой системы.

# zfs promote myzfs/colin3
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.1M 139M 21K /myzfs
myzfs/colin 0 159M 18K /myzfs/colin
myzfs/colin3 18K 139M 18K /myzfs/colin3
myzfs/colin3@test 0 — 18K —
# zfs destroy myzfs/colin
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 147K 159M 21K /myzfs
myzfs/colin3 18K 159M 18K /myzfs/colin3
myzfs/colin3@test 0 — 18K —
Вынесение клонированной файловой системы. Делается для того чтобы убрать зависимость от snapshot’а оригинала. Теперь snapshot является вложенным для клонированной файловой системы и оригинал файловой системы можно удалять.

# zfs rename myzfs/colin3 myzfs/bob
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 153K 159M 21K /myzfs
myzfs/bob 18K 159M 18K /myzfs/bob
myzfs/bob@test 0 — 18K —
# zfs rename myzfs/bob@test myzfs/bob@newtest
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 146K 159M 20K /myzfs
myzfs/bob 18K 159M 18K /myzfs/bob
myzfs/bob@newtest 0 — 18K —
Переименование файловой системы и отдельное переименование snapshot.

# zfs get all
NAME PROPERTY VALUE SOURCE
myzfs type filesystem —
myzfs creation Tue Sep 11 14:21 2007 —
myzfs used 146K —
myzfs available 159M —
myzfs referenced 20K —
[…]
Отобразить свойства данного пула. В дальнейшем данная команда может быть дополнена другими опциями.

# zpool destroy myzfs
cannot destroy ‘myzfs’: pool is not empty
use ‘-f’ to force destruction anyway
Нельзя удалить пул с активными файловыми системами.

# zfs unmount myzfs/bob
# df -h
myzfs 159M 20K 159M 1% /myzfs
Отмонтировать файловую систему в ZFS.

# zfs mount myzfs/bob
# df -h
myzfs 159M 20K 159M 1% /myzfs
myzfs/bob 159M 18K 159M 1% /myzfs/bob
Монтировать в ZFS файловую систему. Это происходит автоматически при загрузке.

# zfs send myzfs/bob@newtest | ssh localhost zfs receive myzfs/backup
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 172K 159M 20K /myzfs
myzfs/backup 18K 159M 18K /myzfs/backup
myzfs/backup@newtest 0 — 18K —
myzfs/bob 18K 159M 18K /myzfs/bob
myzfs/bob@newtest 0 — 18K —
Создается snapshot, который передается на вход команды zfs reveive. В данном случае, в качестве примера, использовано zfs reveive на localhost, но можно делать резервные копии на удаленном хосте или в локальном файле.

# zpool history
History for ‘myzfs’:
2007-09-11.15:35:50 zpool create myzfs mirror /disk1 /disk2 /disk3
2007-09-11.15:36:00 zpool detach myzfs /disk3
2007-09-11.15:36:10 zpool attach myzfs /disk1 /disk3
2007-09-11.15:36:53 zpool detach myzfs /disk3
2007-09-11.15:36:59 zpool add myzfs spare /disk3
2007-09-11.15:37:09 zpool remove myzfs /disk3
2007-09-11.15:37:18 zpool offline myzfs /disk1
2007-09-11.15:37:27 zpool online myzfs /disk1
2007-09-11.15:37:37 zpool replace myzfs /disk1 /disk3
2007-09-11.15:37:47 zpool scrub myzfs
2007-09-11.15:37:57 zpool export myzfs
2007-09-11.15:38:05 zpool import -d / myzfs
2007-09-11.15:38:52 zfs create myzfs/colin
2007-09-11.15:39:27 zpool add myzfs mirror /disk1 /disk5
2007-09-11.15:39:38 zfs create myzfs/colin2
2007-09-11.15:39:50 zfs set reservation=20m myzfs/colin
2007-09-11.15:40:18 zfs set quota=20m myzfs/colin2
2007-09-11.15:40:35 zfs set compression=on myzfs/colin2
2007-09-11.15:40:48 zfs snapshot myzfs/colin@test
2007-09-11.15:40:59 zfs rollback myzfs/colin@test
2007-09-11.15:41:11 zfs clone myzfs/colin@test myzfs/colin3
2007-09-11.15:41:25 zfs destroy myzfs/colin2
2007-09-11.15:42:12 zfs promote myzfs/colin3
2007-09-11.15:42:26 zfs rename myzfs/colin3 myzfs/bob
2007-09-11.15:42:57 zfs destroy myzfs/colin
2007-09-11.15:43:23 zfs rename myzfs/bob@test myzfs/bob@newtest
2007-09-11.15:44:30 zfs receive myzfs/backup
Показать историю команд для всех хранилищ. Можно посмотреть историю только для одного хранилища указав его имя в командной строке. Храниться история только для существующих хранилищ. При удалении хранилища его история удаляется.

# zpool destroy -f myzfs
# zpool status -v
no pools available
Используйте ключ -f, чтобы удалить хранилище с существующими файловыми файловыми системами.