Eu fiz algo muito estúpido hoje ao tentar adicionar um terceiro espelho a um zpool Linux existente chamado backup
. Basta dizer que cometi alguns erros porque não administro muito meu ZFS além de trocar discos a cada dois anos. E, ao tentar corrigi-los, interpretei mal os conselhos on-line para recriar o pool e criei um novo pool nomeado, backup
destruindo assim o pool existente. (Sim, usei a -f
opção depois que ele reclamou. Sim, sou um idiota. Agora sei que nunca mais devo fazer isso. Vamos em frente.)
Pelo que li on-line, meu backup
pool original que "criei" provavelmente é irrecuperável. O que é bom, porque o nome dele backup
tem um motivo: na maioria das vezes, ele apenas abriga meus backups de cerca de 15 anos. No entanto, há algumas coisas que seria bom ter de volta (alguns dados não essenciais que eu movi para lá temporariamente) e algumas coisas que levarei alguns dias para configurar novamente, relacionadas às configurações de backup que residia naquele volume. (Agora eu sei que devo fazer backup dessas coisas em outro lugar, então esta será uma experiência de aprendizado.)
Mas eu tenho um backup dos meus backups - eu estava substituindo um terceiro espelho hoje por uma unidade que removi há alguns meses durante outra atualização do meu sistema (junto com uma atualização do sistema operacional). Na verdade, essa unidade não falhou, mas era antiga e começou a acumular alguns setores defeituosos, então achei melhor retirá-la em vez de esperar que ela fosse corrompida ou algo assim.
De qualquer forma, ainda tenho aquela unidade antiga, então pensei em colocá-la de volta no meu sistema e recuperar os dados do pool de lá. Eu só sentiria falta dos últimos meses de dados de backup. Agora, eu nunca exportei oficialmente o pool naquela unidade nem nada. E desde então atualizei meu sistema operacional, então não esperava que ele detectasse automaticamente essa unidade. (Não sei se está conectado à mesma porta SATA ou não, pois movi algumas unidades.)
Mas o zpool import
comando parece não encontrar nada automaticamente. Brincando com algumas opções, zpool import
vejo a segunda versão (agora destruída) do backup
pool, mas esse é apenas o pool vazio que criei acidentalmente em duas outras unidades.
Algum conselho sobre como posso tentar ler os dados neste terceiro disco? Pelo que me lembro, era um espelho perfeitamente funcional e atualizado do pool ZFS antes de retirá-lo do caso há alguns meses. Em particular:
- O fato de haver um pool destruído pode estar
backup
interferindo na capacidade de detectar e tentar recuperar/importar esse pool antigo? Existe uma maneira de contornar isso? - Ainda tenho a instalação antiga do sistema operacional em meu servidor que acredito estar em execução quando usei o disco antigo. Tentei inicializá-lo apenas para ver se ele poderia detectar o pool ZFS, mas isso não aconteceu. (Novamente, a unidade pode não estar conectada ao mesmo local.) Mas há algum arquivo de log do ZFS ou outras coisas que eu possa extrair que possam conter metadados naquele pool antigo ou o número de ID ou algo que eu poderia ser usado para forçar o ZFS a importar o que deveria ser um espelho intacto nesta unidade?
- Estou apenas assumindo que meu pool nos dois primeiros discos foi destruído por meio do
create -f
comando. Mas se alguém tiver uma ideia de como posso recuperar o primeiro pool diretamente ali, obviamente seria ótimo. - Existe algum outro motivo pelo qual o ZFS não detectaria o terceiro espelho antigo como um disco de pool do ZFS? Se sim, alguma outra sugestão? Outras ferramentas de recuperação que posso tentar?
Agradeço por qualquer ajuda ou sugestões.
EDIT: Aqui está a saída de zdb -l /dev/sdb1
(que é a terceira unidade)
------------------------------------
LABEL 0
------------------------------------
version: 5000
name: 'backup'
state: 0
txg: 0
pool_guid: 3936176493905234028
errata: 0
hostid: 8323329
hostname: [omitted]
top_guid: 14695910886267065742
guid: 17986383713788026938
vdev_children: 1
vdev_tree:
type: 'mirror'
id: 0
guid: 14695910886267065742
whole_disk: 0
metaslab_array: 34
metaslab_shift: 33
ashift: 12
asize: 1000197324800
is_log: 0
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 17914838236907067293
path: '/dev/sdd1'
whole_disk: 0
DTL: 143
create_txg: 4
children[1]:
type: 'disk'
id: 1
guid: 17986383713788026938
path: '/dev/sdb1'
whole_disk: 0
DTL: 141
children[2]:
type: 'disk'
id: 2
guid: 1683783279473519399
path: '/dev/sdc1'
whole_disk: 0
DTL: 145
create_txg: 4
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
create_txg: 0
labels = 0 1 2 3
Se estou interpretando isso corretamente, o status 0 significa que o pool deve estar intacto. Mas quando tento importar mesmo usando o pool GUID zpool import 3936176493905234028
, recebo um erro "não é possível importar... nenhum pool disponível". (Presumo que devo usar pool_guid, mas tentei usar guid e top_guid também e nada parece funcionar.)
EDIT2: recuperei o arquivo zpool.cache do sistema operacional original em que esse pool estava ativo e tentei zpool import -c zpool.cache
, o que deu o seguinte:
pool: backup
id: 3936176493905234028
state: UNAVAIL
status: One or more devices contains corrupted data.
action: The pool cannot be imported due to damaged devices or data.
see: http://zfsonlinux.org/msg/ZFS-8000-5E
config:
backup UNAVAIL insufficient replicas
mirror-0 UNAVAIL insufficient replicas
sdd1 FAULTED corrupted data
sdc1 FAULTED corrupted data
O que é de se esperar. Esses são os dois discos onde o pool foi substituído pelo meu comando create. No entanto, o sdb1 não está listado como uma unidade em potencial - provavelmente porque eu o removi do pool depois de retirar o disco. No entanto, acho que tenho uma cópia intacta dos dados espelhados antigos no sdb1, e o zdb concorda. Por que não importa?