Tempos de reinicialização
Podemos procrastinar a reinicialização às vezes neste mundo de "excessivamente ocupado" e não querer desperdiçar 5 ou 15 segundos. Quando eu olhei pela primeira vez para essa questão, meus tempos de inicialização haviam passado de 45 segundos para 14 segundos com um SSD e systemd
de ajustes.
Recentemente, adquiri um laptop "moderno" com um SSD NVMe M.2 Gen 3.0 x 4 com velocidade de leitura do Windows de 3,4 GB / s incrível e velocidade de leitura do Linux de 2 GB / s. Então deveria ser mais rápido, certo? Hum ... não. É dolorosamente mais lento:
$ systemd-analyze
Startup finished in 6.823s (firmware) + 4.447s (loader) + 3.467s (kernel) + 8.412s (userspace) = 23.151s
Desta vez, é realmente após ajustes. Foi muito pior em 80 segundos porque a nVidia e a Dell optaram por cortar a potência do áudio HDMI na placa gráfica nVidia GTX970M, que aciona a porta HDMI. Como tal, foi necessário o comando setpci
, que causou a mensagem "baixo erro de grapics", e você teve que esperar 20 segundos para que o ponteiro do mouse prosseguisse. Em seguida, recarregaria todos os drivers gráficos e reiniciaria o lightdm.
Outro problema com o laptop "moderno" é o BIOS POST levar 15 segundos. Ajustes no BIOS para desativar a verificação de erros de hardware, desativar o carregamento de drivers de inicialização para NICs e outros ajustes que não consigo lembrar agora apenas alteraram o tempo do BIOS POST para 6 segundos. Em comparação, o "antigo" tempo do BIOS POST do laptop foi de apenas alguns segundos usando o CSM Legacy BIOS e nenhum ajuste da BIOS.
Projeto RapidReboot
do Ubuntu de 2010
A menção do projeto RapidReboot no post do ByteCommander é de 2010. O raciocínio do projeto é resumido assim:
Fundamentação
Existem alguns casos em que podemos assumir com segurança que o usuário não quero ver o gerenciador de inicialização; nestes casos, devemos usar o kexec para evite reinicializações longas, POSTs da BIOS e tempo do carregador de inicialização. Isso pode levar 10 segundos em situações ótimas; mas com BIOS SCSI ou RAID e rede boot roms, o tempo pode subir para 20, 30, ou mesmo mais de 60 segundos, mesmo nos casos em que o tempo entre o carregamento do kernel e ver o tela de login é de 30 a 60 segundos.
Exemplos de uso do projeto:
Casos de uso
- Bob acaba de atualizar seu kernel; update-notifier informa que ele deve reinicializar para que as mudanças entrem em vigor, e o botão 'Restart' usa o kexec para tornar isso mais rápido.
- Alice acaba de atualizar o dbus; update-notifier diz a ela para reiniciar e usa o kexec.
- Seveas realizou várias atualizações no mês passado e agora está com menos de três vezes mais pressão de memória devido a diferentes programas usando cópias diferentes de bibliotecas compartilhadas. Ele decide reiniciar para limpar isso, e usa um "Quick Reboot" para tornar isso mais rápido.
- O Keybuk acabou de instalar o Ubuntu Edgy e quer inicializar nele. O LiveCD carrega o kernel de destino e o initrd com o kexec; todos sistemas de arquivos baseados em disco; sincronizar; e depois usa o kexec para iniciar o novo sistema em vez de reiniciar.
Usando o kexec para reiniciar
kexec
é a mágica que lançamos para reinicializar sem postagem no BIOS e alguns outros mecanismos de descoberta de baixo nível, como a configuração do RAID.
O kernel deve ser compilado com CONFIG_KEXEC
flag
O primeiro passo é garantir que seu kernel foi compilado com a opção CONFIG_KEXEC=y
:
$ uname -r
4.14.2-041402-generic
$ grep KEXEC= /boot/config-'uname -r'
CONFIG_KEXEC=y
O primeiro comando uname -r
é opcional apenas para mostrar com qual kernel você iniciou. Como podemos ver no segundo comando, o kernel é compilado pela equipe do Ubuntu com o sinalizador necessário. Não tenho certeza de quando isso foi adicionado, mas provavelmente & lt; = ano de 2012.
Instalar kexec-tools
O próximo passo é instalar as ferramentas kexec
para o espaço do usuário:
$sudo apt install kexec-tools
Após downloads binários normais, você é recebido com esta tela:
Eu respondi No
em parte por causa deste relatório de bug que a opção não é relevante em systemd
.
Em seguida, a instalação continua (snippet mostrado abaixo):
Unpacking kexec-tools (1:2.0.10-1ubuntu2.4) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for systemd (229-4ubuntu21) ...
Setting up kexec-tools (1:2.0.10-1ubuntu2.4) ...
Generating /etc/default/kexec...
Generating grub configuration file ...
(... CUT ...)
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Found Windows Boot Manager on /dev/sda1@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for EFI firmware configuration
done
Processing triggers for systemd (229-4ubuntu21) ...
Configurando kexec
Nossas coortes no ArchLinux têm excelente documentação para o kexec , mas ele precisa ser massageado para distribuições Ubuntu / Debian. p>
O uso básico é feito com dois comandos:
sudo kexec -l /boot/vmlinuz-'uname -r' --initrd=/boot/initrd.img-'uname -r' --reuse-cmdline
sudo kexec -e
deste ponto em diante, aparece toda vez que você clica em reiniciar, ele recarrega automaticamente o último kernel no modo de reinicialização rápida.
Usando o Systemd para carregar o kexec
Crie o arquivo /etc/systemd/system/[email protected]
:
[Unit]
Description=load %i kernel into the current kernel
Documentation=man:kexec(8)
DefaultDependencies=no
Before=shutdown.target umount.target final.target
[Service]
Type=oneshot
ExecStart=/usr/bin/kexec -l /boot/vmlinuz-%i --initrd=/boot/initrd.img-%i --reuse-cmdline
[Install]
WantedBy=kexec.target
Em seguida, ative o arquivo de serviço para o kernel que você deseja carregar, por exemplo, simplesmente configure o kernel atual uname -r
:
$ sudo systemctl enable kexec-load@'uname -r'
Created symlink from /etc/systemd/system/kexec.target.wants/[email protected] to /etc/systemd/system/[email protected].
Em seguida, para kexec:
$ sudo systemctl kexec
Se você tem youtube
em execução, pode haver um inibidor do sistema impedindo a reinicialização. Nesse caso, use:
$ sudo systemctl kexec -i
Se você deseja carregar um kernel diferente para o próximo kexec, por exemplo, 4.12.2-041202-generic, desabilita o serviço para o kernel atual e habilita aquele para o novo kernel:
$ sudo systemctl disable kexec-load@'uname -r'
$ sudo systemctl enable [email protected]
Mais para vir
Tenho que postar esta resposta agora, já que é hora de inicializar, corrigir, inicializar, corrigir e repetir. Eu tenho uma configuração complicada, onde systemd
carrega cinco nVidia
drivers que eu tenho que descarregar, executar setpci
para ligar o áudio ao HDMI, recarregar os drivers nVidia e reiniciar o LightDm. Pode demorar um pouco para dar certo.
Depois de obter os métodos cli
em funcionamento, criarei um atalho na área de trabalho para reinicialização com um clique com o prompt sudo
password. Depois disso, criarei um atalho na área de trabalho para uma caixa de diálogo yad
, permitindo que você escolha entre os kernels instalados e a reinicialização. Semelhante ao menu de opções avançadas do grub.