it-swarm.com.de

Wann beginnt unter Linux die "Betriebszeit" zu zählen?

Mein Computer sagt:

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

Und wenn ich last überprüfe, sehe ich:

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

Und dann überprüfe ich:

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

Dann sehe ich in /var/log/syslog Die erste Zeile von heute:

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

Alles scheint also zu konvergieren, wenn 8:34 Die Zeit ist, in der mein Computer gestartet wurde.

Ich frage mich jedoch: Was ist die genaue Zeit, die uptime verwendet? Ist uptime ein Prozess, der eine Datei startet und überprüft, oder befindet sich etwas auf der Hardware?

Ich verwende Ubuntu 14.04.

55
fedorqui

Auf meinem System erhält es die Verfügbarkeit von /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

Aus der proc manpage :

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

Das proc-Dateisystem enthält eine Reihe von Pseudodateien. Dies sind keine echten Dateien, sie sehen nur wie Dateien aus, aber sie enthalten Werte, die direkt vom Kernel bereitgestellt werden. Jedes Mal, wenn Sie eine Datei wie /proc/uptime Lesen, wird deren Inhalt im laufenden Betrieb neu generiert. Das proc-Dateisystem ist eine Schnittstelle zum Kernel.


Im Linux-Kernel-Quellcode der Datei fs/proc/uptime.c Unter Zeile 49 sehen Sie einen Funktionsaufruf:

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

Dadurch wird ein proc-Dateisystemeintrag mit dem Namen uptime erstellt (der procfs wird normalerweise unter /proc Bereitgestellt) und ihm wird eine Funktion zugeordnet, die gültige Dateioperationen für dieses Pseudo definiert Datei und die damit verbundenen Funktionen. Im Falle einer Betriebszeit sind es nur read() und open() Operationen. Wenn Sie jedoch die Funktionen zurückverfolgen, erhalten Sie hier , wo die Betriebszeit berechnet wird.


Intern gibt es eine Timer-Unterbrechung, die die Systemverfügbarkeit (neben anderen Werten) regelmäßig aktualisiert. Das Intervall, in dem die Timer-Unterbrechung aktiviert ist, wird durch das Präprozessor-Makro HZ definiert, dessen genauer Wert im Kernel Konfigurationsdatei definiert und zur Kompilierungszeit angewendet wird.

Die Leerlaufzeit und die Anzahl der CPU-Zyklen, kombiniert mit der Frequenz HZ (Zyklen pro Sekunde), können in einer Anzahl (von Sekunden) seit dem letzten Start berechnet werden.


Um Ihre Frage zu beantworten: Wann beginnt die Betriebszeit zu zählen?

Da es sich bei der Betriebszeit um einen internen Kernelwert handelt, der bei jedem Zyklus aktiviert wird, beginnt die Zählung, sobald der Kernel initialisiert wurde. Das heißt, wenn der erste Zyklus beendet ist. Noch bevor etwas gemountet wird, direkt nachdem der Bootloader das Kernel-Image kontrolliert hat.

81
chaos

Solange ich weiß, verwendet uptime/proc/uptime zur Berechnung der Systemverfügbarkeit. Sie können es deutlicher im Quellcode sehen ptime.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);
    }
10
Inclooder

Auf einem Standard-UNIX-System (basierend auf den Originalquellen *) liest uptime/var/adm/utmpx Und überprüft den letzten Zeitpunkt des Neustarteintrags.

Mit anderen Worten: Dies ruft das Datum ab, das Sie auch mit who -b Erhalten, und berechnet dann die Zeit seitdem.

*) uptime ist ein Link zum Programm w und wurde um 1980 von BSD eingeführt.

6
schily