Oracle VirtualBox kullanarak Amazon AMI hazırlama Slackware 14 16-06-2014

One may find the english version of the document at this link: http://www.kahverengi.com/EN/article/amazon-ec22/prepare-amazon-ami-from-oracle-virtualbox-vdi-slackware-14.html

Özet:

Bir önceki yazımda direk kendi makinenizde loop aygıtı yöntemi ile bir imaj üzerinde çalışarak Slackware Amazon AMI oluşturmayı anlatmıştım. Dileyenler o yazıya bu linkten ulaşabilirler. O yazıdan hemen sonra slackbuilds.org sitesinde Slackware 14 için de xen kernel paketinini yayınlandığını gördüm. Hem o paketi kullanmak hem de daha temiz ve anlaşılır bir yönteme de değinmek istediğim için, bu yazıda aynı Amazon AMI' yi bir VirtualBox kullanarak hazırlayıp kaydetmeyi anlatacağım. Kısaca, önce Slackware işletim sistemini bir VirtualBox üzerinde kurup (Guest 1) sonra başka bir VirtualBox makinede (buna da Guest 2 diyelim) ilk VirtualBox makinenin vdi dosyasını image a çevireceğim. Sonra Amazon AWS sistemine bu yeni yartılan dosyayı aktarıp, kaydedeceğim. 
Yazıya başlamadan önce önemli bulduğum bir ayrıntıyı dile getirmek istiyorum. Aşağıda anlatılan adımların sonunda oluşturulan imaj S3 bucket (root device= instance store) üzerinde çalışır olacaktır. Bu da Amazon ec2 instance yaratılmak istendiğinde tip olarak small seçilmek zorunda bırakıyor kullanıcıyı. Oysa ki micro instance yaratmak isteyebiliriz. O yüzden yazının sonunda buna olanak sağlayacak yönteme de değineceğim.

Gerekenler:

Linux çalışma makinesi (Host); Oracle VirtualBox, Slackware 14 yükleme dosyaları (yani DVD veya ISO olabilir),  Amazon AWS hesabı, çalışır durumda Amazon API and AMI araçları

Adımlar:

1. VirtualBox makinelerin kurulması
Guest1 makinesinde Slackware 14 (bu örnekte 32 bit) kurulmalı.  Kurulum işlemini ayrıca anlatmıyorum. Yaklaşık 8Gb lık bir disk ziyadesiyle yeterli olacaktır. Xen kernel için gereken (yada en azından gerektiğini sandığım demeliyim. Çünkü tek tek ayıklama yapmaya zamanım olmadı) paket grupları şunlardır: a ap d f k l n t tcl and x. Ayrıca grub ta kurulmalı.
Guest2 makinesine herhangi bir linux kurulabilir. Sonuçta kullanacağımız araçlar genelde bir çok linux makinede standart olarak bulunuyorlar. Ben bu örnekte yine bir Slackware kurdum. Bu ikinci makinenin tek işlevi vdi imajini disk olarak görüp dosya olarak kaydetmek. Aynı işlemi Host makineden VirtualBox komut satırı araçlarını kullarak ta yapabiliriz (# VBoxManage internalcommands converttoraw ...)

2. Xen kernelinin kurulması
"grup" ön yükleyici Guest1 makinesine kurulmalı ve çalıştığı teyid edilmeli (yani grub aracılığı ile sistem açılabilmeli) .
slackbuilds.org sitesinden xen kernel ve gereken paketler indirilip Guest1 makinesine kurulmalı.
dom0 altında (xen kurulumunda xen klasörü altında bu klasörü göreceksiniz) bulunan kurulum scripti çalıştırılmalı.
grub ile xen kernelindan sistemi açabildiğimiz görmeliyiz.
En sonunda lilo kaldırılabilir. Diğer orijinal kernel  paketleri ve aklınıza gelen gereksiz olan tüm paketler (özellikle x alt grubunda bulunan) kaldırılabilir. Artık Guest1 makinesini kapatabiliriz.

3.  Amazon AMI hazırlanması (Farklı bir VirtualBox makinesinde :Guest2)
Not: Dilerseniz host makine üzerindeyken de bu işlemler yapılabilir.  Aslında bu şekilde daha akıcı ve anlaşılır bir yol izlenmiş olur. Merak edenler için bu link konuyu geyet güzel bir şekilde açıklamaktadır: http://www.niftiestsoftware.com/2011/09/24/converting-a-virtualbox-vm-to-an-ec2-ami/

Biz kendi yolumuza devam edersek,
Guest1 makinesinde vdi dosyasını Guest2 makinesine disk olarak gösterelim (VirtualBox/Guest2/Settings/Storage/Controller/Harddisk) Burada dikkat edilmesi gereken yeni eklenecek olan Guest1 in harddisk'i orijinal Guest2 harddisk'inin altında yer almalıdır. Bu sayede Guest2 makinesi kendi diskinden açılabilecektir.
Guest2 makinesinde,
öncelikle çalışma alanını yaratalım.

# mkdir /tmp/amiworks
# mkdir /tmp/amiworks/fs-slackware
# cd /tmp/amiworks

Bu (Guest2) sistemine eklediğimiz disk üstünde yer alan sistemimizde gerekli değişiklikleri yapalım. Bunun için (Bu örnekte yeni eklenen disk /dev/sdb dir)

# fdisk /dev/sdb
    p
    w
# mount /dev/sdb1 /tmp/amiworks/fs-slackware

Şimdi /tmp/amiworks/fs-slackware/etc/fstab  dosyasını değiştirip şu hale getirelim:

/dev/sda1 / ext3 defaults 1 1
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
/dev/sda2 /mnt ext3 defaults 0 0
/dev/sda3 swap swap defaults 0 0

Virtualbox makinesinde Slackware 14 'ü  varsayılan biçimde kurduğumuzdan dolayı zaten DHCP konusunun olağan biçmde ayarlı olduğunu varsayıyorum. (/tmp/amiworks/fs-slackware/etc/rc.d/rc.inet1 dosyasını açalım ve  DHCP nin aktif olduğundan emin olalım (USE_DHCP[0]="YES" olmalı.)
Artık disk ile işimiz bitti.

# umount /tmp/amiworks/fs-slackware/


Diski imaja aktaralım.

# dd if=/dev/sdb1 of=/tmp/amiworks/slackami14-v7.img bs=16M

[Not: Bu aşamada, eğer herhangi bir ec2 instance'ınız aktif ise, önce bu imajı sıkıştırıp o instance a yükleyerek sonraki işlemleri orada yapmak çok ciddi zaman kazancı sağlamaktadır. Ayrıca bu şekilde çalışıldığında S3 bucket yerine ebs backed root device hazırlamak ta mümkün olacaktır.]
Ancak biz bu çalışmada lokal makinede (burada Guest2) çalışmayı tercih ettik.

Bu adımdaki işlemler için amazon ec2 ami ve api araçlarına ihtiyaç vardır. Ayrıca amazon AWS hesabınızın olması gerekmektedir. Hesap numarası şu şekilde kullanılmalı 111222333444 yani orijinal hesap numarasının aralarındaki çizgileri kaldırarak kullanmak gerekiyor. private key ve certificate dosyalarına da ihtiyaç var ki bunlarda AWS hesabınızı yönettiğiniz web ekranlarından temin edilebilir. ( access credential menüsü).

# ec2-bundle-image -i /tmp/amiworks/slackami14-v7.img -r i386  -k pk-privatekeyfile.pem -c cert-certificatefile.pem -u 111111111111

Hazırlanan dosyaları Amazon AWS ye aktarmadan önce  S3 servisinde bir bucket yaratılması gerekiyor (klasör yaratmak gibi). Benim yaratıp kullandığım bucket in ismi "slackware-images". access ve secret key leri yine AWS yönetim panelinizden edinebilirsiniz. En sonunda da aktarılan imaj register edilir. (not: bilginiz olsun, imaj dosyalarının AWS ye aktarılması son derece uzun sürüyor.)

# ec2-upload-bundle -b slackware-images -m /tmp/slackami14-v7.img.manifest.xml -a -s
# ec2-register slackware-images/slackami14-v7.img.manifest.xml -n slackware-14-v.7

işlemlerimizi bitirdik. Çalışma dosyalarını temizleyelim.

# rm -r /tmp/amiworks

Böylece Amazon AMI imajını yaratmış,  AWS ye yüklemiş ve kayıt ettirmiş olduk. Artık bu imajı kullanarak yeni bir instance yaratabiliriz.

Eğer aktif bir EC2 instance üzerinde çalışmak istersek

Yukarıda asıl makine vdi dosyasını yüklenecek imaja çevirdiğimiz adımda halen localdeki sanal makinedeydik (guest2). Aynı işlemi host makinemizde virtualbox terminal komutlarını kullanarak ta yapabileceğimizi söyledim. Ancak bu şekilde çalıştığımızda Amzona gönderilecek (upload) dosya boyutu ciddi zaman kaybına yol açmakta. Bu soruna yönelik şu yolu izleyebiliriz: Elimizde aktif kullanımda olan bir ec2 instance ı varsa (yoksa da yaratıp kullanmak gayet kolay), lokalimizde bulunan
imajı önce sıkıştırıp sonra Amazon EC2 instance ına upload ederiz. Daha sonra bundle, upload ve register işlemlerini o EC2 instance i üzerinde yaparız.
Kısaca adımları belirtelim:
Hazırlanan VirtualBox makine halen açıkken onun terminalinde

# cat /dev/zero > /tmp/zerofill

Diskte yer kalmadığını berliten bir uyarı alacağız. Sorun değil.

rm /tmp/zerofill

Bu virtualbox makineyi kapatmadan hemen önce /etc/fstab dosyasını yukarıda belirtildiği biçime getirelim. DHCP nin açık/aktif olduğundan emin olalım. En sonunda makineyi kapatalım.

Host makinemizde

# VBoxManage internalcommands converttoraw slackami14.vdi ec2-slackami14.img

Daha sonra bu imaj dosyasını sıkıştırıp EC2 instance' ına gönderelim.(yukarıda boşlukları zero ile oldurmak burada ebatın küçük olmasına yardımcı oluyor.)

# tar cjf ec2-slackami14.img.tar.bz2 ec2-slackami14.img
# scp -i <secretkey.pem> ec2-slackami14.img.tar.bz2 root@:<path_to_working_dir>

Artık EC2 instance makinesine geçebiliriz. Burada önce sıkıştırılan dosyayı açalım, sonra da yukarıdaki rutin adımları bu dosya üzerinde gerçekleştirebiliriz (bundle, upload-bundle ve register)

# tar xf slackami14.img.tar.bz2
# ec2-bundle-image -i ec2-slackami14.img -r i386 -k <pk-privatekeyfile.pem> -c <cert-certificatefile.pem> -u
# ec2-upload-bundle -b slackami -m ec2-slackami14.img.manifest.xml -a -s
# ec2-register slackami/ec2-slackami14.img.manifest.xml -n slackware-14.v7 -K <pk-privatekeyfile.pem> -C <cert-certificatefile.pem>

Aynı dosya ile ebs backed imaj yaratmak istersek aşağıdaki adımları izlememiz gerekmektedir.

S3 (incident store) yerine ebs backed store yaratmak tercih etseydik

Bu durumda Gerçekten de EC2 incidentina ihtiyacımız olacaktı. Yine yukarıdaki gibi hazırlanmış (istenirse sıkıştırılarak) ec2 instance ına gönderilmiş imajımız,
http://www.niftiestsoftware.com/2011/09/24/converting-a-virtualbox-vm-to-an-ec2-ami/ linkinde de anlatıldığı gibi ebs backed Amazon imajına dönüştürülebilirdi.

Son Sözler

Yukarıda yaratılan tüm Amazon imajları ancak fki-f5cbe081 etiketli kernel id si ile çalışabilmektedir. Diğerlerinin hepsini değil ama bazılarını denedim ve başarısız oldum.

Umarım bu yazılanlar size faydalı olur. Düşünceleriniz paylaşmanız beni memnun eder. Eposta adresim: soydaner{at]kahverengi[dot]com.

Lütfen şunu unutmayın ki bu imaj sadece keyfi amaçla yapılmıştır yani gerçek üretim ortamı için kulanılmaya henüz uygun değildir. Yakın tarihte public hale getirip amazon da yayınlamayı düşündüğüm bir Slacware server çalışmam bulunmakta. Dilerseniz bu gerçekleştiğinde size bilgi verebilirim (bana e posta göndermeniz yeterlidir)