Buildroot

Gömülü Linux sistemlerinin kullanımında temel olarak 3 alternatif yöntem bulunmaktadır:

  • Önceden hazırlanmış bir dağıtım kullanmak (Debian, Ångström vb.)

    • Desteklenen mimari sayısı az
    • Özelleştirmek ve ihtiyaç duyulmayan bileşenlerin çıkartılması zor
    • Kaynak kodlardan yeniden inşa etmek çok güç
  • Elle özel bir dağıtım hazırlamak

    • Uzun ve yorucu bir süreç
    • Çapraz derlemeyle ilgili sorunlu uygulamalara dair detayların öğrenilmek zorunda olması
    • Uygulamaların birbirine olan bağımlılıklarının yönetilmesi güç
  • Elle özel bir dağıtım hazırlarken otomatik inşa sistemi kullanmak

    • Her iki yöntemin kötü yanlarını bertaraf edip iyi yanlarını biraraya getirmeye çalışır

Buildroot projesi, benzer işlemleri sıklıkla yapmak zorunda kalan gömülü Linux sistem geliştiricilerinin hayatını kolaylaştırmayı, bunu yaparken de çok karmaşık ve öğrenilmesi başlı başına problem olan yeni bir sistem daha üretmek yerine, geleneksel araçlarla süreci yönetmeyi hedefler.

Tarihçe

Buildroot, 2001 yılında uClibc geliştiricileri tarafından test amaçlı geliştirilmeye başlandı.

2005 yılında geliştirici sayısı biraz daha arttı, ancak profesyonel bir araç olmanın halen uzağında idi.

2009 yılına kadar görece kontrolsüz bir yapıda proje değişen hızlarda büyümeye devam etti.

2009 yılından itibaren Peter Korsgaard projenin yeni sorumlusu oldu. Bu gelişmenin ardından önemli dizayn değişiklikleri, düzenli çıkan versiyonlar ve buildroot kullanan sistemlerdeki artış projeyi bugünkü haline getirdi.

2015 Ocak ayı itibariyle, Buildroot projesi toplam 35 MB kaynak kodundan oluşmakta olup, içerisinde 1415 adet uygulama paketi yer almaktadır. 300'den fazla geliştirici projeye çeşitli seviyelerde katkıda bulunmaktadır.

Yaklaşım

Buildroot temel olarak Makefile sistemi üzerine inşa edilmiştir. Sistem yaklaşık olarak 1500 adet Makefile dosyasından (.mk uzantılı) oluşur.

Tüm süreç öncelikle ana dizinde yer alan Makefile dosyasının okunmasıyla başlar. Yapılan işlemlere göre gerektiğinde ilgili diğer .mk uzantılı Makefile dosyaları include edilerek ilerlenir.

Not: Projede çalışırken make hedeflerini (make strace, make rootfs-clean vb.) TAB tuşu ile otomatik tamamlattırmak mümkündür, ancak otomatik tamamlama fonksiyonunun tüm dosyaları işlemesi gerektiğinden Makefile sayısının çokluğu nedeniyle bu işlem biraz zaman almaktadır. Böyle bir durumla karşılaşırsanız sabırla bekleyin (5-20 saniye) ve bu özelliği şimdilik fazla kullanmamaya bakın.

Konfigürasyon

Buildroot projesinde konfigürasyon işlemleri için, Linux kernel ve Busybox gibi projelerde kullanılan Kconfig sistemi kullanılmaktadır.

kolayca tanımlanabilmektedir.

Konfigürasyon Seçenekleri

  • Kconfig sistemi ile yapılacak konfigürasyon işleminin sonucunda yapılan seçimler kayıt edilirse, ana dizinde .config dosyası oluşacaktır

  • Temel amaç bu dosyayı oluşturmak olduğundan, daha önce oluşturulmuş olan farklı bir .config dosyası kopyalanmak suretiyle de aynı seçim kümesine ulaşılır

  • Buildroot altında öntanımlı gelen config dosyaları, configs/ dizini altında bulunur (Örnek: beaglebone_defconfig)

  • Konfigürasyon işleminde kullanacağımız GUI aracı için birden fazla seçenek mevcuttur:

Yöntem Açıklama İhtiyaç Duyulan Kütüphaneler
xconfig Qt-4 backend qt4-dev
gconfig Gtk-2 backend gtk-2-dev, libglade-2-dev
nconfig Ncurses backend libncurses-dev
menuconfig curses backend libncurses-dev

xconfig

  • Kullanım: make xconfig

  • Qt4 tabanlı bir arayüz sunar.

xconfig

nconfig

  • Kullanım: make nconfig

  • ncurses tabanlı bir arayüz sunar.

nconfig

  • Kullanım: make menuconfig

  • curses tabanlı bir arayüz olup, kullanımını önermekteyiz.

  • Tüm arayüzlerde ilgili seçenek için girilmiş yardım bilgisine ulaşılabilmektedir (curses arayüzünde h kısayolu ile)

menuconfig

Buildroot Kodunun İndirilmesi

  • buildroot kararlı sürümler her 3 ayda bir yayınlanmakta olup, http://buildroot.uclibc.org/download.html adresinden güncel kararlı sürüm indirilebilir.

  • Özellikle buildroot arşivine projenize özgü eklemeler yapacaksanız, bu durumda git üzerinden projeyi klonlayıp, farklı bir branch oluşturarak, değişikliklerinizi de versiyon takibine alabilirsiniz.

  • Bu şekilde buildroot projesindeki yenilikleri de pull edip, kendi çalıştığınız branch içerisine merge etmek mümkün olacaktır.

    $ git clone git://git.buildroot.net/buildroot

Out-Of-Tree Çalışma Modeli

  • Buildroot out-of-tree çalışma modelini destekler

  • Bu şekilde aynı buildroot çalışma dizinini temel alarak, farklı konfigürasyonlarda, farklı cpu aileleri için build işlemini yapmak mümkündür

  • Bu sayede firma içerisinde aynı veya farklı projelerde buildroot için hazırlanmış ek paketler, konfigürasyonlar var ise, tek bir kaynak kod dizininde bulundurulabilir bu dizinde yer alan buildroot aracılığıyla, farklı çalışma dizinlerinde farklı profillerde çıktılar üretilebilir

  • Bu model kullanılmadığında oluşan çıktılar, buildroot kaynak kodlarının bulunduğu yerde output/ dizini altında oluşturulur (bu yöntemi önermemekteyiz)

Hazır Konfigürasyon Kullanımı

  • Buildroot içerisinde Linux kernel projesinde olduğu gibi, önceden tanımlanmış hazır konfigürasyon dosyaları bulunur

  • Bu dosyalar içerisinde genellikle bir paket seçim kümesi ve temel dosya sistemi ayarları yer almaktadır

  • Mevcut bir konfigürasyonu kullanmak için:

    $ make pandaboard_defconfig

  • Mevcut konfigürasyon dosyaları configs/ alt dizininde yer almaktadır.

  • Temel konfigürasyon bu şekilde hızlıca yapıldıktan sonra, make menuconfig komutu yardımıyla toolchain vb. diğer ayarlar da yapılıp inşa sürecine geçilebilir

Boş Konfigürasyon İle Başlamak

  • Eğer hazır bir konfigürasyon dosyası kullanmak istemiyorsanız, aşağıdaki komutla boş bir konfigürasyon dosyası ile de işleme başlayabilirsiniz:

    $ make menuconfig

  • Bu şekilde işleme başlandığında, mevcut paketler arasından sadece busybox'ın ve mimari olarka i386'nın seçişi olduğu temel bir konfigürasyon karşınıza gelecektir.

  • Sırasıyla buradaki menülerden gerekli seçimleri yapıp oluşturduğunuz konfigürasyonu kaydedip, inşa sürecine geçebilirsiniz.

Out-Of-Tree Modeli İle Başlamak

  • Out-of-tree modeli çalışma yöntemini kullanmak istiyorsak, O değişkenine değer atamak suretiyle make uygulamasını çalıştırmalıyız

  • Hazır bir konfigürasyon dosyasını baz alacaksak:

    $ make O=/path/to/project_dir pandaboard_defconfig

  • Boş bir konfigürasyon ile başlayacaksak:

    $ make O=/path/to/project_dir

  • Bu komutun ardından parametre olarak verdiğimiz dizine geçmeli ve geri kalan tüm işlemleri, ilgili dizin altında iken yapmalıyız.

Target Options Bölümü

  • Konfigürasyon ekranındaki ilk menü Target options şeklindedir

  • Burada temel olarak işlemci ailesine ilişkin seçimlerin yapılması gereklidir

  • Yapılan seçimlere bağlı olarak inşa sürecinin devamında derlenecek olan tüm uygulamara, -march, -mcpu, -mtune gibi mimari spesifik doğru derleyici parametreleri geçirilecektir

  • Örnek bir seçim kümesi şu şekilde olabilir:

Başlık Değer
Target Architecture ARM (little endian)
Target Architecture Variant cortex-A8
Target ABI EABI
Floating point strategy VFPv3-D16
ARM instruction set ARM

Build Options Bölümü

  • Bu bölümde temel olarak inşa sürecinin genelini ilgilendiren ayarlar yapılır

  • Burada yer alan ayarların çoğu öntanımlı halinde bırakılabilir

  • Üzerinde durulması gereken başlıklar ise:

    • Download dir

    • gcc optimization level

    • location of a package override file

Build Options Bölümü : Download Dir

  • Download dir seçimi ile, inşa sürecinde otomatik olarak indirilecek dosyaların hangi dizinde tutulacağı belirtilir

  • Bir seçim yapılmaması halinde, öntanımlı olarak buildroot inşa sürecinde kullandığınız ana dizin altında (Out-of-tree modelini kullanıp kullanmadığınıza göre değişkenlik gösteren) dl/ alt dizinde tutulacaktır

  • Buildroot ile çalışırken download işlemlerini buildroot çalışma dizinlerinin dışında, ortak bir dizin altına yapmakta fayda vardır

  • Bu şekilde birden fazla buildroot projesinde çalışırken aynı dosyaları tekrar tekrar download etmek zorunda kalmaz ve hız kazanırsınız

  • Birden fazla çalışanın olduğu veya internet erişiminin sınırlandığı çalışma ortamlarında da yerel ağda bir NFS veya http sunucusu üzerinden ortak bir download dizini kullanmak tercih edilebilir

Build Options Bölümü : gcc optimization

  • Bu bölümde inşa sürecinde tüm uygulamalar için gcc derleyicisine geçirilecek optimizasyon seviyesi parametresi genel olarak belirlenmektedir

  • Merkezi bir noktada bu şekilde optimizasyon seviyesinin belirlenebilmesi, sisteminizde yer alacak tüm uygulamaların istediğiniz optimizasyon seviyesinde üretilmesini garanti eder

  • Öntanımlı değeri optimize for size olmakla birlikte, günümüzde gömülü sistemler için de ana depolama birimi kapasitelerinin arttığını göz önünde bulunduracak olursak, optimizasyon seviyesi 2 veya 3'ü de seçmek anlamlı olmaktadır.

Build Options Bölümü : package override file

  • Buildroot içerisindeki ileri düzey konulardan biri olan OVERRIDE mekanizması için package override dosyasının nerede aranacağı burada belirtilir

  • Package override dosyası temel olarak, buildroot içerisinde tanımlı paketlere ilişkin bazı kuralları değiştirmenize olanak sağlamaktadır

  • Özellikle geliştirme yapmakta olduğunuz bir yazılım için buildroot paketi aracılığıyla derleme yapmak istediğinizde kullanımı zorunlu olmaktadır

  • Konu ayrıntılarına ilerleyen bölümlerde değilinecek olup, bu değer öntanımlı olarak bırakılabilir veya sistem içerisinde ortak bir dizine yer alan ve diğer buildroot projelerinde de kullanılması istenen bir dosya yolu seçilebilir.

Toolchain Seçimi

  • Bu bölüm içerisinde inşa sürecinde çapraz derleme işleminde kullanılacak toolchain seçimi ve detaylı konfigürasyonu yapılacaktır

  • Temel olarak 2 tip toolchain bulunmaktadır:

    • Buildroot toolchain

    • External toolchain

  • Buildroot toolchain tipi seçildiğinde, öncelikle toolchain'in kendisi inşa edilecektir

  • Bu süreç oldukça uzun vakit almakta ve buildroot'tan bağımsız olarak, toolchain inşa süreçlerinin genel anlamda sıkıntılı olması sebebiyle başarısızlıkla da sonuçlanabilmektedir

  • Özel bir nedeni yok ise toolchain'in kendisini üretme sürecinden kaçınılmasını önermekteyiz

Toolchain Seçimi : External Toolchain

  • Toolchain tipi olarak External Toolchain seçilmesi durumunda Toolchain ve Toolchain origin başlığında 2 yeni seçenek belirecektir

  • Burada Sourcery CodeBench, Arago, Linaro tarafından üretilen çeşitli toolchain versiyonları listelenmektedir

  • Bu versiyonlardan biri seçildiğinde, Toolchain origin olarak to be downloaded or installed opsiyonu seçilerek internet üzerinden download edilebilir veya daha önceden sisteminizde zaten var ise ilgili dizin beliritilebilir

  • Custom toolchain opsiyonun seçilmesi halinde ise sisteminizde önceden mevcut olan bir toolchain dizinini seçmeniz mümkündür

System Configuration

  • Bu bölümde oluşturulacak olan dosya sistemiyle ilgili bazı temel ayarlar yapılabilmektedir
Başlık Ayar
System hostname Sistemin adı, hostname
System banner Login işlemi sonrası görünecek metin
Password encoding Parole kripto algoritması
/dev management /dev dizini yönetim metodolojisi
Init system Sistem açılışında kullanılacak init metodolojisi
Root FS skeleton Sistemde kullanılacak iskelet dosya sistemi
Root password Root parolası
Port to run getty Seri konsol login için kullanılacak port
read-write remount Açılış süreci sonrası dosya sistemi yazma konumu
Root filesystem overlay dirs Dosya sistemi üretimi öncesinde kopyalanması istenen dizinler
Custom scripts Dosya sistemi üretimi öncesi ve sonrası çalıştırılacak betikler

System Configuration

systemconfig

/dev management

  • Önemli seçimlerden biri, /dev aygıt dosya sisteminin nasıl yönetileceğinin belirlenmesidir

  • Geçmiş yıllarda statik /dev yönetimi genel olarak kullanılmaktaydı. Halen daha bu seçeneğin anlamlı olduğu projeler olabilir

  • Ancak /dev dizinini kernel üzerinden gelen event'ler ile dinamik olarak oluşturan çözümlerin tercih edilmesini önermekteyiz

  • Bu amaçla userspace'de çalışan, udev veya mdev yardımcı araçlarını kullanabileceğiniz gibi, kernel seviyesinde çalışan devtmpfs yöntemini de kullanabilirsiniz

  • Özellikle sistemin açılış hızına olumlu etkisi düşünüldüğünde, udev veya mdev yerine, sadece devtmpfs yöntemini kullanmanızı öneririz

  • Bu kullanımı şekli için kernel derleme sürecinde, CONFIG_DEVTMPFS ve CONFIG_DEVTMPFS_MOUNT seçenekleri seçilmiş olmalıdır

Kernel

  • Buildroot üzerinden kernel derlemek mümkündür

  • Bunun için Kernel başlığı altında aşağıdaki seçenekler ayarlanmalıdır:

    • derlenecek version

    • hangi yöntemle download edileceği

    • varsa uygulanacak patch'lerin bulunduğu dizin

    • derleme işleminde kullanılacak kernel konfigürasyon dosyası

    • kernel binary formatı

  • Bununla birlikte, bir çok board için standart kernel yerine üretici tarafından gelen özelleştirilmiş kernel kullanıldığından, derlemeyi buildroot altından yapmak çok fazla ek iş yükü gerektirebilir. Bu durumlarda kernel derleme sürecini buildroot dışında halletmek anlamlı olacaktır.

Paket Seçimi : Target Packages

targetpackages

Paket Seçimi

  • Sistemde yer alacak tüm paket seçimleri bu bölüm ve alt menülerinden gerçekleştirilmektedir

  • Paketler gruplanmış olarak, çeşitli başlıklar altına yer alır

  • Birbirine bağımlı olan paketler, Kconfig yapısı aracılığıyla bağımlılık ilişkileri doğrultusunda listelenir

  • Busybox paketi sistemde temel bir önem arzettiğinden, hangi versiyonunun derleneceği ve derleme sırasında kullanılacak busybox konfigürasyon dosyası da seçenek olarak sunulmaktadır

Filesystem images

  • Derleme işlemleri bitiminde üretilecek olan dosya sistemi imajı bu bölümden belirlenmektedir

  • squashfs, cramfs gibi read-only compressed dosya sistemi imajlarından, jffs2, ubifs gibi NAND flash aygıtlar için uygun dosya sistemlerine kadar geniş bir seçenek kümesi yer almaktadır

  • Seçilen dosya sistemi imajı türüne göre açılan ek menülerden parametre geçirmek de mümkündür. Özellikle ubifs dosya sistemi için aşağıdaki parametrelerin doğruluğu teyit edilmelidir:

    • UBI logical eraseblock size

    • UBI minimum IO size

    • Maximum LEB count

    • UBI physical eraseblock size

    • UBI sub-page size

Bootloaders

  • Buildroot üzerinden aşağıdaki bootloader uygulamarını mimariniz için derlemeniz mümkündür:

    • U-Boot

    • Barebox

    • X-Loader

    • Freescale mxs

    • grub, syslinux

  • Gömülü sistemler için yoğun biçimde U-Boot kullanılmakta olsa da, kod kalitesi ve build karmaşıklığı nedeniyle gelecekte yerini yeni nesil u-boot olarak adlandırabileceğimiz barebox'a bırakacağı düşünülmektedir

Derleme İşlemi - Hazırlık

  • Konfgürasyon işlemi tamamlandıktan sonra make komutu ile derleme işlemi başlatılır

  • Öncelikle halihazırda mevcut olmayan gerekli dizinler yaratılır (target, stamps, host vb.)

  • Hedef dosya sistemi iskeleti, target dizini altına kopyalanır

  • Bu bölümde kopyalanacak olan iskelet dosya sistemi, konfigürasyon sırasında değiştirilebilir

Derleme İşlemi - Toolchain

  • Dizinler hazırlandıktan sonra toolchain seçimine göre aşağıdaki yöntemlerden biri izlenir:

    • Buildroot toolchain seçimi yapılmış ise, toolchain üretimi gerçekleştirileceğinden binutils, glibc, gcc gibi çeşitli toolchain bileşenleri download edilir ve toolchain üretilir

    • External toolchain seçimi yapılmış fakat belirli bir versiyonun internet üzerinden download edilmesi istenmişse download işlemi gerçekleştirilir

  • Her iki yöntem sonrasında, üretilen, download edilen veya zaten sistemde belirli bir dizinde mevcut olan toolchain, host/usr/toolchain-type/sysroot dizini altına kopyalanır

Paketler

Dosya Sistemi Üretimi

Buildroot Paketi Oluşturma

Yardımcı Adresler

results matching ""

    No results matching ""