web-dev-qa-db-ja.com

Linuxでは、「稼働時間」はいつからカウントされますか?

私のコンピューターは言う:

$ 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を実行しています。

55
fedorqui

私のシステムでは、_/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ファイルシステムはカーネルへのインターフェースです。


ファイル__fs/proc/uptime.c_のLinuxカーネルソースコード 行49 には、関数呼び出しが表示されます。

_proc_create("uptime", 0, NULL, &uptime_proc_fops);
_

これは proc filesystem entry と呼ばれるuptime(procfsは通常_/proc_の下にマウントされます)を作成し、それに関数を関連付け、その疑似ファイルで有効なファイル操作を定義しますそしてそれらに関連する機能。稼働時間の場合、それはread()およびopen()オペレーションです。ただし、関数をトレースすると、アップタイムが計算される here になります。


内部的には、システムの稼働時間を定期的に更新するタイマー割り込みがあります(他の値に加えて)。 timer-interuptが刻む間隔は、プリプロセッサマクロHZによって定義されます。その正確な値はカーネル config file で定義され、コンパイル時に適用されます。

アイドル時間とCPUサイクル数、および頻度HZ(1秒あたりのサイクル数)を組み合わせて、最後の起動以降の秒数で計算できます。


質問に対処するには:「稼働時間」はいつからカウントされますか?

稼働時間は、各サイクルを刻むカーネル内部値であるため、カーネルが初期化されるとカウントを開始します。つまり、最初のサイクルが終了したときです。何かがマウントされる前でも、ブートローダーがカーネルイメージを制御した直後です。

81
chaos

私の知る限り、uptime/proc/uptimeを使用してシステムの稼働時間を計算します。あなたはそれをソースコードでより明確に見ることができます 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

標準のUNIXシステム(元のソース*に基づく)では、uptime/var/adm/utmpxを読み取り、最後に再起動したエントリがあるかどうかを確認します。

言い換えると、これはwho -bでも取得した日付を取得し、それ以降の時間を計算します。

*)uptimewプログラムへのリンクであり、BSDによって1980年頃に導入されました。

6
schily