Sous Linux, à partir de quel moment le temps de disponibilité commence-t-il à compter?

52

Mon ordinateur dit:

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

Et si je vérifie lastje vois:

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

Et puis je vérifie:

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

Alors je vois dans /var/log/syslogla première ligne d'aujourd'hui être:

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

Donc, tout semble converger pour 8:34être le moment où ma machine a démarré.

Cependant, je me demande: quelle est l'heure exacte uptimeutilise? Est-ce uptimequ'un processus qui lance et vérifie un fichier ou est-ce quelque chose sur le matériel?

J'utilise Ubuntu 14.04.

Fedorqui
la source
Je suis pratiquement sûr que l'horodatage que vous voyez en haut du journal dès le démarrage correspond à l'heure à laquelle le démon syslog a reçu le message à consigner. Ce n'est pas la même chose que quand le système était allumé, ni même quand le noyau a été initialisé.
un CVn
Autant que je sache, systemd-analyze blamecontient également le temps qui précède l’initiation du noyau, du moins sur uefi.
Max Ried
Avec tuptime, vous obtenez un résultat clair et simple.
Rfraile
1
@Rikr intéressant! Cependant, je ne trouve pas cette commande dans ma machine. Est-ce ce projet github ?
fedorqui
@fedorqui Oui, c'est dans github.com/rfrail3/tuptime ou dans Debian dans Stretch ou Sid
Rfraile

Réponses:

79

Sur mon système, la disponibilité 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

De la page de manuel proc :

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

Le système de fichiers proc contient un ensemble de pseudo-fichiers. Ce ne sont pas de vrais fichiers, ils ressemblent à des fichiers, mais ils contiennent des valeurs fournies directement par le noyau. Chaque fois que vous lisez un fichier, tel que /proc/uptime, son contenu est régénéré à la volée. Le système de fichiers proc est une interface avec le noyau.


Dans le code source du fichier du noyau linux fs/proc/uptime.cà la ligne 49 , vous voyez un appel de fonction:

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

Cela crée une entrée de système de fichiers proc appelée uptime(le fichier procfs est généralement monté sous /proc) et y associe une fonction qui définit les opérations de fichier valides sur ce pseudo-fichier et les fonctions qui leur sont associées. En cas de disponibilité, c'est juste read()et open()opérationnel. Cependant, si vous suivez les fonctions, vous vous retrouverez ici , où le temps de disponibilité est calculé.


En interne, il y a une interruption-timer qui met à jour périodiquement le temps de disponibilité du système (en plus des autres valeurs). L'intervalle, dans lequel les ticks d'interruption de minuterie, est défini par la macro préprocesseur HZ, dont la valeur exacte est définie dans le fichier de configuration du noyau et appliquée au moment de la compilation.

Le temps d'inactivité et le nombre de cycles de la CPU, associés à la fréquence HZ(cycles par seconde), peuvent être calculés en nombre (en secondes) depuis le dernier démarrage.


Pour répondre à votre question: à partir de quel moment le temps de disponibilité commence-t-il à compter?

Étant donné que la disponibilité est une valeur interne du noyau, qui se répète à chaque cycle, elle commence à compter dès que le noyau est initialisé. C'est-à-dire quand le premier cycle est terminé. Même avant que quoi que ce soit ne soit monté, juste après le chargeur de démarrage donne le contrôle à l'image du noyau.

le chaos
la source
2
+1, @chaos, serait-il plus précis de dire que le compteur de temps d'utilisation démarre lorsque le gestionnaire d'interruption de minuterie est installé? Le noyau configure-t-il ce gestionnaire?
Prem
3
@Prem Cela fait partie de l'initialisation du noyau. Juste avant l'initialisation du planificateur, l'interruption du minuteur sera enregistrée. C'est l'interruption du minuteur qui appelle la première itération du code du planificateur (par un simple appel de fonction). Si vous êtes intéressé, voici
chaos
Mais parfois, la valeur de disponibilité renvoyée par le noyau n'est pas toujours la même. Comme il est calculé à la volée, et non au démarrage, si le serveur exécute une synchronisation temporelle ou est soumis à une charge importante, cette valeur peut changer en raison des décalages effectués sur le HZ.
Rfraile
10

Tant que je sache, uptimeutilise /proc/uptimepour calculer le temps de disponibilité du système. Vous pouvez le voir plus clairement dans le code source 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
la source
1
Je dirais plutôt que ce pseudo fichier /proc/uptimeest calculé à partir de la disponibilité.
Archemar
2
Ce n'est pas vrai. Regardez le code source dans le lien ci-dessus.
Inclooder
6

Sur un système UNIX standard (basé sur les sources d'origine *), uptimelit /var/adm/utmpxet vérifie la dernière heure d'entrée de redémarrage.

En d'autres termes: il s'agit de récupérer la date avec laquelle vous obtenez également who -bet calcule le temps écoulé depuis lors.

*) uptimeest un lien vers le wprogramme et a été introduit par BSD vers 1980.

schily
la source
Uhms, je ne peux pas trouver /var/adm/utmpxdans mon système. En fait, même pas/var/adm
fedorqui
3
Dans ce cas, vous devez mentionner le type de système d'exploitation que vous utilisez.
Schily
Ma faute! C'est Ubuntu 14.04.
fedorqui
OK, sous Solaris, AIX, HP-UX et * BSD, dans lequel l' wimplémentation d' origine est utilisée, les choses se passent ainsi, mais Linux fait généralement les choses un peu différemment.
Schily
4
Je pense que par standard , vous voulez dire traditionnel . Le standard Unix ne spécifie pas la uptimecommande, encore moins comment elle devrait être implémentée. AFAICT, OS / X n’a pas non plus de / var / adm / utmpx. Et certains systèmes basés sur Linux ont reçu une certification de conformité Unix.
Stéphane Chazelas