Yalnızca bir program çalıştıran ve başka bir şey olmayan özel bir Linux dağıtımı nasıl oluşturulur?


12

XBMCbuntu ile hemen hemen aynı şekilde, sadece bir program çalıştıracak kendi "özel" Linux dağıtımımı nasıl oluşturabilirim .


U&L'ye hoş geldiniz, lütfen rehberli bir tura katılın ve ne yapmak istediğinizi nasıl soracağınızı öğrenmek için zaman ayırın ? çünkü uygulamanın tanımı oldukça belirsiz ve hiçbir şey ifade etmiyor, çünkü tavsiyem kullanmak olurdu busyboxama muhtemelen istediğiniz şey bu değil. lütfen ihtiyacınızı ifade etmek için gerekli zamanı ayırın, size yardımcı olabiliriz. İlgili herhangi bir öğeyi eklemek için sorunuzu düzenlemekte tereddüt etmeyin .
Kiwy

1
Bana oldukça açık görünüyor ...
goldilocks

@ TAFKA'goldilocks 'hayır, çünkü bahse girerim ki XBMCubuntu'da bir terminale veya benzer bir şeye erişebilirsiniz, ancak sadece bir uygulama grafik olarak çalışıyor, ancak bir uygulama çalışmıyor. Sadece bir çekirdek ve meşgul kutusu ile sıfırdan küçük bir dağıtım yaptım, bu durumda, çekirdek tarafından başlatılan hizmetler olsa bile, meşgul kutusunun tek uygulamanız olduğunu söyleyebilirsiniz.
Kiwy

@Kiwi Bu iyi bir cevap (LFS'den daha iyi). Yani - cevaplar bir dizi, 2 iyidir işte muhtemel çözüm çeşiti olsa da bu soru), kimin genel amaçlı aynıdır diğer insanlara faydalı olabilir) 1: Unutmayın TIMTOWTDI - ve bazı edebilir olmak diğerlerinden daha belirli bir hedefe daha uygunsa, hepsinin çalışacağından eminim ve bir çözüme karar vermenin önemli bir yönü öznel olacaktır (örneğin, OP'nin görevin nesnel doğası değil , önceki bilgi ve deneyimi nedeniyle ) .
goldilocks

Yanıtlar:


6

LFS ile uğraşmaya başlamam, bu bazı koyu ormanlara giden bir bahçe yolu.

Arch gibi ilk kurulum veya Ubuntu sunucusu gibi başsız bir sürüm üzerinde çok fazla kontrole sahip olduğunuz bir dağıtımla başlayın. Bunun amacı, init yapılandırmasının karmaşıklığını sınırlamak için yerden tasarruf etmek için çok fazla değildir; başsız bir dağıtımdan başlayarak, çalıştırmak istediğiniz uygulama bir GUI gerektiriyorsa, init tarafından başlatılan bir GUI girişine (yani ekran yöneticisi veya DM) son vermek zorunda kalmadan bunun için gerekli olanları ekleyebilirsiniz. onunla gitmek için çevre.

Daha sonra , init sistemini amaçlarınıza göre nasıl yapılandıracağınızı öğrenmek istersiniz - init olmadan yapamayacağınızı ve hedefinize ulaşmanın en iyi yolu olabileceğini unutmayın. Linux'ta yaygın olarak kullanılan init üzerinde üç varyasyon vardır (ancak diğerleri vardır ):

  • Debian klasik Unix SysV stil initinde bir varyasyon kullanır . jessieYayın tarihi itibariyle Debian da değişti systemd( https://wiki.debian.org/systemd )

  • Ubuntu ve türevleri upstart kullanır .

  • Fedora, Arch ve türevleri systemd kullanır .

Bunlardan herhangi biri hakkında henüz bir şey bilmiyorsanız, hiçbirini kullanmak diğerlerinden daha zor değildir. Daha sonraki ikisinden biriyle giderseniz, SysV ile geriye dönük uyumluluk için bazı mekanizmalar sağlarlar, ancak bununla uğraşmazlar, daha basit değildir. 1

Buradaki nokta, init'in önyüklemede ne yaptığını en aza indirmektir ve bu, odaklanmak istediğiniz uygulamayı desteklemek için minimum miktarda yazılım çalıştıracak bir sistem oluşturabilirsiniz - bu aslında bir sunucunun nasıl kurulduğu, BTW, bu nedenle yaygın bir görevdir (en azından kullanışlı olmayan bir şekilde "sadece bir" kullanıcı ülkesi işlemini çalıştıramayacağınızı unutmayın).

Çalıştırmak istediğiniz uygulama bir GUI programı ise (GUI uygulamaları bir X sunucusu gerektirdiğinden, neden sadece bir uygulamayı çalıştıramayacağınıza dair iyi bir örnek), ~/.xinitrcşöyle bir şeye sahip olabilirsiniz ;

#!/bin/sh

myprogram

O zaman startx, programınız çalışan tek şey olacak ve kısmen pencere yöneticisi veya masaüstü ortamı olmadığı için (yani, pencere çerçevesi veya başlık çubuğu olmayacak) masaüstü değiştirmek veya başka bir şey başlatmak imkansız olacaktır.

1. Biraz uğraşmak için: Bunu araştırırken, daha önce SysV'ye aşina olan kişilerden, örneğin çok karmaşık olduklarını iddia eden sistemd hakkında biraz kavrama bulabilirsiniz. Bununla birlikte, nesnel olarak SysV'den daha karmaşık değildirler (aslında IMO sistemi kullanımı daha basittir), ancak çoğu köpek eski hilelerini tercih eder. Her iki sistem de bir süredir kullanımda.


1
Sen olmadan yapamaz initama kesinlikle sizin yapabileceğiniz upstart, systemd,veya sysv. initadlandırılmış sadece bazı uygulama dosyasıdır inito bağlar zaman çekirdek çağırdığı initramfs.bu üç hatta değildir Çoğu durumda initama aslında konum exectarafından içine ed init,hangi sıklıkla edilirbusybox.
mikeserv

@mikeserv Kesinlikle (ve bunların sadece üç seçenek olmadığını açıkça belirtmiştim). Ayrıca kasten dışladığımı da unutmayın, busyboxçünkü bu ayrı bir yanıta ayrı bir tedaviyi hak ediyor, ancak benim tarafımdan değil.
goldilocks

Ne kadar zarif sunacaksınız! Ama lanet olası bir yol yok.
mikeserv

Bu yaklaşımın pratikte gerçekten işe yarayıp yaramadığını bilmek ilginç olurdu. Gerçekten deneyen var mı?
Faheem Mitha

@FaheemMitha Burada önerdiğim şeyi kastediyorsanız (init yapılandırmasını özelleştirin), elbette işe yarıyor - sistem zaten böyle çalışıyor, sadece soyulmuş ve basitleştirilmiş bir versiyon üretiyor olacaksınız (eminim bu XBMCbutu nedir). Şunu Eğer sürece, biraz daha özel yürütülebilir ala BusyBox ile init yerine, muhtemelen 's değerinden fazla bela gerektiğini bu şekilde yapmak - BusyBox temel amacı ile (küçük gömülü ortamlarda kullanım içindir, örneğin, sadece birkaç MB RAM).
goldilocks

18

Minimal init merhaba dünya programı adım adım

resim açıklamasını buraya girin

Sonsuz bir döngü ile biten herhangi bir bağımlılık olmadan merhaba bir dünya derleyin. init.S:

.global _start
_start:
    mov $1, %rax
    mov $1, %rdi
    mov $message, %rsi
    mov $message_len, %rdx
    syscall
    jmp .
    message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
    .equ message_len, . - message

Çıkış sistemi çağrısını ya da çekirdek paniklerini kullanamayız.

Sonra:

mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o      # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"

Bu /init, çekirdeğin çalışacağı ilk kullanıcı alanı programı olan merhaba dünyamızla bir dosya sistemi oluşturur . Ayrıca daha fazla dosya ekleyebilirdik d/ve /initçekirdek çalıştığında bunlara programdan erişilebilir .

Daha cdsonra Linux çekirdek ağacına, yapı her zamanki gibi ve QEMU'da çalıştırın:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"

Ve bir çizgi görmelisiniz:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

emülatör ekranında! Son satır olmadığını unutmayın, bu yüzden biraz daha yukarı bakmanız gerekir.

Statik olarak bağlarsanız C programlarını da kullanabilirsiniz:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
    sleep(0xFFFFFFFF);
    return 0;
}

ile:

gcc -static init.c -o init

Dinamik bağlantı, en yaygın olanı glibc gibi C standart kitaplıklarının bir parçası olan dinamik bir bağlayıcı çalıştırılabilirinin ayarlanmasını gerektirir.

USB açıkken gerçek donanımda çalışabilir /dev/sdXve:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX

Bu konuda harika bir kaynak: Teknik İpucu: initramfs nasıl kullanılır | landley.net Ayrıca gen_initramfs_list.sh, işlemi otomatikleştirmek için Linux çekirdek kaynak ağacından bir komut dosyası olan nasıl kullanılacağını da açıklar .

Ubuntu 16.10, QEMU 2.6.1 üzerinde test edilmiştir.

Sonraki adımlar

Yapmak istediğiniz bir sonraki şey, BusyBox'ı kurmak .

BusyBox, POSIX-y kabuğu da dahil olmak üzere temel POSIX-y CLI yardımcı programlarını uygular ve sistemle etkileşimli olarak daha kolay deneme yapmanıza olanak tanır.

Şahsen, bu noktada , her şeyi kaynaktan oluşturmayı ve kök dosya sistemini oluşturmayı otomatikleştiren inanılmaz bir komut dizisi olan Buildroot'a güvenmeyi tercih ediyorum .

Bunun için son derece ayrıntılı ve otomatik bir yardımcı yükledim: https://github.com/cirosantilli/linux-kernel-module-cheat


4
Muhtemelen buradaki en az cevap: D. Müthiş!
msouth


1

programlamada biraz iseniz ve sıfırdan oluşturmak istiyorsanız, LFS ile gidebilirsiniz, yani Scratch'tan Linux http://www.linuxfromscratch.org/

ubutnu'yu özelleştirmek istiyorsanız ubunt-builder'ı kullanabilirsiniz ve rpm tabanında isterseniz SUsE-Studio'yu kullanabilirsiniz, Suse studio özel suse linux yapmanıza izin verecektir

şerefe


1

Daha çok "tek bir program" nızın gerektirdiği ile ilgilidir.

Yine de bir LFS (diğer adıyla " Linux From Scratch ") oluşturarak bir şeylerin nasıl bir araya getirileceğini anlamaya başlayabilirsiniz . Sonra LFS üzerinde Gnome veya KDE gibi ağır bir alt sistem oluşturmak gerçek bir acı olabilir.

Tabii ki geri gitmek ilk başta daha kolay olabilir, ancak bir şeyleri tam bir dağıtımdan kaldırmak zahmetli olabilir: bunu bir sanal makinede yapın ve bu sanal makinenin her adımında bir kopyasını yapın.

(2 sentim)

Düzenle :

CentOS veya Ubuntu gibi tam bir dağıtımdan başlamak yerine SecurityBeast tarafından belirtildiği gibi , aşağıdaki gibi dağıtım araçları oluşturmaya da bakabilirsiniz:


1

Sormanız gereken şey, "bir programınızın" neye ihtiyacı ve hangi kaynaklara sahip olduğudur.

Çok çeşitli kitaplıklara ve destek ikili dosyalarına ihtiyaç duyuyorsa, "normal" bir linux dağıtımını (Debian veya benzeri) kullanarak ve sadece önyükleme işlemiyle biraz uğraşabilirsiniz.

Daha dar bir destek malzemesi seçimine ihtiyaç duyuyor, ancak yine de farklı çekirdek modülleri veya kullanıcı alanı destek bitlerini kullanan çeşitli donanımlar için ağ veya destek gibi şeyler gerektiriyorsa ve düzenli bir dağıtımın disk alanını ek yükü istemiyorsanız, gömülü dağıtımlar (buildroot veya benzeri) veya sıfırdan yaklaşımdan bir linux (bu bir bakım baş ağrısı olabilir)

Modüler olmayan bir çekirdeğin sağlayabileceği ve başka hiçbir şeye ihtiyacınız yoksa, kendi ikilinizi doğrudan çekirdeğin üzerinde çalıştırmak işe yarayabilir ve en hafif solüsyon olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.