Home / Raspberry Pi Dersleri / Raspberry Pi 3 – Ethernet Boot (Network Boot)

Raspberry Pi 3 – Ethernet Boot (Network Boot)

Bir önceki yazımızda Raspberry Pi 3’ü USB üzerinden boot etme konusunu anlatmıştık. Bu yazımızda ise tamamen SD kartsız bir şekilde Raspberry Pi 3 cihazımızı Ethernet üzerinden boot etmeyi anlatıyoruz. Bu işlem oldukça karmaşık gibi görünse de benim başarıyla deneyip uyguladığım bir sistem. Yani kesinlikle çalışıyor 🙂 Öncelikle şunu bilmelisiniz, wireless üzerinden bu iş olmaz, direkt olarak kablolu ağ üzerinden gerçekleşmelidir bu sistem.

Sistem Gereksinimleri

İçerik

  • 2 Adet Raspberry Pi 3. (bir tanesi boot olacak client, diğeri ise tftp server)
  • birer adet modem ve switch (bizim DHCP ve DNS Server’a ihtiyacımız olacak, bu işlerle uğraşmak yerine modem bizim için yapsın)
  • 3 adet ethernet kablosu.
  • 1 Adet SD kart yeterli, Raspbian Lite sürümü yüklü olursa çok ama çok iyi olur.

Sistemin Uygulanışı

Modemin ethernet portuna ethernet kablosunun bir ucunu, diğer ucunu da switch’e takın.

Daha sonra da raspberry pi cihazlarınızı aynı şekilde switche bağlayın.

Client Raspberry Pi 3 cihazının hazırlanışı

Client Raspberry Pi demekle kast ettiğimiz network üzerinden boot olacak cihaz demek. Bu cihaz bir kere SD kart ile boot edilmeli ve programlanmalıdır. Client cihazınızın terminalini açın ve update edin.

$ sudo apt-get update

Şimdi USB boot mode’u aktif edeceğiz.

echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt

Cihazımızı yeniden başlatalım

sudo reboot

Cihazımız bir kere yeniden başladıktan sonra programlanacaktır. Programlandığını aşağıdaki komutla kontrol edebilirsiniz.

$ vcgencmd otp_dump | grep 17:
17:3020000a

Komutu çalıştırdığınızda yukarıdaki gibi bir çıktı görüyorsanız işleminiz tamamdır. Eğer farklı bir çıktı geldiyse cihazınız network üzerinden boot olmaz. Buraya dikkat edin.

Şimdi aşağıdaki komutu çalıştırıp cihazınızı kapatın.

sudo poweroff

Raspberry TFTP Server Konfigürasyonu

Şimdi Client üzerinde kullandığınız SD Kartı çıkartın ve Server olan Raspberry Pi cihazınıza takın. Cihazınızı çalıştırdıktan sonra sudo raspi-config komutunu girin ve expanded root filesystem seçeneğinin enable olduğundan emin olun.

Şimdi root klasörlerimizi tutmak için bir tane klasöre ihtiyacımız olacak. Daha sonra SD kartımızın içerisindeki her şeyi buraya yükleyeceğiz. Bunun için rsync kullanacağız. Aşağıdaki komutları sırayla girmeniz yeterli. rsync işlemi biraz süre alacaktır.

sudo mkdir -p /nfs/client1
sudo apt-get install rsync
sudo rsync -xa --progress --exclude /nfs / /nfs/client1

Bu işlemden sonra SSH Host keylerini chroot olarak regenerate etmemiz gerekmekte. Aşağıdaki komutları adım adım uygulayın.

cd /nfs/client1
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bind /proc proc
sudo chroot .
rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
exit
sudo umount dev
sudo umount sys
sudo umount proc

Network Ayarları

Şimdi Network Ayalarını yapmamız gerekli, ip adresinizi ve router’ınızı bulmanız lazım. Eğer ev modemini ve switch’ini kullanıyorsanız bu adım çok önemli.

ip route | grep default | awk '{print $3}'
ip -4 addr show dev eth0 | grep inet

Yukarıdaki komutları sırasıyla çalıştırın. Aşağıdaki formatta bir çıktı alacaksınız.

inet 10.42.0.211/24 brd 10.42.0.255 scope global eth0

10.42.0.211 ile gözüken bizim ip adresimizdir. Sizde değişik olması son derece normal. brd yazan yer broadcast adresidir. Burayı mutlaka kayıt edin. Daha sonra soracağım size.

Şimdi de DNS adresimizi kontrol edelim. (Ev internetiyse Modemin DNS bilgilerini gösterir.)

cat /etc/resolv.conf

Bu bilgileri kayıt edin.

Şimdi sabit IP adresi vermemiz gerekecek. Bunun için

sudo nano /etc/network/interfaces

komutunu girin. iface eth0 inet manual satırını silin. Bunun yerine aşağıdaki satırları girin.

auto eth0
iface eth0 inet static 
        address 10.42.0.211
        netmask 255.255.255.0
        gateway 10.42.0.1

address: ip adresinizdir. Burayı kendi ip adresinizle değiştirin.

netmask: subnet bilginizdir. Kendi subnetinizle değiştirin. (Bu genelde aynıdır, hele ev networklerinde)

gateway: aslında bu bilgi başka ağa geçmek içindir. Ancak ev ortamında modeminizin ip adresini girebilirsiniz.

Şimdi DHCP Client Daemon’u disable edip, Debian Networking’i aktif edeceğiz.

sudo systemctl disable dhcpcd
sudo systemctl enable networking

Değişiklikler geçerli olsun diye reboot yapalım.

sudo reboot

Şimdi DNS adresimizi tekrar girmemiz gerekiyor. Unutmayın, DNS adresiniz modemin ip adresi olacak.

echo "nameserver 10.42.0.1" | sudo tee -a /etc/resolv.conf

Yukarıdaki satır ip adresini resolv.conf dosyasına ekleyecektir.

Şimdi bu dosyayı immutable yapmamız gerekiyor. Yani üzerine hiçbir program yazamamalı. Sebebi de dnsmasq isimli bir dosya kuracak olmamız. Bu dosya mevcut dosyanın bilgilerini siler, kendisinkini girer, bunu istemiyoruz.

sudo chattr +i /etc/resolv.conf

DNSMASQ Kurulumu

Normalde bir cihazı network’ten boot etmemiz için TFTP denilen bir protokolü kullanılırız. Bunu kendimiz ayrı olarak da yükleyebilirdik. Ancak DNSMASQ bu işi bizim için hallediyor, içerisinde kendi DNS Servisi bile bulunuyor. (bununla işimiz yok) Şimdi DNSMASQ kurulumu işlemini gerçekleştirelim.

sudo apt-get update
sudo apt-get install dnsmasq tcpdump

dnsmasq DNS çözümlemesi yapmasın diye aşağıdaki komutları giriyoruz.

sudo rm /etc/resolvconf/update.d/dnsmasq
sudo reboot

Şimdi Client üzerinden gelen paketleri yakalayabiliyor muyuz ona bakalım. (Client’ın networke bağlı olduğunu umuyorum)

sudo tcpdump -i eth0 port bootpc

Aşağıdaki gibi bir çıktı görüyorsanız, doğru gidiyoruz demektir.

IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from b8:27:eb...

Şimdi dnsmasq’ın DHCP servisinin Client’a yanıt vermesi için bir takım konfigürasyon işlemlerini gerçekleştirelim.

sudo echo | sudo tee /etc/dnsmasq.conf
sudo nano /etc/dnsmasq.conf

Açılan Editörde konfigürasyonlarımızı yapalım.

port=0
dhcp-range=10.42.0.255,proxy
log-dhcp
enable-tftp
tftp-root=/tftpboot
pxe-service=0,"Raspberry Pi Boot"

Yukarıdaki konfigürasyona kendi bilgilerinizi girmezseniz sistem çalışmaz, dhcp-range demek dhcp aralığı demektir, eğer sizin ip adresiniz 192.168.1.x formatındaysa oraya 192.168.1.255 yazın. Daha önceden soracağımı söylediğim broadcast adresini işte buraya yazıyoruz.

Şimdi TFTP için bir dosya oluşturmalıyız. Aşağıdaki satırları aynen girin…

sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
sudo systemctl enable dnsmasq.service
sudo systemctl restart dnsmasq.service

Yukarıdaki işlemlerden sonra dnsmasq loglarını görüntüleyebilirsiniz. (aşağıdaki komutla)

tail -f /var/log/daemon.log

Şimdi Client Raspberry Pi 3 cihazınızın power’ını çıkartıp tekrar takın. daemon.log üzerinde aşağıdaki gibi bir çıktı görmelisiniz.

raspberrypi dnsmasq-tftp[1903]: file /tftpboot/bootcode.bin not found

CTRL+Z ile monitor ekranından çıkın. Aşağıdaki komutu girin. Bu komut boot dosyalarımızı tftpboot dosyasına kopyalacaktır.

cp -r /boot/* /tftpboot

dnsmasq servisini restart edin.

sudo systemctl restart dnsmasq

NFS Kurulumu

Şimdi NFS ne alaka diyorsanız size şöyle anlatayım. Biz dnsmasq ile boot dosyasını network üzerinden Client’a yollayıp boot ettireceğiz, ancak 1 GB’ın üzerinde olan root dosyaları olmadan nasıl işlem yapacağız? işte biz de bu root dosyalarını NFS üzerinden göndereceğiz. Hatırlarsanız en başta /nfc/client1’e bu dosyaları kopyalamıştık. (daha doğrusu rsync etmiştik)

Şimdi aşağıdaki komutları sırayla girin

sudo apt-get install nfs-kernel-server
echo "/nfs/client1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
sudo systemctl enable rpcbind
sudo systemctl restart rpcbind
sudo systemctl enable nfs-kernel-server
sudo systemctl restart nfs-kernel-server

Şimdi sudo nano /tftpboot/cmdline.txt yazın. root= ifadesinden itibaren olan kısmı(kendisi dahil) silin, aşağıdaki satırı aynen yapıştırın.

root=/dev/nfs nfsroot=10.42.0.211:/nfs/client1 rw ip=dhcp rootwait elevator=deadline

IP adresine dikkat edin. Sizde değişim olacaktır. Geri kalanı aynı kalmalı.

Son Adım

Son olarak;

sudo nano /nfs/client1/etc/fstab

satırını çalıştırın.

/dev/mmcblkp1 ve /dev/mmcblkp2 satırlarını tamamen silin.

Şimdi her şey hazır. Client Raspberry Pi cihazına power verin, eğer power verilmişse çıkartın tekrar takın. Network boot, birazcık deneme isteyebilir. Sabredin, mutlaka olacaktır. Kolay gelsin.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir