logo

Murat Demirten

header-nav
text

{ ubi dubium ibi libertas }

mobile-nav-trigger

Kış saati güncellemesi

23 Ekim 2016, Pazar

Son yıllarda yaz/kış saati dönüşümleri, çeşitli nedenlerle önceden planlanın dışındaki tarihlerde gerçekleşti. Bu yıl ise kış saati uygulaması tamamen kaldırıldı, gelecek yıl ne olur bilemiyoruz. Böyle giderse yakında saat dilimi değişikliklerini seçim vaatleri arasında dahi görebiliriz! Bu yazıda 2016 kış saati geçişinin iptali özelinde Linux sunucularda dikkat edilmesi gereken noktalar üzerinde duracağız.

Şu an GMT+3 saat diliminin içinde bulunuyoruz. Bu son değişiklik olmasa idi, saatler 30 Ekim 2016'da 1 saat geri alınacak ve GMT+2 saat dilimine dahil olacaktık.

Zaman dilimlerine ait bilgiler IANA tarafından TimeZone Database projesi kapsamında derlenip toparlanmakta ve işletim sistemi ve yazılım üreticileri, bu veritabanını temel alarak kendi sistemlerine uygun güncellemeler çıkarmaktadırlar.

Linux dağıtımlarında bu bilgiler genellikle tzdata adlı paket içerisinden çıkmaktadır. Dolayısıyla Linux sunucularda yapılması gereken işlem, tzdata paketinin güncellenmesinden ibarettir.

Türkiye özelindeki bu değişikliği içeren tzdata versiyonu (IANA), 2016g şeklindedir. Linux dağıtımlarında yer alan tzdata DEB veya RPM paketinin versiyon isimlendirmelerinde de IANA versiyonu kullanıldığından, tzdata paketinizin versiyonu 2016g veya yukarısı ise (son versiyon şu an için 2016h'dir), güncellemeler zaten yapılmış durumda demektir; aksi takdirde 30 Ekim'den önce güncelleme yapmanız gerekecektir.

İlgili IANA veritabanı güncellemesine ilişkin commit'e buradan erişebilirsiniz. Ek olarak, 2016h versiyonuna güncelleyecek olursanız, commit ayrıntısında görebileceğiniz üzere, Türkiye için 1986-1990 ve 1994 yıllarında yapılan saat dilimi geçişlerindeki 1 saatlik hataya dair düzeltmeyi de edinmiş olacağınızı belirtelim.

Paket yöneticisi ile güncelleme

Debian tabanlı dağıtımlar için ilgili değişikliği içeren güncellenmiş paket, henüz ana arşiv sunucularına kabul edilmiş durumda değildir. Güncellemeyi içeren deb paketi versiyonu, 2016g-0+deb8u1 şeklinde olup, şu an Proposed-Updates aşamasında yer almaktadır. İlgili tzdata paketi, büyük olasılıkla 30 Ekim tarihinden önce, kararlı dağıtıma ait arşivler içerisinde yerini alacaktır. Debian tzdata paketinin güncel durumuna ait bilgilere şuradan erişebilirsiniz: tzdata tracker sayfası

Eğer proposed-updates aşamasındaki paketi bir an önce sistemlerinize yüklemek istiyorsanız, proposed-updates repo'larını kullanabilmek adına aşağıdaki satırı /etc/apt/sources.list dosyanıza ekleyip, ardından apt-get update && apt-get install tzdata komutlarını çalıştırmanız yeterli olacaktır.

deb http://ftp.us.debian.org/debian jessie-proposed-updates main contrib non-free
Güncelleme: Paket versiyonu 2016h-0+deb8u1 olarak Debian jessie-updates repolarına girdi, bu paketi aynı zamanda eski wheezy sürümüne de yükleyebilirsiniz

CentOS için güncellenmiş paketin (2016h-1.el7) ana arşivlere girmiş durumda olduğu görünmektedir. yum install tzdata komutuyla sisteminizi güncelleyebilirsiniz.

Diğer dağıtımlar için son durumu paket yöneticiniz üzerinden kontrol etmelisiniz.

Eski dağıtım versiyonlarında güncelleme

Dağıtımlar tarafından LTS (Long Time Support) kapsamında, genellikle bir veya iki önceki kararlı sürümler için de güncelleme paketleri hazırlanır. Ancak eğer kullandığınız dağıtım için paket çıkmamış yada çıkmayacak ise, güncellemeyi yaptığınız bir sunucudaki /usr/share/zoneinfo/Turkey dosyasını, eski sunucunuzdaki aynı dosya üzerine kopyalayabilirsiniz. Bu işlemi yaptıktan sonra, eğer /etc/localtime dosyanız bir sembolik link değil de timezone dosyanızın bir kopyası şeklinde tutuluyor ise, güncellenmiş sistemden edinmiş olduğunuz Turkey adlı dosyayı, ayrıca /etc/localtime üzerine de yazmalısınız.

Güncellemenin doğrulanması

Linux sunucunuzda yaptığınız güncellemenin sonucunu, sistem saatini ileri almak zorunda kalmadan date komutunu kullanarak kontrol edebilirsiniz. Örnek olarak 1 Kasım 2016, 00:00:00 UTC zamanını ele alalım. Güncellenmiş bir sistemde Türkiye için bu saat gece 03:00:00 şeklinde olmalıdır. Eğer 02:00:00 şeklinde görülüyor ise, ilgili sistemde güncelleme yapılmamış demektir.

$ date --date="2016-11-01 00:00:00 utc"
Tue Nov  1 02:00:00 EET 2016
# Güncelleme yapılmamış

$ date --date="2016-11-01 00:00:00 utc"
Tue Nov  1 03:00:00 +03 2016
# Güncelleme yapılmış

Güncelleme sonrası dikkat edilmesi gerekenler

Güncelleme işlemini yaptınız, yukarıdaki yöntemle doğruluğunu da teyit ettiniz ve her şeyin olması gerektiği gibi çalışmasını bekliyorsunuz. Peki gerçekte öyle olacak mı? Hayır!

Linux sistemler üzerindeki yazılımlar, doğal olarak glibc kütüphanesini kullandığından, timezone değişimiyle ilgili davranışları birbirine benzer. Glibc kütüphanesi, uygulama ilk çalıştırılırken bir defaya mahsus /etc/localtime dosyasını okur ve bu şekilde timezone bilgilerini temin eder. Uygulamanın hayat döngüsü içerisinde sonradan yapılan zaman fonksiyonu çağrımlarında her defasında timezone verisini sistem üzerinden yeniden okumaz, kendi önbelleğindeki verileri kullanır.

Not: Bazı yeni glibc versiyonlarında, eğer TZ ortam değişkeni ayarlanmamış ise, her zaman fonksiyonu kullanıldığında stat() sistem çağrısıyla /etc/localtime dosyasında bir değişiklik olup olmadığı da kontrol edilmektedir ki bu da performans açısından sıkıntılı bir durum oluşturur. TZ ortam değişkeni ayarlanarak bu problemin üstesinden gelinebilir.

Yukarıda anlatılan glibc davranışı, zaman dilimi değişimi kurallarında bir güncelleme olması halinde, halihazırda sistemde çalışır durumda bulunan uygulamaların, eski bilgilerle zaman işlemleri yapmaya devam etmesine neden olur. Bu uygulamaları zaman değişiminden haberdar etmenin tek yolu ise, çalışan uygulamayı sonlandırıp yeniden başlatmaktır. Böylelikle uygulama ilk açılışında /etc/localtime dosyası tekrar okunacak ve değişiklikler uygulama içerisinde aktif olacaktır.

Özetle, 2016 kış saati değişimi sürecinde hem tzdata paketinizi güncellemeli, hem de sistemde çalışan web sunucu, veritabanı sunucu vb. gibi servisleri yeniden başlatmalısınız.

Peki, diyelim ki yıllar boyunca açık kalması gereken bir uygulama yazdınız ve zaman değişimini algılaması için yeniden başlatma gibi bir lüksünüz de bulunmuyor (çok istisnai bir senaryo gibi görünüyor ama böyle bir durumla karşılaştık ve problemi çözmek zorunda kaldık!). Bu durumda ne yapacaksınız? Çözüm için Linux-Tips.com'da benzeri bir soruya gönderdiğim yanıtı inceleyebilirsiniz. Özetle, tzset (3) fonksiyonu her çağrıldığında, /etc/localtime dosyasının yeniden okunması işlemi de tetiklenmektedir. Eğer bir timer kurup, her saat başında tzset() fonksiyonunu çağıracak olursanız, zaman değişimlerini uygulamanızı yeniden başlatmak zorunda kalmaksızın, gerektiğinde algılamış olursunuz. 

search
Sosyal Medya