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.
Kaynak: https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt
Kconfig sistemiyle kolay bir şekilde
Seçenekler arasındaki bağımlılıklar
Farklı türlerde değişkenler
Şartlı akışlar ve öntanımlı değerler
Sistem içi yardım metinleri
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.
nconfig
Kullanım:
make nconfig
ncurses tabanlı bir arayüz sunar.
menuconfig
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)
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 olarkai386
'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ızHazı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ırBuildroot 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
/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
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
Web: http://buildroot.org
Eposta Listesi: [email protected] (http://buildroot.org/lists.html)
IRC kanalı: Freenode üzerinde #buildroot
Hata takip sistemi: https://bugs.uclibc.org