Criando grub.cfg

Criando grub.cfg
  • Como inicializar a partir de uma partição GPT?
  • É como o MBR que precisa de uma partição com o sinalizador de inicialização ativado?
  • Como marcar uma partição GPT inicializável no Linux?

Responder1

Como inicializar a partir de uma partição GPT?

A inicialização de uma instalação Linux envolve vários estágios e componentes de software, incluindofirmwareinicialização, execução de umcarregador de inicialização, carregamento e inicialização de umKernel Linuximagem e execução de váriosscripts de inicializaçãoedemônios. Para cada uma destas etapas e componentes existem diferentes variações e abordagens; por exemplo,GRUB,LILO,SYSLINUXouCarregarpodem ser usados ​​como carregadores de inicialização, enquanto os scripts de inicialização podem ser tradicionaisiniciar-style, ou a configuração do sistema pode ser realizada através de alternativas modernas, comosistemaouSubir na vida.

Outro programa popular para inicializar érEFIndaGerenciador de inicialização UEFIcapaz de lançarEFISTUBgrãos.

OEFI(Interface de firmware extensível)partição do sistemaouPESé uma partição em um dispositivo de armazenamento de dados (geralmente uma unidade de disco rígido ou unidade de estado sólido) usada por computadores que aderem aoInterface de firmware extensível unificada(UEFI). Quando um computador éinicializado, o firmware UEFI carrega arquivos armazenados no ESP para iniciar os sistemas operacionais instalados e vários utilitários.

Um ESP contém ocarregadores de inicializaçãoouimagens do kernelpara todos os sistemas operacionais instalados

É como o MBR que precisa de uma partição com o sinalizador de inicialização ativado?

Osinalizador de inicializaçãoé dos tempos antigos, onde você indicaria umMBRregistro de partição como inicializável, para que você possa indicar onde o carregador de inicialização residia. Então, para responder sua pergunta, não, você não precisa sinalizar uma partição de inicialização inicializável.

Oidentificador globalmente exclusivo(GUIA) para oEFIpartição do sistema noTabela de partição GUID(GPT) esquema éC12A7328-F81F-11D2-BA4B-00A0C93EC93B, enquanto seu ID noregistro mestre de inicialização(MBR) o esquema da tabela de partições é0xEF.

Como marcar uma partição GPT inicializável no Linux?

  • Emgdisk, você define o código de tipo como EF00. (gdisk usa códigos de tipo de dois bytes que se expandem para os códigos de tipo reais no disco; "EF00" é apenas um mnemônico para "C12A7328-F81F-11D2-BA4B-00A0C93EC93B".)
  • EmGPartedou parted, você define o "sinalizador de inicialização". Observe, entretanto, que isso funciona apenas em discos GPT; você não pode definir o código do tipo ESP em discos MBR com esses programas. (Isso normalmente não é um grande problema, já que os computadores baseados em EFI geralmente inicializam a partir de discos GPT.)
  • Nas versões recentes do Linuxfdisk, você define o tipo de partição por seu número (1 para "Sistema EFI" em discos GPT ou 0xEF em discos MBR) ou inserindo o código de tipo completo em discos GPT.

Responder2

É como o MBR que precisa de uma partição com o sinalizador de inicialização ativado?

Hmm, bem antes de fazermos uma breve lembrança de como o BIOS entrega a execução da inicialização.

  1. O BIOS lê o primeiro setor (512 Bytes) da mídia de inicialização.
  2. Se os dois últimos bytes do setor forem 55 AA ele executa esse setor. Então aqui termina a responsabilidade da bios.

Esse código de 440 bytes cortado é denominado MBR (Master Boot record). Seu objetivo é procurar nas 4 entradas da tabela de partições o sinalizador inicializável. Se for para alguma partição marcada como inicializável, ele carregará seu primeiro setor e transferirá o fluxo de execução de inicialização para o código neste setor.

Observe, por motivos de compatibilidade, que o chamado MBR protetor existe mesmo quando se usa GPT. (O GPT começa no segundo setor)

Portanto, é o código MBR que cuida do 'sinalizador inicializável'. No entanto, esse código MBR de 440 bytes cortado pode ser alterado ou diferente. E quando, de fato, ao instalar o GRUB, esse é o caso. Por exemplo, instalando o GRUB2 assim:

sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 

Substituirá completamente o código MBR padrão por seu próprio código. (observe que uma cópia desse código pode ser encontrada em /boot/grub/i386-pc/boot.img)

Conclusão: -> O código Grub não se importa com nenhum sinalizador inicializável.

Instalando o grub no dispositivo GPT não EFI

Por 'Não-EFI' quero dizer que temos um dispositivo antigo cujo BIOS não tem UEFI ou no qual o UEFI é executado no modo CSM (Módulo de suporte de compatibilidade) e inicializa da maneira tradicional que descrevi acima.

Quando o Grub é instalado através de 'listas de bloqueio', ele se instala no espaço de partição entre o MBR e o primeiro setor de inicialização. No entanto, quando usamos GPT, o Grub se recusa a seguir esse caminho de lacuna de partição. Em vez disso, ele deseja que uma pequena partição seja criada onde possa instalar seu código com segurança.

Então é assim que configuramos isso usandoGparted:

  1. Crie uma partição formatada de 1 MB
  2. Marque essa partição como 'bios-grub' Quando você ativar a caixa de seleção 'bios-grub' no gparted, o tipo GPT será alterado para 'Partição de inicialização do BIOS'.

Alternativamente, você pode usar: gdisk -l /dev/sdbpara verificar e ...

sgdisk -t 3:ef02 /dev/sdb ^- marca a 3ª partição como ef02 => 'partição de inicialização do BIOS'

... para fazer o mesmo sem o gparted. Nota: "ef02" é a abreviação de 'partição de inicialização do BIOS' ou GUID 21686148-6449-6E6F-744E-656564454649.

Ok, é isso. Agora podemos executar a configuração do Grub.

Monte seu Linux (ou partição /boot/grub) em /mnt/boot e execute

  1. sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 
    

Se você tiver sorte e tudo correr bem e você verá:

grub-install: Info: setting the root device to `hostdisk//dev/sda,gpt6'.
grub-install: Info: saving <556324864,0,512>.
...

Para que o conteúdo /boot/grub/i386-pc/core.imgseja copiado diretamente para a 'partição de inicialização do BIOS' de 1 MB, --forcecaso contrário, o grub se recusa a ser instalado por meio de listas de bloqueio. Caso falhe, aqui está um atalho para tentar iniciar novamente a parte da lista de bloqueios da instalação:

grub-bios-setup --verbose --force --directory= /mnt/boot/grub/i386-pc  /dev/sdb

Então, em resumoconfiguração do grub-biosirá copiar

/mnt/boot/grub/i386-pc/boot.img -> Sector 0 (MBR)
/mnt/boot/grub/i386-pc/core.img -> Sector 556324864 (BIOS boot partition)

Porém a parte mais importante, a 'compilação' do core.img, não é realizada por ele.

eu usoCaixa Virtualpara testar o processo de inicialização:

sudo chmod 666 /dev/sd*
VBoxManage  internalcommands createrawvmdk -filename ~/sdb.vmdk -rawdisk /dev/sdb

Esse comando é particularmente útil para colocar todo o dispositivo físico na máquina virtual.

<Ctrl direito> + R reinicia VM

'Diversão' com resgate de grub>

Apenas uma breve pressa, pois provavelmente você o encontrará no caminho. Ok, o objetivo é fazer com que esses 2 comandos sejam executados sem erros:

> insmod normal
> normal

seté útil para ver o que está definido. lsmostra quais partições existem ls (hd0,2)mostra quais arquivos estão na partição # 1 se for encontrada a pasta grub em (hd0,2) set prefix=(hd0,2)/boot/grubé o comando que o tirará de lá. agora insmod normale normalo levará ao menu grub 'normal'. depois que o normal.mod estiver em execução, há apenas uma coisa legal a ser mencionada:

ls (hd0,<tab>

lhe dará uma visão mais detalhada sobre quais partições existem, quais são seus nomes e o sistema de arquivos usado.

Mas voltando ao assunto.

Como marcar a partição com grub.cfg?

Isso acontece indiretamente ao instalar o grub. Depois disso, é consertado e quase impossível de mudar. Graças a algumas decisões estúpidas de design. Ok, vamos examinar mais de perto aquela parte não bem projetada do grub.

A chave para este core.img. Durante a configuração do grub queégravado directamente na partição de 1 MB que criámos para esse fim Contém um script que poderáser mais ou menos parecido com este

set prefix=(hd0,2)/boot/grub
insmod normal
normal

Este script e todos os drivers do sistema de arquivos necessários para acessar a partição com os arquivos grub serão colados e compactados (!!!) em core.img. Por causa da compactação você não pode usar um editor de disco para visualizá-lo ou alterar pequenas coisas como alterar (hd0,2) para (hd0,4) ou coisas assim que podem ser necessárias, você usa gdisk para classificar partições GPT ou fazer alguma outras mudanças. Também não há como desabilitar a compactação (ou bem, há uma opção para isso, mas não funciona). Além disso, esse script é gerado automaticamente e você não tem como alterá-lo para torná-lo um pouco mais inteligente. Por ex. use search.label para encontrar a partição Grub necessária em vez de números de partição fixos. Tudo o que você pode fazer parcialmente é executar novamente a configuração do grub e esperar que tudo dê certo para inicializar.

Nota: Estranhamente, ao usar EFI, as coisas são mais abertas e amigáveis ​​para personalização rápida.

Infelizmente ainda estou pesquisando como funciona o 'grub-install'. Atualmente estou brincando com esquisitices como se mexesse comsdaembora eu especifique explicitamente que deve usarsdb.

Posso editar esta postagem mais tarde se aprender mais sobre. EDITAR: Ok, vamos lá. Aqui está como fazer o 'impossível':

nano /mnt/boot/grub/i386-pc/load.cfg

desde

search.fs_uuid 39ff90d3-00b1-4cb9-8b94-03a7a9053352 root hd0,gpt6 
set prefix=($root)'/mnt/boot/grub'

é uma porcaria e não é o que eu preciso. Eu mudo para:

search.fs_label boot root hd0,gpt5 
set prefix=($root)/grub

uau, isso parece melhor. :) ... agora gere 'core.img'...:

grub-mkimage -O i386-pc -o /mnt/boot/grub/i386-pc/core.img  -C none \
    --prefix /grub -c /mnt/boot/grub/i386-pc/load.cfg  \
    ext2 ntfs part_gpt biosdisk search_label normal

Nota: além do NTFS também adicionei o módulo 'normal' para maior conforto no console de resgate. Agora, a guia para concluir um comando e também o cursor para cima e para baixo para rolar o histórico de comandos funcionará. E como mencionado antes, atualmente --Compression nonenão tem efeito. Core.img é sempre compactado com xz.

... e grave-o no disco:

grub-bios-setup -v -f -d /mnt/boot/grub/i386-pc  /dev/sdb

Portanto, a partir de qual partição é iniciada depende do que está escrito em grub.cfg e, claro, de quais usuários foram selecionados para inicializar.

Criando grub.cfg

Monte seu sistema Linux em /mnt/MINT e execute:

grub-mkconfig -o /mnt/MINT/boot/grub/grub.cfg

Adicionando suporte UEFI

Preparação: Com o Gparted adicione partição FAT32 de 1 MB. e defina o tipo como 'ef00 partição de sistema EFI' eu uso sgdisk -t 11:ef00 /dev/sdb ^- marca a 11ª partição como ef00 => 'partição de sistema EFI'

gdisk -l /dev/sdbpara verificar o resultado. No entanto, na maioria das vezes já existe alguma 'partição do sistema EFI'. Então nesse caso é só usar, em vez de criar um adicional.

A 'partição do sistema EFI' armazenará grubx64.efi que posteriormente será carregado e executado pelo BIOS EFI.Observe que o EFI-Bios sabe por padrão como ler um GPT e também um FAT32. Agora monte

/mnt/boot -> Linux System containing grub.cfg
/mnt/UEFI -> The 'EFI system partition'

Agora execute o grub-install:

sudo grub-install --boot-directory=/mnt/boot \
        --efi-directory=/mnt/UEFI  --target=x86_64-efi   /dev/sdb   -v 

Não mudou muito. Bem, --force não é mais necessário, há outro --target e há argumentos adicionais necessários --efi-directory

informação relacionada