/ redirecionamento dinâmico do console / dev

4

É possível redirecionar dinamicamente todos os dados enviados para /dev/console para outra coisa (por exemplo, para /dev/null , /dev/tty9 ou mesmo /dev/null )?

Claro, isso pode ser feito estaticamente através do parâmetro de inicialização do kernel console=XXX (ou redirecionamento de canal padrão no caso de um único programa). O problema é que preciso fazê-lo dinamicamente (e para todos os programas que geram saída), com base nos dados que vêm de um dispositivo externo.

Alguma sugestão?

    
por qehgt 23.10.2013 / 22:34

1 resposta

3

Existem algumas opções em que posso pensar, a sua eficácia depende de como as coisas chegam ao "console".

Para mensagens baseadas no kernel, o mais simples é usar dmesg -n 1 para desabilitar (praticamente todas) as mensagens do console, e usar o syslogd / klogd para extrair e registrá-las ou encaminhá-las. Todas as mensagens do kernel ainda são registradas e podem ser acessadas via /proc/kmsg (ou sys_syslog() ), independentemente do nível de log do console. Uma variação disso é inicializar seu kernel com quiet , o que suprime printk() output e depende apenas do syslogd / klogd para processar mensagens do kernel.

Uma opção mais aventureira e abrangente é usar um módulo de console , que é mais comumente usado em convidados da VM, para que o host da VM possa acessar os consoles convidados diretamente. Existem dois tipos , o driver do sistema (por exemplo, "VGA" em um PC x86, o kernel "console=" opção); e o driver modular que pode ser carregado e descarregado conforme necessário, e pode assumir o controle do sistema. Um driver possivelmente útil é netconsole , embora seja facilmente carregado e não carregado (pode ser usado como um sistema e um driver modular, existem duas desvantagens:

  • não take_over_console() , então tudo ainda vai para o console original
  • ele só faz o log via ethernet (o loopback não é suportado)

Você pode fazer algo útil com o console "fictício" e uma das opções acima. netcat ou socat são bons "clientes" para um netconsole:

modprobe netconsole "[email protected]/eth0,[email protected]/ff:ff:ff:ff:ff:ff"
socat UDP4-LISTEN:55514 -

Se você está mais interessado em capturar a saída do console de serviços individuais do sistema, não acho que haja uma maneira simples sem modificações de script.

Formas não-simples (e possivelmente não agradáveis) de fazer isso incluem o uso de LD_PRELOAD para funções de redirecionamento hijack que geram saída ou para adicionar algum código _init para alterar os descritores de arquivo padrão. Ou pior: anexar com um depurador e manipular os descritores de arquivos abertos . /etc/ld.so.preload seria uma maneira simples (se for hackea e um pouco desagradável) de implementar a primeira opção.

Se eu quisesse monitorar a saída do console para daemons, provavelmente alteraria os scripts de inicialização para executá-los em screen sessions, talvez assim como .

    
por 24.10.2013 / 14:19