Linux Admin

Saturday, May 22, 2010

Laptopta sanal sunucu, KVM içerisinde linux-vserver

Çalıştığım şiskette sistem yöneticiliği yapıyorum, ofis içerisinde küçük bir sunucu odamız var ve burada çeşitli teslerimiz için laboratuvar ortamımız mevcut. Ama kişisel olarak yapmak istediğim testleri kendi laptopumda yapmak evde de çalışabilmemi sağladığım için işime geliyor. Gün boyunca bir çok uygulama görüp iş yerindeki laboratuvar ortamına ya da internete bağlı kalmadan test etmek istiyorum ama bütün bu uygulamaları kurarak bilgisayarımı çöplük haline getirmek de istemiyordum.

Ben de bilgisayarımda yapacağım testler için KVM ile oluşturduğum sanal sunucuları kullanıyordum, ancak:
  • bir kaç sanal cunusu çalıştırmam gerekince toplamda sahip olduğum 1GB ram'in hatırı sayılır kısmını sanal sunuculara ayırıyordum
  • sunucular'a kaynaklar istesemde istemesem de atanmış oluyordu,
  • toplam 10GB kadar olan boş alanıma çok sunucu kuramıyordum, her sunucu için ne kadar diske ihtiyacım olacağını da bilemiyordum, sonradan diski büyütebilsem de bu çok kolay değildi
Bir süre sonra KVM gibi tam sanllaştırma yapan araçlardan vazgeçip işletim sistemi seviyesinde sanallaştırma yapmak için bilgisayarıma linux-vserver çekirdeği (linux-image-vserver-686) kurdum. Böyle yaptığımda da şu sorunlar ile karşılaştım:
  • çekirdeğim değiştiği için nvidia ve madwifi gibi sürücular için tekrar modül derlemem gerekti, hoş hani zaten bunu modüle-assistant benim adıma yapıyor ama gene de rahatsız edici bir durum
  • gittiğim her yerde ağ yapılandırmam değişiyordu ve linux-vserver sunucularına dinamik ip vermek çok kolay olmuyordu
Sonunda yeni gelen bir güncelleme sırasında kendimi vserver çekirdeğini kaldırırken bulunca farklı bir yöntem kullanmak gerektiğini düşündüm ve şöyle bir çözüm buldum:
  • Bir adet KVM kurup içerisine linux-vserver çekirdeği kurdum
  • KVM'in ağ yapılandırmasını ayarlayarak KVM ve içerisindeki sanal sunucuları ayrı bir ağa koydum, böylece sabit ip verebildim ve nat ile nete çıkardım: http://www.linuxquestions.org/questions/linux-networking-3/kvm-qemu-and-nat-on-the-host-machine-mini-tutorial-697980/
  • Tüm sanal sunucuların içinde bulunduğu disk alanına toplamda 10GB ayırdım, tümü bunu paylaşıyorlar, her yeni sunucunun disk maliyeti yalnızca 200MB ölüyor (benim imajımın sıfır boyutu bu kadar)
  • Tüm sanal sunuculara ayrı ayrı ram ayırmaktansa toplamda 300MB ram ayırdım ve tümü bunu paylaşıyorlar, 10 kadar sanal cunucu ile daha pek yavaşlama olmadı.
Nasıl yaptığıma gelince:
bekir@laptop:~$ sudo aptitude install kvm
KVM'in ağ yapılandırmasını düzenleyelim:
bekir@laptop:~$ for i in /etc/kvm/*; do echo ===== $i =====; cat $i; done
===== /etc/kvm/kvm-if.conf =====
#see /home/bekir/bin/testing
BRIDGE=kvmnat
NETWORK=192.168.172.0
HOST=192.168.172.1
MASK=255.255.255.0
===== /etc/kvm/kvm-ifdown =====
#!/bin/sh
#see /home/bekir/bin/testing

. /etc/kvm/kvm-if.conf

echo "$0:"

echo "Tearing down network bridge for $1"
ip link set $1 down
brctl delif "$BRIDGE" $1

ifconfig kvmnat 0.0.0.0
ip link set "$BRIDGE" down
brctl delbr "$BRIDGE"

exit 0
===== /etc/kvm/kvm-ifup =====
#!/bin/sh
#see /home/bekir/bin/testing

. /etc/kvm/kvm-if.conf

echo "$0:"
echo "Setting up the network bridge for $1"
brctl addbr "$BRIDGE"
brctl addif "$BRIDGE" "$1"
ifconfig "$BRIDGE" "$HOST" netmask "$MASK"
ip link set "$1" up
ip link set "$BRIDGE" up

if iptables -t nat -L POSTROUTING -n | grep ^MASQUERADE | awk '{print $4}' | cut -d/ -f1 | grep "$NETWORK" >/dev/null
then
echo "IP masquerading already set up"
else
echo "Setting up IP masquerading"
iptables -t nat -A POSTROUTING -s "$NETWORK"/"$MASK" -d ! "$NETWORK"/"$MASK" -j MASQUERADE
fi

echo "Setting up IP forwarding"
sysctl net.ipv4.ip_forward=1

exit 0

===== /etc/kvm/kvm-ifup-bak =====
#! /bin/sh
# Script to bring a network (tap) device for qemu-kvm up
# The idea is to add the tap device to the same bridge
# as we have default routing to.

switch=$(ip route ls | \
awk '/^default / {
for( i = 0; i < NF ; i++ ) { if ($i == "dev") { print $(i+1); exit; } }
}'
)
/sbin/ifconfig $1 0.0.0.0 up

# only add the interface to default-route bridge if we
# have such interface (with default route) and if that
# interface is actually a bridge.
if [ -n "$switch" -a -d /sys/class/net/$switch/bridge/. ]; then
/usr/sbin/brctl addif $switch $1 || :
fi
bekir@laptop:~$
KVM içerisine kurulum için debian kurulum CD'sini indirelim:
Ben debian'ın sitesinden indirdim, şuradan bulabilirsiniz: http://www.debian.org/CD/
bekir@laptop:/media/free$ wget http://cdimage.debian.org/debian-cd/5.0.4/i386/iso-cd/debian-504-i386-CD-1.iso

Sanal sunucuları koyacağımız disk alanını ayıralım (ben 10GB ayırdım)
bekir@laptop:~/media/free$ dd if=/dev/zero of=kvm_vserver_kernel bs=100M count=100
KVM icerisine ilk kurulumu yapalim linux-vserver cekirdegi koyalim:
bekir@laptop:~/media/free$ sudo kvm -hda kvm_vserver_kernel -cdrom debian-504-i386-CD-1.iso -m 300 -net nic,vlan=0 -net tap,vlan=0
Sistem CD'den açılıyor ve şu ayarları yapıyorum:
  • Tüm diski kendisi bölümlendirsin (tek parça)
  • Ağ ayarları için elle yapılandırma seçip şunları kullandım:
  • * address 192.168.172.2/255.255.255.0
  • * gateway 192.168.172.1
  • * dns-nameservers 192.168.172.1
  • Sisteme neler kurayım diye sorduğunda hiç bir şey seçmedim
Kurulum bittikten sonra KVM'i kurduğumuz sistemden açalım:
bekir@laptop:~$ sudo kvm -hda /media/free/kvm_vserver_kernel -m 300 -net nic,vlan=0 -net tap,vlan=0
Ben bu komutu her seferinde hatırlamak zorunda kalmamak için su betiği yazdım:
bekir@laptop:~$ cat bin/start-kvm-host
#!/bin/bash
# /etc/kvm/ altındaki dosyaları elledim: http://www.linuxquestions.org/questions/linux-networking-3/kvm-qemu-and-nat-on-the-host-machine-mini-tutorial-697980/
#IP address: 192.168.172.12
#Netmask: 255.255.255.0
#Gateway: 192.168.172.1
#DNS: 192.168.0.1
# -cdrom /media/free/debian-504-i386-CD-1.iso
exec sudo kvm -vnc :0 -hda /media/free/kvm_vserver_kernel -m 300 -net nic,vlan=0 -net tap,vlan=0
bekir@laptop:~$
Şimdi makinanın arayüzüne bağlanmak için sunu kullanabilirsiniz (Eğer bir şeyler doğru gitmezse açılan kvm'in ekranını buradan görebilirsiniz)
bekir@laptop:~$ sudo aptitude install vncviewer
bekir@laptop:~$ vncviewer localhost
Şimdi KVM içerisine kurduğumuz debian'a yerleşmeye başlayabiliriz:
bekir@kvm:~$ sudo aptitude install linux-image-vserver-686 util-vserver ssh
bekir@kvm:~$ sudo reboot
bekir@kvm:~$ sudo vserver vserver_template build -m debootstrap --hostname vserver_template.laptop.bdgn.net --interface eth0:192.168.172.3/24 -- -d lenny -m http://ftp.de.debian.org/debian # biraz uzun sürüyor
bekir@kvm:~$ sudo vserver vserver_template start
Starting enhanced syslogd: rsyslogd.
Starting OpenBSD Secure Shell server: sshd.
bekir@kvm:~$ sudo vserver vserver_template enter
root@vserver_template:~# # artık yeni sunucu içindesinizistediğiniz paketeri kurun ve template'de olması gerektiğini düşündüğünüz yapılandırmaları yapın
root@vserver_template:~# aptitude install ssh
root@vserver_template:~# adduser bekir
root@vserver_template:~# visudo # bekir ALL=(ALL) ALL
root@vserver_template:~# # key'lerinizi koyabilir ve daha istediğiniz değişiklikleri de burada yapabilirsiniz
root@vserver_template:~# logout
bekir@kvm:~$
Hemen yeni makinamiza ssh ile girmeyi deneyelim:
bekir@kvm:~$ ssh 192.168.172.3
The authenticity of host '192.168.172.3 (192.168.172.3)' can't be established.
RSA key fingerprint is 3c:fd:16:d0:04:43:39:32:c5:14:5b:49:7a:cd:f9:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.172.3' (RSA) to the list of known hosts.
Last login: Wed May 19 03:51:19 2010 from 192.168.172.3
bekir@vserver_template:~# sudo aptitude install vim emacs bash-completion
bekir@vserver_template:~# sudo aptitude install locales
bekir@vserver_template:~$ sudo dpkg-reconfigure locales
bekir@vserver_template:~# # ev dizinime gereken dosyalari tasidim ve ssh key'imi de koydum
bekir@vserver_template:~# sudo update-alternatives --config editor # vim.basic
bekir@vserver_template:~$ sudo apt-get clean # çok büyük boyutlu olabilir, her makina için kopyalanacağından temizlemekte fayda var
bekir@vserver_template:~$ logout
bekir@kvm:~$
Artık template'imiz hazır, template makinamızı açık tutmayalım:
bekir@kvm:~$ sudo vserver vserver_template stop
Yeni makinalar yaratmak için de alttaki gibi bir betik yazdım. Bu betik şu işleri de yapıyor:
  • sıradan bir ip bulup makineye veriyor, ismiyle ulaşabilmemiz için /etc/hosts'a makina adını ekliyor
  • bütün sanal makinalarının /home ve /var/cache/apt/archives dizinleri kvm makinasındaki ile ortak oluyor.
  • sanal makinaların kvm makinası açılışında kendiliğinden başlamalarını sağlıyor.
bekir@kvm:~$ cat /usr/local/bin/create_vserver
#!/bin/bash
V_NAME=$1

[ "$USER" == "root" ] || { echo "You must bee root"; exit 1; }
[ -z "$V_NAME" ] && { echo "Give a vserver name"; exit 1; }

MAX_IP=$(cat /etc/vservers/*/interfaces/0/ip | cut -d. -f4 | sort -n | tail -1 )
V_IP=192.168.172.$[MAX_IP + 1]

echo "Creating new vserver $V_NAME with ip $V_IP ..."

vserver $V_NAME build -m clone --hostname $V_NAME.laptop.bdgn.net --interface eth0:$V_IP/24 -- --source /var/lib/vservers/debian
echo -e '/home\t/home\tbind\tbind\t0\t0' >> /etc/vservers/$V_NAME/fstab
echo -e '/var/cache/apt/archives/\t/var/cache/apt/archives/\tbind\tbind\t0\t0' >> /etc/vservers/$V_NAME/fstab
echo "default" > /etc/vservers/$V_NAME/apps/init/mark
vserver $V_NAME start
vserver $V_NAME exec bash -c 'rm /etc/ssh/ssh_host_*'
vserver $V_NAME exec bash -c 'dpkg-reconfigure openssh-server'

echo $V_IP $V_NAME >> /etc/hosts

echo "Created new vserver $V_NAME with ip $V_IP"

exit 0
bekir@kvm:~$
Artık sanal makina yaratmak ve silmek su kadar basit:
bekir@kvm:~$ sudo create_vserver test_makinasi
Creating new vserver test_makinasi with ip 192.168.172.4 ...
Starting enhanced syslogd: rsyslogd.
Starting OpenBSD Secure Shell server: sshd.
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Restarting OpenBSD Secure Shell server: sshd.
Created new vserver test_makinasi with ip 192.168.172.4
bekir@kvm:~$ ssh test_makinasi
The authenticity of host 'test_makinasi (192.168.172.4)' can't be established.
RSA key fingerprint is 1a:50:a9:51:8e:5b:c3:a9:96:d6:85:51:8c:00:ea:0b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'test_makinasi,192.168.172.4' (RSA) to the list of known hosts.
Last login: Tue May 18 01:05:32 2010 from 192.168.172.1
bekir@test_makinasi:~$ logout
bekir@kvm:~$ sudo vserver-stat
CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME
40006 21 214.3M 93.9M 3m32s63 2m22s18 17h40m26 veli
40008 6 43.5M 8M 0m02s10 0m00s64 17h40m26 pyldap
40009 3 23.5M 2.2M 0m02s52 0m01s25 28m22s75 test_makinasi
bekir@kvm:~$ sudo vserver test_makinasi delete
Are you sure you want to delete the vserver test_makinasi (y/N) y
Stopping enhanced syslogd: rsyslogd.
Asking all remaining processes to terminate...done.
All processes ended within 1 seconds....done.
bekir@kvm:~$
Şimdi kendi makinamizdan sanal sunuculara da ip adresleri ile erişebiliriz:
bekir@laptop:~$ ssh 192.168.172.4
The authenticity of host '192.168.172.4 (192.168.172.4)' can't be established.
RSA key fingerprint is 1a:50:a9:51:8e:5b:c3:a9:96:d6:85:51:8c:00:ea:0b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.172.4' (RSA) to the list of known hosts.
Last login: Wed May 19 21:23:00 2010 from 192.168.172.4
bekir@test_makinasi:~$
SSH ile sanal sunuculara laptoptan erişebilmek için de laptop'umda şu ayarı yaptım:
bekir@hede:~$ sudo sh -c 'echo 192.168.172.2 kvm >> /etc/hosts'
bekir@hede:~$ cat >> ~/.ssh/config
> Host t-*
> ProxyCommand ssh $DEBUG -t kvm nc -w 1 -q 1 $(echo %h|sed 's/^t-//') %p
bekir@hede:~$ ssh kvm
bekir@kvm:~$ logout
bekir@hede:~$ ssh t-test_makinasi
The authenticity of host 't-test_makinasi ( < no hostip for proxy command>)' can't be established.
RSA key fingerprint is 86:a2:55:22:20:5c:57:43:e2:b5:dc:9a:2c:0d:87:90.
Are you sure you wat to continue connecting (yes/no)? yes
Warning: Permanently added 't-test_makinasi' (RSA) to the list of known hosts.
Last login: Wed May 19 21:36:21 2010 from 192.168.172.4
bekir@test_makinasi:~$ logout
bekir@hede:~$

1 comment:

  1. Kernel derlemeye gerek yoktu. 2.6.29'dan itibaren lxc (linux containers) geliyor kernel'da. Sanırım vserver deprecated oldu. Ayrıca lxc çok daha üstün özellikler de sunuyor: http://sozluk.sourtimes.org/show.asp?t=linux+containers ayrıca: http://www.ibm.com/developerworks/linux/library/l-lxc-containers/

    ReplyDelete