XBMCbuntu ile hemen hemen aynı şekilde, sadece bir program çalıştıracak kendi "özel" Linux dağıtımımı nasıl oluşturabilirim .
XBMCbuntu ile hemen hemen aynı şekilde, sadece bir program çalıştıracak kendi "özel" Linux dağıtımımı nasıl oluşturabilirim .
Yanıtlar:
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 . jessie
Yayı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.
init
ama kesinlikle sizin yapabileceğiniz upstart, systemd,
veya sysv. init
adlandırılmış sadece bazı uygulama dosyasıdır init
o bağlar zaman çekirdek çağırdığı initramfs.
bu üç hatta değildir Çoğu durumda init
ama aslında konum exec
tarafından içine ed init,
hangi sıklıkla edilirbusybox.
busybox
çünkü bu ayrı bir yanıta ayrı bir tedaviyi hak ediyor, ancak benim tarafımdan değil.
Minimal init merhaba dünya programı adım adım
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 cd
sonra 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/sdX
ve:
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
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
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:
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.
busybox
ama 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 .