Wann beginnt unter Linux die Betriebszeit?

52

Mein Computer sagt:

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

Und wenn ich nachschaue, lastsehe 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/syslogder ersten 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 in 8:34der Zeit zusammenzufallen, in der meine Maschine hochgefahren ist.

Ich frage mich jedoch: Was ist die genaue Zeit uptimeverwendet? Ist uptimeein Prozess, der startet und prüft eine Datei oder ist es etwas auf der Hardware?

Ich verwende Ubuntu 14.04.

fedorqui
quelle
Ich bin mir ziemlich sicher, dass der Zeitstempel, den Sie oben im Protokoll des Startvorgangs sehen, der Zeitpunkt ist, zu dem der Syslog-Dämon die zu protokollierende Nachricht empfangen hat. Das ist nicht dasselbe wie beim Einschalten des Systems oder sogar dasselbe wie beim Initialisieren des Kernels.
ein CVn
Soweit ich weiß , systemd-analyze blameenthält auch die Zeit vor dem Kernel init, zumindest auf UEFI.
Max Ried
Mit tuptime erhalten Sie eine übersichtliche und einfache Ausgabe.
Rfraile
1
@Rikr interessant! Ich kann diesen Befehl jedoch nicht auf meinem Computer finden. Ist es dieses Github-Projekt ?
Fedorqui
@fedorqui Ja, ist es in github.com/rfrail3/tuptime oder in Debian in Stretch oder Sid
Rfraile

Antworten:

79

Auf meinem System erhält es die Betriebszeit 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 aus wie Dateien, enthalten jedoch Werte, die direkt vom Kernel bereitgestellt werden. Jedes Mal, wenn Sie eine Datei lesen, wie z. B. /proc/uptime, wird der Inhalt sofort neu generiert. Das proc-Dateisystem ist eine Schnittstelle zum Kernel.


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

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

Dadurch wird ein Proc-Dateisystemeintrag mit dem Namen uptime(der Procfs wird normalerweise unter gemountet /proc) erstellt und ihm eine Funktion zugeordnet, die gültige Dateioperationen für diese Pseudodatei und die ihnen zugeordneten Funktionen definiert. Im Falle einer Betriebszeit ist es gerecht read()und open()betriebsbereit. Wenn Sie jedoch die Funktionen zurückverfolgen, gelangen Sie hierher , wo die Betriebszeit berechnet wird.


Intern gibt es einen Timer-Interrupt, der die Systemverfügbarkeit (neben anderen Werten) regelmäßig aktualisiert. Das Intervall, in dem der Timer-Interrupt tickt, wird vom Präprozessor-Makro festgelegt HZ, dessen genauer Wert in der Kernel- Konfigurationsdatei definiert und zur Kompilierungszeit angewendet wird.

Die Leerlaufzeit und die Anzahl der CPU-Zyklen in Kombination mit der Frequenz HZ(Zyklen pro Sekunde) können in einer Anzahl (in 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 kerninternen Wert handelt, der bei jedem Zyklus anhakt, beginnt er zu zählen, wenn der Kernel initialisiert wurde. Das heißt, wenn der erste Zyklus beendet ist. Noch bevor etwas gemountet wird, gibt der Bootloader direkt die Kontrolle über das Kernel-Image.

Chaos
quelle
2
+1, @chaos, wäre es genauer zu sagen, dass der Betriebsstundenzähler startet, wenn der Timer-Interrupt-Handler installiert ist? Konfiguriert der Kernel diesen Handler?
Prem
3
@Prem Dies ist Teil der Kernel-Initialisierung. Kurz vor der Scheduler-Initialisierung wird der Timer-Interrupt registriert. Es ist der Timer-Interrupt, der die erste Iteration des Scheduler-Codes aufruft (nur durch einen Funktionsaufruf). Wenn Sie interessiert sind, ist dies eine gute Lektüre: github.com/0xAX/linux-insides/blob/master/Initialization/…
Chaos
Aber manchmal ist der vom Kernel zurückgegebene Betriebszeitwert nicht immer der gleiche. Wie im laufenden Betrieb und nicht beim Booten berechnet, kann sich dieser Wert ändern, wenn der Server eine gewisse Zeit synchronisiert oder stark ausgelastet ist.
Rfraile
10

So lange ich weiß, wird uptimeverwendet /proc/uptime, um die Systemverfügbarkeit zu berechnen. Sie können es deutlicher im Quellcode uptime.c sehen

  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);
    }
Inclooder
quelle
1
Ich würde eher sagen, dass Pseudodatei /proc/uptimeaus der Betriebszeit berechnet wird.
Archemar
2
Das ist nicht wahr. Schauen Sie sich den Quellcode im obigen Link an.
Inclooder
6

uptimeLiest /var/adm/utmpxund prüft auf einem Standard-UNIX-System (basierend auf den Originalquellen *) den letzten Neustarteintrag.

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

*) uptimeist ein Link zum wProgramm und wurde von BSD um 1980 eingeführt.

schily
quelle
Ähm, ich kann nicht /var/adm/utmpxin meinem System finden. In der Tat, nicht einmal/var/adm
Fedorqui
3
In einem solchen Fall sollten Sie angeben, welches Betriebssystem Sie verwenden.
Schily
Mein Fehler! Es ist Ubuntu 14.04.
Fedorqui
OK, unter Solaris, AIX, HP-UX und * BSD, wo die ursprüngliche wImplementierung verwendet wird, ist dies der Fall, aber Linux macht normalerweise etwas andere Dinge.
Schily
4
Ich denke , von Standard , meinen Sie traditionelle . Der Unix-Standard legt den uptimeBefehl nicht fest, geschweige denn, wie er implementiert werden soll. AFAICT, OS / X hat auch kein / var / adm / utmpx. Einige Linux-basierte Systeme sind nach Unix zertifiziert.
Stéphane Chazelas