Erro de grub-probe do ZFS falhou ao obter caminho canônico de / dev / DISK_NAME

1

Antecedentes:

  • Ubuntu Xenial
  • ZFS instalado para disco do sistema (assim, você sabe: rpool / ROOT)
  • O sistema é executado corretamente, mas quando o kernel atualiza, grub-probe causa erro mencionado acima
  • Eu prefiro não reiniciar agora

Há uma discussão aqui sobre grub-probe e como deve ser "apenas melhor", mas isso ajuda até que isso apareça. Eu tirei a ideia dessa discussão.

Mais detalhes: uma instância completa do erro (para o meu sistema) se parece com:

/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/ata-ADATA_SP550_2G1520009135-part1'.

Isto está enterrado em uma série de detalhes extraídos de um comando apt para instalar drivers gráficos (mas isso não é importante).

Esse disco corresponde a uma das minhas partições ZIL. Eu adicionei o ZIL e o cache depois que a instalação foi concluída, então eu suponho que é por isso que eu não vi o problema antes. Eu ainda não reiniciei, e é por isso que estou vendo o problema. Sim, você pode reiniciar para consertar tudo isso, mas supondo que você não queira fazer isso, continue lendo:

Se eu olhar em / dev, vejo links para todos os meus discos ZFS que se parecem com:

lrwxrwxrwx  1 root     root           4 Sep 16 23:31 ata-WDC_WD10EARS-00Y5B1_WD-WMAV51436394-part1 -> sdc1
lrwxrwxrwx  1 root     root           4 Sep 16 23:31 ata-WDC_WD20EZRX-00D8PB0_WD-WCC4MK86SWX7-part1 -> sdd1
lrwxrwxrwx  1 root     root           4 Sep 16 23:31 ata-WDC_WD20EZRX-00D8PB0_WD-WCC4N1085683-part1 -> sde1
lrwxrwxrwx  1 root     root           4 Sep 16 23:31 ata-WDC_WD2500JS-22MHB0_WD-WCANK4053187-part1 -> sda1

... mas notavelmente nenhum para as partições ZIL.

Eu posso testar a situação executando:

$ sudo grub-probe /
grub-probe: error: failed to get canonical path of '/dev/ata-ADATA_SP550_2G1520009135-part1'.

Então, a questão é: como corrigir esse problema, então grub-probe se comporta?

    
por fbicknel 19.09.2016 / 22:53

3 respostas

3

Existe uma variável de ambiente que corrige isso. A questão da minha leitura parece ser que o Grub gosta da idéia de 'suportar' o zfs, mas não a idéia de corrigir problemas relacionados ao zfs no Grub. Especificamente, seu erro é lidar com erros em termos de encontrar coisas.

Por exemplo, as ferramentas do grub que acompanham o Ubuntu 16.x não conseguirão encontrar / boot em um volume ZFS sem alguma intervenção do usuário e, em seguida, escreverão alguns (mas não todos) arquivos necessários de qualquer utilitário usando a pasta / boot que acabou de dizer que não conseguiu encontrar.

De qualquer forma ...

link

To check if you have commit (should see full paths):

ZPOOL_VDEV_NAME_PATH=1 zpool status

If so you can do:

ZPOOL_VDEV_NAME_PATH=1 grub-whatevs ....

Você pode passar a variável como entrada para os utilitários necessários do grub, ou você pode especificá-la como uma variável do shell no .bashrc ou .profile do root ou algo assim com ...

export ZPOOL_VDEV_NAME_PATH=YES

A variável faz com que o zpool relate caminhos completos, em vez de caminhos relativos / dev para os discos que podem ou não funcionar corretamente com o zfs. Os utilitários do Grub verificam o zpool status dos pools do zfs para localizar os discos que os contêm. Portanto, alterar a saída do zpool status corrige o grub.

Concordo que os usuários não deveriam ter que lidar com isso, em referência ao comentário da femulator. A solução real? O mesmo que qualquer outro projeto de código aberto que defina em bugs que nunca são consertados. Bifurque-o, conserte-o e pare de usar o projeto de origem / biblioteca / o que for. A maneira FOSS de "demitir" alguém, em outras palavras;). Aparentemente, o Debian estava ciente deste bug em particular há sete anos.

Essa foi a única coisa que me impediu de migrar com sucesso um pool de boot do FreeBSD RaidZ para o Ubuntu. Se alguém tentar algo semelhante, o processo é relativamente simples, desde que você entenda bem o ZFS para ignorar as partes da documentação do Grub e do zfsonlinux que estão erradas (como configurar o conjunto de dados raiz para não montá-lo automaticamente, eh ... "Como exatamente isso vai arrancar então?). É um pouco irônico que o Ubuntu aponte em seus documentos que o gerenciador de inicialização é o 'recurso' mais inseguro do Linux, o que é verdade, suponho, mas neste caso também é uma falha gritante do Ubuntu. Levaria uma ou duas horas para migrar um pool BSD ZFS para outro sistema operacional se eu pudesse fazer isso usando os utilitários Sun / Solaris que realmente funcionam. O problema é que eu tive que usar utilitários Linux (como o Grub) que não funcionam (ou mal) em algum momento, então existe a falha dos outros dois dias que passei corrigindo isso. O Ubuntu seria muito melhor se não precisasse do grub para arrancar ...

    
por RNC 05.08.2017 / 23:52
1

Supondo que você não queira reinicializar (veja abaixo), a resposta para isso é criar links semelhantes para os discos que estão faltando. Para mim e para o meu sistema, isso significava adicionar esses links:

$ cd /dev
$ sudo ln -sf sdf1 /dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part1
$ sudo ln -sf sdf3 /dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part3
$ sudo ln -sf sdg1 /dev/disk/by-id/ata-SPCC_Solid_State_Disk_EB84076413B201101308-part1
$ sudo ln -sf sdg3 /dev/disk/by-id/ata-SPCC_Solid_State_Disk_EB84076413B201101308-part3

(a partição 2 em ambos os discos é espelhada para ser o ZIL para home , mas grub-probe não se importa com isso)

A fórmula para isso é determinar quais discos grub-probe precisam, em seguida, criar links simbólicos para eles de acordo com o padrão:

$ sudo ln -sf {sdname}{partN} /dev/disk/by-id/{diskid}-part{partN}

Você pode determinar os discos necessários, repetindo o comando $ sudo grub-probe / e criando links até que fique satisfeito e, por fim, relate:

$ sudo grub-probe /
zfs

Até que seja feliz, você verá reclamações semelhantes:

$ sudo grub-probe /
grub-probe: error: failed to get canonical path of '/dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part3'.

Observe que ele está reclamando especificamente sobre -part3 e o nome do disco é ata-ADATA_SP550... Criar o link:

Encontre o disco correspondente a ata-ADATA_SP.... executando:

$ ls -l /dev/disk/by-id | grep ata-ADATA_SP
lrwxrwxrwx 1 root root  9 Sep 17 13:45 ata-ADATA_SP550_2G1520009135 -> ../../sdf
lrwxrwxrwx 1 root root 10 Sep 17 13:49 ata-ADATA_SP550_2G1520009135-part1 -> ../../sdf1
lrwxrwxrwx 1 root root 10 Sep 17 13:51 ata-ADATA_SP550_2G1520009135-part2 -> ../../sdf2
lrwxrwxrwx 1 root root 10 Sep 17 13:50 ata-ADATA_SP550_2G1520009135-part3 -> ../../sdf3

Note que isto é sdf, então seu comando de link se torna:

$ sudo ln -sf /dev/sdf3 /dev/disk/by-id/ata-ADATA_SP550_2G1520009135-part3

Enxágue e repita até que o comando grub-probe seja bem-sucedido. Se você sabe o que está fazendo e sabe quais partições são usadas por todos os discos que participam do ROOT pool, vá diretamente até o final e vincule-as ao invés de usar grub-probe para lhe dizer o que fazer.

Você pode pensar que isso iria subverter o motivo pelo qual você usou esses /dev/disk/by-id/* nomes em primeiro lugar. Se os caminhos /dev/sd* mudarem, você será escolhido e terá que fazer os links novamente, certo? Acontece que uma alternativa para tudo isso é reinicializar o host: ele cria os links na reinicialização.

    
por fbicknel 19.09.2016 / 23:14
0

O que é o bug / correção do ZFS para isso? os usuários não devem ter que lidar com isso - > link

    
por fermulator 29.06.2017 / 15:06