Daha önceki bir yazımda (kesin konuşmak gerekirse şu yazımda) Xen üzerinde sanal Pardus kurmuş ve normal kullanıcı olarak oturum açıp, ağdaki herhangi diğer bilgisayar veya dom0'dan VNC ile bağlanıp sanal Pardus'umuzu kullanmıştık.
Kısaca özetlemek gerekirse:
- domU'da normal kullanıcı olarak VNC sunucusu çalıştırılır.
- Normal kullanıcının DISPLAY çevre değişkeni çalıştırılan VNC sunucu olacak şekilde ayarlanır.
- domU'da KDE başlatılır.
Ancak bir süre sonra fark edeceğiniz gibi, her grafik arayüz kullanmak istediğimizde bütün bu işlemleri baştan yapmak epey vakit kaybettiriyor. Ben de yukarıda saydığım adımları bizim adımıza yapan bir COMAR servis betiği ile sorunu çözmeye çalıştım. Betik son derece basit ve kirli, ancak özellikle Linux sistemleri yönetmenin kolaylığı ve elimizin altındaki araçlar konusunda fikir vermesi açısından yararlı olacağını düşünüyorum.
Önce COMAR tarafından çağrılacak başlatma betiği:
#!/bin/bash
export USER="otc"
export HOME="/home/otc"
/usr/bin/vncpasswd < /home/otc/.vnc/vnc-passwd
/usr/bin/vncserver :1 > /home/otc/vnc.log 2>&1
export DISPLAY="pardus-client:1"
/usr/kde/3.5/bin/startkde > /home/otc/kde.log 2>&1
vncserver programını başlatabilmek için bir şifre girme zorunluluğu bizi vncpasswd programı ile şifreyi önceden belirlemek zorunda bırakıyor. Bu şifre kullanıcımızın ev dizinindeki bir dosyadan okunacak şekilde ayarlanıyor. DISPLAY çevre değişkeni ayarlanıp KDE başlatılıyor. USER ve HOME çevre değişkenlerinin ayarlanması vncserver programını başlatabilmek için gerekli, eğer bunları ayarlamaz iseniz vnc sunucunuz başlatılamıyor.
Sırada vnc sunucumuzun otomatik başlamasını sağlayacak COMAR servis betiği var:
from comar.service import *
import os
serviceType = "script"
serviceDesc = _({
"en": "Vnc Server",
"tr": "Vnc Sunucu",
})
serviceDefault = "on"
@synchronized
def start(boot=False):
if status():
return
run("/sbin/start-stop-daemon --start --quiet --chuid otc -b --exec /etc/init.d/startvnc")
@synchronized
def stop():
run("/sbin/start-stop-daemon --stop --quiet --name startkde")
run("/sbin/start-stop-daemon --stop --quiet --name Xvnc")
def status():
return isServiceRunning("/home/otc/.vnc/pardus-client:1.pid")
COMAR servis betikleri Python ile yazılan ve servis ile ilgili işlemlerin tanımlandığı betiklerdir. Bu işlemler tanımlanırken COMAR Service API'si bize çok çeşitli metodlar sunar. Siz service komutunu veya TASMA'dan Servis Yöneticisi'ni çalıştırdığınızda COMAR servis betiğinizi çalıştırarak size istediğiniz bilgiyi sunar.
COMAR API'leri sistemde /usr/lib/pardus/comar altında bulunur. Bu dizinin içindeki service.py ve utility.py betikleri içerisinde servis betiğinde kullanabileceğiniz metod ve sınıfların kaynak kodları bulunur.
serviceDefault değişkeni ile servisin öntanımlı durumu (her açılışta başlatılıp başlatılmayacağı) belirtilir.
serviceDesc ile Servis Yöneticisi veya service komutunun çıktısında servisin açıklama hanesinde görünecek değer belirtilir.
Bir COMAR servis betiğinde servisin çalıştırılması, durdurulması ve o anki durumunun öğrenilmesi için gerekli 3 metod tanımlanması yeterlidir.
Servisleri başlatmak için run (/usr/lib/pardus/comar/utility.py içinde tanımlı) veya startService (/usr/lib/pardus/comar/service.py içinde tanımlı) çağrılarını kullanabilirsiniz. Run metodu yeni bir kabuk başlatmadan verilen komutu çalıştırır.
vncserver programı kendi süreç numarasını kullanıcının ev dizinindeki bir dosyaya yazar. COMAR isServiceRunning metoduna bu dosyanın yolunu vererek, dosyanın içinde yazan süreç numarasını okuyup o numaralı sürecin aktif olup olmadığını kontrol etmesini istiyoruz.
Servis başlatılacağı ve durdurulacağı zaman /sbin/start-stop-daemon programını çalıştırılmasını istiyoruz. start-stop-daemon orjinalde debian için yazılmış, servis başlatmak ve durdurmak için aşağı yukarı her linux dağıtımında bulunan yararlı bir program. Bu program ile ilgili daha ayrıntılı bilgi almak isteyenler programın man sayfasına bakabilirler.
start-stop-daemon ile servis başlatılırken /etc/init.d/startvnc betiğini otc kullanıcısı olarak start parametresi ile çalıştırmasını ve hata çıktıları haricinde hiçbir çıktıyı ekrana yazdırmamasını istiyoruz. startvnc betiğinde de vncserver ve startkde programlarının standart ve hata çıktılarını kullanıcının ev dizinindeki bir dosyaya yönlendiriyoruz ki COMAR ile servisi başlattığımızda bu çıktıları dosyadan takip edebilelim.
Servis durdurulacağı zaman Xvnc ve startkde adındaki tüm programların SIGTERM sinyali ile durdurulmasını istiyoruz. Belirtilen programların hangi sinyal ile durdurulacakları start-stop-daemon'un --signal parametresi ile belirtilebilir.
Hazırladımız COMAR servis betiğini kullanması için COMAR'a kaydettirmemiz gerekli. COMAR ile komut satırından haberleşmek için hav komutunu kullanıyoruz.
# hav register System.Service vnc service.py
Yukarıdaki komut ile service.py betiğini vnc adı ile COMAR Service sınıfı altına kaydettik. Artık Servis Yöneticisi veya service komutu ile vnc adını verdiğimiz servisimizi kullanmaya başlayabiliriz.
# service vnc start
# service vnc stop
# service vnc status
Servis betiğinizde bir hata olduğunu fark eder, veya artık bu servisi kullanmak istemediğinize karar verirseniz COMAR'a bu servisi silmesini söylemeniz gerekir.
# hav remove vnc
Tags: Pardus