Score:2

จะตรวจสอบได้อย่างไรว่าเวลาของระบบซิงโครไนซ์กับเซิร์ฟเวอร์ NTP โดยไม่ทราบไคลเอ็นต์ ntp ที่ใช้ในผลิตภัณฑ์หรือไม่

ธง cn

จะตรวจสอบได้อย่างไรว่าเวลาของระบบซิงโครไนซ์กับเซิร์ฟเวอร์ NTP โดยไม่ทราบไคลเอ็นต์ NTP ที่ใช้ในผลิตภัณฑ์หรือไม่ ฉันกำลังพัฒนาแอปพลิเคชันที่คาดว่าจะทำงานในคอนเทนเนอร์หรือระบบสแตนด์อโลน แอปพลิเคชันของฉันมีข้อกำหนดเพื่อให้แน่ใจว่าระบบซิงโครไนซ์เวลาก่อนที่จะพยายามดำเนินการบางอย่าง อย่างไรก็ตาม ไม่สามารถรับประกันความพร้อมใช้งานของแพ็กเกจ NTP/chrony ในคอนเทนเนอร์ได้ แม้ว่าจะใช้ไคลเอนต์ NTP หนึ่งหรือไคลเอ็นต์อื่นใน OS โฮสต์ก็ตาม

ดังนั้นฉันกำลังมองหาวิธีที่รวมเป็นหนึ่งเพื่อทราบว่าเวลาของระบบตรงกันหรือไม่?

John Mahowald avatar
cn flag
คุณกำลังมองหาโซลูชันแบบพกพาอยู่หรือไม่? บางคำตอบที่คุณได้รับไม่ใช่ เช่น systemd เป็น Linux เท่านั้น
cptMikky avatar
us flag
จากสิ่งที่ฉันอ่านดูเหมือนว่าคุณต้องการตรวจสอบให้แน่ใจว่านาฬิการะบบ "ตรงเวลา" จริง ๆ แล้วความจริงที่ว่ากล่องซิงค์กับเซิร์ฟเวอร์ NTP ไม่ได้แปลว่าเวลาถูกต้องเสมอไป เพียงแต่ซิงค์กับเซิร์ฟเวอร์ NTP เท่านั้น หากคุณต้องการวิธีเดิม ทางออกเดียวที่ปลอดภัยของคุณคือทำการเปรียบเทียบการชดเชยเวลากับแหล่งเวลาที่เชื่อถือได้
Score:2
ธง cn

แอปพลิเคชันในการประมวลผลเพื่อวัตถุประสงค์ทั่วไปไม่สามารถทราบได้ในทุกกรณีว่าการซิงค์เวลาทำงานอย่างไรบนโฮสต์ที่เรียกใช้ ในคอนเทนเนอร์ คุณไม่เห็นและไม่สามารถเชื่อมต่อกับ chronyd หรือ ntpd ที่ทำงานบนโฮสต์ได้ แต่วิธีนี้ช่วยรักษาเวลาได้ดี หรือผู้เยี่ยมชม VM ที่อาศัยการซิงค์เวลาของโฮสต์ก็ไม่สามารถมองเห็นได้เช่นกัน ยิ่งไปกว่านั้น การทำให้คำตอบทั่วไปยากขึ้น มีการใช้งาน NTP มากกว่าที่คุณคิด: chrony, ntp, ntpsec, openntpd, w32tm

บ่อยครั้งที่เอกสารเกี่ยวกับความสำคัญของเวลาที่ถูกต้องก็เพียงพอแล้ว

ในบางแพลตฟอร์ม การพึ่งพาการเริ่มต้น ntpd นั้นค่อนข้างตรงไปตรงมา ใน RHEL ถึง รอการซิงค์เวลา systemctl เปิดใช้งาน chrony-wait และเพิ่มไปยังหน่วย systemd ของคุณ

After=time-sync.target
ต้องการ=time-sync.target

ยังมีแอปพลิเคชันที่มีข้อกำหนดด้านเวลาที่เข้มงวด สิ่งที่เรียกร้องมากที่สุดที่ฉันคิดได้คือเจ้าหน้าที่ประทับเวลา หนึ่งในมาตรฐานการอ้างสิทธิ์ต้องการการชดเชยน้อยกว่าหนึ่งวินาทีหรือไม่สามารถออกได้. การตอบสนองที่ก้าวร้าวนี้บ่งบอกว่าแอปพลิเคชันทำการตรวจสอบเวลาของตัวเอง

อาจรวมไคลเอ็นต์ SNTP ซึ่งตรวจสอบการชดเชย NTP ในแอปพลิเคชันของคุณกับเซิร์ฟเวอร์ NTP ที่กำหนดค่าได้ไม่สามารถตรวจสอบการรัน ntpd ที่เหมาะสมได้ แต่สามารถตรวจสอบออฟเซ็ตได้โดยไม่คำนึงว่าการซิงค์เวลาทำงานอย่างไรกับโฮสต์

Score:1
ธง jo

มีสองวิธีในการทำเช่นนี้

หากคอนเทนเนอร์ที่คุณใช้งานมีการใช้งาน systemd เต็มรูปแบบ ดังนั้น วันที่เวลา โปรแกรมสามารถแจ้งให้คุณทราบว่าโฮสต์ซิงโครไนซ์หรือไม่

วิธีจัดการภายในคือผ่าน dbus ซึ่งพูดกับ systemd-หมดเวลา ภูต สิ่งที่กำลังทำอยู่คือการเรียกระบบ: adjtimex ซึ่งเป็นไปได้ที่จะได้รับข้อมูลกลับเพื่อระบุสถานะปัจจุบันของการปรับในเคอร์เนล (ถ้ามี) ที่กำลังดำเนินการอยู่

ดังนั้น วิธีที่สองในการดำเนินการนี้ด้วยตัวเองโดยไม่ต้องดำเนินการอย่างเต็มรูปแบบคือการใช้ adjtimex() การโทรของระบบ

เคอร์เนลไม่ต้องการให้มีการข้ามเวลาในการรายงานเวลา (หรือแย่กว่านั้นคือเวลาเดินทางย้อนกลับ) เนื่องจากมันใช้การเบ้ในเวลาซึ่งในช่วงเวลาไม่กี่ชั่วโมงจะแก้ไขเวลาของระบบ (เสร็จแล้ว โดยเพิ่มหรือหน่วงเวลาไม่กี่มิลลิวินาทีต่อวินาทีจนกว่าการปรับจะเสร็จสมบูรณ์)

เดอะ adjtimex โดยทั่วไปแล้วการเรียกระบบจะใช้โดยระบบ NTP เพื่อเปลี่ยนความเอียงปัจจุบันที่นาฬิกาเผชิญอยู่เพื่อให้ซิงโครไนซ์อย่างถูกต้องกับแหล่งสัญญาณนาฬิกาจริง -- แต่ นอกจากนี้ยังสามารถใช้เพื่อดึงสถานะปัจจุบันของการเอียงของแหล่งสัญญาณนาฬิกา ดังนั้นจึงช่วยให้คุณสามารถมองเข้าไปในแนวคิดของเมล็ดพืชว่ากำลังทำการซิงค์อะไรอยู่ (ถ้ามี)

หน้าคนสำหรับ adjtimex ให้ส่วนที่น่าสนใจสองสามส่วนที่เกี่ยวข้องกับสิ่งที่คุณถาม:

       ฟิลด์ buf.status เป็นบิตมาสก์ที่ใช้เพื่อตั้งค่าและ/หรือดึงสถานะบิตที่เกี่ยวข้องกับการนำ NTP ไปใช้ บางส่วนในหน้ากาก
       มีทั้งแบบอ่านได้และตั้งค่าได้ ในขณะที่แบบอื่นเป็นแบบอ่านอย่างเดียว
...
       STA_UNSYNC (อ่าน-เขียน)
              นาฬิกาไม่ตรงกัน

และ

มูลค่าผลตอบแทน
       เมื่อสำเร็จ adjtimex() และ ntp_adjtime() จะคืนสถานะนาฬิกา นั่นคือหนึ่งในค่าต่อไปนี้:
...
       TIME_ERROR นาฬิการะบบไม่ซิงโครไนซ์กับเซิร์ฟเวอร์ที่เชื่อถือได้ ค่านี้จะถูกส่งกลับเมื่อข้อใดข้อหนึ่งต่อไปนี้เป็นจริง:

                   * ตั้งค่า STA_UNSYNC หรือ STA_CLOCKERR อย่างใดอย่างหนึ่ง

                   * STA_PPSSIGNAL ชัดเจนและตั้งค่า STA_PPSFREQ หรือ STA_PPSTIME อย่างใดอย่างหนึ่ง

                   * ตั้งค่า STA_PPSTIME และ STA_PPSJITTER แล้ว

                   * มีการตั้งค่า STA_PPSFREQ และ STA_PPSWANDER หรือ STA_PPSJITTER อย่างใดอย่างหนึ่ง

                   ชื่อสัญลักษณ์ TIME_BAD เป็นคำพ้องความหมายสำหรับ TIME_ERROR ซึ่งจัดเตรียมไว้สำหรับความเข้ากันได้แบบย้อนหลัง

ดังนั้น หากคุณไม่มีคอนเทนเนอร์ที่สมบูรณ์ คุณก็ยังได้รับข้อมูลนี้อยู่ ฉันเขียนโปรแกรมง่าย ๆ ที่จะดึงสถานะของเมล็ดที่เอียงผ่าน adjtimex ในซีคุณสามารถรวบรวมได้เช่น gcc -o timex timex.c

#รวม <stdio.h>
#รวม <stdlib.h>
#รวม <unistd.h>
#รวม <errno.h>
#รวม <string.h>

#รวม <sys/timex.h>

/* เขียนสำหรับ https://serverfault.com/questions/1077601/how-to-check-whether-the-system-time-is-synchronised-to-ntp-server-without-knowi */

เป็นโมฆะ test_status(
    int เซนต์) 
{
  ถ้า (st & STA_PLL)
    printf("เฟสล็อกลูป\n");
  ถ้า (เซนต์ & STA_PPSFREQ)
    printf("ชีพจรต่อความถี่ความถี่\n");
  ถ้า (เซนต์ & STA_FLL)
    printf("วินัยเวลา PPS\n");
  ถ้า (เซนต์ & STA_INS)
    printf("แทรกอธิกวินาทีและสิ้นวัน\n");
  ถ้า (เซนต์ & STA_DEL)
    printf("ลบอธิกวินาทีและสิ้นวัน\n");
  ถ้า (st & STA_UNSYNC)
    printf("นาฬิกาไม่ตรงกัน\n");
  ถ้า (เซนต์ & STA_FREQHOLD)
    printf("ความถี่ค้าง\n");
  ถ้า (เซนต์ & STA_PPSSIGNAL)
    printf("มีสัญญาณ PPS ที่ถูกต้อง\n");
  ถ้า (เซนต์ & STA_PPSJITTER)
    printf("เกินสัญญาณ PPS กระวนกระวายใจ\n");
  ถ้า (เซนต์ & STA_PPSWANDER)
    printf("สัญญาณ PPS เกิน\n");
  ถ้า (เซนต์ & STA_PPSERROR)
    printf("ข้อผิดพลาดในการปรับเทียบสัญญาณ PPS\n");
  ถ้า (เซนต์ & STA_CLOCKERR)
    printf("ความผิดพลาดของฮาร์ดแวร์นาฬิกา\n");

  ถ้า (เซนต์ & STA_NANO)
    printf("ความละเอียดระดับนาโนวินาที\n");
  อื่น
    printf("ความละเอียดไมโครวินาที\n");

  ถ้า (เซนต์ & STA_MODE)
    printf("ความถี่ล็อคลูป\n");
  อื่น
    printf("เฟสล็อคลูป\n");
}

int หลัก () {
  โครงสร้าง timex tx = {};
  tx.modes = ADJ_OFFSET_SS_READ;
  int err = adjtimex(&tx);

  สวิตช์ (ผิดพลาด) {
    กรณี -1:
      printf("เวลาผิดพลาด: %s\n", strerror(errno));
    หยุดพัก;

    กรณี TIME_WAIT:
      printf("ใส่/ลบ Leap วินาทีเสร็จ\n");
    หยุดพัก;

    กรณี TIME_INS:
      printf("อธิกวินาทีที่จะเพิ่มในวัน UTC ถัดไป\n");
    หยุดพัก;

    กรณี TIME_DEL:
      printf("อธิกวินาทีจะถูกลบในวัน UTC ถัดไป\n");
    หยุดพัก;

    กรณี TIME_OOP:
      printf("กำลังแทรก Leap วินาที\n");
    หยุดพัก;

    กรณี TIME_ERROR:
      printf("เวลารับผิดพลาด\n");
    หยุดพัก;

    กรณี TIME_OK:
      printf("เวลาตกลง\n");
    หยุดพัก;

    ค่าเริ่มต้น:
      printf("ค่าเริ่มต้นของเวลา: %x (%d)\n", err, err);
    หยุดพัก;
  }

  test_status (tx.status);
  ทางออก (0);
}

ทำงานบนระบบที่ไม่ได้ซิงโครไนซ์:

$ ./timex 
เกิดข้อผิดพลาดในการหาเวลา
นาฬิกาไม่ซิงโครไนซ์
ความละเอียดระดับไมโครวินาที
เฟสล็อคลูป

ทำงานในคอนเทนเนอร์บนโฮสต์เดียวกันที่ไม่ได้ซิงโครไนซ์:

# พ็อดแมนรัน -v /tmp/timex/timex:/timex docker.io/gammabytehosting/rockylinux /timex
เกิดข้อผิดพลาดในการหาเวลา
นาฬิกาไม่ซิงโครไนซ์
ความละเอียดระดับไมโครวินาที
เฟสล็อคลูป

การตั้งเวลาในระบบโฮสต์ที่จะซิงโครไนซ์:

# systemctl เริ่ม chronyd
# แหล่งที่มา chronyc
210 จำนวนแหล่งที่มา = 9
ชื่อ MS/ที่อยู่ IP Stratum Poll ถึง LastRx ตัวอย่างสุดท้าย               
================================================== =============================
^* _เกตเวย์ 2 6 7 1 +5568ns[ -720ms] +/- 32ms
# ./timex 
เวลาตกลง
ความละเอียดระดับไมโครวินาที
เฟสล็อคลูป

ทำการตรวจสอบทางโปรแกรมเดียวกันในคอนเทนเนอร์บนโฮสต์เดียวกัน:

# พ็อดแมนรัน -v /tmp/timex/timex:/timex docker.io/gammabytehosting/rockylinux /timex
เวลาตกลง
ความละเอียดระดับไมโครวินาที
เฟสล็อคลูป

อาจมีปัญหากับเนมสเปซเวลาที่ฉันยังไม่ได้ทดสอบ (แม้ว่ามันจะใหม่มากก็ตาม) เพื่อดูว่าแตกต่างหรือให้เกียรติ adjtimex ในบริบทที่แยกต่างหาก (ดู ผู้ชาย 7 time_namespaces) แต่จากที่ฉันได้อ่านมา มันน่าจะยังใช้ได้อยู่ -- ฉันจะปล่อยให้คุณตัดสินใจเอง

Score:-1
ธง eg

จะตรวจสอบได้อย่างไรว่าเวลาของระบบซิงโครไนซ์กับเซิร์ฟเวอร์ NTP หรือไม่

ไม่มี

แอปพลิเคชันของฉันมีข้อกำหนดเพื่อให้แน่ใจว่าระบบซิงโครไนซ์เวลาก่อนที่จะพยายามดำเนินการบางอย่าง

ไม่ใช่ความรับผิดชอบของแอปพลิเคชันในการตั้งค่าสภาพแวดล้อมที่ถูกต้องเพื่อให้ทำงาน ซึ่งขึ้นอยู่กับระบบและผู้ดูแลระบบ

แอปพลิเคชันขึ้นอยู่กับวันที่/เวลาที่ส่งคืนโดยระบบ ไม่ว่าจะเป็นช่วงเวลานั้นก็ตาม "ถูกต้อง" หรือ "ผิด" ; โดยทั่วไปแล้วแอปพลิเคชันไม่มีทางรู้ได้ มันจะใช้วันที่ / เวลาของระบบนั้น

หากคุณมีโมเดลไคลเอนต์เซิร์ฟเวอร์ ให้แสดงข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์เมื่อใดก็ตามที่ธุรกรรมกำลังจะถูกปฏิเสธเนื่องจากการชดเชยวันที่/เวลา (มาก) จะเป็นการดี
โปรดทราบว่าการมีอยู่ของ off-set ดังกล่าวไม่ได้บอกคุณว่าไคลเอ็นต์อยู่ในนาฬิกาที่ไม่ถูกต้อง หรือเซิร์ฟเวอร์ หรือทั้งสองอย่าง

Matthew Ife avatar
jo flag
สิ่งที่ผู้ใช้ร้องขอคือสามารถระบุได้หรือไม่ (โดยไม่ต้องตรวจสอบการใช้งาน NTP) เพื่อดูว่าเคอร์เนลมีการปรับเอียงหรือไม่ แม้ว่าแอปพลิเคชันไม่ได้ตั้งค่าสภาพแวดล้อม แต่แอปพลิเคชันที่ดีอาจตรวจสอบว่าอยู่ในสภาพแวดล้อมที่ถูกต้องโดยไม่ต้องทำการเปลี่ยนแปลงใดๆ
John Mahowald avatar
cn flag
แอปพลิเคชันที่ไม่ได้อยู่ในการควบคุมและไม่รู้จักสภาพแวดล้อมจะทำงานได้ไม่ดีในการอนุมานว่าการทำงานของการซิงค์เวลาทำงานอย่างไร ปล่อยให้เป็นหน้าที่ของผู้ดูแลระบบโฮสต์ OS หรือกำหนดนาฬิกาของซอฟต์แวร์และ/หรือฮาร์ดแวร์ที่เกี่ยวข้องอย่างเคร่งครัด

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา