Lebih mudah tugasan, lebih kerap saya melakukan kesilapan

Lebih mudah tugasan, lebih kerap saya melakukan kesilapan

Tugas remeh ini timbul pada suatu petang Jumaat dan sepatutnya mengambil masa 2-3 minit. Secara umum, seperti biasa.

Seorang rakan sekerja meminta saya membetulkan skrip pada pelayannya. Saya melakukannya, menyerahkannya kepadanya dan secara tidak sengaja menjatuhkan: "Masa cepat 5 minit." Biarkan pelayan mengendalikan penyegerakan itu sendiri. Setengah jam, sejam berlalu, dan dia masih mengembung dan mengutuk secara senyap-senyap.

“Bodoh! — Saya fikir, beralih kepada konsol pelayan — okay, saya akan berehat selama beberapa minit lagi.”

Jom tengok ntp, rdate, sdwdate tidak dipasang timesyncd dilumpuhkan dan tidak berjalan.

# timedatectl
      Local time: Sun 2019-08-25 20:44:39 +03
  Universal time: Sun 2019-08-25 17:44:39 UTC
        RTC time: Sun 2019-08-25 17:39:52
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

Di sini saya akan segera ambil perhatian bahawa masa perkakasan adalah betul: ia akan menjadi lebih mudah untuk menavigasi lebih jauh.

Di sinilah bermulanya siri kesilapan.

Kesilapan pertama. Keyakinan diri

Klik-klak...

# systemctl enable systemd-timesyncd.service && systemctl start systemd-timesyncd.service && ntpdate 0.ru.pool.ntp.org && timedatectl set-ntp on && timedatectl
25 Aug 21:00:10 ntpdate[28114]: adjust time server 195.210.189.106 offset -249.015251 sec
      Local time: Sun 2019-08-25 21:00:10 +03
  Universal time: Sun 2019-08-25 18:00:10 UTC
        RTC time: Sun 2019-08-25 18:00:10
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

Semuanya baik-baik saja, masa disegerakkan, masa sistem sepadan dengan perkakasan. "Ambil," kata saya dan kembali ke perniagaan saya.

“Ambil apa? - rakan sekerja itu marah. “Masa yang sama!”

Semakin anda menyelesaikan masalah biasa, semakin banyak pemikiran anda menjadi berkedip dan anda tidak lagi berfikir bahawa keadaan keseratus atau keseribu akan berbeza, tetapi tidak kali ini.

# timedatectl
      Local time: Sun 2019-08-25 21:09:15 +03
  Universal time: Sun 2019-08-25 18:09:15 UTC
        RTC time: Sun 2019-08-25 18:05:04
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

Masa sistem salah lagi.

Mari cuba lagi:

# ntpdate 0.ru.pool.ntp.org && timedatectl && sleep 1 && timedatectl
25 Aug 21:07:37 ntpdate[30350]: step time server 89.175.20.7 offset -249.220828 sec
      Local time: Sun 2019-08-25 21:07:37 +03
  Universal time: Sun 2019-08-25 18:07:37 UTC
        RTC time: Sun 2019-08-25 18:07:37
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
      Local time: Sun 2019-08-25 21:11:46 +03
  Universal time: Sun 2019-08-25 18:11:46 UTC
        RTC time: Sun 2019-08-25 18:07:37
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

Mari lakukan secara berbeza:

# date -s "2019-08-25 21:10:30" && date && sleep 1 && timedatectl
Sun Aug 25 21:10:30 +03 2019
Sun Aug 25 21:10:30 +03 2019
      Local time: Sun 2019-08-25 21:14:36 +03
  Universal time: Sun 2019-08-25 18:14:36 UTC
        RTC time: Sun 2019-08-25 18:10:30
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

Dan seperti ini:

# hwclock --hctosys && timedatectl && sleep 1 && timedatectl
      Local time: Sun 2019-08-25 21:11:31 +03
  Universal time: Sun 2019-08-25 18:11:31 UTC
        RTC time: Sun 2019-08-25 18:11:31
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
      Local time: Sun 2019-08-25 21:15:36 +03
  Universal time: Sun 2019-08-25 18:15:36 UTC
        RTC time: Sun 2019-08-25 18:11:32
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

Masa ditetapkan untuk sepersekian saat, dan serta-merta mula "tergesa-gesa" semula.

Pada masa yang sama, dalam log, pada masa perubahan manual sedemikian, kita hanya melihat laporan sistem bahawa masa telah berubah, masing-masing, ke arah yang betul/salah dan kadangkala Menyegerakkan semula daripada systemd-timesyncd.

Aug 25 21:18:51 wisi systemd[1]: Time has been changed
Aug 25 21:18:51 wisi systemd-timesyncd[29258]: System time changed. Resyncing.
Aug 25 21:18:51 wisi systemd[1187]: Time has been changed
Aug 25 21:18:51 wisi systemd[1]: Time has been changed
Aug 25 21:18:51 wisi systemd[1187]: Time has been changed

di sini

# ps afx | grep "[1]187"
 1187 ?        Ss     0:02 /lib/systemd/systemd --user

Pada ketika ini, sudah perlu untuk mencari sebabnya, tetapi selama 18 tahun pentadbiran, otak telah mengumpulkan statistik tentang kesilapan "masa" dan, di luar kebiasaan, sekali lagi menyalahkan penyegerakan.
Mari kita matikan sepenuhnya.

# timedatectl set-ntp off && systemctl stop systemd-timesyncd.service
# hwclock --hctosys && timedatectl && sleep 1 && timedatectl
      Local time: Sun 2019-08-25 21:25:40 +03
  Universal time: Sun 2019-08-25 18:25:40 UTC
        RTC time: Sun 2019-08-25 18:25:40
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
      Local time: Sun 2019-08-25 21:29:31 +03
  Universal time: Sun 2019-08-25 18:29:31 UTC
        RTC time: Sun 2019-08-25 18:25:41
       Time zone: Europe/Minsk (+03, +0300)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

dan dalam log

Aug 25 21:25:40 wisi systemd[1]: Time has been changed
Aug 25 21:25:40 wisi systemd[1187]: Time has been changed
Aug 25 21:29:30 wisi systemd[1]: Time has been changed
Aug 25 21:29:30 wisi systemd[1187]: Time has been changed

Menyegerakkan semula hilang dan sebaliknya kayu balak adalah murni.

Menyemak kesimpulan tcpdump pada port 123 pada semua antara muka. Tiada permintaan, tetapi masa masih berjalan pergi.

Ralat dua. Tergesa-gesa

Ada satu jam lagi untuk tamat minggu kerja, dan saya tidak mahu pergi hujung minggu dengan masalah remeh yang tidak dapat diselesaikan (jangan perhatikan masa dalam kod, artikel itu ditulis pada hari-hari berikutnya ).
Dan di sini sekali lagi, daripada mencari sebab, saya mula mencuba untuk membuat penjelasan untuk hasilnya. Saya katakan "mencipta" kerana tidak kira betapa logiknya penjelasan untuk hasilnya, ia adalah pendekatan yang cacat untuk menyelesaikan masalah.

Pelayan ini ialah pelayan penstriman dan menukar aliran DVB-S2 kepada IP. Strim DVB-S mengandungi cap masa, jadi penerima, pemultipleks, pengacak dan televisyen sering menggunakannya untuk menyegerakkan jam sistem. Pemacu papan DVB-S dibina ke dalam kernel, jadi cara terpantas untuk memastikan aliran DVB-S2 dikeluarkan adalah dengan memutuskan sambungan kabel yang datang dari "plat". Nasib baik, pelayan berada di belakang dinding, jadi begitu.

Sudah tentu, jika log itu mengandungi apa yang sepatutnya ada, ini tidak akan berlaku, tetapi lebih lanjut mengenai itu, sekali lagi, pada akhir artikel.

Oleh kerana kami telah mengeluarkan semua isyarat satelit, kami juga akan mengeluarkan isyarat darat - pada masa yang sama kami mengeluarkan semua kabel rangkaian. Pelayan terputus dari dunia luar dan berfungsi sepenuhnya secara autonomi, tetapi jam sistem masih tergesa-gesa.

Minggu kerja sudah berakhir, dan isu tarikh/masa itu sendiri tidak kritikal, jadi anda boleh pulang ke rumah, tetapi di sini saya membuat kesilapan baru.

Ralat tiga. Penasihat

tidak pernah! Jangan sekali-kali bertanya soalan di forum dan tapak khusus umum (ala stackoverflow) jika jawapannya memerlukan lebih daripada mempelajari halaman pertama Google dan membaca satu halaman manual.

Mereka akan menghantar anda kembali ke Google, membaca lelaki yang sama dan secara popular menerangkan peraturan forum/tapak, tetapi tidak akan memberi anda jawapan.

Berikut adalah beberapa faktor objektif:

  • tiada siapa kecuali anda boleh mengetahui masalahnya juga;
  • tiada siapa yang boleh menjalankan ujian di bawah keadaan yang sama seperti anda

dan subjektif:

  • anda mungkin tidak memberikan semua input untuk menyelesaikan masalah itu, kerana anda telah membuat arahan yang "betul" dan sedang membentangkan intipati isu yang memfokuskannya;
  • mandur (moderator, old-timer, admin) sentiasa betul, kalau foreman salah... well, you know...

Jika, semasa membalas komen, anda kekal dalam had perbendaharaan kata yang ditapis, maka anda mempunyai saraf yang kuat.

keputusan

Tidak perlu membahagikan tugas kepada mudah dan kompleks.

Kami berhenti bergantung pada pengalaman, statistik, penasihat kami dan mula tidak "menerangkan" hasil akhir, tetapi secara konsisten mencari sebabnya.

Memandangkan seseorang menetapkan masa, panggilan sistem yang sepadan mesti berlaku.

Sama seperti dalam dokumentasi perisian, dokumen terbaik adalah sumber, begitu juga dalam pentadbiran sistem pembantu terbaik adalah audit, dalam kes kami auditd.

keraguan seketikaSaya telah melalui mana, tetapi tidak pasti sepenuhnya bahawa masa dalam Linux hanya boleh ditetapkan clock_settime и settimeofday, jadi untuk ujian pertama saya memilih semua panggilan "sesuai":

# man syscalls | col | grep -F '(2)' | grep -vE '(:|;)' | grep -E '(time|date|clock)' | sed "s/(2).*//" | xargs -I SYSCALL echo "-S SYSCALL " | xargs echo
-S adjtimex -S clock_adjtime -S clock_getres -S clock_gettime -S clock_nanosleep -S clock_settime -S futimesat -S getitimer -S gettimeofday -S mq_timedreceive -S mq_timedsend -S rt_sigtimedwait -S s390_runtime_instr -S setitimer -S settimeofday -S stime -S time -S timer_create -S timer_delete -S timer_getoverrun -S timer_gettime -S timer_settime -S timerfd_create -S timerfd_gettime -S timerfd_settime -S times -S utime -S utimensat -S utimes

dan membuang s390_runtime_instr, stime, timerfd_create, yang auditctl tidak mengenalinya, pada mulanya melancarkan audit dalam bentuk:

auditctl -a exit,always -S adjtimex -S clock_adjtime -S clock_getres -S clock_nanosleep -S clock_settime -S futimesat -S getitimer -S gettimeofday -S mq_timedreceive -S mq_timedsend -S rt_sigtimedwait -S semtimedop -S setitimer -S settimeofday -S time -S timer_create -S timer_delete -S timer_getoverrun -S timer_gettime -S timer_settime -S timerfd_gettime -S timerfd_settime -S times -S utime -S utimensat -S utimes

Selepas memastikan bahawa tiada log lain di lokasi log yang saya minati syiling Selain kedua-dua ini, saya hanya menggunakannya lagi.

Menjalankan audit panggilan sistem clock_settime и settimeofday dan cuba tukar tarikh:

# auditctl -a exit,always -S clock_settime -S settimeofday && date -s "2019-08-22 12:10:00" && sleep 5 && auditctl -D

Kelewatan lima saat ditambah supaya "parasit" kami dijamin untuk membetulkan masa.

Mari lihat laporannya:

# aureport -s -i

Syscall Report
=======================================
# date time syscall pid comm auid event
=======================================
Warning - freq is non-zero and incremental flushing not selected.
1. 08/22/2019 12:10:00 settimeofday 3088 chkcache_proces root 479630
2. 08/26/2019 09:37:06 clock_settime 1538 date root 479629

Di sini kita melihat kita tarikh dan tidak diketahui oleh kita chkcache_processes. Ia berakhir dalam laporan di atas kerana aureport mengisih keluaran mengikut tarikh apabila menukar daripada binari dan peristiwa itu berlaku pada masa yang kami tetapkan tarikh -s "2019-08-22 12:10:00".
Siapa yang melahirkannya?

# ausearch -sc settimeofday --comm "chkcache_proces"
----
time->Thu Aug 22 12:10:00 2019
type=PROCTITLE msg=audit(1566465000.000:479630): proctitle="/usr/local/bin/oscam"
type=SYSCALL msg=audit(1566465000.000:479630): arch=c000003e syscall=164 success=yes exit=0 a0=7fde0dfc6e60 a1=0 a2=136cf a3=713ba56 items=0 ppid=3081 pid=3088 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts20 ses=68149 comm="chkcache_proces" exe="/usr/local/bin/oscam" key=(null)

/usr/local/bin/oscam - parasit kami telah ditemui. Walaupun kelakuannya "berniat jahat", adalah mustahil untuk menolak sistem akses bersyarat, tetapi saya masih ingin tahu oscam, WTF?

Jawapannya cepat ditemui dalam sumber:

#if defined(CLOCKFIX)
if (tv.tv_sec > lasttime.tv_sec || (tv.tv_sec == lasttime.tv_sec && tv.tv_usec >= lasttime.tv_usec)) // check for time issues!
{
  lasttime = tv; // register this valid time
}
  else
{
  tv = lasttime;
  settimeofday(&tv, NULL); // set time back to last known valid time
  //fprintf(stderr, "*** WARNING: BAD TIME AFFECTING WHOLE OSCAM ECM HANDLING, SYSTEMTIME SET TO LAST KNOWN VALID TIME **** n");
}

Macam comel je kat sini mengulas keluar barisan amaran...

Sumber: www.habr.com

Tambah komen