106: VMware servisleri ve kapanmayan SSH bağlantısı | Orcunus.cOm
106: VMware servisleri ve kapanmayan SSH bağlantısı
09.05.2011 OzanOrcunus	Yorum bırakın Go to comments
ESX üzerinde problem gidermeye çalışırken ya da konfigürasyon değişikliklerinde sıklıkla VMware servislerini yeniden başlattığımız olmuştur. Bu gayet basit bir operasyondur ve detaylarına buradan erişebilirsiniz. Benim ilgimi çeken konu şu oldu. Bir ESX sunucusuna SSH ile bağlanıp, VMware Management servislerini restart ettikten sonra, SSH bağlantısından exit komutu ile çıkmayı deneyin. SSH bağlantısının sonlanmadığını ve siyah bir ekranda beklediğini göreceksiniz. Normalde çok üzerinde durmayacağınız bu durum, eğer shell scriptlerini ciddi oranda kullanıyor ve yaptığınız işlem sonucunda servisleri restart etme ihtiyacı hissediyor iseniz, sizin için büyük bir problem teşkil edecektir.
Aslında sorun, servisler yeniden başlatılırken olanlardan kaynaklanıyor. SSH ile bağlanıp, servisleri yeniden başlattığımızda, arka planda çalışan ve logout olunduğunda da çalışması gereken child prosesler yaratıyoruz. SSHD (ssh deamon) ise protokol gereği, bağlantı sonlandırılırken, bu prosesler üzerinde aktif standard input/output olmadığından emin olmak durumunda. Ancak yarattığımız bu child proseslerde bu bilgi sshd’ye hiçbir zaman ulaşamıyor. Detaylı bilgiye buradan da erişebilirsiniz. VMware servislerinin yeniden başlatılmasında durum budur.
Aşağıda bu durumu gösteren bir örneği görebilirsiniz. Bu konumda exit komutu sonrasında SSH istediğimiz gibi kapanmayacaktır.
Servisler yeniden başlatıldıktan sonra görünen iki adet proses var, vmware-watchdog ve logger prosesleri. Bunların ne olduklarını kısaca belirtmek gerekirse:
vmware-watchdog: Bu proses hostd (VMware Host Agent) prosesini takip eder ve gerekli gördüğü durumlarda hostd servisini yeniden başlatır. Hostd’nin parent prosesidir.
logger: ESX’e özel bir komut değildir, syslog loglaması amaçlı kullanılır.
Tavsiye edilmemekle birlikte, teorinin doğruluğunu test edebiliriz. ps -ef | grep vmware-watchdog komutu ile prosesin PID’ini bulur, kill -9 <PID> komutu ile de bu prosesi sonlandırırız. Aynı işlemi logger prosesi için de yaparız. Bu iki prosesi yok ettikten sonra exit komutu ile SSH bağlantımızı sonlandırdığımızda sorun olmadığını görürüz. Ama dediğim gibi watchdog prosesini yok etmek iyi bir tercih değil. Bu durum VMware makalesinde belirtilen hostd’nin yeniden çalıştırılamama problemine sebebiyet verebilecektir.
Peki, hiç mi uygulayabileceğimiz alternatif bir yol yok? Bunun için işin iyice mutfağına girmek gerekiyor. Service mgmt-vmware restart komutunu çalıştırdığımızda aslında arka planda bir script çalıştırır. Bu script /etc/init.d/mgmt-vmware isimli scripttir. Scripti detaylı incelediğimizde, aşağıdaki fonksiyonlar işin gerçeğini daha net gözler önüne seriyor:
# Start hostd
vmware_bg_exec "$hostdName" "$watchdog" -s hostd -u 60 -q 5 -c $hostdSupport \
"$hostd /etc/vmware/hostd/config.xml -u"
# Execute a macro in the background
local msg="$1"  # IN
echo -n '   '"$msg"' (background)'
"$func" "$@" 2>&1 | logger -t 'VMware[init]' -p daemon.err >/dev/null 2>&1 &
Burada child proseslerin nasıl yaratıldığı açıkça görünüyor. Eğer biz 4 numaralı satırın sonuna </dev/null komutunu eklersek, proses bir input beklemeyecek ve SSH kapandığında sorun olmayacak. Ancak bu yöntem de çok tavsiye edilen bir yöntem olmamakla birlikte, vmkernel’ın güncellendiği durumlarda yapılan bu değişikliğin yok olma riski de bulunmaktadır. Yine benim tavsiyem, buraya kadar yazıp çizdiklerimiz, vmware-watchdog ve hostd proseslerini daha iyi anlamak ve vmkernel üzerinde ne tip trickler yapabileceğimizi farketmenin ötesine gitmemeli.
Kategoriler:VMware Etiketler:ESX, Hostd, ServiceConsole
107: FaultTolerance ve SiteSurvey 105: Project Onyx