Su Linux, da dove inizia il conteggio dei "tempi di attività"?


52

Il mio computer dice:

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

E se controllo lastvedo:

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

E poi controllo:

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

Poi vedo nella /var/log/syslogprima riga di oggi essere:

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

Quindi tutto sembra convergere nel 8:34momento in cui la mia macchina si è avviata.

Tuttavia, mi chiedo: qual è il tempo esatto uptimeutilizza? È uptimeun processo che avvia e controlla alcuni file o è qualcosa sull'hardware?

Sto eseguendo Ubuntu 14.04.


Sono abbastanza sicuro che il timestamp che vedi nella parte superiore del registro all'avvio sia il momento in cui il demone syslog ha ricevuto il messaggio da registrare. Non è la stessa cosa di quando il sistema è stato acceso, o anche la stessa cosa di quando il kernel è stato inizializzato.
un CVn del

Per quanto ne so systemd-analyze blamecontiene anche il tempo che precede Kernel Init, almeno su uefi.
Max Ried

Con tuptime ottieni un output chiaro e semplice.
Rfraile,

1
@Rikr interessante! Tuttavia, non riesco a trovare questo comando nella mia macchina. È questo progetto github ?
fedorqui,

@fedorqui Sì, è su github.com/rfrail3/tuptime o all'interno di Debian in Stretch o Sid
Rfraile,

Risposte:


79

Sul mio sistema ottiene il tempo di attività da /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

Dalla manpage proc :

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

Il filesystem proc contiene un set di pseudo file. Questi non sono file reali, sembrano solo file, ma contengono valori forniti direttamente dal kernel. Ogni volta che leggi un file, ad esempio /proc/uptime, il suo contenuto viene rigenerato al volo. Il filesystem proc è un'interfaccia per il kernel.


Nel codice sorgente del kernel linux del file fs/proc/uptime.calla riga 49 , vedi una chiamata di funzione:

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

Questo crea una voce del filesystem proc chiamata uptime(il procfs è normalmente montato sotto /proc) e associa ad esso una funzione, che definisce le operazioni di file valide su quel pseudo file e le funzioni ad esse associate. In caso di uptime è solo read()e open()operazioni. Tuttavia, se rintracci le funzioni , finirai qui , dove viene calcolato il tempo di attività.


Internamente, c'è un timer-interrupt che aggiorna periodicamente il tempo di attività del sistema (oltre ad altri valori). L'intervallo, in cui il timer-interruzione scatta, è definito dalla macro del preprocessore HZ, il cui valore esatto è definito nel file di configurazione del kernel e applicato al momento della compilazione.

Il tempo di inattività e il numero di cicli della CPU, combinati con la frequenza HZ(cicli al secondo), possono essere calcolati in un numero (di secondi) dall'ultimo avvio.


Per rispondere alla tua domanda: da dove inizia il conteggio dei "tempi di attività"?

Poiché il tempo di attività è un valore interno del kernel, che aumenta ogni ciclo, inizia a contare quando il kernel è stato inizializzato. Cioè, quando il primo ciclo è terminato. Anche prima che qualsiasi cosa sia montata, subito dopo il bootloader dà il controllo all'immagine del kernel.


2
+1, @chaos, sarebbe più preciso affermare che il contatore del tempo di attività inizia quando viene installato il gestore di interruzione del timer? Il kernel configura questo gestore?
Prem

3
@Prem Fa parte dell'inizializzazione del kernel. Subito prima dell'inizializzazione dello scheduler, l'interruzione del timer verrà registrata. È l'interrupt del timer che chiama la prima iterazione del codice dello scheduler (solo tramite una chiamata di funzione). Se sei interessato, questa è una buona lettura: github.com/0xAX/linux-insides/blob/master/Initialization/…
caos

Ma a volte il valore di uptime restituito dal kernel non è sempre lo stesso. Come viene calcolato al volo, non all'avvio, se il server esegue una sincronizzazione temporale o è sotto carico pesante, questo valore può cambiare a causa degli spostamenti sull'HZ.
Rfraile,

10

Per quanto ne so, uptimeutilizza /proc/uptimeper calcolare il tempo di attività del sistema. Puoi vederlo più chiaramente nel codice sorgente 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);
    }

1
Preferirei dire che il pseudo file /proc/uptimeviene calcolato dal tempo di attività.
Archemar,

2
Non è vero. Dai un'occhiata al codice sorgente nel link sopra.
Inclooder

6

Su un sistema UNIX standard (basato sulle fonti originali *), uptimelegge /var/adm/utmpxe verifica l'ultima volta della voce di riavvio.

In altre parole: questo sta recuperando la data con cui si ottiene anche who -be quindi calcola il tempo da allora.

*) uptimeè un collegamento al wprogramma ed è stato introdotto da BSD intorno al 1980.


Uhm, non riesco a trovare /var/adm/utmpxnel mio sistema. In realtà, nemmeno/var/adm
fedorqui

3
In tal caso, dovresti menzionare il tipo di sistema operativo che stai utilizzando.
schily,

Colpa mia! È Ubuntu 14.04.
fedorqui,

OK, su Solaris, AIX, HP-UX e * BSD dove wviene utilizzata l' implementazione originale le cose vanno in questo modo, ma Linux di solito fa cose un po 'diverse.
schily

4
Penso per standard , intendi tradizionale . Lo standard Unix non specifica il uptimecomando, figuriamoci come dovrebbe essere implementato. AFAICT, OS / X non ha neanche / var / adm / utmpx. E alcuni sistemi basati su Linux hanno ricevuto la certificazione di conformità Unix.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.