Cihazın Açılması
Raspberry Pi 2 yalnız microSD üzerinden açılabilmektedir. Bu sebeple SD kart üzerinde, biri boot dosyaları diğeri ise dosya sistemi için gerekli, iki adet bölümlendirme (partition) bulunmalıdır. FAT32 formatlı boot bölümlendirmesinde önyükleyiciler, çekirdek ve gerekli diğer dosyalar bulunurken, diğer bölüm cihazın tanıyabileceği formatta bir dosya sistemini içermektedir.
SD kart üzerine gerekli dosyaları kendimiz yazabileceğimiz gibi Raspberry Pi desteği olan bir dağıtımı da kullanabiliriz. Şimdi sırayla bu yöntemlere bakalım.
SD Karta Gerekli Dosyaların Kopyalanması
İlk olarak, SD kart üzerinde boot dosyalarını alabilecek büyüklükte (FAT32 dosya sisteminde minimum disk bölümü 32MB olabilir bununla birlikte boot yükleyici FAT16 ile de çalışmaktadır) bir FAT32 bölümü ve dosya sistemi için ext4 bölümü oluşturmalıyız. Bu amaçla Linux altında fdisk veya gparted gibi uygulamaları kullanabilirsiniz.
Linux altında SD kartları /dev/mmcblk0
, /dev/mmcblk1
vb. şeklinde tanınmaktadır. İlk tanına SD kart üzerinde oluşturularak birinci disk bölümünün aygıt ismi de /dev/mmcblk0p1
şeklinde olacaktır (0 değil 1'den başladığına dikkat ediniz).
Disk bölümlendirmek genel olarak konumuzun dışında olsa da, örnek olması açısından aşağıda disk bölümlendirme tablosu (partition table) tamamen boş olan ve /dev/mmcblk0
şeklinde algılanmış bir SD kart için gereken fdisk
komutlarının pipe yöntemiyle verilip FAT32 türünde formatlanması gösterilmektedir:
$ echo "n
p
1
+64M
t
c
w
" | sudo fdisk /dev/mmcblk0 && sudo mkfs.vfat /dev/mmcblk0p1
FAT32 boot bölümünde asgari aşağıdaki dosyalara ihtiyaç duymaktayız.
Dosya | Görevi |
---|---|
bootcode.bin | Alt seviye önyükleyici |
start.elf | GPU firmware |
fixup.dat | SDRAM'in GPU ve CPU arasında bölümlendirilmesinde kullanılıyor |
kernel.img | Kernel imajı |
config.txt | start.elf tarafından okunan ayar dosyası |
cmdline.txt | Kernel'a geçirilecek komut satırı argümanlarını barındıran dosya |
bcm2709-rpi-2-b.dtb | Kernel derleme aşamasında üretilmiş olan Device Tree Block dosyası |
Daha önce de söylediğimiz gibi config.txt dosyası ile sistem ayarları değiştirilebilmekte (ARM ve GPU frekansları, RAM paylaşımları) ayrıca önyükleyiciye müdahale edilebilmektedir. Bu dosyanın içeriğini BIOS ayarlarına benzetebiliriz. config.txt içinde yüklenecek çekirdeğe ilişkin herhangi bir atıf bulunmadığı sürece start.elf, kernel.img dosyasını yüklemekte ve ARM işlemciyi reset modundan çıkarmaktadır. Çekirdek imajı olarak önyükleyicilerle beraber gelen kernel.img dosyasını kullanabileceğiniz gibi daha önce derlediğimiz zImage dosyasını da kernel.img olarak kopyalayıp kullanabilirsiniz.
Örnek bir config.txt
içeriği aşağıdaki gibidir:
kernel=kernel.img
Örnek bir cmdline.txt
dosyasının içeriği ise aşağıdaki gibidir:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
ÖNEMLİ NOT: Raspberry Pi için diğer kaynaklarda da yukarıdaki gibi bir örnek
cmdline.txt
dosyası ile karşılaşacaksınız. Burada verilen çekirdek açılış parametrelerindeconsole
bölümünün 2 defa yer aldığına dikkat ediniz. Örneğimizdeconsole
öncelikle seri konsola atanmış, sonra bir detty1
aygıtı üzerine atanmış. Bu şekilde boot edilen bir çekirdek konsola gidecek mesajları her iki aygıta da gönderir (örneğimizde seri port ve HDMI üzerindeki tty konsolu) ancak sonuncuconsole
parametresi olarak hangi aygıt belirtilmişse sadece oradan girdi alır. Yani yukarıdaki argümanlarla boot edecek olursanız konsol çıktıları hem seri portta hem de bağlı ise HDMI monitorde görünecek, Linux açıldıktan sonra ise seri konsoldan giriş yapamayacak, sistemdeki USB portuna takacağınız bir USB klavye ile giriş yapmak durumunda kalacaksınız. Giriş işlemleri için de seri konsolu kullanmak istiyorsanızcmdline.txt
içerisinde sıralamayı uygun şekilde değiştirebilir veyaconsole=tty1
bölümünü tamamen kaldırabilirsiniz.
Temel bir dosya sisteminin nasıl oluşturulduğunu kitabımızın Kök Dosya Sistemi Oluşturma bölümünde bulabilirsiniz.
Kök Dosya Sisteminin SD Karta Aktarımı
Cihazı SD kart üzerindeki bir kök dosya sistemi ile açmak için, önceki aşamalarda hazırlamış olduğumuz kök dosya sistemini SD kartın ilgili bölümüne kopyalamamız gerekiyor.
Bunun için eğer henüz yoksa fdisk
vb. bir disk bölümlendirme aracı ile SD kart üzerinde Linux tipinde (83) ikinci bir disk bölümü oluşturmalı, bu bölümü kullanmak istediğimiz dosya sisteminin türüne göre biçimlendirmeli ve sonrasında ilgili bölümü sistemimize mount edip hazırlamış olduğumuz kök dosya sistemini bu alana kopyalamalıyız.
Disk bölümünün /dev/mmcblk0p2
ismiyle oluşturduğumuzu ve kök dosya sistemini /opt/rpi
dizininde oluşturduğumuzu, geçici mount dizini olarak da /mnt/tmp
'yi kullanacağımızı varsayarsak komutlarımız şu şekilde olacaktır:
$ sudo mkfs.ext4 /dev/mmcblk0p2
$ sudo mount /dev/mmcblk0p2 /mnt/tmp
$ sudo cp -a /opt/rpi/* /mnt/tmp/
$ sudo umount /mnt/tmp
Artık sistemimiz SD kart üzerindeki kök dosya sistemi üzerinden açılmak için hazır.
Cihazın U-Boot Üzerinden Açılması
config.txt içine aşağıdaki gibi bir giriş eklediğimizde start.elf kernel yerine u-boot'u yükleyecek ve sonrasına ARM işlemciyi çalıştıracaktır. Öncesinde, SD kartın boot bölümüne daha önce derlediğimiz zImage ve u-boot.bin dosyalarını kopyalamalıyız.
kernel=u-boot.bin
u-boot komut satırına düştükten sonra çekirdek ve ilgili dtb dosyasını belleğin güvenli bir alanına çekip, çekirdeğe kök dosya sistemi ve konsolla ilgili değerleri geçirdikten sonra aşağıdaki gibi çalıştırabiliriz.
mmc dev 0
fatload mmc 0:1 0x01000000 zImage
fatload mmc 0:1 0x02000000 bcm2709-rpi-2-b.dtb
setenv bootargs earlyprintk console=ttyAMA0 console=tty1 root=/dev/mmcblk0p2 rootwait
bootz 0x01000000 - 0x02000000
DİKKAT: 20 Haziran 2015 itibariyle Raspberry Pi 2 modeli için hazırlanmış u-boot uygulaması ile SD kart üzerinden okuma işlemi 80 KB/s gibi oldukça düşük bir hızda çalışmaktadır. Bu nedenle çekirdek imajının yüklenmesi 40-50 saniye arasında zaman almakta olup yakın gelecekte sorunun giderilmiş olması beklenmektedir.
U-Boot Ortam Değişkenlerinin Düzenlenmesi
Bir önceki örneğimizde u-boot konsolu üzerinden komutlar girerek sistemin açılması gösterildi. Eğer her defasında komutları girmek yerine öntanımlı açılışın bu şekilde gerçekleşmesini istiyorsak, u-boot ortam değişkenlerini düzenleyerek non-interactive açılış sürecini yönlendirebiliriz.
Buraya kadar olan çalışmalarınızda dikkatinizi çekti ise, u-boot ilk açılırken aşağıdaki gibi mesajlar çıkmaktaydı:
reading uboot.env
** Unable to read "uboot.env" from mmc0:1 **
Using default environment
Görüleceği üzere ilk çalıştırmada uboot.env
adlı bir dosya aranmakta ve bulunamadığı için öntanımlı ortam değişkenlerinin kullanılacağına dair bilgi verilmektedir.
uboot.env
dosyasının formatı basit olmakla birlikte, bir metin dosyası olarak hazırlanması mümkün değildir (NULL değerler ve padding yapılması gerekecektir)
Bununla birlikte u-boot kodu içerisindeki tools
dizini altında mkenvimage
adlı yardımcı bir uygulama çıkmaktadır. Bu uygulama ile istenen uboot.env
dosyasını oluşturabiliriz.
Öncelikle istediğimiz ortam değişkenlerini bir metin dosyasını yazmalıyız. Bunun için aşağıdaki satırları /tmp/uboot.env.txt
adlı yeni bir geçici dosya oluşturup içerisine kopyalayın:
arch=arm
baudrate=115200
board=rpi_2
board_name=rpi_2
bootargs=earlyprintk console=ttyAMA0 console=tty1 root=/dev/mmcblk0p2 rootwait
bootcmd=run mmcboot
mmcboot=setenv devnum 0; mmc dev 0; fatload mmc 0:1 ${kernel_addr} zImage; fatload mmc 0:1 ${fdt_addr} ${fdtfile}; bootz ${kernel_addr} - ${fdt_addr}
bootdelay=2
cpu=armv7
fdt_addr=0x2000000
fdtfile=bcm2709-rpi-2-b.dtb
kernel_addr=0x1000000
loadaddr=0x00200000
scriptaddr=0x00000000
soc=bcm283x
stderr=serial,lcd
stdin=serial,lcd
stdout=serial,lcd
usbethaddr=b8:27:eb:4c:66:85
vendor=raspberrypi
Ardından mkenvimage
komutunu u-boot kaynak kod ana dizininde bulunduğunuzu varsayacak olursak aşağıdaki gibi çalıştırın:
$ tools/mkenvimage -s 0x4000 -o /tmp/uboot.env /tmp/uboot.env.txt
Örneğimizdeki -s
parametresi oluşacak dosyanın boyutunu belirlememizi sağlamaktadır. Dosyanın 4 KB ve katları şeklinde olması beklenir. Biz burada 16 KB (0x4000) şeklinde belirtmiş olduk. Ortam değişkenlerimiz bu kadar yer kaplamıyor, kalan alan 0xFF
ile doldurulacak ve uygun checksum değeri hesaplanacaktır.
İşlem bitiminde oluşan uboot.env
dosyasını SD kartımızın u-boot'u barındıran ilk bölümüne kopyaladığımızda bir sonraki açılışta yeni değerlerin aktifleştiğini (printenv
komutuyla u-boot ekranında teyit edilebilir) göreceksiniz.
Cihazın Bir Dağıtım Üzerinden Açılması
Raspberry Pi, Raspbian, Ubuntu MATE, Ubuntu Snappy Core, OpenELEC ve RISC OS olmak üzere birçok sürüm tarafından desteklenmektedir. Biz incelememizde Debian tabanlı Raspbian dağıtımını kullanacağız. Aşağıdaki bağlantıdan Rasbian veya başka bir dağıtımı indirebilirsiniz.
https://www.raspberrypi.org/downloads/
Sonrasında elde ettiğimiz 2015-05-05-raspbian-wheezy.zip dosyasını açmalı ve işletim sistemi imajını SD karta yazmalıyız. Sisteminizde SD karta ilişkin dosya düğümünü belirledikten sonra yazma işlemini dd ile yapabilirsiniz. Sistemimiz için örnek bir yazma aşağıdaki gibidir.
Not: sudo fdisk -l ile sisteminizdeki bölümlendirme tablosunu listeleyebilirsiniz.
Yazma işleminden önce SD kartınızın dosya sisteminize mount edilmemiş olduğundan emin olunuz.
dd bs=4M if=2015-05-05-raspbian-wheezy.img of=/dev/sdb
Not: dd ile yapılan kopyalama işleminin ilerleyişini izlemek için başka bir terminalde aşağıdaki komutu girebilirsiniz.
pkill -USR1 -n -x dd
Bu işlem sonrasında SD kartınızda daha önce bizim elle kopyaladığımız dosyaları da içeren bir boot bölümü ve dosya sistemine ilişkin ikinci bir bölüm oluşmuş olmalıdır. SD kartı cihaza takıp çalıştırdığımızda işletim sistemi açılmalıdır.
Benzer işlem Raspberry Pi işletim sistemi yükleyicisi NOOBS ile de yapılabilmektedir. NOOBS, Raspbian dağıtımının içermekte ayrıca internet üzerinden indirdiği başka dağıtımları da cihaz üzerine kurabilmektedir. NOOBS yükleyicisini yine aşağıdaki adresten indirip, .zip dosyasını açtıktan sonra bir önceki adımda yaptığımız gibi dd ile SD karta yazabilirsiniz.
https://www.raspberrypi.org/downloads/
SD kartı cihaza takıp enerji verdiğinizde cihaz recovery modda açılacaktır. Cihazı HDMI üzerinden bir ekrana bağladıktan sonra, GUI üzerinden istediğiniz dağıtımı seçebilir ve cihaza yükleyebilirsiniz.