Logging do Anaconda

Introdução

O Anaconda rastreia todas suas atividades em logs. Isso inclui:

  • mudanças de etapa na instalação (que correspondem aproximadamente a telas diferentes no instalador gráfico)

  • detecção e manipulação de dispositivos de armazenamento

  • detecção de mídia de instalação

  • inicialização de rede

  • mensagens do kernel

  • chamadas a métodos críticos dentro do anaconda

  • chamadas a programas externos

Logging no sistema instalado

Durante a instalação, os logs são armazenados no diretório /tmp:

Arquivos de Log

/tmp/anaconda.log

informações gerais da instalação, particularmente as mudanças de etapas.

/tmp/storage.log

escaneamento e manipulação dos dispositivos de armazenamento (discos rígidos, partições, LVM, RAID), particionamento

/tmp/program.log

chamadas a programas externos, suas saídas

/tmp/syslog

mensagens do kernel e de programas externos (Gerenciador de Rede)

/tmp/yum.log

log interno do yum

/tmp/dnf.log

log interno do DNF

/tmp/dnf.hawkey.log

log Hawkey interno do DNF

/tmp/dnf.rpm.log

log RPM interno do DNF

Algumas mensagens de log também são escritas para os terminais:

Dispositivos TTY

/dev/tty3

mensagens de anaconda.log, storage.log e yum.log.

/dev/tty4

o mesmo que syslog

/dev/tty5

stdout e strderr de programas externos

tty3 e tty4 refletem certos arquivos de log. Arquivos de log sempre contém mensagens de todos os níveis de log, incluindo debug, mas o nível mínimo de logs nos terminais pode ser controlado com a opção loglevel na linha de comando.

Existem outros dois arquivos de log criados no sistema de arquivos de destino, no diretório root, também acessível em /mnt/sysimage/root durante a instalação:

/mnt/sysimage/root/install.log

log do processo de instalação do pacote.

/mnt/sysimage/root/install.log.syslog

mensagens da instalção que o chroot criou log de através do syslog do sistema.

Em sua maioria informação sobre usuários e grupos criado durante a instalação do DNF.

Formato do log

Em arquivos, o formato da mensagem do log é:

 H:M:S,ms LOGLEVEL facility:message

em que:

  • H:M:S é a marca temporal da mensagem

  • ms é a parte dos milisegundos da marca de tempo. Note que isso normalmente se tornará zero em um syslog remoto.

  • LOGLEVEL é o nível de log da mensagem. Na teoria, por conta de mensagens do kernel serem parte dos logs do anaconda, todos os níveis de log que são definidos em rsyslog podem aparecer nos arquivos de log. Porém, o Anaconda por si só irá produzir logs apenas nos níveis de:

    • DEBUG

    • INFO

    • WARN

    • ERR

    • CRIT

  • facility é o programa ou componente que criou a mensagem. Pode ser, por exemplo, kernel, anaconda, storage ou similar.

  • message é a mensagem em si.

Para logs rodando nos terminais, o formato é simplesmente:

 LOGLEVEL facility:message

Logging remoto via TCP

O Anaconda tem suporte para logging remoto gerenciado pelo serviço rsyslog rodando no sistema instalado. Ele pode ser configurado para enviar seus logs por meio do TCP para uma máquina arbitrária na rede que também estiver rodando o serviço syslog. Isso é controlado com a opção de linha de comando do syslog.

Não se esquece de habilitar a porta que você estiver rodando seu serviço syslog local no seu firewall.

Do que é feito log remotamente

Tudo o que é feito log diretamentel pelo anaconda também deve aparecer em logs remotos. Isso inclui mensagens emitidas pelo loader e o subsistema de armazenamento. Todo o rastreamento do anaconda (/tmp/anaconda-tb-xyz) são concatenados em um único arquivo /tmp/anaconda-tb-all.log e então tranferidos. Além disso, /tmp/x.log é transferido.

O logging remoto só funciona quando o instalador inicializa a rede. Assim que a rede é habilitada, levam alguns minutos para que o rsyslog perceba. O Rsyslog tem uma fila para mensagens que não puderam ser enviadas por conta de uma rede inacessível e ele eventualmente manda todas elas, na ordem correta.

Configuração

Depende de você como o serviço de logging remoto é configurado; você pode, por exemplo, fazer um log de todas as mensagens recebidas em um único arquivo ou os organizar em um diretório de acordo com os endereços de IP do sistema remoto.

O RPM do anaconda também providencia o script analog, que gera um arquivo de configuração do rsyslogd apropriado baseado em alguns parâmetros de instalação. Ele também é capaz de gerar um comando de bash para executar rsyslogd com a configuração gerada. Assim, você pode, de um shell: $ eval scripts/analog -p 6080 -s -o ./someconf /home/akozumpl/remote_inst Isso inicia um serviço rsyslogd que irá escutar na porta 6080. Os logs da máquina remota com IP 10.34.33.221 serão armazenados em /home/akozumpl/remote_inst/10.34.33.221/, e.g. /home/akozumpl/remote_inst/10.34.33.221/anaconda.log.

A configuração remota do syslog explora várias características das mensgens de log para poder as orgazizar nos arquivos certos: * o IP do transmissor da mensagem para saber que máquina gerou a mensagem e então para qual diretório a mensagem pertence. * anaconda.log, storage.log e program.log tem o nome incorporado neles como programname. * mensagens do syslog vem do kernel e de serviços, da mesma forma que eles vem no sistema instalado * install.log.syslog feito durante a instalaão de pacotes é feito log como um hostname especial sysimage.

Execute analog sem a opção -o para ver como um arquivo de configuração especializado deve ser. Perceba também que ele usa o mesmo formato de mensagens que o anaconda, mas você pode modificar isso pra especificar qualquer formato que você quiser.

Veja também

Logging remoto via o virtio

O QEMU/KVM no Fedora 13 e em diante permite a criação de máquinas virtuais com múltiplos dispositivos virtio expostos à máquina hóspede. Um tal dispositivo pode ser usado para enviar logs para a máquina host. Dessa forma podemos conseguir logs enviados em tempo real, assim que o subsistema de logging do anaconda é inicializado (cedo) e não ter de esperar que a rede venha à tona. Além disso, é a única forma de enviar os logs em uma configuração sem-rede.

Configuração de Logging Remoto

O Anaconda enviará logs automaticamente pelo virtio se ele conseguir encontrar a porta /dev/virtio-ports/org.fedoraproject.anaconda.log.0. Essa é a porta que é criada usando uma diretiva XML do libvirt que o liga a um soquete TCP do lado do host. Se torna então possível ler os logs por aí diretamente, ou criar uma instância do rsyslog para os analisar e os arquivar em seus arquivos respectivos.Veja o diagrama ASCII abaixo para o todo o conjunto:

Anaconda--->rsyslog(hóspede)--->virtio(dispositivo char do hóspede)--->hipervisor kvm--->virtio(soquete TCP)
                                                                                |
                                                                                v
                                                      arquivos de log enviados<---rsyslog(host)

Instruções passo-a-passo para configurar tudo:

  1. Crie uma máquina virtual de teste, p.ex. usando o Gerenciador Virtual </li>

  2. Adicione a porta virtio-serial para sua máquina virtual, e a direcione para a porta TCP 6080 no host. Começe editando a configuração do hóspede: virsh edit <machine name>

  3. No editor do hóspede, adicione as seguintes informações na seção <devices>:

<channel type='tcp'>
  <source mode='connect' host='127.0.0.1' service='6080'/>
  <target type='virtio' name='org.fedoraproject.anaconda.log.0'/>
</channel>
  1. Começe a escutar com o processo rsyslogd no host, usando o script analog descrito na seção de logging via TCP:

eval `analog -p 6080 -o rsyslogd.conf -s /home/akozumpl/remote_inst`
  1. Inicie a máquina virtual.

  2. Continue com a instalação. Imediatamente depois das boas-vindas do Anaconda, as mensagens de log vão aparecer no diretório passado para o script analog, no sub-diretório 127.0.0.1.

virt-install

Se você estiver usando o virt-install você pode o configurar com a opção --channel:

--channel tcp,host=127.0.0.1:6080,mode=connect,target_type=virtio,name=org.fedoraproject.anaconda.log.0

Problemas conhecidos e resolução de problemas

  • funciona no libvirt>=0.8.2

  • mensagens syslog chroot de /mnt/sysimage/root/install.log.syslog não são enviadas.

  • não é possível iniciar a máquina a não ser que algo esteja escutando na porta TCP em que o virtio-serial está conectado.

  • se você quer testar que a conexão do virtio está funcionando, ao invés de usar analog e rsyslog você pode apenas deixar uma utilidade do netcat escutar na dada porta, p.ex. nc -l 0.0.0.0 6080. Você deve então começar a ver logs no terminal assim que a máquina hóspede começar sua inicialização.

  • se ambos o logging remoto TCP via o syslog e o logging remoto virtio via virtiolog= são especificados na linha de comando, você terá de configurar duas instâncias do rsyslogd no servidor/host para ouvir de ambas as conexões, ou então as filas de envio do rsyslog ficarão cheias e o envio irá parar.

Logs do Anaconda no sistema em execução

Após toda instalação bem sucedida, os logs do anaconda são copiados em /var/log no sistema recém instalado. Para evitar conflitos de nome com outros arquivos de log no diretório, os logs do anaconda são renomeados para:

Nome durante a instalação Nome no sistema de destino

/tmp/anaconda.log

/var/log/anaconda.log

/tmp/syslog

/var/log/anaconda.syslog

/tmp/X.log

/var/log/anaconda.xlog

/tmp/program.log

/var/log/anaconda.program.log

/tmp/storage.log

/var/log/anaconda.storage.log

/tmp/yum.log

/var/log/anaconda.yum.log

/tmp/ifcfg.log (new in F14)

not copied

A partir do Fedora 15 (ou pós F14 Rawhide), os logs vão para o diretório /var/log/anaconda no sistema de destino, incluindo o ifcfg.log introduzido no Fedora 14.

Dicas de logging

Se lhe for pedido logs para um bugzilla, sua melhor opção é mudar do GUI do anaconda para o tty2 e então usar scp para copiar os arquivos para o seu computador, p.ex.:

$ cd /tmp
$ scp anaconda.log aklap:/home/akozumpl/

Também é possivél fazer um despejo completo do estado de um processo anaconda em execução (o mesmo despejo que é compilado automaticamente se uma exceção não processada ocorre). Para enviar um SIGUSR2 para o processo principal do anaconda:

$ kill -USR2 `cat /var/run/anaconda.pid``

Isso cria um arquivo /tmp/anaconda-tb-** que também contém anaconda.log, storage.log e syslog.

Se você estiver numa máquina virtual KVM e não exista um scp disponível (estágio 1), você pode (após configurar a rede, se já não o tiver feito) redirecionar para um arquivo TCP especial, no host:

$ nc -l 4444 > syslog.log

no hóspede:

$ ifconfig eth0 10.0.2.10/24 up
$ grep "" /tmp/syslog > /dev/tcp/10.0.2.2/4444