Como criar um zpool do ZFS que o GRUB possa ler

4

A página wiki do Arch Linux ZFS explica criação de conjuntos compatíveis com o grub , assim como esta página sobre como inicializar o Fedora , mas não consegui criar um conjunto legível pelo Grub. A página wiki do Arch Linux sobre Instalando o Arch Linux no ZFS destaca alguns bugs, mas não explica como superá-los .

As páginas vinculadas explicam que o Grub suporta um subconjunto de recursos zpool e não pode ler um pool que usa recursos que ele não suporta. Eles explicam como configurar um pool adequado, mas não consegui fazê-lo funcionar. O subconjunto de recursos suportados não parece estar documentado em lugar algum.

Estou usando uma máquina virtual para testar com o Grub 2.02 e Arch Linux kernel 4.16.13-1-ARCH, que é o mais recente e é compatível com a versão atual do pacote zfs-linux ( zfs-linux-0.7.9.4.16.13.1-1 ). Eu não estou (ainda) tentando criar um sistema inicializável, apenas para provar que o Grub pode ler o zpool. Aqui está o que eu tentei:

Primeiro, como a página wiki em arco sugere, desabilitando recursos indesejados:

# zpool create \
    -o feature@multi_vdev_crash_dump=disabled \
    -o feature@large_dnode=disabled           \
    -o feature@sha512=disabled                \
    -o feature@skein=disabled                 \
    -o feature@edonr=disabled                 \
    testpool mirror \
    /dev/disk/by-id/ata-VBOX_HARDDISK_VB{5f2d4170-647f16b7,f38966d8-57bff7df}

que resulta nesses recursos:

testpool  feature@async_destroy          enabled                       local
testpool  feature@empty_bpobj            active                        local
testpool  feature@lz4_compress           active                        local
testpool  feature@multi_vdev_crash_dump  disabled                      local
testpool  feature@spacemap_histogram     active                        local
testpool  feature@enabled_txg            active                        local
testpool  feature@hole_birth             active                        local
testpool  feature@extensible_dataset     active                        local
testpool  feature@embedded_data          active                        local
testpool  feature@bookmarks              enabled                       local
testpool  feature@filesystem_limits      enabled                       local
testpool  feature@large_blocks           enabled                       local
testpool  feature@large_dnode            disabled                      local
testpool  feature@sha512                 disabled                      local
testpool  feature@skein                  disabled                      local
testpool  feature@edonr                  disabled                      local
testpool  feature@userobj_accounting     active                        local

Depois, como o exemplo do fedora , ativando os recursos desejados:

zpool create -d \
    -o feature@async_destroy=enabled \
    -o feature@empty_bpobj=enabled \
    -o feature@spacemap_histogram=enabled \
    -o feature@enabled_txg=enabled \
    -o feature@hole_birth=enabled \
    -o feature@bookmarks=enabled \
    -o feature@embedded_data=enabled \
    -o feature@large_blocks=enabled \
    testpool mirror \
    /dev/disk/by-id/ata-VBOX_HARDDISK_VB{5f2d4170-647f16b7,f38966d8-57bff7df}

que resulta nesses recursos:

# zpool get all testpool | grep feature
testpool  feature@async_destroy          enabled                       local
testpool  feature@empty_bpobj            active                        local
testpool  feature@lz4_compress           disabled                      local
testpool  feature@multi_vdev_crash_dump  disabled                      local
testpool  feature@spacemap_histogram     active                        local
testpool  feature@enabled_txg            active                        local
testpool  feature@hole_birth             active                        local
testpool  feature@extensible_dataset     enabled                       local
testpool  feature@embedded_data          active                        local
testpool  feature@bookmarks              enabled                       local
testpool  feature@filesystem_limits      disabled                      local
testpool  feature@large_blocks           enabled                       local
testpool  feature@large_dnode            disabled                      local
testpool  feature@sha512                 disabled                      local
testpool  feature@skein                  disabled                      local
testpool  feature@edonr                  disabled                      local
testpool  feature@userobj_accounting     disabled                      local

Em cada caso, eu carreguei alguns conteúdos:

# cp -a /boot /testpool

E, em seguida, reinicie o Grub:

grub> search --set --label testpool
grub> ls /
@/
grub> ls /@
error: compression algorithm 80 not supported
.
grub> ls /@/
error: compression algorithm inherit not supported
.

Eu tentei ativar / desativar alguns recursos, principalmente lz4_compress . Eu também tentei criar um conjunto de dados no pool. Nada que eu tentei funcionou dentro do Grub.

Eu esperava poder listar /boot ou /@/boot .

Erros encontrados incluem

  • compression algorithm inherit not supported
  • compression algorithm 66 not supported
  • compression algorithm 80 not supported
  • incorrect dnode type

Como um zpool ZFS deve ser criado para que seja legível pelo Grub?

    
por starfry 05.06.2018 / 12:51

1 resposta

1

O Grub não pode executar de forma confiável uma listagem de diretórios de um zpool devido a um bug como confirmado via a lista de discussão :

listing directory contents in Grub is broken, I have a patch lying around that fixes that specific issue. if you get strange error messages (e.g., something like invalid BP type or compression algorithm), it's likely this issue.

Este probelm está presente no Grub instalado a partir do ArchLinux e também do Fedora 28. O Ubuntu, no entanto, parece ter corrigido seu Grub para corrigir isso (confirmado com o Ubuntu 16.10).

O Grub pode, no entanto, ler os arquivos necessários para inicializar. Você pode criar um zpool que o Grub inicializará assim:

zpool create -m none "$ZPOOL" "$RAIDZ" "${DISKS[@]}"

onde as variáveis definem o nome do pool, por exemplo, mypool , o nível de invasão, por exemplo, mirror e os discos, por exemplo, /dev/disk/by-id/... (dois discos sendo necessários para um espelho).

Você precisa criar um conjunto de dados

zfs create -p "$ZPOOL"/ROOT/archlinux

E você precisa definir o ponto de montagem do conjunto de dados:

zfs set mountpoint=/ "$ZPOOL"/ROOT/archlinux

Você pode então inicializá-lo com o Grub usando comandos como:

insmod part_gpt
search --set --label mypool
linux /ROOT/archlinux@/boot/vmlinuz-linux zfs=mypool rw
initrd /ROOT/archlinux@/boot/initramfs-linux.img
boot

Eu criei um script para testá-lo em uma máquina VirtualBox. Eu instalei o Arch do ISO em uma raiz normal do ext4 e usei-o para instalar uma nova raiz do ZFS em dois discos virtuais espelhados. O texto acima é um resumo - consulte o script para obter detalhes completos.

    
por 18.06.2018 / 23:56