Vamos supor que nosso houve um problema em nosso servidor e precisamos migrar os HDs que compõem nosso pool “meuPool” para outro servidor. O sistema de arquivos ZFS disponibiliza as opções “export” e “import” para a realização da migração dos HDs.
É bem simples a migração.
Executamos que possamos retirar os discos:
sudo zpool export meuPool
E após conectar os discos no novo servidor:
sudo zpool import meuPool
Já podemos finalizar esse post. Porém gostaria de praticar e ver mais alguns detalhes. Então vamos continuar:
Ao usar “export” os são drivers liberados de modo que possamos desplugar os cabos e movê-los para outro servidor.
Se não executarmos o comando “zfs export” o novo servidor não será capaz de importar os discos. Além disso, “zfs export” nos garante que os dados estão consistentes nos discos permitindo a liberação para migrar.
Se removermos os discos sem “zfs export” e ao inserirmos no outro servidor esse servidor novo reconhecerá os discos como “faulted pool” ou pool com falha e se recusará a importar. Essa atitude é uma proteção contra “race condition”; mas precisamente evitar que, por exemplo, já exista algum servidor nas(network attached storage) usando o pool.
O ZFS é muito inteligente para reconhecer os discos no novo servidor não importando a ordem colocada. Podemos ter 10 discos e inseri-los em qualquer ordem no novo servidor.
Nosso ambiente atual é o seguinte
Iremos retirar os discos do server02 e passá-los para o server01.
Servidor danificado:
Aqui iremos usar “zfs export” para exportar os discos.
- Sistema Operacional: Debian 10
- Ip: 192.168.0.41
- nome/hostname: server02
- HD: /dev/sdb, /dev/sdc, /dev/sdd e /dev/sde
Criei um pool com
sudo zpool create meuPool mirror sdb sdc mirror sdd sde
elder@server02:~$ sudo zpool status
pool: meuPool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
meuPool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
Servidor Novo que Receberá os Discos
Iremos usar “zfs import” para importar os discos.
- Sistema Operacional: Debian 10
- Ip: 192.168.0.40
- nome/hostname: server01
Os discos “/dev/sdb, /dev/sdc, /dev/sdd e /dev/sde” serão conectados nesse servidor.
Exportando o Pool
Comandos a serem executados no server02 danificado.
- Execute o comando “zfs export meuPool
elder@server02:~$ sudo zpool export meuPool
Dica: Para forçar a exportação podemos usar “-f”.
- Desligue o server02 e retire os HDs.
Importando o Pool
Comandos a serem executados no server01
Eu fiz um erro proposital: Acabei pegando 3 HDs do pool e 1 que não fazia parte, um HD estranho, desconhecido. Vamos ver o erro que ocorre.
A migração, sem o erro proposital, é para ter sucesso de primeira!
- Desligue o servidor Server01 se ele não tiver a opção de “troca quente(hot swap)” e conecte os 4 discos retirados do server02
- Ligue o server01 e execute “lsblk -d” para vermos os discos inseridos
elder@server01:~$ sudo zpool import pool: meuPool id: 14129386467484550634 state: DEGRADED status: One or more devices contains corrupted data. action: The pool can be imported despite missing or damaged devices. The fault tolerance of the pool may be compromised if imported. see: http://zfsonlinux.org/msg/ZFS-8000-4J config: meuPool DEGRADED mirror-0 ONLINE sdb ONLINE sdc ONLINE mirror-1 DEGRADED sdd FAULTED corrupted data ata-VBOX_HARDDISK_VB826fbce8-bc5f6bb5 ONLINE
Dica: Se foi exportado mais de um pool do server02 danificado podemos usar “zpool import nome_do_pool” para importarmos apenas um desejado.
- Acima podemos ver que os espelhos ficaram como “DEGRADED” e um dos discos como “FAUTED corrupted”. Na verdade, usando apenas “zpool import” não foi eficiente; não importando, pois ainda estamos sem pool no server01
elder@server01:~$ sudo zpool list no pools available
- Execute “zpool import meuPool”
elder@server01:~$ sudo zpool import meuPool
Dica: poderíamos executar “zpool import -a” para importar todos os pool disponíveis.
- Veja o status
elder@server01:~$ sudo zpool status pool: meuPool state: DEGRADED status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-4J scan: none requested config: NAME STATE READ WRITE CKSUM meuPool DEGRADED 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 mirror-1 DEGRADED 0 0 0 10132285155705578371 FAULTED 0 0 0 was /dev/sdd1 ata-VBOX_HARDDISK_VB826fbce8-bc5f6bb5 ONLINE 0 0 0 errors: No known data errors
Nenhum erro encontrado 🙂 mas ainda os espelhos estão como DEGRADED e um dos discos como “FAULTED”. Outra informação importante é “was /dev/sdd1” que nos informa que o disco(10132285155705578371) perdido era identificado como /dev/sdd1.
- O que aconteceu? como mencionado acima, o disco(10132285155705578371) não se encontra inserido no server01. Vamos inseri-lo.
- Com o HD correto inserido usaremos o comando “blkid” para listarmos as identificações dos blocos(block id). Lembre que o disco que está como FAULTED acima é identificado como “10132285155705578371”.
elder@server01:~$ sudo blkid /dev/sdf1: LABEL="meuPool" UUID="14129386467484550634" UUID_SUB="10132285155705578371" TYPE="zfs_member" PARTLABEL="zfs-74bbbcbb13fad551" PARTUUID="237ea48d-767c-8c4d-8ae1-4f587805090b" /dev/sdc1: LABEL="meuPool" UUID="14129386467484550634" UUID_SUB="6913836240169211556" TYPE="zfs_member" PARTLABEL="zfs-8890548514dd217e" PARTUUID="8141f6ab-2678-e24f-9374-763e774c337c" /dev/sdb1: LABEL="meuPool" UUID="14129386467484550634" UUID_SUB="17249640120417132992" TYPE="zfs_member" PARTLABEL="zfs-bbc7d7ca54db721e" PARTUUID="5072e474-ed04-b642-83ae-e9eef8241c94" /dev/sdd1: LABEL="meuPool" UUID="14129386467484550634" UUID_SUB="13030838777518907721" TYPE="zfs_member" PARTLABEL="zfs-384a87ba46e14c91" PARTUUID="f8145fca-b4b4-9b4d-8f3d-b134d4aa24ff" /dev/sda1: UUID="08d9728a-0edf-4f23-b06a-6cb3ee2fea50" TYPE="ext4" PARTUUID="143703ee-01" /dev/sda5: UUID="b48081aa-85b8-4124-bbe2-b644291f97df" TYPE="ext4" PARTUUID="143703ee-05" /dev/sda6: UUID="d04d6b8a-a462-4328-8d5e-a87fd57b55de" TYPE="swap" PARTUUID="143703ee-06" /dev/sda7: UUID="c751cff9-6622-45b1-9ddf-0b7b4a96fd26" TYPE="ext4" PARTUUID="143703ee-07" /dev/sda8: UUID="7621b2ea-6ceb-4e11-b9dc-ad17316274fe" TYPE="ext4" PARTUUID="143703ee-08" /dev/sde1: PARTUUID="4f0b7617-01" /dev/sdf9: PARTUUID="a49cd053-8ef4-8740-bc2e-c16062b2e538" /dev/sdc9: PARTUUID="d7db4a43-076f-634a-acc7-077bb96c4302" /dev/sdb9: PARTUUID="c8d695b3-9923-0343-911f-ef9507b75058" /dev/sdd9: PARTUUID="bdb20fbd-b74a-3347-9a94-86ae7b09bf48"
O disco correto é o /dev/sdf1, ele tem id 10132285155705578371.
Podemos ver em verde que sdc1, sdb1 e sdd fazem parte do pool meuPool.
O /dev/sde é um intruso e não faz parte do pool zfs.Temos um probleminha: o resultado de “zpool status” acima nos diz que o disco que falta estava identificado antes como sdd. Mas o sdd agora está como sdf. E agora??? Na verdade e felizmente, como estamos trabalhando com espelhamento(mirror) basta substituir(replace) o disco sdd pelo sdf
- Substitua o disco sdd pelo sdf. Use “-f” para forçar a substituição.
elder@server01:~$ sudo zpool replace -f meuPool sdd sdf
- Veja o status
elder@server01:~$ sudo zpool status pool: meuPool state: ONLINE status: One or more devices has experienced an unrecoverable error. An attempt was made to correct the error. Applications are unaffected. action: Determine if the device needs to be replaced, and clear the errors using 'zpool clear' or replace the device with 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-9P scan: resilvered 180K in 0 days 00:00:01 with 0 errors on Fri Feb 5 11:55:55 2021 config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdf ONLINE 0 0 8 ata-VBOX_HARDDISK_VB826fbce8-bc5f6bb5 ONLINE 0 0 0 errors: No known data errors
Negritei acima dicas improtantes: PRecisamos executar “zpool clear” ou “zpool replace”. Bom, “zpool replace” foi o que fizemos. Vamos limpar(clear)
- Limpe o disco recém adicionado
elder@server01:~$ sudo zpool clear meuPool sdf
- Veja o status. Agora sim estamos OK.
elder@server01:~$ sudo zpool status pool: meuPool state: ONLINE scan: resilvered 180K in 0 days 00:00:01 with 0 errors on Fri Feb 5 11:55:55 2021 config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdf ONLINE 0 0 0 ata-VBOX_HARDDISK_VB826fbce8-bc5f6bb5 ONLINE 0 0 0 errors: No known data errors
Acima vemos que um “resilver” foi realizado. Veremos sobre isso no próximo Post.
Conclusão
O correto é trabalhar com os ids dos discos ao invés desses rótulos: sdb, sdc…. Esses rótulos mudam, como vimos acima, já os IDs dos discos não; são permanentes. Podemos encontrar esses IDs usando o comando blkid.
Vamos ver um exemplo usando o disco sde.
elder@server01:~$ sudo zpool create meuPool02 ata-VBOX_HARDDISK_VB32c76fa9-f05ea43a
Ao invés de colocar “sde” usamos “ata-VBOX_HARDDISK_VB32c76fa9-f05ea43a”.
Onde encontramos esses IDs? Eles estão dentro de /dev/disk/by-id/. Pesquise com “ls -l”
elder@server01:~$ ls -l /dev/disk/by-id/ total 0 lrwxrwxrwx 1 root root 9 fev 5 10:54 ata-VBOX_CD-ROM_VB2-01700376 -> ../../sr0 lrwxrwxrwx 1 root root 9 fev 5 12:28 ata-VBOX_HARDDISK_VB32c76fa9-f05ea43a -> ../../sde lrwxrwxrwx 1 root root 9 fev 5 11:55 ata-VBOX_HARDDISK_VB3fa3b388-c8f02690 -> ../../sdf lrwxrwxrwx 1 root root 10 fev 5 11:55 ata-VBOX_HARDDISK_VB3fa3b388-c8f02690-part1 -> ../../sdf1 lrwxrwxrwx 1 root root 10 fev 5 11:55 ata-VBOX_HARDDISK_VB3fa3b388-c8f02690-part9 -> ../../sdf9 lrwxrwxrwx 1 root root 9 fev 5 10:54 ata-VBOX_HARDDISK_VB826fbce8-bc5f6bb5 -> ../../sdd lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VB826fbce8-bc5f6bb5-part1 -> ../../sdd1 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VB826fbce8-bc5f6bb5-part9 -> ../../sdd9 lrwxrwxrwx 1 root root 9 fev 5 10:54 ata-VBOX_HARDDISK_VB8b3ce427-2779f1ea -> ../../sdc lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VB8b3ce427-2779f1ea-part1 -> ../../sdc1 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VB8b3ce427-2779f1ea-part9 -> ../../sdc9 lrwxrwxrwx 1 root root 9 fev 5 10:54 ata-VBOX_HARDDISK_VBcad12d2a-434739ba -> ../../sda lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcad12d2a-434739ba-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcad12d2a-434739ba-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcad12d2a-434739ba-part5 -> ../../sda5 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcad12d2a-434739ba-part6 -> ../../sda6 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcad12d2a-434739ba-part7 -> ../../sda7 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcad12d2a-434739ba-part8 -> ../../sda8 lrwxrwxrwx 1 root root 9 fev 5 10:54 ata-VBOX_HARDDISK_VBcef28c17-112e7c2a -> ../../sdb lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcef28c17-112e7c2a-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 10 fev 5 10:54 ata-VBOX_HARDDISK_VBcef28c17-112e7c2a-part9 -> ../../sdb9
Muito bom, não é mesmo? Espero que tenha gostado!
Excelente artigo. Gostaria de tirar uma dúvida. Atualmente eu estou com uma demanda semelhante, porem eu estou com o meu ubuntu com o disco principal todo em zfs e preciso trocar a minha placa mãe. Essa mesma ideia daria certo?