15 Mart 2015 Pazar

Haydi Makinaları Ağdan Açalım (yada PXE Boot)


Başlıktan anlaşılacağı üzere makinaları ağdan açmayı yani network boot yada PXE boot adı verilen işlem için gerekli adımları bu yazıda anlatacağım. Bu iş fiziksel makinalarla da yapılabilir ama sanal makinalar kadar pratik olmayacaktır. Sanal makinalar için önce VirtualBox'ı denedim. Maalesef ağdan boot etme özelliği doğru çalışmıyor, bu nedenle VMware'de anlatmak zorunda kaldım. Yazıyı takip etmek için sahip olunması gerekenler:
  1. CentOS 6.6 minimal. Teorik olarak 7 dışında herhangi bir 6.x CentOS dağıtımı
  2. VMware Workstation yada en az iki fiziksel makina ve bunlara ait şebeke altyapısı
  3. Her evin olmazsa olmazı PuTTY ve onun kadim dostu WinSCP.
  4. Seçimlik olarak Live herhangi bir Linux sürümü. Ben KNOPPIX'i tercih ettim. DVD sürümü de bulunuyor ama ağdan açmak için tavsiye etmiyorum.
Fiziksel makina kurulumu hem pratik değil hem de şebeke kurulumu vb. konular için burada yer yetmeyecek. Yine yerden kısmak için Linux kurulumu kısa tutulacak, zaten DHCP, PXE boot gibi kavramlara en azından aşina olan okuyucunun kurulumu yapabileceği varsayılacaktır.

Önce VMware'in Virtual Network Editor'ünde diğer bütün ağlardan ayrı bir ağ oluşturulur. Virtual Network Editor'u açınca gelen pencerede "Add Network"e basılır. Penceredeki değeri değiştirmeye gerek yoktur. Tamam'a basınca yeni bir ağ tanımlanmış olur. Ağın türü 'Host-only' olmalı ve DHCP kapalı bırakılmalıdır. Alt-ağ adresi olarak 192.168.150.0/24 girilecektir. Normalde bu aralık rastgele atanır ama en alt satırda istenildiği gibi ayarlanabilir. Son durumda ayarlar yandaki gibi olacaktır. Tamam'a basınca Windows'ta 192.168.150.1 IP'li yeni bir sanal arabirim oluşur. 

Bundan sonra VMware'de sanal makina oluşturulacaktır. Makinayı oluştururken VMware'in ayarlara karışmaması için 'I will install the operating system later.' seçilir. Makinaya bir ad verilir. Ben "dhcpserver" adını verdim. Disk için tavsiye edilen 20GB olsa da masaüstü kurulum yapılmayacağından 8GB yeterlidir. Normalde disk "thin provision" olarak oluşturulduğundan yer sorunu olmaz. Yalnız sunucuda birden fazla işletim sistemi bulunacaksa, bütün işletim sistemlerinin dosyalarının diskte olması gerektiğinden daha büyük bir disk alanı gerekir. 

Ayarlarda disk dosyası tek dosya olarak saklanacak ve son adımda "Customize Hardware" diyip bazı değişiklikler yapılacaktır: Sırasıyla, RAM için 1GB ayarlanır. Optik sürücüde "Use ISO image file" diyip CentOS'un kalıp dosyası seçilir. Disket sürücü, ses kartı ve yazıcı kaldırılabilir. Sonuncu ama en önemlisi "Add" diyip bağlantısı "Custom" olan bir ağ kartı eklenir. Burada, yukarıda oluşturulan ağ girilmelidir (örn. VMnet02, yanında host-only yazmalı). İkincil ağ kartı, sunucu bir arabirimden IP dağıtıp diğer makinalarla haberleşirken diğer arabirimden Internet'e bağlanmasını sağlayacaktır. Internet bağlantısı sonradan yüklenecek paketler için gereklidir ve ağdan açılan makinaların Internet bağlantısı için ağ geçidi olarak hizmet verebilir. Bunlar tamamlandığında sunucu kuruluma hazır olur.
Kuruluma hazır sanal sunucu
Sunucu açılır ve CentOS kurulumuna geçilir. Kurulumda Türkçe klavye dışında bütün ayarlar olduğu gibi bırakılır. Hostname olarak ben "dhcpserver" verdim. Zaman dilimi seçilip kurulum tamamlanır. Ağ ayarları işletim sistemi açıldıktan sonra yapılacaktır. Makinanın, NAT yapacak Internet arabiriminin ve Host-only arabirimin MAC adresleri not edilmelidir. Bunlar kartları ayarlarken işe yarayacaktır.

Makina açılınca şu ayarlar yapılmalıdır:
  1. /etc/udev/rules.d/70-persistent-net.rules dosyasında NAT olarak ayarlı arabirimin MAC'inin eth0'a ve Host-only arabirimin eth1'e atanması. Bu adım seçimlik olsa da yazıda eth0 Internet ve eth1 iç ağ kabul edilecektir.
  2. /etc/selinux/config dosyasında SELINUX=disabled yapılır. Bu da seçimlik bir adım ama ileride beklenmedik hatalarla boğuşmayı engelleyecektir.
  3. /etc/sysconfig/network-scripts/ifcfg-eth0 dosyasında ONBOOT=yes olarak değiştirilir. 
  4. /etc/sysconfig/network-scripts/ifcfg-eth1 dosyasında ONBOOT=yes, BOOTPROTO=static olarak değiştirilir ve şu iki satır eklenir: IPADDR=192.168.150.10  NETMASK=255.255.255.0
Son iki adım zorunludur. Ben 192.168.150.10 IP'sini tercih ettim ama host makinaya atanan 192.168.150.1 dışındaki tüm IP'ler verilebilir. Bundan sonra reboot komutuyla makina yeniden başlatılır.

Artık makinaya PuTTY ile bağlanılabilir. Geri kalan işlemler için PuTTY'i kullanmak kopyala/yapıştır sağlaması nedeniyle konsoldan daha pratik olacaktır. 

Ağla yoğun olarak uğraşılacağından iptables kapatılmalıdır. Sanal makina internete NAT ile çıktığından hostta firewall çalışıyorsa iptables'ın kapatılmasının zararı yoktur. Yazının ileriki bölümlerinde iptables tekrar devreye alınacaktır. iptables'ı devre dışı bırakmak için: chkconfig iptables off; chkconfig ip6tables off; service iptables stop; service ip6tables stop komutları verilir. Son olarak SMTP de kapatılır: service postfix stop; chkconfig postfix off.

Makina sanal olduğundan VMware-tools yüklenebilir. Sanal makinada çalışmayanlar yada yüklemek istemeyenler için bu adım seçimliktir. Yükleme betiği perl ile yazıldığından önce yum install perl komutunu verilir. VMware araçlarının en yeni çekirdeğe kurulması için "yum update" komutu verilir. Bu güncelleme adımı da seçimliktir ama önemli bir ipucu: VMware araçları yüklendikten sonra çekirdek değişirse bu araçların yeniden yüklenmesi gerekir. Güncelleme bittikten sonra makina yeni çekirdekle başlatılır. Sanal makinanın sağ tuş menüsünden VMware araçlarının yüklemesi seçilir. Bu, VMware araçlarının bulunduğu CD kalıbının sanal sürücüye takılmasını sağlar. CD, herhangi bir dizine mount edilir; içindeki VMware-tools-<sürüm>.tar.gz dosyası diske kopyalanır, açılır ve içerisindeki vmware-install.pl betiği çalıştırılır. Minimal kurulumda, dizin paylaşım hizmetinin ve sürükle-bırak desteğinin açılması hizmet başlarken hata alınmasına yol açar.

paketleri yükle...
Buraya kadar olan adımlarla henüz boş bir makina oluşturulmuştur. Bundan sonra yum ile şu paketler yüklenmelidir:
  • dhcp
  • syslinux
  • tftp-server
  • nfs-utils
  • nfs4-acl-tools
  • portmap

DHCP Sunucusu Kurulumu
Dikkat: Yanlış ayarlanmış bir DHCP sunucusu bulunduğunuz ağdan atılmanıza neden olabilir.

Yazıda sanal makinanın arabirimi 'host-only' olduğundan sorun oluşturmaz ancak fiziksel makinalarda ve 'bridged mode'da çalışan arabirimleri olan sanal makinalarda dikkat etmek gerekir.

/etc/dhcp/dhcpd.conf dosyasının içeriği aşağıdaki gibi olmalıdır:

subnet 192.168.150.0 netmask 255.255.255.0 {
range 192.168.150.101 192.168.150.200;
option routers 192.168.150.10;
option domain-name-servers 212.252.114.8;
option subnet-mask 255.255.255.0;
option time-offset 2;
filename "pxelinux.0";
}

Anahtar kelimeler yeterince açık olduğundan açıklama verilmemiştir. Kelimelerle ilgili ayrıntılı belgeye http://linux.die.net/man/5/dhcpd.conf adresinden ulaşılabilir. "Option" ile başlayan satırlar seçimlik olup, istemcileri Internete çıkarırken işe yarayacaktır. Buradaki en önemli satır olan "filename "pxelinux.0";" satırı, bir makina ağdan boot etmek için sunucuya geldiğinde ona pxelinux.0 adlı dosyayı göndermesini sağlar. Bu olmazsa sunucu herhangi bir DHCP sunucu olur. DNS satırındaki IP, Superonline DNS'ine ait olup örnektir. Keyfi herhangi bir DNS de olabilir.

Sanal makina donanım ayarları
chkconfig dhcpd on; service dhcpd start komutuyla sunucu başlatılır. Bu aşamada sunucuyu denemek için disksiz bir sanal makina oluşturulup Knoppix ile açılacaktır. Daha önceki gibi bir sanal makina daha oluşturulur. Farklı olarak Knoppix, Debian tabanlı bir dağıtım olduğundan işletim sistemi olarak Linux ve "Debian 6 64-bit" seçilmelidir. Bu sanal makina sonradan istemci olarak da kullanılacağından ben adını dhcpclient01 verdim. Makina oluşturulduktan sonra "Settings" seçilerek donanım özellikleri ayarlanır. Sabit diski silinir, optik sürücüye Knoppix'in kalıp dosyası yerleştilir, ağ kartı host-only olarak VMnet02'ye bağlanır.

Makina Knoppix ile açıldıktan sonra terminalde hangi IP'yi aldığına bakınca sonuç başarılıdır.

Bu aşamada istemci açıkken, ihtiyaç olacak bazı dosyalar bu makinadan alınacaktır. Aslında bu yazıda anlatılan işi Knoppix otomatik olarak yapar ve bunun adı "Knoppix Terminal Server"dır.


Sunucu çalıştırılınca bazı sorular sorar ve buna göre bir PXE boot sunucusu çalıştırır. Bütün sorularda OK'a basılarak temel bir ayar oluşturulur, sonradan bu dosyalar sunucuda elle düzenlenecektir. Knoppix'de bu sunucu çalıştırıldığında /tmp/tftpboot dizinini oluşturur. Gereken dosyalar bu dizin altındaki miniroot.gz dosyası ve /tmp/tftpboot/pxelinux.cfg/default dosyasıdır. Bunların scp ile sunucuya kopyalanması gereklidir.



TFTP Sunucusunun Ayarlanması
TFTP ayarlanması muhtemelen en kolay sunucudur. /etc/xinetd.d/tftp dosyasında disable = yes satırı disable = no yapılır ve xinetd servisi yeniden başlatılır. xinetd altında çalışan hizmetlere chkconfig ile bakıldığında tftp: on görülmelidir. Aynı dosya içerisinde "server_args = -s" ile başlayan satır TFTP sunucunun kök dizinidir ve kurulumda /var/lib/tftpboot olarak gelir. Bunu sonraki adımlar için not etmek yararlı olur.


NFS Ayarları
NFS, istemci açılırken kernel yüklendikten ve miniroot açıldıktan sonra CD'deki dosyaların alınması için kullanılacaktır. Bunu ayarlamak da oldukça kolaydır. /etc/exports dosyası yoksa oluşturulur ve içine şu satır girilir:

/var/lib/tftpboot/Knoppix     192.168.150.0/24(ro,async,no_root_squash)

Yukarıdaki dizin oluşturulur. Sırayla rpcbind ve nfs servisi başlatılır. Bu servislerin de başlangıçta açılması için chkconfig rpcbind on ve chkconfig nfs on komutları verilir. Sunucunun çalışıp çalışmadığı diğer makinada "mount -t nfs 192.168.150.10:/var/lib/tftpboot/Knoppix /mnt" komutuyla denenir. Komut sorunsuz çalışmalı ve sözkonusu mount "df -h" çıktısında görülmelidir. Sonrasında istemci kapatılır ve sanal makinadan CD çıkarılır. İstenirse CD sürücü sanal makinadan kaldırılabilir.

Bundan sonra sunucuda PXELinux ayarlanacaktır. Önce, pxelinux.0 dosyası bulunur (/usr/share/syslinux/pxelinux.0 altında olmalıdır) ve /var/lib/tftpboot dizinine kopyalanır. Bu dizin altında pxelinux.cfg adında bir dizin daha oluşturulur. WinSCP ile Knoppix'in kalıp dosyası sunucuya kopyalanır ve dosya "mount knoppix.iso /var/lib/tftpboot/Knoppix -t iso9660 -o loop" komutuyla oluşturulan dizine bağlanır (mount edilir). Bu dizin farklı verilecekse NFS export'larında da aynı dizinin girilmesi gerekir. CD'de, isolinux dizinindeki dosyaların tümü (boot.msg, linux vb.) /var/lib/tftpboot dizini altına kopyalanır. Bir Fedora/RedHat dağıtımını ağdan açmak için gerekli dosyalar initrd.img ve vmlinuz adındadır. Son olarak sunucu yeniden başlatıldığında servisler çalışacaksa yukarıdaki mount işlemi /etc/fstab'a eklenmelidir.

Bundan sonra pxelinux.cfg dizininde bazı boş dosyalar oluşturulur. Bunların adları şöyle olmalıdır:
  1. İstemcinin MAC adresi iki nokta yerine eksi işaretiyle ayrılır. Başına fazladan bir "01-" eklenir. Örn. 01-00-0C-29-01-02-03. MAC adresi sanal makina ayarlarından bulunabilir.
  2. İstemcinin IP adresi onaltılık düzende yanyana yazılır. Örn. 192.168.150.101 için C0A89665. Bu sayının ilk basamağı için bir dosya, ilk iki basamağı için bir dosya, ... diye sekiz tane dosya. Örnekten hareketle C, C0, C0A, C0A8, C0A89, C0A896, C0A8966, C0A89665
  3. "default". Yalnızca default. Bu default'u elle oluşturulmak yerine istemciden alınan default kullanılacaktır. Bu nedenle dosya bu dizine taşınır.
"default" dosyasının içinde açılışta hangi çekirdeğin yükleneceğine, hangi boot parametrelerinin girileceğine dair ayarlar bulunur. Bunun için isolinux.cfg dosyasından da kopya çekilebilir. Bu dosyanın içerisinde "nfsdir=192.168.150.101:/mnt-system" şeklinde satırlar olmalıdır. Bu, Knoppix'in kendi üzerinde çalıştırdığı NFS sunucu IP'si ve yoludur. Bu ayardaki IP'yi sunucunun IP'si (192.168.150.10) ve yolu /etc/exports'da verilen yol olarak ayarlamak gerekir. Bu dosyadaki diğer anahtar kelimelerden başlıcaları şöyle:
  • secure kelimesi istemcilerde root kullanıcısına erişimi kapatır. Örneğin lab ortamı için tercih edilebilir. 
  • lang hem işletim sisteminin dilini hem de klavye düzenini belirler. Knoppix'de varsayılan Almanca QWERTZ klavyedir. lang=en yada lang=tr girilebilir.
  • video ile açılışın grafik yada metin ekranda yapılması seçilebilir.
  • tz saat dilimini seçmeye yarar. localtime BIOS saatini kullanır, başka bir zaman dilimi açılışta seçilebilir.
Buna benzer satırların birden fazla olduğu görülebilir. İlk satır varsayılan değer, diğerleri de seçeneklerdir. Tek bir seçenek için aşağıdaki kadarı yeterli olacaktır:

PROMPT 1
DEFAULT Knoppix
TIMEOUT 30
DISPLAY boot.msg
LABEL Knoppix
KERNEL linux
APPEND secure nfsdir=192.168.150.10:/var/lib/tftpboot/Knoppix   nodhcp lang=tr ramdisk_size=100000 init=/etc/init apm=power-off nomce loglevel=1 initrd=miniroot.gz libata.force=noncq tz=localtime BOOT_IMAGE=knoppix

Son olarak, bu makinaya daha önceden kopyalanan miniroot.gz de /var/lib/tftpboot dizine kopyalandığında sunucu hazır duruma gelir.

Şimdi istemciyi çalıştırınca Knoppix açılacaktır.


Bununla birlikte bir sonraki adım için route -n komutuyla bakıldığında varsayılan ağ geçidi (default gateway) 192.168.150.10 görünmeli ve /etc/resolv.conf'ta DHCP ayarlarında girilen DNS sunucunun IP'si bulunmalıdır. Örn. Superonline DNS.

iptables Kuralları ve Gateway'in Ayarlanması
En başta iptables kapatılmıştı. Şimdi NAT için iptables kullanılacağından chkconfig ile iptables ve her ne kadar kullanılmayacaksa da ip6tables açılıp, service iptables start ve service ip6tables start ile servisler başlatılsın. Bu halde iptables, istemcinin sunucuya erişimini kısıtlayacak ve makina açılamayacaktır. Burada tek tek portları anlatmak, özellikle RPC'nin statik olmayan portları kullanması nedeniyle zor (iptables için bu portlar ayar dosyalarıyla sabitlenir). Bu nedenle eth1'in bağlı olduğu iç ağ güvenilir kabul edilip, firewall iç ağa aşağıdaki komutla açılacaktır:

iptables -I INPUT -i eth1 -s 192.168.150.0/24 -j ACCEPT

service iptables save komutuyla bu kural kaydedilir. İstenirse iç ağda sunucu yada port bazında engellemeler yapılabilir. Bu ayarla artık sunucu sorunsuz açılır ama paketleri iletebilir durumda değildir. Bunun için /etc/sysctl.conf dosyası açılır ve net.ipv4.ip_forward değeri sıfırsa bir yapılır. Yapılan değişikliğin yeniden başlatmadan aktifleşmesi için echo 1 > /proc/sys/net/ipv4/ip_forward komutu girilir. 

Artık sunucu paketleri iletebilir fakat nereye ileteceğini bilemez. Bunun için iptables'da eth1'den gelen paketleri al eth0'a gönder, geri dönen cevapları da eth0'dan eth1'e gönder şeklinde bir kural aşağıdaki gibi girilecektir:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state  --state RELATED,ESTABLISHED -j ACCEPT 
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Bu komutlardan sonra tekrar service iptables save çalıştırılır. Son olarak /etc/sysconfig/iptables dosyası içinde -A FORWARD -j REJECT --reject-with icmp-host-prohibited satırı varsa, bu silinir ve iptables yeniden başlatılır. Bu satır RedHat kurulumunda standart olarak gelir ve FORWARD zincirinin başında, gelen paketleri reddeder. Yukarıda FORWARD zincirine eklenen satırlar, bu satırın altında kaldıklarından çalışamazlar. Bu satır silinip servis yeniden başlatıldığında sorun ortadan kalkar. 







Bu arada fark edileceği üzere iptables kuralları /etc/sysconfig/iptables dosyasında saklanmaktadır ancak kuralları komutla girmek daha pratik olduğundan tercih edilmiştir.

 Görüldüğü üzere artık paketler dışarı çıkabiliyor.
İstenirse iptables yerine sunucuda squid vekil sunucu da tercih edilebilir ancak vekil sunucu istemci tarafında ek ayar gerektirir.

Miniroot.gz Dosyası Hakkında
Açılışta Linux çekirdeği yüklendikten sonra boot parametrelerinde verilen miniroot.gz dosyası kök dizine açılarak init çalıştırılır. Bu dosyada işletim sisteminin minimumda çalışması için gerekli dosyalar sıkıştırılmış olarak bulunur. Yan görüntüdeki komutlar çalıştırılırsa (son komutun çıktısı biraz uzundur) başlangıçtaki dosya sistemi diske açılır. Peki bu neye yarar?

miniroot.gz, Knoppix'de oluşturulmadan önce sihirbaz hangi ethernet kartlarını deneyeyim diye sormuştu. Soru, seçili olanlara dokunmadan OK diyip geçilmişti. Knoppix, bu kartların çalışması için gerekli çekirdek modüllerini /modules dizinine yükleyip açılışta bu modüllerin yüklenmesini sağlar. Örneğin açılışta bir makinanın ethernet kartı tanınmadıysa, "/init: cd: line 1: can't cd to /modules/net" gibi bir hatayla kabuk açılır ama hiçbir modül yüklenmemiş kabukta DOS'tan daha fazla seçenek yok gibidir. Sihirbaz kullanmadan bir modülü miniroot'a eklemek için; dosya sistemi açılır, gerekli çekirdek modülü /modules dizinine kopyalanır ve miniroot.gz şu komutla tekrar oluşturulur:

find . | cpio -oH newc | gzip -9 > ../miniroot.gz

Yeni miniroot'ta ethernet kartının modülleri olacağından düzgün bir şekilde yüklenip açılması beklenir. 


Birden Fazla Bilgisayarın Sunucudan Açılması
Gerçek bir durumda örneğin bir lab kurulması planlanıyorsa birden fazla bilgisayarın olacağı açıktır. Bu durumun benzetimini VMWare'de yapmak için ilk oluşturulan dhcpclient01'i klonlanır. Full Clone'la birlikte makinalar istenilen adlarla klonlanır. İlk makinanın diski olmadığından yeni makinalarda da disk bulunmaz ve disk olmadığından makinalar hızla klonlanabilir. Dört tane makina oluşturulup hepsi başlatıldığında sorunsuz açıldıkları görülmüştür. Burada belki SSD disk, performans açısından yararlı olabilir.


Kamera Arkası
Neden böyle bir bölüme gerek duydum? Açıkçası daha sık yazı eklemek istemekle birlikte bu yazı sanıyorum daha öncekiler arasında beni en çok uğraştıranı oldu. En önce VirtualBox beni uğraştırdı.

Fikir, Ekim-Kasım 2014 gibi ortaya çıkmıştı ancak VirtualBox'taki sorun nedeniyle yazıya Şubat ortasında başladım ve Mart ortasında içerik olarak bitirebildim. Editoryal kısım bunun dışındadır. İlk önce vmware-tools sorun çıkardı. Minimal'de kurduğumda açılışta hata alıyordu ancak Masaüstü sürümde hata almıyordu. Hangi paketin eksik olduğunu tek tek denedim. X paketlerine gelince sorunun pano paylaşımı ve sürükle-bırak'ta olduğunu farkettim. VMWare-tools kurulumu konusunda biraz da takıntılı davrandım. 

Yazının devamında işletim sistemi dosyalarını HTTP ile aktarmak istiyordum ancak Knoppix'te bununla ilgili kaynak bulamadım. Hatta tam makinayı ağdan açtım, yazıyı bağlayabilirim derken CD'yi sürücüde unuttuğumu farkettim. Çekirdek TFTP'den yükleniyordu ama init /dev/sr0'a baktığından tesadüfen doğru çalışmıştı.

Sonrasında yazıyı NFS'e çevirdimse de Knoppix'le bir hayli uğraşmak zorunda kaldım. Bir ara CentOS7 live'la açayım diye düşündüm. Bu arada dikkatli okuyucu "yum install" ekran görüntüsünde hala httpd olduğunu NFS olmadığını fark etmiştir. Sonrasında Knoppix'in kendi terminal sunucusunu keşfetmemle doğru ayarları buradan aldım ve yazı tam ortasında tekrar değişti. Son değişiklikleri gözden geçirmek için yazıdaki adımları tek tek yaparak kurulumu baştan gerçekleştirdim. 

En sonda ağ geçidi kurulumunda da iptables'da hangi kuralın beni engellediğini farketmem biraz zamanımı aldı ve bir aylık bir uğraş sonucunda yazı yayına hazır duruma geldi.