No Linux, quando o “uptime” começa a contar?

48

Meu computador diz:

$ uptime
 10:20:35 up  1:46,  3 users,  load average: 0,03, 0,10, 0,13

E se eu verificar last , vejo:

reboot   system boot  3.19.0-51-generi Tue Apr 12 08:34 - 10:20  (01:45)    

E então eu confiro:

$ ls -l /var/log/boot.log 
-rw-r--r-- 1 root root 4734 Apr 12 08:34 boot.log

Então, vejo em /var/log/syslog a primeira linha de hoje:

Apr 12 08:34:39 PC... rsyslogd: [origin software="rsyslogd" swVersion="7.4.4" x-pid="820" x-info="http://www.rsyslog.com"] start

Assim, tudo parece convergir em 8:34 , sendo a hora em que minha máquina inicializou.

No entanto, pergunto-me: qual é a hora exata em que uptime usa? uptime é um processo que inicia e verifica algum arquivo ou é algo no hardware?

Estou executando o Ubuntu 14.04.

    
por fedorqui 12.04.2016 / 10:26

3 respostas

73

No meu sistema, ele recebe o tempo de atividade de /proc/uptime :

$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY)         = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY)         = 4
 10:52:38 up 3 days, 23:38,  4 users,  load average: 0.00, 0.02, 0.05

Na página de manual do processo :

   /proc/uptime
          This file contains two numbers: the uptime of the system
          (seconds), and the amount of time spent in idle process
          (seconds).

O sistema de arquivos proc contém um conjunto de pseudo-arquivos. Esses não são arquivos reais, eles apenas se parecem com arquivos, mas eles contêm valores que são fornecidos diretamente pelo kernel. Toda vez que você lê um arquivo, como /proc/uptime , seu conteúdo é regenerado na hora. O sistema de arquivos proc é uma interface para o kernel.

No código-fonte do kernel linux do arquivo fs/proc/uptime.c na linha 49 , você vê uma chamada de função:

proc_create("uptime", 0, NULL, &uptime_proc_fops);

Isso cria uma entrada do sistema de arquivos proc chamada uptime (o procfs é geralmente montado sob /proc ) e associa uma função a ele, que define operações válidas de arquivo nesse pseudo arquivo e as funções associadas a ele. Em caso de tempo de atividade, são apenas read() e open() operações. No entanto, se você rastrear as funções de volta, você acabará aqui , onde o o tempo de atividade é calculado.

Internamente, há uma interrupção do temporizador que atualiza periodicamente o tempo de atividade do sistema (além de outros valores). O intervalo, no qual o temporizador-intercalar pulsa, é definido pelo pré-processador-macro HZ , cujo valor exato é definido no kernel config e aplicado em tempo de compilação.

O tempo ocioso e o número de ciclos da CPU, combinados com a frequência HZ (ciclos por segundo), podem ser calculados em um número (de segundos) desde a última inicialização.

Para responder à sua pergunta: Quando o "tempo de atividade" começa a contar?

Como o tempo de atividade é um valor interno do kernel, que ativa todos os ciclos, ele começa a contar quando o kernel é inicializado. Isto é, quando o primeiro ciclo terminou. Mesmo antes de qualquer coisa ser montada, diretamente depois que o gerenciador de inicialização dá o controle para a imagem do kernel.

    
por 12.04.2016 / 11:25
10

Desde que eu saiba, uptime usa /proc/uptime para calcular o tempo de atividade do sistema. Você pode ver isso mais claramente no código-fonte uptime.c

  FILE *fp;

  fp = fopen ("/proc/uptime", "r");
  if (fp != NULL)
    {
      char buf[BUFSIZ];
      char *b = fgets (buf, BUFSIZ, fp);
      if (b == buf)
        {
          char *end_ptr;
          double upsecs = c_strtod (buf, &end_ptr);
          if (buf != end_ptr)
            uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t)
                      ? upsecs : -1);
        }

      fclose (fp);
    }
    
por 12.04.2016 / 10:37
6

Em um sistema UNIX padrão (com base nas fontes originais *), uptime/var/adm/utmpx e verifica a última vez que a reinicialização foi iniciada.

Em outras palavras: isso é recuperar a data que você também obtém com who -b e, em seguida, calcula o tempo desde então.

*) uptime é um link para o programa w e foi introduzido pela BSD por volta de 1980.

    
por 12.04.2016 / 11:41