Giriş
Bu yazı dizisinde buildroot dağıtım build sistemine bakmak ve onu özelleştirme konusundaki deneyimimi paylaşmak istiyorum. Grafik arayüzlü ve minimum işlevselliğe sahip küçük bir işletim sistemi oluşturma konusunda pratik deneyim olacaktır.
Öncelikle build sistemi ile dağıtımı karıştırmamalısınız. Buildroot, kendisine sunulan bir dizi paketten bir sistem oluşturabilir. Buildroot, makefile dosyaları üzerine kuruludur ve bu nedenle muazzam özelleştirme yeteneklerine sahiptir. Bir paketi başka bir sürümle değiştirmek, kendi paketinizi eklemek, paket oluşturma kurallarını değiştirmek, tüm paketleri yükledikten sonra dosya sistemini özelleştirmek mi istiyorsunuz? buildroot tüm bunları yapabilir.
Rusya'da buildroot kullanılıyor, ancak bence yeni başlayanlar için çok az Rusça bilgi var.
Çalışmanın amacı canlı indirme, icewm arayüzü ve tarayıcı içeren bir dağıtım kiti oluşturmaktır. Hedef platform sanal kutudur.
Neden kendi dağıtımınızı oluşturmalısınız? Genellikle sınırlı kaynaklarla sınırlı işlevselliğe ihtiyaç duyulur. Otomasyonda daha da sıklıkla ürün yazılımı oluşturmanız gerekir. Gereksiz paketleri temizleyip ürün yazılımına dönüştürerek genel amaçlı bir dağıtımı uyarlamak, yeni bir dağıtım oluşturmaktan daha fazla emek gerektirir. Gentoo'yu kullanmanın da sınırlamaları vardır.
Buildroot sistemi çok güçlüdür ancak sizin için hiçbir şey yapmaz. Yalnızca montaj sürecini etkinleştirebilir ve otomatikleştirebilir.
Alternatif yapı sistemleri (yocto, açık yapı sistemi ve diğerleri) dikkate alınmaz veya karşılaştırılmaz.
Nereden alınır ve nasıl başlanır
Proje web sitesi -
Buildroot, yapının hedef panosu için defconfig'leri çalıştırır. Defconfig, yalnızca varsayılan değerleri olmayan seçenekleri saklayan bir yapılandırma dosyasıdır. Neyin nasıl toplanacağını belirleyen odur. Bu durumda, meşgul kutusu, linux çekirdeği, uglibc, u-boot ve barebox önyükleyicilerinin yapılandırmalarını ayrı ayrı yapılandırabilirsiniz, ancak bunların tümü hedef panele bağlanacaktır.
İndirilen arşivi açtıktan veya git'ten klonladıktan sonra kullanıma hazır bir buildroot elde ediyoruz. Kılavuzda dizin yapısı hakkında daha fazla bilgi edinebilirsiniz; size en önemlilerini anlatacağım:
yazı tahtası — her panele özel dosyaların bulunduğu bir dizin. Bunlar, sistem görüntüleri (iso, sdcart, cpio ve diğerleri), bir kaplama dizini, çekirdek yapılandırması vb. oluşturmak için komut dosyaları olabilir.
yapılandırmaları — panonun gerçek yapılandırması. Defconfig tamamlanmamış bir kart yapılandırmasıdır. Yalnızca varsayılan ayarlardan farklı olan parametreleri saklar
dl — montaj için indirilen kaynak kodlarının/dosyaların bulunduğu dizin
çıktı/hedef — ortaya çıkan işletim sisteminin birleştirilmiş dosya sistemi. Daha sonra indirme/kurma için görüntüler oluşturulur.
çıktı/ana bilgisayar - montaj için ana yardımcı programlar
çıktı/oluşturma - birleştirilmiş paketler
Montaj KConfig aracılığıyla yapılandırılır. Linux çekirdeğini oluşturmak için aynı sistem kullanılır. En sık kullanılan komutların listesi (buildroot dizininde çalıştırın):
- make menuconfig - yapı yapılandırmasını çağırın. Grafiksel arayüzü de kullanabilirsiniz (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig - çekirdek yapılandırmasını çağırın.
- make clean - derleme sonuçlarını temizleyin (çıktıda saklanan her şey)
- yap - bir sistem inşa et. Bu, önceden birleştirilmiş süreçleri yeniden birleştirmez.
- make defconfig_name - yapılandırmayı belirli bir defconfig olarak değiştirir
- make list-defconfigs - defconfig'lerin listesini gösterir
- kaynak oluştur - kurulum dosyalarını oluşturmadan indirmeniz yeterli.
- yardım yap - olası komutları listele
Önemli notlar ve faydalı ipuçları
Buildroot, önceden oluşturulmuş paketleri yeniden oluşturmaz! Bu nedenle, komple yeniden montajın gerekli olduğu bir durum ortaya çıkabilir.
Komutla ayrı bir paketi yeniden oluşturabilirsiniz. paket adı-yeniden oluştur. Örneğin, Linux çekirdeğini yeniden oluşturabilirsiniz:
make linux-rebuild
Buildroot, çıktı/derleme/$paketadı dizininde .stamp dosyaları oluşturarak herhangi bir paketin durumunu saklar:
Bu nedenle, paketleri yeniden oluşturmadan root-fs'leri ve görüntüleri yeniden oluşturabilirsiniz:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
Yararlı Değişkenler
buildroot'un kolay yapılandırma için bir dizi değişkeni vardır
- $TOPDIR - buildroot dizini
- $BASEDIR - ÇIKIŞ dizini
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — ana bilgisayar fs'si, hazırlama fs'si, hedef fs oluşturma dizinleri.
- $BUILD_DIR - paketlenmemiş ve oluşturulmuş paketlerin bulunduğu dizin
Görüntüleme
buildroot'un görselleştirme özelliği vardır.Son sistemde bir bağımlılık diyagramı, derleme süresi grafiği ve paket boyutları grafiği oluşturabilirsiniz. Sonuçlar çıktı/grafik dizininde pdf dosyaları biçimindedir (svn, png arasından seçim yapabilirsiniz).
Görselleştirme komutlarına örnekler:
make graph-depends
bağımlılık ağacı oluşturmake <pkg>-graph-depends
belirli bir paket için bağımlılık ağacı oluşturmakBR2_GRAPH_OUT=png make graph-build
PNG çıktısıyla derleme süresini planlayınmake graph-size
paket boyutu grafiği
Yararlı komut dosyaları
Buildroot dizininde bir alt dizin var utils kullanışlı komut dosyalarıyla. Örneğin paket açıklamalarının doğruluğunu kontrol eden bir script var. Bu, kendi paketlerinizi eklerken faydalı olabilir (bunu daha sonra yapacağım). utils/readme.txt dosyası bu komut dosyalarının açıklamasını içerir.
Bir stok dağılımı oluşturalım
Tüm işlemlerin root değil normal kullanıcı adına yapıldığını unutmamak önemlidir.
Tüm komutlar buildroot'ta yürütülür. Buildroot paketi zaten birçok ortak kart ve sanallaştırma için bir dizi yapılandırma içerir.
Yapılandırma listesine bakalım:
qemu_x86_64_defconfig yapılandırmasına geçin
make qemu_x86_64_defconfig
Ve montaja başlıyoruz
make
Derleme başarıyla tamamlandı, sonuçlara bakın:
Buildroot, Qemu'da çalıştırabileceğiniz ve çalıştıklarını doğrulayabileceğiniz görüntüleri derledi.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Sonuç, qemu'da çalışan bir sistemdir:
Kendi pano konfigürasyonunuzu oluşturma
Pano Dosyaları Ekleme
Yapılandırma listesine bakalım:
Listede pc_x86_64_efi_defconfig'i görüyoruz. Yapılandırmadan kopyalayarak kendi panomuzu oluşturacağız:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Komut dosyalarımızı, rootfs-overlay'ı ve diğer gerekli dosyalarımızı depolamak için hemen bir pano dizini oluşturalım:
mkdir board/my_x86_board
Bu defconfig'e geçin:
make my_x86_board_defconfig
Böylece, artık build config (buildroot dizininin kökünde .config dosyasında saklanır) x86-64 eski(bios) önyükleme hedef makinesine karşılık gelir.
Linux çekirdeği yapılandırmasını kopyalayalım (ileride faydalı olacaktır):
cp board/pc/linux.config board/my_x86_board/
Yapı parametrelerini KConfig aracılığıyla ayarlama
Kuruluma başlayalım:
make menuconfig
KConfig penceresi açılacaktır. Grafiksel bir arayüzle yapılandırmak mümkündür (make nconfig, make xconfig, make gconfig):
İlk bölüme Hedef Seçenekleri giriyoruz. Burada yapının gerçekleştirileceği hedef mimariyi seçebilirsiniz.
Oluşturma seçenekleri - burada çeşitli oluşturma ayarları vardır. Kaynak kodlarını, derleme iş parçacığı sayısını, kaynak kodlarını indirmek için aynaları ve diğer ayarları içeren dizinleri belirtebilirsiniz. Ayarları varsayılan olarak bırakalım.
Araç Zinciri – oluşturma araçlarının kendisi burada yapılandırılır. Onun hakkında daha fazlasını okuyun.
Takım zinciri tipi – kullanılan takım zinciri tipi. Bu, buildroot'a yerleştirilmiş bir araç zinciri veya harici bir araç zinciri olabilir (önceden oluşturulmuş olan dizini veya indirilecek URL'yi belirtebilirsiniz). Farklı mimariler için ek seçenekler mevcuttur. Örneğin kol için harici takım zincirinin Linaro versiyonunu seçebilirsiniz.
C kütüphanesi – C kütüphanesinin seçimi Tüm sistemin çalışması buna bağlıdır. Tipik olarak, olası tüm işlevleri destekleyen glibc kullanılır. Ancak gömülü bir sistem için çok büyük olabilir, bu nedenle sıklıkla uglibc veya musl seçilir. Glibc'yi seçeceğiz (bu daha sonra systemd'yi kullanmak için gerekli olacaktır).
Çekirdek Başlıkları ve Özel Çekirdek Başlıkları serisi – birleştirilmiş sistemde yer alacak çekirdek sürümüyle eşleşmelidir. Çekirdek başlıkları için tarball veya git deposunun yolunu da belirtebilirsiniz.
GCC DERLEYİCİ VERSİYONLARI – oluşturma için kullanılacak derleyici sürümünü seçin
C++ desteğini etkinleştir – sistemdeki C++ kitaplıkları desteğiyle oluşturmayı seçin. Bu gelecekte bizim için faydalı olacaktır.
Ek gcc seçenekleri – ek derleyici seçeneklerini ayarlayabilirsiniz. Şimdilik buna ihtiyacımız yok.
Sistem konfigürasyonu, oluşturulan sistemin gelecekteki parametrelerini ayarlamanıza olanak tanır:
Çoğu nokta başlıktan açıkça anlaşılıyor. Aşağıdaki noktalara dikkat edelim:
Kullanıcı tablolarının yolu - oluşturulacak kullanıcıları içeren tablo (
Örnek dosya. Kullanıcı kullanıcısı admin, otomatik olarak gid/uid, /bin/sh kabuk, varsayılan grup kullanıcısı, grup üyesi kökü, yorum Foo kullanıcısı parolasıyla oluşturulacaktır.
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Kök dosya sistemi yer paylaşımlı dizinleri - birleştirilmiş target-fs'nin üzerine yerleştirilmiş dizin. Yeni dosyalar ekler ve mevcut dosyaların yerine geçer.
Dosya sistemi görüntüleri oluşturmadan önce çalıştırılacak özel komut dosyaları - Dosya sistemini görüntülere katlamadan hemen önce çalıştırılan komut dosyaları. Şimdilik scripti boş bırakalım.
Çekirdek bölümüne geçelim
Çekirdek ayarları burada yapılır. Çekirdeğin kendisi make linux-menuconfig aracılığıyla yapılandırılır.
Çekirdek sürümünü farklı şekillerde ayarlayabilirsiniz: sunulanlar arasından seçim yapın, sürümü manuel olarak girin, bir depo veya hazır bir tarball belirtin.
Çekirdek yapılandırması — çekirdek yapılandırmasının yolu. Seçilen mimari için varsayılan konfigürasyonu veya Linux'tan defocnfig'i seçebilirsiniz. Linux kaynağı, farklı hedef sistemler için bir dizi tanım içerir. İhtiyacınız olanı bulabilirsiniz
Hedef paketler bölümü, kurulmakta olan sisteme hangi paketlerin kurulacağını seçmenizi sağlar. Şimdilik değiştirmeden bırakalım. Paketlerimizi daha sonra bu listeye ekleyeceğiz.
Dosya sistemi görüntüleri - toplanacak dosya sistemi görüntülerinin listesi. Bir ISO görüntüsü ekleyin
Önyükleyiciler - toplanacak önyükleyicilerin seçimi. İsolinix'i seçelim
Systemd'yi Yapılandırma
Systemd, çekirdek ve glibc ile birlikte Linux'un temel direklerinden biri haline geliyor. Bu nedenle ayarını ayrı bir öğeye taşıdım.
make menuconfig, ardından Hedef paketler → Sistem araçları → systemd aracılığıyla yapılandırılır. Burada sistem başlatıldığında hangi systemd hizmetlerinin kurulacağını ve başlatılacağını belirleyebilirsiniz.
Sistem yapılandırmasını kaydetme
Bu konfigürasyonu KConfig aracılığıyla kaydediyoruz.
Ardından defconfig'imizi kaydedin:
make savedefconfig
Linux Çekirdek Yapılandırması
Linux çekirdeği yapılandırması aşağıdaki komutla çağrılır:
make linux-menuconfig
Virtualbox video kartı için destek ekleyelim
Virtualbox Guest entegrasyon desteğini ekleyelim
Kaydet ve çık. ÖNEMLİ: yapılandırma çıktı/derleme/linux-$sürüm/config dosyasına kaydedilecek ancak board/my_x86_board/linux.config dosyasına kaydedilmeyecek
Bu nedenle, yapılandırmayı bir depolama konumuna manuel olarak kopyalamanız gerekir:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Bundan sonra tüm sistemin tamamen yeniden montajını gerçekleştireceğiz. buildroot önceden oluşturulmuş olanı yeniden oluşturmaz; yeniden oluşturma için paketleri manuel olarak belirtmeniz gerekir. Zaman ve sinir kaybetmemek için küçük bir sistemi tamamen yeniden inşa etmek daha kolaydır):
make clean;make
Derlemenin tamamlanmasının ardından, CD'den önyükleme yaparak VirtualBox'ı (sürüm 5.2 ve 6.0'da test edilmiştir) başlatın.
Birleştirilmiş iso'dan çalıştırma:
Kullanılan malzemelerin listesi
- Yapı kökü kılavuzu
Kaynak: habr.com