Eu quero criar um potencial de inicialização que permita que diferentes configurações de upstart / runlevel sejam carregadas com base em keydowns específicos na inicialização (ou combos). Como faço para detectar um evento de chave para baixo com um script iniciante?
Estou no 10.04 se isso ajudar.
Métodos alternativos para alcançar o mesmo resultado são aceitáveis, ou seja, como posso usar o grub para fazer isso?
Para ajudar a fornecer mais clareza, estou criando uma instrução passo a passo com base nas duas respostas dadas por Tuminoid e Lumbric. (Por favor me ajude a melhorar isso, minha interpretação da resposta de Tuminoid não funciona.)
Observação: Todos devem ter um motivo para fazer isso. Para dar sentido às duas soluções passo-a-passo a seguir, descreverei o meu propósito de querer ter scripts iniciantes decididos na inicialização.
Eu estou criando um DVD ao vivo para navegar na Internet chamado Surfer. Por segurança, quero desativar a conta de administrador e deixar uma conta sem privilégios para navegar na web. Também quero dar a mim e aos usuários a capacidade de remasterizar o Surfer, para que eles possam adicionar mais aplicativos on-line e personalizar sua conta de Surfer e, em seguida, gravar seu próprio Surfer iso personalizado ao vivo. Então, vou precisar de dois perfis de inicialização: Surfer e Remaster. Um para navegação on-line segura, o outro para remasterização e desenvolvimento.
Solução de Lumbric
Crie um arquivo grub personalizado
1. Para adicionar entradas personalizadas ao grub, abra este arquivo com o gedit para edição:
gksudo gedit /etc/grub.d/40_custom
Você terá o arquivo correto se vir este texto:
#!/bin/sh
exec tail -n +3 menuentry ...text left out... {
...text left out...
}
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
2. Em outro separador gedit, abra:
/boot/grub/grub.cfg
3. No grub.cfg, procure as seções que começam com:
menuentry
Escolha a entrada padrão que você usa para inicializar. Se você não sabe a entrada padrão olhando para este arquivo, então reinicie e tome nota da que você escolheu na inicialização. Não salve as alterações se precisar reinicializar para encontrar sua entrada padrão. Quando você tiver certeza de sua entrada padrão, tenha em mente que esta é a entrada a ser usada para seus perfis personalizados.
Cada seção menuentry terá alguns conjuntos de colchetes correspondentes:
#!/bin/sh
exec tail -n +3 menuentry ...text left out... {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=1
}
menuentry ...text left out... {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=2
}
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry ...text left out... {
...text left out...
}
menuentry ...text left out... {
...text left out...
}
que encapsulam algumas linhas de texto. Copie a seção de entrada padrão. Copie da palavra menuentry para o colchete de fechamento. Vou precisar de duas entradas, então vou colar minha entrada padrão duas vezes.
Deve ser parecido com o seguinte para duas entradas de perfil de inicialização personalizadas. (Lembre-se de que tirei o texto para facilitar a leitura):
menuentry "Surfer" {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=1
}
4. Encontre sua linha de inicialização pressionando ctrl + f. Digite no campo de pesquisa:
linux / boot
Cada linha de inicialização deve estar destacada.
5. Recorte e cole este texto no final da linha de inicialização destacada, mas altere o número para cada entrada.
boot-profile = 1
Após colar, a entrada do menu deve ser semelhante a esta:
menuentry "Remaster" {
...text left out...
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=2
}
6. Agora, vamos editar a linha que vemos na inicialização. Para a entrada de menu identificada acima, edite o texto entre a palavra menuentrada e o primeiro colchete. Substitua pelo texto Surfista :
sudo update-grub
Faça o mesmo para a entrada do Remaster:
task
start on startup or bootChoice
script
profile=$(cat /proc/cmdline |sed 's/.*boot-profile=\([0-9]\).*//g')
case $profile in
1)
# Run script for Surfer Profile
initctl emit surferboot
;;
2)
# Run script for Remaster Profile
initctl emit remasterboot
;;
*)
echo Error
echo "Error" > /error
;;
esac
end script
7. Salve o arquivo 40_custom.
8. Agora, atualize o grub com este comando:
# surfer user boot
task
start on surferboot
script
echo "surfer test-data" > /home/surfer/surfer
end script
Nota: Se você fizer qualquer atualização ou instalação de programas que modifiquem seu kernel, esteja ciente do ponto de vista de lumbric em seu link. Como podemos saber se nosso kernel será atualizado? Ajude-me a esclarecer como podemos impedir a atualização do nosso kernel sem saber.
9. Reinicie. Quando no menu de inicialização, procure por suas novas entradas. Se você os vê, as coisas estão indo muito bem até agora. Escolha uma das suas entradas personalizadas e pressione Enter.
10. Quando logado, abra o Terminal. Digite este comando.
cat / proc / cmdline
O Grub escreve a linha de inicialização para este arquivo. A linha de inicialização é onde você adicionou boot-profile = 1 no final. Então, se você escolheu surfista, então deve ler boot-profile = 1 no final ou boot-profile = 2 se você escolheu Remaster. Caso contrário, releia a partir do primeiro passo e corrija quaisquer erros lógicos.
11. Agora, o script deve ser escrito para lidar com a entrada de inicialização escolhida no menu grub. Eu estou optando por usar um script upstart, porque eu sei como fazer isso. O upstart iniciará o mais rápido possível, verifique o conteúdo de / proc / cmdline e use-o para determinar nossa escolha no menu de inicialização. Aqui está o script de inicialização inicial:
/etc/bootChoice.conf
12.Após o seguinte texto em:
#!/bin/sh
EVENT="startup"
while [ /bin/true ]; do
echo "Select boot:"
echo " 1) Surfer"
echo " 2) Remaster"
echo ""
read selection
case "$selection" in
1)
EVENT="surfer"
;;
2)
EVENT="remaster"
;;
*)
;;
esac
done
exec /sbin/init --startup-event=$EVENT
13. Agora, um sinal será emitido com base em nossa escolha. Para lidar com cada sinal, dois arquivos devem ser criados. Um chamado: surfer.conf e outro chamado remaster.conf. Coloque-os em / etc / init /. Seu conteúdo será semelhante a este:
/etc/init/surfer.conf
/etc/init/remaster.conf
Podemos ver que quando o sinal surferboot é emitido, o script acima é iniciado determinado por esta linha: start on surferboot
Coloque todos os códigos de script de inicialização personalizados entre script
e end script
. A mesma coisa será feita para o Remaster.
Eu tentei isso, funciona. Obrigado Lumbric.
Solução de Tuminóides
Primeiro, devemos deixar o grub saber que queremos chamar um script. Vamos colocar o caminho do script dentro de / etc / default / grub.
1. Abra o arquivo: / etc / default / grub.
gksudo gedit / etc / default / grub
2. Adicione esta linha no final do arquivo:
init = / sbin / preinit
3. Salvar e sair. Em seguida, execute este comando:
update-grub
Agora vamos criar o arquivo que fizemos o grub ciente.
4. Crie o arquivo com o gedit:
gksudo gedit / sbin / preinit
5. Cole o seguinte texto dentro:
%pre%
6. Torne o script executável:
chmod + x / sbin / preinit
WIP NOTA: Eu tentei isso até este ponto e não funciona. Por favor ajude a melhorar esta interpretação da resposta, apontando para onde estou indo errado.
Última seção: Esta seção está inacabada. Aguardando clareza nos primeiros passos para terminar.
Os eventos acima são sinais iniciantes. Se você não usou sinais iniciantes, eles irão chamar um script no diretório: / etc / init. Então, eu farei dois arquivos em / etc / init chamados:
%pre%
Nesses arquivos, usarei scripts bash para configurar cada inicialização.
Eu vou criar no upstart /etc/gdm/custom.conf para forçar um login automático se o Surfista for escolhido. Eu também abro o / etc / shadow e desabilito a senha do remasterizador.
Como alternativa, criarei o /etc/gdm/custom.conf para um login automático forçado ao remasterizador do usuário para remasterização e desenvolvimento.