Тапшырма канчалык жөнөкөй болсо, ошончолук көп ката кетирем

Тапшырма канчалык жөнөкөй болсо, ошончолук көп ката кетирем

Бул арзыбаган иш жума күнү түштөн кийин пайда болуп, 2-3 мүнөткө созулушу керек эле. Жалпысынан алганда, ар дайым.

Бир кесиптешим анын сервериндеги сценарийди оңдоону суранды. Мен муну жасадым, ага бердим жана байкабай таштап койдум: "Убакыт 5 мүнөт тез". Сервер синхрондоштурууну өзү чечсин. Жарым саат, бир саат өттү, ал дагы эле үрпөйүп, акырын тилдеп жатты.

«Акмак! — Мен ойлодум, сервер консолуна которулуп, — макул, мен дагы бир нече мүнөт тыныгам.

көрөлү ntp, rdate, sdwdate орнотулган эмес timesyncd өчүрүлгөн жана иштебейт.

# 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

Бул жерде мен дароо аппараттык убакыт туура экенин белгилейм: андан ары багыттоо оңой болот.

Мына ушул жерден каталардын сериясы башталды.

Биринчи ката. Өзүнө ишенүү

Click-Click...

# 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

Баары жакшы, убакыт синхрондолуп, системанын убактысы аппараттык камсыздоого дал келет. "Алгыла" дедим да, кайра ишиме кирдим.

«Эмне алалы? – кесиптеши ачууланды. "Ошол эле убакыт!"

Канчалык типтүү маселелерди чечкен сайын, ошончолук ой жүгүртүүң ирмемделип, жүзүнчү же миңинчи жагдай башкача болот деп ойлобой каласың, бирок бул жолу эмес.

# 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

Системанын убактысы дагы туура эмес.

Келгиле, кайра аракет кылалы:

# 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

Башкача кылалы:

# 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

Жана бул сыяктуу:

# 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

Убакыт бир секундага белгиленип, ошол замат кайра "шашып" баштайт.

Ошол эле учурда, журналдарда, мындай кол менен өзгөртүү учурунда, биз убакыт тиешелүүлүгүнө жараша, туура/туура эмес багытта жана маал-маалы менен өзгөргөндүгү жөнүндө системалык отчетторду гана көрөбүз. Кайра синхрондолууда 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

бул жерде

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

Бул учурда, буга чейин эле себебин издөө керек болчу, бирок 18 жыл башкаруу, мээ "убакыт" каталар боюнча статистиканы чогулткан жана, адатта, кайра синхрондоштуруу күнөөлөп жатат.
Аны толугу менен өчүрөлү.

# 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

жана журналдарда

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

Кайра синхрондолууда жок болуп кетти, антпесе журналдар тунук.

Корутундуларды текшерүү tcpdump бардык интерфейстерде 123 портунда. Сураныч жок, бирок убакыт дагы эле зымырап өтүп жатат.

Ката экинчи. Шашылыш

Жумуш жумасынын бүтөөрүнө бир саат калды, мен дем алыш күндөрү чечилбеген маселе менен кетким келбейт (коддогу убакытка көңүл бурбаңыз, макала кийинки күндөрү жазылган. ).
Бул жерде дагы, себебин издөөнүн ордуна, мен натыйжага түшүндүрмө берүүгө аракет кыла баштадым. Мен "ойлоп табуу" деп айтам, анткени натыйжанын түшүндүрмөсү канчалык логикалуу болбосун, бул маселени чечүүдөгү ката мамиле.

Бул сервер агымдык сервер жана DVB-S2 агымын IPге айлантат. DVB-S агымында убакыт белгилери бар, ошондуктан кабыл алгычтар, мультиплексорлор, скрамблерлер жана телевизорлор аларды системалык саатты синхрондоштуруу үчүн колдонушат. DVB-S тактасынын драйверлери ядрого орнотулган, андыктан DVB-S2 агымын алып салууну камсыз кылуунун эң ылдам жолу - бул "плиталардан" келген кабелдерди ажыратуу. Бактыга жараша, сервер дубалдын артында, ошондой болсун.

Албетте, журналдарда эмне болушу керек болсо, анда мындай болмок эмес, бирок бул тууралуу дагы, макаланын аягында.

Ооба, биз бардык спутниктик сигналдарды алып салгандыктан, жер үстүндөгү сигналдарды да жок кылабыз - ошол эле учурда бардык тармак кабелдерин сууруп алабыз. Сервер тышкы дүйнөдөн үзүлүп, толугу менен автономдуу иштейт, бирок системалык саат дагы эле шашып турат.

Жумуш жумасы бүттү, ал эми күн/убакыт маселесинин өзү маанилүү эмес, андыктан үйгө жөн эле кете берсеңиз болот, бирок бул жерде мен жаңы ката кетирип жатам.

Ката үчүнчү. Кеңешчилер

Эч качан! Эгер жооп Google'дун биринчи барагын изилдеп, бир адам барагын окууну гана талап кылса, форумдарда жана жалпы адистештирилген (a la stackoverflow) сайттарда эч качан суроо бербеңиз.

Алар сени кайра Google'га жөнөтүп, ошол эле кишини окуп, форумдун/сайттын эрежелерин элге түшүндүрүп беришет, бирок жооп беришпейт.

Бул жерде кээ бир объективдүү факторлор бар:

  • көйгөйдү сенден башка эч ким биле албайт;
  • эч ким сыноолорду сиздикиндей шарттарда өткөрө албайт

жана субъективдүү:

  • Сиз маселени чечүү үчүн бардык салымыңызды бере албашыңыз мүмкүн, анткени сиз буга чейин “туура” багытты ойлоп таптыңыз жана маселенин маңызын ага көңүл буруп жатасыз;
  • бригадир (модератор, эски, админ) ар дайым туура, бригадир туура эмес болсо... жакшы, билесиң...

Эгерде комментарийлерге жооп берип жатып, сиз цензураланган лексиканын чегинде калган болсоңуз, анда сизде күчтүү нерв бар.

чечим

Тапшырмаларды жөнөкөй жана татаал деп бөлүүнүн кереги жок.

Биз өзүбүздүн тажрыйбабызга, статистикабызга, кеңешчилерибизге таянууну токтотуп, акыркы жыйынтыкты “түшүндүрүп” койбой, ырааттуу түрдө себебин издей баштайбыз.

Кимдир бирөө убакытты койгондуктан, тиешелүү тутум чалуу болушу керек.

Программалык документацияда эң жакшы документтер булактар ​​болуп саналгандай эле, системаны башкарууда эң жакшы жардамчы бул аудит, биздин учурда аудитд.

Бир көз ирмем шектенүүМен манадан өттүм, бирок Linux'та убакытты гана коюуга болоруна толук ишенген эмесмин саат_коюлган убакыт и күндү белгилөө, ошондуктан биринчи сыноо үчүн мен бардык "ылайыктуу" чалууларды тандадым:

# 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

жана таштоо s390_runtime_instr, stime, timerfd_create, кайсы auditctl аны тааныган жок, алгач төмөнкү формада аудит жүргүздү:

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

Мени кызыктырган журналдарда башка журналдар жок экенине ынангандан кийин системалар Бул экөөнөн тышкары мен аларды гана колдондум.

Системалык чалуу аудитин жүргүзүү саат_коюлган убакыт и күндү белгилөө жана датаны өзгөртүүгө аракет кылыңыз:

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

Беш секунддук кечигүү кошулат, ошондуктан биздин "мите" убакытты оңдоого кепилдик берилет.

Келгиле, отчетту карап көрөлү:

# 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

Мына биз өзүбүздүн дата жана бизге белгисиз chkcache_processes. Бул жогорудагы отчетто аяктады, анткени экиликтен которууда aureport чыгарууну датасы боюнча сорттоп, окуя биз белгилеген убакта болгон. дата -s "2019-08-22 12:10:00".
Аны ким төрөдү?

# 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 - биздин мите табылды. Анын "зыяндуу" жүрүм-турумуна карабастан, шарттуу кирүү системасынан баш тартуу мүмкүн эмес, бирок мен дагы эле билгим келет oscam, WTF?

Жооп бат эле жерден табылат булак коддору:

#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");
}

Бул жерде кандай сүйкүмдүү көрүнөт Жорум чыккан линия эскертүү...

Source: www.habr.com

Комментарий кошуу