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.
Pingback: Primeiros passos com ZFS
O_O sem palavras…
bem legal, pra quem nao conhece nada sobre ZFS como eu!
Legal o artigo.
O que você usou para abrir o ZFS no Linux? ZFS on Fuse?
Pingback: Primeiros passos com ZFS | Abiyaa
Parabéns pelo artigo, direto ao assunto
Excelente artigo! Não sabia que dava pra fazer essas bruxarias com o ZFS… Muito bom mesmo 😀
O Silveira, ele usou o iscsi para abrir como se fosse um disco local.
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 !