Como iniciar uma tarefa antes da rede?

2

Eu escrevi uma tarefa iniciante que modifica / etc / network / interfaces . (Na verdade, um arquivo source d.) Qual condição start on eu preciso declarar para deixar minha tarefa executar antes de qualquer trabalho de rede?

Eu tentei start on starting networking , mas aparentemente é tarde demais. Quando efetuo login após a inicialização, vejo que as alterações foram gravadas, mas obviamente não são usadas: a nova configuração informa um IP estático, mas o processo de inicialização aguarda que um servidor DHCP inexistente (configuração antiga) atinja o tempo limite.

Eu também tentei start on starting network-interface INTERFACE=eth0 , o que não funcionou também. IIRC houve um erro no log que a mudança não poderia ser escrita.

Background : Eu preciso de um modelo de VM que possa ser clonado e os clones configurados por meio de um script. Entre outras configurações, eu preciso dar-lhes um endereço IP estático para acessá-los a partir do host. Eu uso o guestfish para escrever um arquivo de configuração em um dos discos virtuais e deixo um script aplicar essas configurações ao sistema. Não quero que esse disco contenha um arquivo de configurações do sistema real. Eu não posso modificar o / etc diretamente, porque esse disco é compartilhado (copy-on-write / diff) entre os clones e o guestfish aparentemente não suporta esse tipo de imagem. Eu também poderia deixá-los usar o DHCP e configurar um servidor que atribuísse o IP pelo MAC, mas tenho medo da complexidade. Eu também poderia adicionar apenas outro disco virtual para arquivos de configuração, mas, se possível, eu preferiria armazenar as configurações diretamente na imagem de disco do sistema.

Software usado : Ubuntu Server 12.04, VirtualBox. O modificador de configuração é um script Ruby auto-escrito.

    
por user1252434 05.06.2012 / 10:38

3 respostas

1

Encontrei uma solução para mim mesmo.

Eu removi qualquer configuração para eth0 do modelo de VM. Assim, não é criado automaticamente. Meu trabalho de configuração agora começa em starting networking , modifica o arquivo de configuração e chama explicitamente ifup eth0 .

Embora isso resolva meu problema, isso não se encaixa no caso geral de como iniciar um serviço / tarefa no início antes da rede. Assim, deixarei a questão em aberto.

    
por user1252434 05.06.2012 / 16:47
1
start on starting network-interface
instance $INTERFACE
task
exec mything

e

start on starting networking
task
exec mything

ifup é executado por um dos dois métodos, pelo trabalho network-interface ou pelo trabalho networking , que é usado para configurar qualquer interface não coberta pelo udev.

A estrofe instance acima garante que seu trabalho seja iniciado para cada um dos dois casos, porque a maneira como o upstart funciona, uma condição or não bloqueará o outro.

(que é esse bug btw: link )

Se o seu trabalho não puder ser executado simultaneamente ou duas vezes, será necessário dividi-lo em três tarefas. Um chamado 'mything-waiter':

start on starting network-interface
instance $INTERFACE
task
exec start wait-for-state WAITER=mything-waiter-$UPSTART_JOB-$INTERFACE WAIT_FOR=mything

E outro com uma linha exec semelhante para iniciar a rede:

start on starting networking
task
exec start wait-for-state WAITER=mything-waiter-networking WAIT_FOR=mything

E o outro chamado "mything", que é apenas

task
exec mything

Eu acho que um argumento pode ser feito para que 'comece a iniciar o trabalho em rede' faça tudo isso, mas isso exigirá um novo redesenho da criação de redes no Ubuntu.

    
por SpamapS 27.06.2012 / 16:50
0

Você poderia simplesmente começar seu trabalho em start on startup ? Existe alguma razão para ligá-lo ao início das redes, se você só precisa que a configuração seja alterada antes do início da rede.

Edit: ok, isso não funcionou.

Eu não consigo mexer no meu sistema init agora, então eu tenho que dar alguns conselhos não testados:

Primeira opção: adicione a estrofe task ao seu trabalho. Ele deve fazer com que o Upstart espere até sair antes de iniciar o trabalho de rede / interface de rede pendente. Tenho certeza de que isso não está corrigindo o problema de tempo, pois há muitas perguntas no AskUbuntu sobre como injetar coisas no processo normal de inicialização.

Segunda opção: use os arquivos sobrescritos . Eu acho que network-interface.conf é o que você precisa falsificar. Infelizmente, ele já usa a seção pre-start , então, em vez de apenas criar um, precisamos copiá-lo (e somente ele) para o nosso arquivo network-interface.override .

Depois de copiar a seção pre-start , basta modificar o conteúdo para atender às suas necessidades. O arquivo original permanece como está, mas a seção de pré-inicialização de sua substituição literalmente substitui a do trabalho original.

Espero que ou ajude.

    
por Tuminoid 06.06.2012 / 07:48