grub não consegue encontrar o grub.cfg ao inicializar a partir do zfs root

0

Eu instalei o Xubuntu 14.04 em uma raiz ZFS seguindo estas instruções usando o repositório Debian da ZoL: link

O sistema funciona bem, mas ao inicializar, o grub entra diretamente no shell do grub. Lá eu posso rodar configfile (hd0,msdos3)/ROOT/ubuntu/@/boot/grub/grub.cfg e o menu usual do grub começa e eu posso inicializar o meu sistema. Parece-me que o grub não consegue encontrar grub.cfg por si mesmo.

As instruções realmente dizem que o caminho é (hd0,msdos3)/ROOT/ubuntu@/boot/grub/grub.cfg (observe o @ ). Mas isso não funcionou para mim. Eu tive que colocar um / antes do @. Mas eu acho que isso não é relevante. (3.5 boot de teste a partir da instalação do grub existente)

O Grub foi instalado com grub-install --boot-directory=/rpool/ROOT/ubuntu/boot /dev/sda de acordo com as instruções.

De qualquer forma, após algumas reinicializações, notei que existe uma pasta real /rpool/ROOT/ubuntu/boot e também uma pasta /rpool/ROOT/ubuntu/@/boot que contém uma pasta do grub com tudo, menos grub.cfg :

$ ls -l /rpool/ROOT/ubuntu/boot/grub/
drwxr-xr-x 2 root root     3 Jan 30 21:34 fonts
-rw-r--r-- 1 root root   699 Jan 31 11:04 gfxblacklist.txt
-rw-r--r-- 1 root root  1024 Jan 30 21:34 grubenv
drwxr-xr-x 2 root root   273 Jan 30 21:47 i386-pc
drwxr-xr-x 2 root root     5 Jan 30 21:47 locale

/rpool/ROOT/ubuntu/@/boot/grub/ contém o mesmo.

Eu copiei /boot/grub/grub.cfg para ambos os locais e agora está funcionando. Meu problema real é que, se algo atualizar o grub, eu tenho que copiar grub.cfg novamente. Por enquanto adicionei 2 linhas a /usr/sbin/grub-mkconfig para fazer a cópia em cada grub-update . Mas quando o pacote do grub é atualizado, essa mudança será eliminada. Então, estou procurando uma solução confiável aqui.

Mais uma ideia:

Será que /rpool/ROOT/ubuntu/ também deve manter meu sistema de arquivos? Porque diferente do diretório boot está vazio:

# ls -l /rpool/ROOT/ubuntu/
total 17
drwxr-xr-x 3 root root 3 Jän 30 21:40 @
drwxr-xr-x 3 root root 3 Jän 30 21:34 boot

Aqui algumas informações que podem ser úteis:

# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
rpool              4,15G  94,3G   144K  /rpool
rpool/ROOT         4,15G  94,3G  7,09M  /rpool/ROOT
rpool/ROOT/ubuntu  4,14G  94,3G  4,01G  /rpool/ROOT/ubuntu

parte relacionada a zfs de mount :

rpool/ROOT/ubuntu on / type zfs (rw,relatime,xattr,noacl)
rpool on /rpool type zfs (rw,relatime,xattr,noacl)
rpool/ROOT on /rpool/ROOT type zfs (rw,relatime,xattr,noacl)

Qualquer ajuda é apreciada. Se você precisar de mais informações, me avise.

FWIW: Meu único conhecimento prévio do ZFS é de usar freenas, esta é minha primeira tentativa de fazer isso sozinho.

    
por fronk 31.01.2015 / 13:33

2 respostas

1

Algumas correções da minha própria experiência.

  1. Seu "rpool" foi montado em "/ rpool" automaticamente no momento em que você criou o rpool. É por isso que, em algum lugar no processo de configuração, você emite zfs set mountpoint=none rpool para eliminar esse comportamento. O mesmo que você faz para rpool/ROOT para eliminar sua montagem automática em / rpool / ROOT, que você não precisa.

  2. Na verdade, seu zpool é "rpool", enquanto "rpool / ROOT" é um conjunto de dados do ZFS e não um zpool.

  3. Com grub-install , você pode se referir apenas à árvore de diretórios atual. É por isso que você dá --boot-directory=/boot . O script em si não quer ouvir nada sobre o ZFS. Mas, no processo, outros scripts auxiliares incluídos no GRUB2 irão verificar o que está montado lá e garantir que o grub possa acessá-lo no momento da inicialização. Portanto, se você usar a versão mais recente do ZFS, a partir da data de sua escrita, o GRUB2 NÃO o reconhecerá e se recusará a instalá-lo. Ai!

  4. Você com certeza colocou "/" antes de "@" e é relevante, como você mesmo admitiu que não funcionou para você de outra forma. EDIT: bem, ele usou para importar, mas com o último código git isso não acontece.

  5. Por fim, a inicialização em snapshots não é suportada, receio. Ou seja, enquanto você PODE dizer ao GRUB para usar algo como (hd0,2)mypool/ROOT/myfs@version etc., sua inicialização atual não será o que você espera. Então não faça isso.

por Kostya Berger 27.02.2015 / 19:17
0

Eu acabei de descobrir:

O comando grub-install estava errado. --boot-directory precisa ser /boot em vez de /rpool/ROOT/ubuntu/boot .

Agora eu fiz o grub-install --boot-directory=/boot , excluí as pastas de inicialização em /rpool/ROOT/ubuntu e /rpool/ROOT/ubuntu/@ e ele inicializa bem.

Deixe-me tentar explicar:

/rpool e /rpool/ROOT são meus zpools. Eles são montados lá para que eu possa acessar os conjuntos de dados que posso criar nesses pools, eu acho. A pasta /rpool/ROOT/ubuntu é desnecessária, apenas foi copiada durante a cópia do sistema de arquivos do ext2-fs temporário para o conjunto do ZFS. Eu deletei agora.

O Grub encontra o arquivo de configuração em /boot , porque conhece o ZFS. Até encontra meus instantâneos. Isso é o que os caminhos com @ são para:

No grub shell eu posso usar (hd0,msdos3)/ROOT/ubuntu ou (hd0,msdos3)/ROOT/ubuntu@ para o atual sistema de arquivos atual, ou se eu tiver um instantâneo chamado "versão-1" eu posso dizer ao grub para usar (hd0,msdos3)/ROOT/ubuntu@version-1 . Deve ser o mesmo na linha de comando do kernel para inicializar com um snapshot como sistema de arquivos raiz como linux /ROOT/ubuntu/boot/vmlinuz-3.13.0-45-generic root=ZFS=rpool/ROOT/ubuntu@version-1 , mas eu não tentei isso ainda. Provavelmente terá que carregar o kernel anterior se ele foi atualizado depois de tirar o instantâneo.

    
por fronk 01.02.2015 / 16:08