sábado, 7 de setembro de 2024

Recuperando o menu do GRUB via comando pelo Shell do GRUB

O que que acontece algumas vezes quando a gente liga a máquina, a máquina tá funcionando e começa o processo de boot, vem o GRUB, só que o GRUB não encontra por alguma razão o arquivo de configuração. E aí aparece essa tela aqui, que é o interpretador do shell do GRUB:
Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists possible
device or file completions.

grub> _

Então o que que nós vamos fazer? Nós temos que descobrir e nós podemos fazer isso através do shell do GRUB. Quais são as partições que têm nessa máquina? Quais são os discos que tem nessa máquina, se tem mais de um, que tipo de partição para conseguir através disso, descobrir onde está o nosso sistema. E usando o próprio GRUB, dizer pro GRUB carregar o kernel, passar alguns parâmetros para o kernel, dizer pro GRUB carregar o primeiro disco de inicialização, chama "initrd" e depois a gente diz para ele bootar.

Tudo isso que a gente vai dizer digitando comandos é o que está no menu do GRUB, mas nesse caso no nosso problema não tem o menu do GRUB, então para gente não ficar na mão, a gente vai ver como é que resolve isso, eu vou abrir aqui.

Vou mostrar a tela de uma máquina virtual que tá justamente nessa condição.

Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists possible
device or file completions.

grub> _


Então eu tô aqui na tela do Shell do GRUB. A gente consegue inclusive ver que é a tela do Shel do GRUB, que é tipo um interpretador de comandos, mas como qualquer interpretador de comandos, não apresenta nada aí para gente, mas a gente tem que conhecer os comandos. Normalmente quando a gente não conhece nada, a gente pode pedir ajuda e digitar "help" com isso, a gente vai ver todos os comandos que tem, pra gente poder usar no GRUB. 
grub> _

Digito "help":
grub> help


Ao digitar "help" e teclar Enter, podemos ver todos os comandos que podemos usar no GRUB


É diícil de ler, né? Então eu vou passar uma dica aí que é essa é sensacional, hein? A gente vai primeiro. Vou limpar aqui a tela para ficar mais fácil de você ver os comandos:
grub> clear


Podemos digitar "set pager=1" para informar ao GRUB que queremos um paginador:
grub> set pager=1


Agora quando digitar help, teremos a visualização como páginas, pressionando barra de espaço para mudar de página.

Vamos começar, a primeira coisa que iremos fazer é usar um programa chamado "ls", veja o que aparece:

grub> ls
(proc) (hd0,gpt2) (hd0,gpt1) (hd0) (cd0)


Podemos conferir os discos e as partições que o GRUB conseguiu percerber.

Nessa máquina aqui, a gente tá vendo que tem o (hd0), o (cd0), esse proc é do sistema rodando tá! Conseguimos ver também que no (hd0) tem duas partições, a gpt2 e a gpt1. Então já dá para a gente saber também que esse disco foi particionado usando o modelo de particionamento GPT. 

O outro particionamento que que tem disponível é o ms-dos então se você tem um disco que é particionado aquela moda MBR. Lembra!? Que tem quatro partições primárias no máximo e tal que era muito utilizado antes, hoje é bem menos em virtude do UFI.

Agora nos interessa a gente descobrir onde está o nosso sistema, onde está o nosso kernel para gente poder falar pro GRUB carregar e sequer. Então nós vamos usar o "ls" só que agora. Vamos passar para ele qual é a partição que a gente quer listar

grub> ls (hd0,gpt1)/
efi/ refind_linux.conf


Vou listar, a gente vê aí que tem um diretório chamado "efi" e um arquivo chamado "refind_linux.conf"

Tá na cara para quem já está habituado que isso aí é a partição UEFI, porque tem um diretório UEFI. O nosso kernel não tá aí! 

Então eu vou listar a outra partição, a partição 2. 

grub> ls (hd0,gpt2)/
lost+found/ boot/ bin lib lib32 lib64 libx32 sbin debian/ dev/ etc/ home/ media/ mt/ opt/ proc/ root/ run/ srv/ sys/ tmp/ usr/ var/ vdisk swapfile

Ah tá aí, ó! tá na cara que tá aí o nosso sistema, tem um "/boot", um "bin", "lib", "lib32" etc, e todos os diretórios típicos de uma instalação de GNU/Linux. Onde é que fica o kernel?

Esse kernel fica no diretório "/boot". Então nós vamos fazer o seguinte. Eu vou listar o "/boot":

grub> ls (hd0,gpt2)/boot
efi/ grub/ refind_linux.cont config-4.19.0-9-amd64 core.img contig-5.6.13-gnu vmlinuz-5.6.13-gnu System.map-5.6.13-gnu initrd.img-5.6.13-gnu vmlinuz-4.19.0-9-amd64 System.map-4.19.0-9-amd64 initrd.img-4.19.0-9-amd64

Vamos listar, pronto! Apareceu vários arquivos, o que nos interessa aqui é justamente ver os arquivos cujo nome é esse aqui "vmlinuz-5.6.13-gnu", a gente consegue ver que tem uma "vmlinuz-4.19.0-9-amd64" e tem uma "vmlinuz-5.6.13-gnu". 

Esse "vmlinuz-4.19.0-9-amd64" é o kernel versão 4.19, o padrão que tem no Debian Buster atualmente e o "vmlinuz-5.6.13-gnu" é o Linux Libre, repara que nessa máquina eu tenho mais de um kernel, né! 

Qual é o nosso próximo passo aqui, o nosso próximo passo é dizer para o GRUB carregar o kernel. Como é que a gente faz isso usando um comando que chama? Usando um comando chamado "linux".

E indicando para ele onde ele vai buscar o kernel, no nosso caso o "(hd0,gpt2)/boot" e agora repara eu vou apertar VM só e vou apertar o tab e a gente vai ver que o interpretador ele não é tão simples assim não. Ele tem recursos interessantes, porque ele vai conseguir completar dessa vez, ele não completou tudo por quê? Porque tem mais de uma possibilidade então ele tá me mostrando que eu tenho dois kernels eu vou escolher o 5.6.13-gnu que é do Linux libre.

grub> linux (hd0,gpt2)/boot/vm Possible files are: vmlinuz-5.6.13-gnu vmlinuz-4.19.0-9-amd64 grub> linux (hd0,gpt2)/boot/vmlinuz-_

Com esse comando:

grub> linux (hd0,gpt2)/boot/vmlinuz-5.6.13-gnu

Eu digo para o GRUB carregar esse kernel né! 

Se eu fizesse só isso não teria problema, o GRUB carregaria o kernel, mas na hora que o kernelk fosse rodar, ele não ia saber onde ele ia montar o "/", o diretório raiz de toda a instalação, de todo GNU/Linux. Então eu vou passar para ele assim:

grub> linux (hd0,gpt2)/boot/vmlinuz-5.6.13-gnu root=/dv/vda2

Isso aqui é uma máquina virtual e em uma máquina virtual, os discos costumam se chamar "VD alguma coisa", em uma máquina física que usa barramento Sata, provavelmente é sda ou sdb. 

Mas, e se eu não souber? Bom, se você não souber, você pode tentar com esse e não vai estragar a máquina não vai acontecer nada. Talvez dê um kernel panic. 

Ah. Ah kernel panic?! 

Não! Não precisa entrar em pânico quando dá um kernel panic porque sempre tem solução. 

Aqui, eu já sei que é essa, mas naturalmente você pode descobrir. 

Então antes de fazer desse jeito, eu vou mostrar uma coisa, eu não sei então eu vou conferir:

Mas antes de digitar o comando mencionado, vamos testar uma coisa, descobrir os nomes dos discos de nosso interesse.

Vou digitar "cat (hd0,gpt2)/etc/fstab":

grub> cat (hd0,gpt2)/etc/fstab

grub> cat (hd0,gpt2)/etc/fstab

# /etc/fstab: static file system information.

#

# Use ‘blkid' to print the universally unique identifier for a

# device; this may be used with UUID= as a more robust way to name devices

# that works even if disks are added and removed. See fstab(5S).

#

# <file system <mount point>  <type> <options> <dump> <pass>

# /dev/nbd1p3

UUID=336dbd2e-3e4f-4fba-9aG1-6eal7eBb1802 / ext4 rw,relatime 0 1



# /dev/nbdip1

UUID=1029-1F 02 /doot/efi vfat rw, relat ime, fmask=0022,d

mask=0022,codepage=437,locharset=iso8859-1,shortname=mixed,errors=remount-ro 0 2



# /dev/sda2

#UUID=6b78f7cc-2a06-4c7d-bf55-8dd23645ae79      none      swap

0 0

#/dev/mapper/cswap      none      swap      sw      0      0

/dev/mapper/cryptoswap none      swap      sw      0      0

#/dev/sdal /nnt ext4 rw,relatime     0  1

e1

swap



Eu posso usar o fstab usando o próprio GRUB e descobrir qual é o nome do dispositivo aonde está o nosso sistema. Nesse caso aí nós temos mutas numerações que são os os UUID, que pode ser usado também na horam aplicar os comandos de recuperação do GRUB como forma alternativa ao invés de digitar por exemplo /dev/vda.

grub> linux (hd0,gpt2)/boot/vmlinuz-5.6.13-gnu root=/dev/vda2
grub> _

Quando digito e teclo Enter. 

Parece que não aconteceu nada! Mas aconteceu, o GRUB carregou na memória o kernel, então o kernel já está na memória. 

Ele não tá rodando ainda, mas ele já está na memória. 

E eu vou dizer agora aqui para o GRUB carregar o initrd, que é um disco inicial que por enquanto está só num arquivo que o kernel quando tá rodando monta primeiro ele para poder dali pegar alguns módulos e ser capaz de montar o "/" (partição raíz).

Então digito "initrd (hd0,gpt2)/boot/initrd.img-5.6.13-gnu":

grub> initrd (hd0,gpt2)/boot/initrd.img-5.6.13-gnu
grub> _


Agora então o GRUB carregou o kernel, o GRUB carregou o "initrd".

Bom, o que que ele mais precisa? Ele já tem tudo que ele precisa, a gente só precisa dizer para ele dar boot! O que que vai acontecer? Quando eu pressionar o Enter aqui depois de ter digitado o boot:

grub> boot

Ele vai colocar o kernel em execução. O kernel vai pegar esse initrd, pegar os módulos que estão lá, montar o "/" e dar prosseguimento pro boot. Vamos ver.

A tela vai mostrar o sistema carregando os serviços, um monte de "Ok", quando aparece os "Ok", a gente fica logo feliz, né? Vai entrar aqui inclusive o ambiente gráfico.

Olha lá!

Carregou! Entrou o ambiente gráfico, eu vou logar aqui só para a gente ver que tá tudo ok? Estou digitando. Operei a senha. Será que eu não sei a senha?

Entre no terminal e digite "sudo update GRUB":

sudo update GRUB

O que que faz o update do GRUB? Ele atualiza o arquivo de configuração do configuração do GRUB, o que produz o menu update GRUB.

Após digitar e pressionar Enter, a gente pode ver inclusive que ele encontrou aqueles arquivos que a gente tinha visto, já que é o initrd e o vmlinuz dos dois kernels que tem aí.


E agora eu vou rebootar a máquina para ver se tá tudo ok usando o programa "shutdown -r now" com os parâmetros -r e now no final para que ele faça isso agora:

sudo shutdown -r now

A máquina vai rebootar, e quando ela rebootar, a gente vai ver de novo o GRUB aqui, a gente tem um outro bootloader, mas a gente vai ver o GRUB com cada uma das suas entradas e o problema tá resolvido.

Essa é uma problemática que acontece em algumas vezes. 

Por que que ela acontece? Bom, ás vezes você instalou um outro sistema operacional, ás vezes você apagou o arquivo por engano, às vezes não completou a instalação do sistema operacional, deu problema na hora que você for escolher onde gravar o GRUB e tudo mais. Então essa é uma forma de resolver quando parou no GRUB e a gente não tem o que fazer.


Fonte:

https://www.youtube.com/watch?v=ptFSVbRcz_4

https://superuser.com/questions/1237684/how-to-boot-from-grub-shell

https://www.linuxfoundation.org/blog/blog/classic-sysadmin-how-to-rescue-a-non-booting-grub-2-on-linux

https://medium.com/@awitisimon23/booting-linux-from-grub-grub-rescue-46674e52e325

Nenhum comentário:

Postar um comentário