Linuxでは、「アップタイム」はいつからカウントされますか?


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


起動時のログの上部に表示されるタイムスタンプは、syslogデーモンがログに記録するメッセージを受信した時間であると確信しています。これは、システムの電源がオンになったときと同じものではなく、カーネルが初期化されたときと同じものではありません。
CVn

私の知る限りsystemd-analyze blame、少なくともuefiでのカーネル初期化前の時間も含まれています。
マックスリード

tuptimeを使用すると、明確でシンプルな出力が得られます。
-Rfraile

1
@Rikr面白い!ただし、このコマンドがマシンに見つかりません。このgithubプロジェクトですか?
fedorqui

@fedorquiはい、github.com / rfrail3 / tuptimeにあるか、StretchまたはSidでDebian内にあります
-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()操作。ただし、関数をさかのぼると、ここで終了し、稼働時間が計算されます。


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

アイドル時間とCPUサイクル数は、周波数HZ(1秒あたりのサイクル数)と組み合わせて、最後のブート以降の数(秒単位)で計算できます。


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

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


2
+ 1、@ chaos、タイマー割り込みハンドラーがインストールされているときにアップタイムカウンターが開始すると言う方が正確でしょうか?カーネルはこのハンドラーを構成しますか?
Prem

3
@Premこれは、カーネルの初期化の一部です。スケジューラの初期化の直前に、タイマー割り込みが登録されます。(関数呼び出しによって)スケジューラコードの最初の反復を呼び出すのは、タイマー割り込みです。あなたが興味を持っているなら、これは良い読書です:github.com/0xAX/linux-insides/blob/master/Initialization/…–
chaos

ただし、カーネルから返される稼働時間の値が常に同じではない場合があります。起動時ではなくオンザフライで計算されるように、サーバーが何らかの時間同期を実行している場合、または負荷が高い場合、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);
    }

1
むしろ、擬似ファイル/proc/uptimeは稼働時間から計算されると言いたいです。
-Archemar

2
それは真実ではない。上記のリンクのソースコードをご覧ください。
クルーダー

6

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

言い換えれば、これはあなたも取得した日付を取得しwho -b、それからの時間を計算することです。

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


オーム、/var/adm/utmpx私のシステムで見つけることができません。実際、そうでもありません/var/adm
fedorqui

3
そのような場合は、使用しているOSの種類に言及する必要があります。
schily

私のせい!Ubuntu 14.04です。
fedorqui

OK、元のw実装が使用されているSolaris、AIX、HP-UX、および* BSD ではこのようになりますが、Linuxでは通常少し異なります。
気違い

4
標準では、あなたは伝統的なことを意味すると思います。UNIX標準では、uptimeコマンドの実装方法はもちろんのこと、コマンドは指定されていません。AFAICT、OS / Xにも/ var / adm / utmpxがありません。また、一部のLinuxベースのシステムは、Unix準拠の認定を受けています。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.