В Linux, когда «uptime» начинает считать?

52

Мой компьютер говорит:

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

И если я проверю, lastя увижу:

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

И тогда я проверяю:

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

Тогда я вижу в /var/log/syslogпервой строке сегодняшнего дня:

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

Так что, похоже, все сходится в 8:34то время, когда моя машина загрузилась.

Однако мне интересно: какое точное время uptimeиспользует? Это uptimeпроцесс, который запускает и проверяет какой-то файл или это что-то на оборудовании?

Я использую Ubuntu 14.04.

fedorqui
источник
Я почти уверен, что отметка времени, которую вы видите в верхней части журнала при загрузке, - это время, когда демон syslog получил сообщение для регистрации. Это не то же самое, что при включении системы, или даже то же самое, что и при инициализации ядра.
CVn
Насколько я знаю, systemd-analyze blameтакже содержит время до инициализации ядра, по крайней мере, на UEFI.
Макс Райд
С tuptime вы получите ясный и простой вывод.
Rfraile
1
@Rikr интересно! Тем не менее, я не могу найти эту команду в моей машине. Это проект GitHub ?
Федорки
@fedorqui Да, это в github.com/rfrail3/tuptime или в Debian в Stretch или Sid
Rfraile

Ответы:

79

В моей системе он получает время безотказной работы /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

Из справочной страницы proc :

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

Файловая система proc содержит набор псевдо-файлов. Это не настоящие файлы, они просто выглядят как файлы, но они содержат значения, которые предоставляются непосредственно ядром. Каждый раз, когда вы читаете файл, например /proc/uptime, его содержимое восстанавливается на лету. Файловая система proc - это интерфейс к ядру.


В исходном коде ядра Linux fs/proc/uptime.cв строке 49 вы видите вызов функции:

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

Это создает запись файловой системы proc, называемую uptime(procfs обычно монтируется под ней /proc), и связывает с ней функцию, которая определяет допустимые файловые операции над этим псевдофайлом и функции, связанные с ними. В случае безотказной работы это как раз read()и open()операции. Однако, если вы проследите функции обратно, вы окажетесь здесь , где рассчитывается время безотказной работы.


Внутренне, существует прерывание по таймеру, которое периодически обновляет время работы системы (помимо других значений). Интервал, в течение которого отсчитывается таймер-прерывание, определяется макросом препроцессора HZ, точное значение которого определяется в файле конфигурации ядра и применяется во время компиляции.

Время простоя и количество циклов ЦП в сочетании с частотой HZ(циклов в секунду) можно рассчитать в количестве (секунд) с момента последней загрузки.


Чтобы ответить на ваш вопрос: когда «uptime» начинает считать?

Поскольку uptime является внутренним значением ядра, которое увеличивается каждый цикл, он начинает считать, когда ядро ​​инициализируется. То есть когда первый цикл закончился. Еще до того, как что-либо монтируется, непосредственно после того, как загрузчик дает контроль над образом ядра.

хаос
источник
2
+1, @chaos, точнее было бы сказать, что счетчик времени безотказной работы запускается, когда установлен обработчик прерывания по таймеру? Ядро настраивает этот обработчик?
Прем
3
@Prem Это часть инициализации ядра. Непосредственно перед инициализацией планировщика прерывание таймера будет зарегистрировано. Это прерывание по таймеру, которое вызывает первую итерацию кода планировщика (просто путем вызова функции). Если вы заинтересованы, это хорошее чтение: github.com/0xAX/linux-insides/blob/master/Initialization/…
хаос
Но иногда значение uptime, возвращаемое ядром, не всегда одинаково. Как рассчитывается на лету, а не при загрузке, если сервер выполняет некоторую временную синхронизацию или находится под большой нагрузкой, это значение может измениться из-за сдвигов в HZ.
Rfraile
10

Насколько я знаю, uptimeиспользует /proc/uptimeдля расчета работоспособности системы. Вы можете увидеть это более четко в исходном коде 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
источник
1
Я бы предпочел сказать, что псевдо-файл /proc/uptimeвычисляется из времени безотказной работы.
Archemar
2
Это не правда. Посмотрите на исходный код по ссылке выше.
Inclooder
6

В стандартной системе UNIX (на основе оригинальных источников *) uptimeчитает /var/adm/utmpxи проверяет последний раз записи перезагрузки.

Другими словами: это извлекает дату, с которой вы также получаете, who -bа затем вычисляет время с тех пор.

*) uptimeявляется ссылкой на wпрограмму и была введена BSD в 1980 году.

Шили
источник
Хм, я не могу найти /var/adm/utmpxв моей системе. На самом деле даже нет/var/adm
fedorqui
3
В таком случае вы должны указать, какую ОС вы используете.
Шили
Моя вина! Это Ubuntu 14.04.
Федорки
Хорошо, в Solaris, AIX, HP-UX и * BSD, где используется оригинальная wреализация, все обстоит именно так, но Linux обычно делает вещи немного иначе.
Шили
4
Я думаю, что под стандартом вы подразумеваете традиционный . Стандарт Unix не определяет uptimeкоманду, не говоря уже о том, как она должна быть реализована. AFAICT, OS / X также не имеет / var / adm / utmpx. А некоторые системы на базе Linux получили сертификацию Unix-соответствия.
Стефан Шазелас