Xen ile sanal makinede yazıcı tanıtma 15 February 08, Friday @ 05:44

Xen ile domU altında herhangi bir gerçek aygıtı kullanmak isterseniz öncelikle aygıtı sadece domU'nun kullanması için transfer etmeniz gerekir.

Xen ile USB portlarını domU'lara transfer edemezsiniz. Şu an (3.2.0 kararlı sürümü ile) Xen sadece PCI aygıtlarının domU'ya transfer edilmesi özelliğini sağlamaktadır. Ancak USB aygıtlar, birer PCI aygıtı olan USB Controler aracılığı ile kullanılırlar. :-)

PCI aygıtları domU'ya transfer etmek için Xen'in PCI Backend (pciback) sürücüsü kullanılır. dom0 içinde yüklü olan pciback sürücüsü Xen'in fiziksel aygıtları kullanabilmesi için bir arayüz sunar. Buna benzer bir arayüz olan PCI Frontend (pcifront) de domU'larda bulunur ve her ikisi birlikte sanal makinelerin gerçek aygıtlarla güvenli bir şekilde iletişimini sağlar.

Herhangi bir aygıtı domU'ya transfer etmek, backend sürücüsünün aracılığını ortadan kaldırmak demek olduğu için aygıt artık dom0 veya diğer domU'lar tarafından kullanılamaz. Aynı zamanda Xen hipervizörünün de aracılığı ortadan kalktığı için (normalde bütün aygıtlar Xen hipervizörü tarafından yönetilen backend sürücüsü aracılığıyla kullanılırlar.) domU'nun aygıtın kullanımı konusunda sınırsız yetkisi olur.

Aşağıda örnek olarak yazıcınızı nasıl domU'ya transfer edebileceğinizi göstereceğim.

Bir aygıtı domU'ya transfer etmeniz için önce onu pciback sürücüsünü kullanarak dom0'dan saklamanız ve daha sonra domU ayar dosyasında aygıtın kullanılacağını belirtmeniz gerekir.

Bunu sağlamak için üç yöntem mevcuttur. Birinci yöntem sadece pciback ve pcifront sürücüleri dom0 ve domU kerneli içinde statik olarak derlenmişse işe yarar. Eğer her iki sürücüden biri modül olarak derlenmişse sadece diğer yöntemler kullanılabilir.

Her üç yöntem için de önce hangi aygıtı transfer edeceğinizi bulmanız gerekir. Bunun için lspci çıktısını kullanabilirsiniz. Benim makinemde lspci çıktısı aşağıdaki gibidir:

# lspci 
00:00.0 Host bridge: Silicon Integrated Systems [SiS] 741/741GX/M741 Host (rev 03)
00:01.0 PCI bridge: Silicon Integrated Systems [SiS] SiS AGP Port (virtual PCI-to-PCI bridge)
00:02.0 ISA bridge: Silicon Integrated Systems [SiS] SiS964 [MuTIOL Media IO] (rev 36)
00:02.5 IDE interface: Silicon Integrated Systems [SiS] 5513 [IDE] (rev 01)
00:02.7 Multimedia audio controller: Silicon Integrated Systems [SiS] AC'97 Sound Controller (rev a0)
00:03.0 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f)
00:03.1 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f)
00:03.2 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f)
00:03.3 USB Controller: Silicon Integrated Systems [SiS] USB 2.0 Controller
00:04.0 Ethernet controller: Silicon Integrated Systems [SiS] SiS900 PCI Fast Ethernet (rev 90)
00:05.0 IDE interface: Silicon Integrated Systems [SiS] RAID bus controller 180 SATA/PATA [SiS] (rev 01)
00:09.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
01:00.0 VGA compatible controller: Silicon Integrated Systems [SiS] 661/741/760/761 PCI/AGP VGA Display Adapter

Bu çıktı içinden bir transfer etmek istediğiniz pci aygıtını bulmanız gerekir. Usb portuna herhangi bir aygıt takın. dmesg çıktısında aygıtın hangi Controller üzerinde olduğunu görebilirsiniz. Burada örnek olarak transfer etmek istediğimiz USB portunun 00:03:0 adresinde olduğunu farzedeceğim.

1. YÖNTEM

Xen sanal makine yöneticisine açılışta vereceğiniz kernel parametreleri ile pciback sürücüsünün hangi aygıtları dom0'dan saklaması gerektiğini belirtebilirsiniz. Örnek bir grub girdisi şöyle olabilir.

title           Xen 3.1.0 / Debian GNU/Linux, kernel 2.6.18-xen
root (hd0,1)
kernel /boot/xen-3.1.0.gz
module /boot/vmlinuz-2.6.18-xen root=/dev/sda2 ro console=tty0 pciback.hide=(00:03.0)
module /boot/initrd.img-2.6.18-xen
savedefault

Bu yöntemin işe yaraması için pciback sürücüsünün dom0 kernel'i içine statik olarak derlenmesi gerektiğini unutmayın.

2. YÖNTEM

pciback sürücüsüne göndereceğiniz parametreler ile aygıtın saklanmasını sağlayabilirsiniz. Ancak pciback sürücüsünün aygıtı kontrol altına alması için o aygıtın hiçbir sürücünün kontrolü altında olmaması gerekir. Eğer saklayacağınız PCI aygıtı için bir sürücü yüklenmiş ise öncelikle bu sürücüye aygıtı bırakmasını söylemeniz gerekir. Örneğin dmesg çıktısına göre benim yazıcımın bağlı olduğu PCI Controler aygıtı ohci_hcd sürücüsü tarafından kullanılmaktaymış.

ohci_hcd: 2005 April 22 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI)
usb 1-1: new full speed USB device using ohci_hcd and address 2

O halde ohci_hcd sürücüsüne bu PCI aygıtının kontrolünü bırakmasını söylemeliyiz.

# echo -n 0000:00:03.0 > /sys/bus/pci/drivers/ohci_hcd/unbind

Eğer yukarıdaki komut bir hata veriyorsa (hatayı dmesg çıktısında görebilirsiniz) yanlış sürücüye parametre yolluyorsunuz demektir.

Artık bu aygıtı pciback sürücüsünün kontrol etmesini söyleyebiliriz.

# echo -n 0000:00:03.0 > /sys/bus/pci/drivers/pciback/new_slot
# echo -n 0000:00:03.0 > /sys/bus/pci/drivers/pciback/bind

Yukarıdaki 3 komutu bir açılış betiği içine yazarak her açılışta otomatik olarak çalıştırılmasını sağlayabilirsiniz.

Bu yöntemi kullanırsanız hatırlamanız gereken şey, pciback modülü herhangi bir nedenle kaldırılırsa veya yeniden yüklenirse aynı işlemleri yeniden yapmanız gerektiğidir.

3. YÖNTEM

Modül ayarlarının yazıldığı dizinde birkaç oynamayla aynı işlemi yapabilirsiniz. Bu yöntemin yararı herhangi bir nedenle pciback modülü kaldırılsa veya yeniden yüklense bile ayarların yeniden yapılması gerekmez. Ancak bu yöntemin uygulanması dağıtımdan dağıtıma farklılık gösterir. Örneğin modüller ile ilgili ayarlar Debian' da /etc/modprobe.d/ dizini altında herbir modül için modülün adıyla aynı birer dosya şeklinde tutulur. Pardus'ta bu dizin /etc/modules.d/ adını alırken, Red Hat, CentOS ve Fedora gibi dağıtımlarda bütün modüller ile ilgili ayarlar /etc/modprobe.conf içine yazılırlar.Kullandığınız dağıtımda bu özelliği nasıl kullacağınızı bulmak size kalmış. :-)

Örneğin Debian'da /etc/modprobe.d/pciback dosyasındaki ayarlar aşağıdaki gibi olmalıdır.

options pciback hide=(0000:00:03.0)

Ancak eğer ohci_hcd modülü pciback modülünden önce yüklenirse bu parametre işe yaramaz. (2. YÖNTEM'de anlatılan sebepten dolayı) O halde ohci_hcd modülünün ayar dosyasına da pciback modülünden önce yüklenmesini engelleyecek bir ayar koymalıyız.

install ohci_hcd /sbin/modprobe pciback ; /sbin/modprobe --first-time --ignore-install ohci_hcd

Bu ayar ile ohci_hcd modülü ilk defa yükleneceği zaman önce pciback modülünün yüklenmesini sağladık.

Eğer bu üç yöntemden birini kullanarak aygıtı pciback kontrolüne verdiyseniz artık aygıtınız domU tarafından kullanılmaya hazırdır. domUayar dosyasına yazılan pci parametresi ile aygıtı domU'nun kontrolüne verebilirsiniz.

pci=['00:03.0']

Eğer herşey yolunda gittiyse domU başladığında yeni bir PCİ aygıtı görüp kullanmaya başlayacaktır.

# lspci
00:00.0 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f)
# lsusb
Bus 001 Device 003: ID 04e8:325b Samsung Electronics Co., Ltd
Bus 001 Device 002: ID 058f:9254 Alcor Micro Corp. Hub
Bus 001 Device 001: ID 0000:0000

Sadece bir usb portunu domU'ya atamadığımıza dikkat edin. Atadığımız PCI aygıtı USB Controler idi, dolayısı ile aynı USB Contoler'a bağlı USB portlarının hepsini birden domU'ya atadık. Bu portların sayısı birden fazla olabilir.

Ayrıca bu işlem her PCI aygıtı için tekrarlanabilir. Böylelikle birden fazla aygıtı (örneğin iki ağ kartı ve bir yazıcıyı) domU'nun kontrolüne verebilirsiniz.



Tags: Sanallaştırma 

Comments

Post a comment (max. 3000 character)

Your name: Comment:
Number of remaining characters: