web-dev-qa-db-fra.com

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

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 last je 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

Ensuite, je vois dans /var/log/syslog la première ligne d'aujourd'hui étant:

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

Tout semble donc converger en 8:34 étant le moment où ma machine a démarré.

Cependant, je me demande: quel est le temps exact que uptime utilise? uptime est-il un processus qui lance et vérifie un fichier ou est-ce quelque chose sur le matériel?

J'utilise Ubuntu 14.04.

55
fedorqui

Sur mon système, il obtient 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

Depuis la page de manuel de 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 simplement à 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 noyau linux du fichier fs/proc/uptime.c À ligne 49 , vous voyez un appel de fonction:

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

Cela crée un entrée du système de fichiers proc appelé uptime (le procfs est généralement monté sous /proc), Et lui 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é, il s'agit simplement d'opérations read() et open(). Cependant, si vous retracez les fonctions, vous vous retrouverez ici , où le temps de disponibilité est calculé.


En interne, il existe une interruption temporisée qui met à jour périodiquement la disponibilité des systèmes (en plus des autres valeurs). L'intervalle, dans lequel la temporisation s'interrompt, est défini par la macro préprocesseur HZ, dont la valeur exacte est définie dans le noyau fichier de configuration et appliquée au moment de la compilation.

Le temps d'inactivité et le nombre de cycles CPU, combiné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 quand le "temps de disponibilité" commence-t-il à compter?

Étant donné que la disponibilité est une valeur interne du noyau, qui revient à chaque cycle, elle commence à compter lorsque le noyau est initialisé. Autrement dit, lorsque le premier cycle est terminé. Avant même que quoi que ce soit soit monté, directement après que le chargeur de démarrage donne le contrôle à l'image du noyau.

81
chaos

Pour autant que je sache, uptime utilise /proc/uptime pour calculer la disponibilité du système. Vous pouvez le voir plus clairement dans le code source 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

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

En d'autres termes: il s'agit de récupérer la date que vous obtenez également avec who -b puis calcule le temps depuis.

*) uptime est un lien vers le programme w et a été introduit par BSD vers 1980.

6
schily