Script Upstart: Detecta a tecla Shift na inicialização

7

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.

    
por bambuntu 06.04.2012 / 20:21

2 respostas

1

Capturar um evento com a tecla Shift pressionada durante a inicialização parece ser uma tarefa interessante, mas não tenho idéia de como conseguir isso. Mas eu descrevi em um recente Q & amp; A como usar o menu GRUB em Para executar diferentes scripts de inicialização após o login.

O script da Etapa 3 deve ser executado após o login, mas também pode ser colocado em /etc/rcXY .

    
por lumbric 25.03.2012 / 17:37
1

Você não pode fazer isso para um script Upstart. Eles não são interativos por natureza.

O que você poderia fazer é fazer uma entrada no menu do Grub que aponte para um shell script como um init, solicitar um tipo de boot que você quer (ou interagir com você do jeito que você quiser) e, em seguida, fazer exec /sbin/init --startup-event=<type of boot> . Isso faz com que o evento de inicialização do Upstart seja algo diferente de startup e você pode construir o seu boot de acordo com o que quiser.

Por exemplo, coloque algo assim em /sbin/preinit :

#!/bin/sh 
EVENT="startup" 
while [ /bin/true ]; do   
  echo "Select boot:"   
  echo " 1) Normal"   
  echo " 2) Minimal"  
  echo " 3) Foobar"  
  echo ""   
  read selection   
  case "$selection" in 
2)   
  EVENT="minimal-startup"   
  ;; 
3)   
  EVENT="foobar-startup"   
  ;;
*)   
  ;;   
  esac 
done

exec /sbin/init --startup-event=$EVENT

Usando esta solução, você não precisa copiar / etc / init por aí, mas pode ter um belo conjunto estático de tarefas, que são executadas com base em diferentes sinais de início.

    
por Tuminoid 26.03.2012 / 09:18