W Linuksie, od kiedy zaczyna się „uptime”?

52

Mój komputer mówi:

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

A jeśli sprawdzę last, zobaczę:

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

A potem sprawdzam:

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

Potem widzę w /var/log/syslogpierwszym wierszu dzisiejszego słowa:

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

Więc wszystko wydaje się zbieżne w 8:34czasie, gdy moja maszyna została uruchomiona.

Zastanawiam się jednak: jaki jest dokładny czas uptime? Czy uptimeproces, który uruchamia i sprawdza jakiś plik, czy jest to coś na sprzęcie?

Używam Ubuntu 14.04.

fedorqui
źródło
Jestem prawie pewien, że znacznik czasu widoczny w górnej części dziennika po uruchomieniu to czas, w którym demon syslog otrzymał wiadomość do zalogowania. To nie to samo, co kiedy system był włączony, ani nawet to samo, co podczas inicjalizacji jądra.
CVn
O ile mi wiadomo, systemd-analyze blamezawiera także czas przed inicjacją jądra, przynajmniej na uefi.
Max Ried
Z tuptime otrzymujesz wyraźny i prosty wynik.
Rfraile,
1
@Rikr ciekawe! Nie mogę jednak znaleźć tego polecenia na moim komputerze. Czy to ten projekt github ?
fedorqui
@fedorqui Tak, jest w github.com/rfrail3/tuptime lub w Debianie w Stretch lub Sid
Rfraile

Odpowiedzi:

79

W moim systemie czas przestoju jest uzyskiwany z /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

Ze strony proc :

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

System plików proc zawiera zestaw pseudo plików. To nie są prawdziwe pliki, po prostu wyglądają jak pliki, ale zawierają wartości dostarczane bezpośrednio przez jądro. Za każdym razem, gdy czytasz plik, na przykład /proc/uptimejego zawartość jest regenerowana w locie. System plików proc jest interfejsem do jądra.


W kodzie źródłowym jądra linuksa pliku fs/proc/uptime.cw wierszu 49 widać wywołanie funkcji:

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

Tworzy to pozycję systemu plików proc o nazwie uptime(procfs jest zwykle montowany pod /proc) i kojarzy z nią funkcję, która definiuje prawidłowe operacje na pliku na tym pseudo pliku i funkcje z nimi związane. W przypadku przestojów jest to po prostu read()i open()operacji. Jeśli jednak prześledzisz funkcje z powrotem, skończysz tutaj , gdzie obliczany jest czas sprawności.


Wewnętrznie występuje przerwa czasowa, która okresowo aktualizuje czas pracy systemu (oprócz innych wartości). Interwał, w którym tyka przerwanie timera, jest definiowany przez makro preprocesora HZ, którego dokładna wartość jest zdefiniowana w pliku konfiguracyjnym jądra i stosowana w czasie kompilacji.

Czas bezczynności i liczbę cykli procesora w połączeniu z częstotliwością HZ(cykli na sekundę) można obliczyć w liczbie (sekundach) od ostatniego uruchomienia.


Aby odpowiedzieć na twoje pytanie: od kiedy zaczyna się „uptime”?

Ponieważ czas działania jest wewnętrzną wartością jądra, która zaznacza się w każdym cyklu, zaczyna się odliczać po zainicjowaniu jądra. Oznacza to, że pierwszy cykl się skończył. Nawet zanim cokolwiek zostanie zamontowane, bezpośrednio po tym, jak bootloader daje kontrolę nad obrazem jądra.

chaos
źródło
2
+1, @chaos, czy dokładniej byłoby powiedzieć, że licznik czasu przestoju rozpoczyna się po zainstalowaniu modułu obsługi przerwań czasomierza? Czy jądro konfiguruje ten moduł obsługi?
Prem
3
@Prem Jest to część inicjalizacji jądra. Tuż przed inicjalizacją programu planującego zostanie zarejestrowane przerwanie timera. Jest to przerwanie timera, które wywołuje pierwszą iterację kodu harmonogramu (tylko przez wywołanie funkcji). Jeśli jesteś zainteresowany, warto przeczytać: github.com/0xAX/linux-insides/blob/master/Initialization/…
chaos
Ale czasami wartość czasu sprawności zwracana z jądra nie zawsze jest taka sama. Jak oblicza się w locie, a nie przy rozruchu, jeśli serwer uruchamia synchronizację czasową lub jest obciążony, ta wartość może się zmienić z powodu przesunięć w HZ.
Rfraile,
10

O ile wiem, uptimeużywa /proc/uptimedo obliczania czasu pracy systemu. Widać to wyraźniej w kodzie źródłowym 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);
    }
Inclooder
źródło
1
Wolę powiedzieć, że pseudoplik /proc/uptimejest obliczany na podstawie czasu pracy.
Archemar,
2
To nieprawda. Spójrz na kod źródłowy w linku powyżej.
Inclooder
6

W standardowym systemie UNIX (opartym na oryginalnych źródłach *) uptimeodczytuje /var/adm/utmpxi sprawdza ostatni wpis ponownego uruchomienia komputera.

Innymi słowy: pobiera datę, którą również otrzymujesz, who -ba następnie oblicza czas od tego czasu.

*) uptimeto link do wprogramu, który został wprowadzony przez BSD około 1980 roku.

schily
źródło
Nie mogę znaleźć /var/adm/utmpxw moim systemie. W rzeczywistości nawet nie/var/adm
fedorqui
3
W takim przypadku powinieneś wspomnieć, jakiego systemu operacyjnego używasz.
schily,
Moja wina! Jest Ubuntu 14.04.
fedorqui
OK, w systemach Solaris, AIX, HP-UX i * BSD, w których wużywana jest oryginalna implementacja, wszystko działa w ten sposób, ale Linux zwykle robi to nieco inaczej.
schily,
4
Myślę, że standardowo masz na myśli tradycyjny . Standard uniksowy nie określa uptimepolecenia, nie mówiąc już o tym, jak powinien zostać zaimplementowany. AFAICT, OS / X nie ma również / var / adm / utmpx. Niektóre systemy Linux otrzymały certyfikat zgodności z Unixem.
Stéphane Chazelas