ZFS – Alguns exemplos

By | October 2, 2008

Cenário Fixo:

Tenho na minha caixa Solaris o HD do sistema operacional – IDE 8GB -, dois HDs IDE de 2GB e dois HDs SCSI também de 2GB, identificados através do comando format:

root@nexenta:/# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0d0 <DEFAULT cyl 4092 alt 2 hd 128 sec 32>
/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0
1. c0d1 <VMware V-0000000000000000-0001-2.00GB>
/pci@0,0/pci-ide@7,1/ide@0/cmdk@1,0
2. c1d1 <VMware V-0000000000000000-0001-2.00GB>
/pci@0,0/pci-ide@7,1/ide@1/cmdk@1,0
3. c2t0d0 <VMware,-VMware Virtual S-1.0-2.00GB>
/pci@0,0/pci1000,30@10/sd@0,0
4. c2t1d0 <VMware,-VMware Virtual S-1.0-2.00GB>
/pci@0,0/pci1000,30@10/sd@1,0
Specify disk (enter its number): ^C

Vou ignorar o primeiro disco, pois o mesmo já está alocado para o pool padrão do sistema operacional, chamado syspool.

Aqui entra o primeiro conceito sobre ZFS: O sistema de arquivos não vai ser escrito diretamente no disco (block device). Ao invés disso ele será escrito em “pools”, que nada mais são do que devices virtuais que contém discos. Algo parecido com utilizar ext3 em cima de LVM ao invés do disco.

Para listar os pools existentes:

root@nexenta:/# zpool list
NAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
syspool  7.44G  1.81G  5.63G    24%  ONLINE  -

Vamos agora brincar um pouco com as possibilidades que ZFS nos dá.

Cenário 1 – Todos os discos como um único filesystem.

root@nexenta:/# zpool create linuxman c0d1 c1d1 c2t0d0 c2t1d0
root@nexenta:/# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
linuxman  7.94G    97K  7.94G     0%  ONLINE  -
syspool   7.44G  1.81G  5.63G    24%  ONLINE  -
root@nexenta:/# zfs list
NAME                             USED  AVAIL  REFER  MOUNTPOINT
linuxman                         110K  7.81G    18K  /linuxman
syspool                         1.81G  5.51G    23K  legacy
syspool/rootfs-nmu-000          1.81G  5.51G  1.55G  legacy
syspool/rootfs-nmu-000@initial   271M      -   780M  -
root@nexenta:/linuxman# df -h linuxman
Filesystem             size   used  avail capacity  Mounted on
linuxman               7.8G    18K   7.8G     1%    /linuxman

Perceba que não precisei montar o filesystem, nem editar fstab. Apenas o comando “zpool create” foi o suficiente para criar o pool, formatar os discos, criar uma entrada no zfs e montar o filesystem.
Mas vamos apagar isso e continuar brincando:

root@nexenta:/# zpool destroy linuxman
root@nexenta:/# zpool list
NAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
syspool  7.44G  1.81G  5.63G    24%  ONLINE  -

🙂

Cenário 2 – Espelhos

Vou criar agora um novo pool, mas desta vez espelhando os dois discos SCSI:

root@nexenta:/# zpool create linuxman mirror  c2t0d0 c2t1d0
root@nexenta:/# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
linuxman  1.98G    94K  1.98G     0%  ONLINE  -
syspool   7.44G  1.81G  5.63G    24%  ONLINE  -
root@nexenta:/# df -h linuxman
Filesystem             size   used  avail capacity  Mounted on
linuxman               2.0G     1K   2.0G     1%    /linuxman

Cenário 3 – Adicionando discos ao pool

Esse pool de 2GB não dá para nada? Precisa adicionar mais discos para criar espaço no seu filesystem? No hay problema:

root@nexenta:/# zpool add linuxman mirror  c0d1 c1d1
root@nexenta:/# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
linuxman  3.97G   114K  3.97G     0%  ONLINE  -
syspool   7.44G  1.81G  5.63G    24%  ONLINE  -
root@nexenta:/# df -h linuxman
Filesystem             size   used  avail capacity  Mounted on
linuxman               3.9G    18K   3.9G     1%    /linuxman

Perceba o detalhe importante: Se você criou o pool como mirror, não dá pra acrescentar somente um disco a mais. Pelo menos dois são necessários.

Mas vamos limpar isso.

root@nexenta:/# zpool destroy linuxman
root@nexenta:/# zpool list
NAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
syspool  7.44G  1.81G  5.63G    24%  ONLINE  -

Cenário 3 – Exportando ZFS via iSCSI

Foi aqui que eu comecei, na verdade. Estou trabalhando num projeto piloto que, quando em produção, vai utilizar SAN. Infelizmente não tenho uma SAN para laboratório, então decidi usar iSCSI para simular o comportamento da SAN.

Começamos criando o pool:

root@nexenta:/# zpool create linuxman c2t0d0 c2t1d0

Mas para podermos exportar é necessário também criar um volume. Um volume é uma fatia do pool, falando simplificadamente.

root@nexenta:/# zfs create  -V 1G linuxman/iscsi
root@nexenta:/# zfs list linuxman/iscsi
NAME             USED  AVAIL  REFER  MOUNTPOINT
linuxman/iscsi     1G  3.91G    16K  -

Este volume pode ser exportado via iSCSI e a própria hierarquia do ZFS vai se encarregar de criar as LUNs:

root@nexenta:/# zfs set shareiscsi=on linuxman/iscsi

É bem provável que o iscsi não esteja rodando no seu Solaris por padrão, então habilite-o:

root@nexenta:/# svcadm enable iscsitgt

E agora seu volume já deve estar disponível:

root@nexenta:/# iscsitadm list target
Target: linuxman/iscsi
iSCSI Name: iqn.1986-03.com.sun:02:1a01588d-af11-4163-a4c7-bdf19d1550a2
Connections: 0

Vamos até o Linux ali do lado para ver se conseguimos utilizar este volume:

[root@cluster1 ~]# iscsiadm -m discovery -t sendtargets -p 172.16.66.128
172.16.66.128:3260,1 iqn.1986-03.com.sun:02:1a01588d-af11-4163-a4c7-bdf19d1550a2

UIA! Vamos usar então:

[root@cluster1 ~]# /etc/init.d/iscsi restart
Stopping iSCSI daemon: /etc/init.d/iscsi: line 33:  5656 Killed                  /etc/init.d/iscsid stop
iscsid dead but pid file exists                            [  OK  ]
Turning off network shutdown. Starting iSCSI daemon:       [  OK  ]
[  OK  ]
Setting up iSCSI targets: Logging in to [iface: default, target: iqn.1986-03.com.sun:02:1a01588d-af11-4163-a4c7-bdf19d1550a2, portal: 172.16.66.128,3260]
Login to [iface: default, target: iqn.1986-03.com.sun:02:1a01588d-af11-4163-a4c7-bdf19d1550a2, portal: 172.16.66.128,3260]: successful
[  OK  ]
[root@cluster1 ~]# fdisk -l|grep part
Disk /dev/sdc doesn't contain a valid partition table
[root@cluster1 ~]# echo -e "n\n p\n 1\n \n \n w\n"|fdisk /dev/sdc
[root@cluster1 ~]# mkfs.ext3 -q /dev/sdc1 -L /linuxman
[root@cluster1 ~]# mkdir /linuxman
[root@cluster1 ~]# mount LABEL=/linuxman /linuxman
[root@cluster1 ~]# df -h /linuxman
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdc1            1008M   18M  940M   2% /linuxman

Divertido, né? Temos agora ext3 encapsulado em ZFS exportado via iSCSI. Isso pode ser útil em cenários como o abaixo.

Cenário 4 – Fazendo backup.

Então esse meu diretório /linuxman contém dados do meu projeto. Mas como ainda é laboratório, vira e mexe eu estrago alguma coisa.
Vou facilitar minha vida com o ZFS então.

No Linux:

[root@cluster1 linuxman]# cd /linuxman
[root@cluster1 linuxman]# for i in $(seq 1 10); do dd if=/dev/zero of=file$i.dat count=1 bs=100M; done 2>/dev/null
[root@cluster1 linuxman]# ls
file10.dat  file1.dat  file2.dat  file3.dat  file4.dat  file5.dat  file6.dat  file7.dat  file8.dat  file9.dat  lost+found

No Solaris:

root@nexenta:/# zfs snapshot linuxman/iscsi@antes-do-teste-1
root@nexenta:/# zfs list
NAME                              USED  AVAIL  REFER  MOUNTPOINT
linuxman                         2.00G  1.91G    18K  /linuxman
linuxman/iscsi                   2.00G  2.91G  1.00G  -
linuxman/iscsi@antes-do-teste-1      0      -  1.00G  -

Volto no Linux e estrago meu árduou trabalho:

[root@cluster1 linuxman]# rm -rf file1*
[root@cluster1 linuxman]# ls
file2.dat  file3.dat  file4.dat  file5.dat  file6.dat  file7.dat  file8.dat  file9.dat  lost+found

Mas para recuperar é fácil:

No Linux:

[root@cluster1 linuxman]# cd /
[root@cluster1 /]# umount /linuxman/

No Solaris:

root@nexenta:/# zfs set shareiscsi=off linuxman/iscsi
root@nexenta:/# zfs rollback linuxman/iscsi@antes-do-teste-1
root@nexenta:/# zfs set shareiscsi=on linuxman/iscsi

E finalmente, no Linux:

[root@cluster1 /]# mount LABEL=/linuxman /linuxman
[root@cluster1 /]# cd /linuxman/
[root@cluster1 linuxman]# ls
file10.dat  file1.dat  file2.dat  file3.dat  file4.dat  file5.dat  file6.dat  file7.dat  file8.dat  file9.dat  lost+found

E ai estão todos os arquivos de volta.

OBSERVAÇÃO: Aparentemente a formatação no blog perdeu algumas partes dos textos pré-formatados, mas nada significativo. Viva com isso. Olhe pelo feed que está legal.

9 thoughts on “ZFS – Alguns exemplos

  1. Pingback: Primeiros passos com ZFS

  2. morikawa

    bem legal, pra quem nao conhece nada sobre ZFS como eu!

  3. Pingback: Primeiros passos com ZFS | Abiyaa

  4. Eduardo Carneiro

    O Silveira, ele usou o iscsi para abrir como se fosse um disco local.

  5. grind

    Esse foi o melhor texto que ja vi ate hoje sobre o ZFS, 101% do que esta por ai trata essa Ma-Ga_Vilha como se fosse cultura klingon que é incompreensível para nos meros mortais !

Comments are closed.