NFS Root Çalışma

Kök dosya sisteminin cihazın üzerindeki bir depolama biriminde değil de ağ üzerindeki bir NFS paylaşımında yer aldığı senaryo NFS Root olarak adlandırılmakta olup, NFS Root Çalışma başlıklı bölümde ayrıntılarıyla işlenmiştir.

Bu bölümde Raspberry Pi 2 özelinde NFS Root çalışma detaylarını inceleyeceğiz.

NFS Root çalışma yöntemleriyle ilgili destekler (CONFIG_ROOT_NFS=y)kernel imajı içerisine statik olarak eklenmiş olmalıdır.

Start.elf Üzerinden NFS Root Açılışı

Raspberry Pi cihazlarında GPU tarafından yüklenen bootcode.bin ve start.elf adlı boot yükleyiciler bulunmaktadır. Geleneksel u-boot yükleyicisi ile karşılaştırıldığında oldukça farklı olan bu yükleyiciler, nfs root çalışma senaryosu için benzer imkanlar sağlamaktadır.

Cihazla birlikte gelen start.elf boot yükleyicisi, cmdline.txt adlı bir dosya olması halinde burada yer alan kernel commandline parametrelerini ATAGS yöntemiyle çalıştırılacak kernel'a iletmektedir (ARM Mimarisinde Açılış Süreci bölümüne bakabilirsiniz).

NFS üzerinden kök dosya sistemini bağlayabilmek için cmdline.txt dosyasına aşağıdaki satırın girilmesi yeterli olacaktır:

console=ttyAMA0,115200 root=/dev/nfs rw nfsroot=192.168.0.5:/opt/rpi ip=192.168.0.6:::::eth0 rootwait

Eğer DHCP üzerinden ip alınacak ise, ip=dhcp şeklinde de belirtebilirsiniz. Bu senaryonun çalışması için kernel içerisinde CONFIG_IP_PNP_DHCP=y şeklinde seçilmiş olmalıdır.

U-Boot Üzerinden NFS Root Açılışı

Raspberry Pi 2 üzerinde u-boot çalıştırmak, Haziran 2015 itibariyle halen çeşitli önemli sorunlara yol açmaktadır. U-boot içerisinde ethernet kartının çalışır hale getirilmesi her zaman mümkün olmamakta ve cihazı resetleyip yeniden denemek veya u-boot içindeyken dhcp komutuyla ip almayı denemek gerekmektedir. Kernel imajını ağdan yüklemek yerine SD karttan okumak istediğimizde okuma performansı çok düşük olmaktadır.

Bahsettiğimiz olumsuzluklara rağmen u-boot'un kullanım yaygınlığı ve önümüzdeki aylarda bu problemlerin giderilme olasılığı düşünülerek ayrıntılı olarak incelenmiştir.

U-boot üzerinden açılışta en kritik nokta, start.elf örneğinde olduğu gibi doğru command line parametreleri ile kernel imajının çalışmaya başlamasını sağlayabilmektir.

Kernel imajını ve Flattened Device Tree (FDT) tanım dosyasını yükleme yöntemimize göre süreç bir miktar değişmektedir. Aşağıda bu yöntemlerden ağ üzerinden yükleme ve sd kart üzerinden yükleme seçenekleri incelenmiştir.

Kernel ve FDT'nin Ağ Üzerinden Yüklenmesi

Kullanılacak kernel imajı ve fdt dosyası TFTP sunucu ana dizinine konulmalıdır.

U-boot komut satırında ethernet'i kullanmaya başlayabilmek için öncelikle aşağıdaki komut verilmelidir:

usb start

Ardından u-boot'un standart ortam değişkenleri üzerinden ip atama yöntemiyle cihazımızın ve TFTP sunucunun ip adresi belirtilmelidir. Örneğimizde cihaz ip adresi 192.168.0.6, sunucu ip adresi ise 192.168.0.5 şeklindedir.

setenv ipaddr 192.168.0.6
setenv serverip 192.168.0.5

Ardından zImage kernel imaj dosyasını TFTP sunucudan 0x1000000 gibi bir adrese çekelim:

tftp 0x1000000 zImage

Aynı şekilde cihazımız için TFTP sunucu ana dizinine koyduğumuz bcm2709-rpi-2-b.dtb FDT dosyasını 0x2000000 gibi bir adrese çekelim:

tftp 0x2000000 bcm2709-rpi-2-b.dtb

Kernel ve FDT imajları bellekte ve adreslerini biliyoruz. Sonraki adımda command parametrelerini hazırlayabilmek için bootargs u-boot değişkenini aşağıdaki gibi düzenlemeliyiz:

setenv bootargs console=ttyAMA0,115200 root=/dev/nfs nfsroot=192.168.0.5:/opt/rpi ip=192.168.0.6

Son olarak bootz komutuna kernel imajının ve FDT imajının bellekteki adreslerini parametre olarak verip Linux açılış sürecini başlatalım:

bootz 0x1000000 - 0x2000000

Özet olarak aşağıdaki gibi çıktılar almış olmalıyız:

U-Boot> setenv ipaddr 192.168.0.6
U-Boot> setenv serverip 192.168.0.5
U-Boot> tftp 0x1000000 zImage
Waiting for Ethernet connection... done.
Using sms0 device
TFTP from server 192.168.0.5; our IP address is 192.168.0.6
Filename 'zImage'.
Load address: 0x1000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #
         945.3 KiB/s
done
Bytes transferred = 3819416 (3a4798 hex)
U-Boot> tftp 0x2000000 bcm2709-rpi-2-b.dtb
Waiting for Ethernet connection... done.
Using sms0 device
TFTP from server 192.168.0.5; our IP address is 192.168.0.6
Filename 'bcm2709-rpi-2-b.dtb'.
Load address: 0x2000000
Loading: #
         861.3 KiB/s
done
Bytes transferred = 9703 (25e7 hex)
U-Boot> setenv bootargs console=ttyAMA0,115200 root=/dev/nfs nfsroot=172.16.2.64:/opt/rpi,vers=3 ip=192.168.0.6
U-Boot> bootz 0x1000000 - 0x2000000
## Flattened Device Tree blob at 02000000
   Booting using the fdt blob at 0x2000000
   Loading Kernel Image ... OK
   Loading Device Tree to 07b43000, end 07b485e6 ... OK

Starting kernel ...
Uncompressing Linux... done, booting the kernel.
...
[    5.008131] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC1E1
[   10.243929] IP-Config: Complete:
[   10.247276]      device=eth0, hwaddr=66:82:1a:78:a9:2f, ipaddr=192.168.0.6, mask=255.255.255.0, gw=172.16.2.254
[   10.257516]      host=192.168.0.6, domain=, nis-domain=(none)
[   10.263368]      bootserver=192.168.0.5, rootserver=192.168.0.5, rootpath=
[   10.282394] VFS: Mounted root (nfs filesystem) readonly on device 0:14.
[   10.289601] devtmpfs: mounted
[   10.293252] Freeing unused kernel memory: 388K (8072d000 - 8078e000)
Sistem aciliyor...
[   10.534755] random: nonblocking pool is initialized

Please press Enter to activate this console.

Kernel ve FDT'nin SD Kart Üzerinden Yüklenmesi

results matching ""

    No results matching ""