Tarkibga o'tish

Vaqt zonasi va locale sozlamalari

Server jismonan qayerda turishidan qat’i nazar, uning tizim soati hamda matn va sana formati to'g'ri sozlangan bo'lishi kerak: noto'g'ri vaqt zonasi log tahlilini chalkashtiradi, noto'g'ri locale esa buyruqlar chiqishida sana, son yoki valyutaning kutilmagan formatda ko'rinishiga sabab bo'ladi. systemd ikkalasini ham bitta vositalar oilasi — timedatectl va localectl orqali boshqaradi.

Bu maqola init va systemd maqolasida tanishtirilgan systemd vositalar oilasini davom ettiradi.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • joriy vaqt zonasi va soat holatini timedatectl bilan tekshirish va o'zgartirish;
  • nega production serverlar odatda UTC da qolishini tushuntirish;
  • tizim locale’ini localectl bilan ko'rish va o'zgartirish;
  • LANG, LC_* o'zgaruvchilari va tizim locale sozlamasi o'rtasidagi farqni tushuntirish;
  • noto'g'ri vaqt zonasi yoki locale keltirib chiqaradigan odatiy muammolarni tanib olish.

timedatectl: vaqt va vaqt zonasi

Joriy holatni ko'rish:

timedatectl
               Local time: Fri 2026-07-24 10:00:00 UTC
           Universal time: Fri 2026-07-24 10:00:00 UTC
                 RTC time: Fri 2026-07-24 10:00:00
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Asosiy maydonlar:

  • Time zone — hozir sozlangan vaqt zonasi;
  • System clock synchronized — tizim soati NTP vaqt serveriga mos keladimi;
  • NTP service — vaqtni sinxronlash xizmati faolmi.

Mavjud vaqt zonalarini ko'rish

timedatectl list-timezones | grep -i tashkent
Asia/Tashkent

Vaqt zonasini o'zgartirish

sudo timedatectl set-timezone Asia/Tashkent
timedatectl | grep 'Time zone'
               Time zone: Asia/Tashkent (+05, +0500)

Info

Production serverlar odatda vaqt zonasini haqiqiy geografik zonaga emas, UTC ga o'rnatilgan holda saqlaydi. Sababi: bir nechta serverdan yig'ilgan log'larni solishtirganda, cron jadvallari bilan ishlaganda yoki vaqtga asoslangan har qanday hisob-kitobda har bir mashinaning bitta qat’iy nuqtaga (UTC) bog'langani tahlilni ancha soddalashtiradi. Vaqt zonasiga xos ko'rinish odatda tizim darajasida emas, ilova yoki taqdimot qatlamida hal qilinadi.

NTP sinxronlashni boshqarish

sudo timedatectl set-ntp true
timedatectl | grep -E 'synchronized|NTP service'

set-ntp true/false tarmoqdagi vaqt serveri bilan avtomatik sinxronlashni yoqadi yoki o'chiradi. O'chirilganda soat faqat uskuna soatiga (RTC) tayanadi va asta-sekin haqiqiy vaqtdan uzoqlashib ketishi mumkin.

Warning

System clock synchronized: no ga e’tibor berishga arziydi: TLS sertifikatlarini tekshirish, cron rejalashtirish, log'lar tartibi va ko'p taqsimlangan tizimlar (masalan, Kerberos autentifikatsiyasi) noto'g'ri vaqtga sezgir. Bu holatni ko'rsangiz, avval NTP xizmati (odatda systemd-timesyncd yoki chronyd) haqiqatan ishlayotganini tekshiring.

Soatni qo'lda o'rnatish va RTC vaqt zonasi

Vaqtni qo'lda o'rnatish faqat NTP o'chirilgan bo'lsa ma’noga ega — sinxronlash faol bo'lsa, systemd qo'lda kiritilgan qiymat vaqt serveri bilan "kurashmasligi" uchun o'zgarishni rad etadi:

sudo timedatectl set-time "2026-07-24 10:00:00"
Failed to set time: Automatic time synchronization is enabled

Yechim — avval set-ntp false qilish, lekin serverda odatda yaxshiroq javob NTP’ni yoqiq qoldirib, uni chetlab o'tish o'rniga sinxronlashni tuzatish. Bunga bog'liq bitta maydon dual-boot mashinalarida chalkashlik tug'diradi: RTC in local TZ. Linux sukut bo'yicha uskuna soatini (RTC) UTC da, Windows esa lokal vaqtda saqlaydi, shuning uchun dual-boot mashinasi sudo timedatectl set-local-rtc 1 ishga tushirilmaguncha operatsion tizimlardan birida noto'g'ri vaqtni ko'rsatadi. Serverda esa RTC’ni doim UTC da qoldiring — set-local-rtc 1 hujjatlarda ishonchsiz va tavsiya etilmaydigan rejim sifatida ko'rsatilgan.

localectl: tizim locale sozlamalari

Joriy holatni ko'rish:

localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

Locale — tizim tili, sana formati, son ajratgichlari va valyutani ko'rsatish qoidalarini belgilaydigan sozlamalar to'plami. LANG=en_US.UTF-8 ingliz tili, AQSh formatlash qoidalari va UTF-8 kodlashni bildiradi.

Mavjud locale’larni ko'rish

locale -a | grep -i utf8 | head -n 5

Agar kerakli locale ro'yxatda bo'lmasa, avval uni yaratish (generate) kerak:

sudo locale-gen en_US.UTF-8

Tizim locale’ini o'zgartirish

sudo localectl set-locale LANG=en_US.UTF-8
localectl status

LANG/LC_* va joriy shell muhiti

localectl tizim bo'yicha sukut bo'yicha qiymatni o'rnatadi, lekin har qanday foydalanuvchi yoki shell sessiyasi uni o'z muhit o'zgaruvchisi bilan qayta belgilashi mumkin:

echo "$LANG"
LC_ALL=C date
  • LANG — aniq o'rnatilmagan har qanday LC_* o'zgaruvchisiga qo'llanadigan sukut bo'yicha locale;
  • LC_TIME, LC_NUMERIC, LC_MONETARY va boshqalar — muayyan toifa uchun alohida locale;
  • LC_ALL — barcha LC_* sozlamalarini vaqtincha qayta belgilaydi va ularning hammasidan ustun turadi.
date
LC_TIME=en_GB.UTF-8 date

Bu ikki buyruq bitta vaqt lahzasini ko'rsatadi, lekin — mos locale o'rnatilgan bo'lsa — boshqa formatda.

Info

Sana yoki son formatini oldindan aytib bo'ladigan tarzda tahlil qilishi kerak bo'lgan skript yozayotganda uni LC_ALL=C yoki LC_ALL=C.UTF-8 bilan ishga tushirish tavsiya etiladi — bu buyruq chiqishini foydalanuvchi yoki muhitning locale sozlamasidan qat’i nazar barqaror, oldindan ma’lum formatda saqlaydi.

Keng tarqalgan xatolar

Har bir serverni turli vaqt zonasida qoldirish

Ko'p serverli muhitda har bir mashina o'zining geografik vaqt zonasida ishlasa, log'larni birlashtirish va hodisalar ketma-ketligini tiklash ancha qiyinlashadi. Barcha serverlarni UTC da saqlash bu muammoni oldindan yo'q qiladi.

NTP’ni tekshirmasdan "vaqt noto'g'ri" degan xulosaga kelish

Ko'p hollarda muammo vaqt zonasida emas, NTP sinxronlash o'chirilgani yoki buzilganida bo'ladi. Avval timedatectl dagi System clock synchronized qiymatini tekshiring.

Hech qachon yaratilmagan locale’dan foydalanishga urinish

Locale mavjud bo'lmasa, localectl set-locale aniq xato bermasligi mumkin; buyruqlar chiqishida kutilmaganda C yoki POSIX formatiga qaytib qolish haqiqiy belgi bo'lishi mumkin. Avval locale -a bilan tekshiring va kerak bo'lsa locale-gen bilan yarating.

Mashqlar

  1. timedatectl chiqishidagi har bir maydonni o'qing va har birini o'z so'zlaringiz bilan tushuntiring.
  2. Sinov VM’ida vaqt zonasini Asia/Tashkent ga o'zgartiring, so'ng date va timedatectl chiqishlarini solishtiring.
  3. LC_ALL=C date va oddiy date chiqishlarini solishtiring — farqni tushuntiring.
  4. localectl status ni echo $LANG bilan solishtiring va tizim darajasidagi hamda shell darajasidagi sozlamalar qachon farq qilishi mumkinligini tushuntiring.

Mashqni bajardim deyish uchun: skript chiqishida kutilmagan sana formatini ko'rsatayotgan server uchun avval qaysi ikki sozlamani (locale yoki LC_ALL qayta belgilashi) tekshirish kerakligini tushuntira olishingiz kerak.

Xulosa

timedatectl vaqt zonasi, joriy vaqt va NTP sinxronlash holatini, localectl esa til va formatga oid locale sozlamalarini boshqaradi. Production serverlar odatda UTC da qoladi, skriptlar esa barqaror formatlash uchun odatda LC_ALL=C dan foydalanadi — ikkala amaliyot ham ko'p serverli, avtomatlashtirilgan muhitda kutilmagan nomuvofiqliklarning oldini oladi.

Manbalar