Tek bir uygulama çalıştıran bir Linux sistemi nasıl oluşturulur?


17

Bir Linux uygulaması çalıştırmaya çalışıyorum ve çalıştırmak istediğim tek şey bu önyükleme dışı bir uygulama. Ağa ihtiyacım var ve hepsi bu (ekran, çevre birimi vb. Yok). Çalıştığım uygulamanın CPU'nun% 100'üne sahip olması için çalışan başka bir uygulama istemiyorum. Mümkün mü?


İşletim sisteminizin hala bazı kaynaklara ihtiyacı olduğu için CPU'nun% 100'ünü göremez.
n0pe

@MaxMackie Açıkçası, ama işletim sistemi sadece uygulama adına devralmak istiyorum (örneğin ağ amaçlı).
dschatz

1
Yüklü bir masaüstü ortamıyla bile, ama boşta otururken, herhangi bir işlemci zamanı kullanmadığını biliyorsunuz değil mi? Kullandığı koç, başka uygulamalar talep ederse değiştirilmeye tabidir.
psusi

@ dschatz Sorunuza daha fazla ayrıntı eklemeniz yardımcı olacaktır. Bize hangi uygulamayı çalıştırmak istediğinizi, nasıl çalışmasını istediğinizi ve ne tür bir donanım kullandığınızı anlatmak gibi.
NN

Mümkünse, bunu neden istediğini bilmek istiyorum. Anladığım kadarıyla, sadece uygulamanızı çalıştırmak için işletim sisteminden (konsol dahil) her şeyi kaldırmak istiyorsunuz . Performans kazançları marjinal olacak, bu yüzden tüm bu işe sahip olmanın anlamı nedir?
nmat

Yanıtlar:


13

Minimal initrd CPIO 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

sys_exitÇekirdek panikleri kullanamayız .

Sonra:

mkdir d
as --64 -o init.o init.S
ld -o init d/init.o
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 .

Sonra cdLinux ç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

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

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

Bu konuda harika bir kaynak: http://landley.net/writing/rootfs-howto.html Ayrıca gen_initramfs_list.sh, işlemin otomatikleştirilmesine yardımcı olmak için Linux çekirdek kaynak ağacından bir komut dosyası olan nasıl kullanılacağını da açıklar .

Sonraki adım: BusyBox'ı sistemle etkileşime girecek şekilde ayarlayın: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902

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


3

çekirdeği init=/path/to/myappönyükleyicinizde tanımlanan parametre ile başlatabilirsiniz .


2
Bu oldukça aşırı bir çözüm. Başlangıç ​​komut dosyasının kullanıcı uygulamasıyla değiştirilmesi, uygulamanın, ağa bağlı olmadan, takılı rootfs (sysfs veya proc veya tmpfs olmadan) dışında herhangi bir dosya sistemi olmadan çalışmasını sağlar ve muhtemelen bazı aygıt düğümleri oluşturulmaz.
talaş

2
@ sawdust: Kesinlikle katılıyorum. Ama soru da biraz
aşırıydı

2

Kiosk kurmaya çalıştığınız anlaşılıyor . İnternetteki çoğu rehber, çalışan tek uygulama olarak Firefox gibi bir web tarayıcısına odaklanır. Fikirler için bu kılavuza bir göz atın .


2
Hmm, gerçekten ağ ile tek bir uygulama çalıştırmaya çalışıyorum. Herhangi bir X ve mümkün olan en az sayıda başka uygulamanın çalışmasını istemiyorum. Bunun tüm gereksiz cinlerin çalışmasını nasıl kısıtladığını görmüyorum.
dschatz

Uygulama X olmadan da çalışabilir mi?
Journeyman Geek

2

Çekirdeği başlattıktan sonra kesinlikle sadece bir kullanıcı uygulaması çalıştırabilirsiniz. Ancak CPU'nun% 100'üne sahip olmayacak çünkü var olması gereken çekirdekle ilgili başka işlemler de olacak. Bu genellikle kablosuz yönlendiriciler gibi gömülü Linux aygıtlarında yapılır. Ayrıca bunu çok iş parçacıklı bir uygulama için ilk elden deneyime sahibim.

Çekirdek önyüklendikten sonra, bir başlatma veya başlatma komut dosyası çalıştırılır. Linux çalışma seviyelerini ve init sürecini okuyun. Kullanılan çeşitli başlangıç ​​şemaları vardır, bu yüzden spesifik olmak mümkün değildir. Ancak Linux, durumunuz için tam olarak hangi uygulamaların ve arka planların yürütüleceğini yapılandırmanıza izin verecektir. Kökteki bir başlangıç ​​dosyası dışında, değiştirilmesi gereken dosyalar / etc ve özellikle /etc/init.d dizinindedir.

BTW, süper programcıdan biri değilseniz veya uzak bir GDB sunucusu çalıştırmadan önce, uygulamanız için bir hata ayıklama konsolu (PC konsolu veya seri bağlantı noktası) gerekir. Bu, seg hataları, bus hataları ve onaylama hataları konusunda bilgilendirilmenizi sağlar. Yani "ağ" yanı sıra "periferik" birini planlıyoruz.


1

Çalıştırılması gereken bazı sistem uygulamaları vardır, bunların yanında, bilgisayar kaynaklarının geri kalanını bu uygulamaya ayırabilirsiniz. En azına sahip olmak için TinyCore Linux vb.Gibi küçük Linux dağıtımlarına bir göz atabilirsiniz.

Ayrıca uygulamanın kendisine, ağın yanı sıra hangi hizmetlere ihtiyaç duyduğuna da bağlı olacaktır.

Bence daha spesifik bilgi verebilirseniz daha detaylı cevap alırsınız.

Ne tür bir uygulama vb.


Uygulamam bazı çok iş parçacıklı iş yükünü (aritmetik işlemler) çalıştırmak için pthread kütüphanesini kullanır ve tcp / ip girdisine dayalı olarak farklı hesaplamalar yapması istenebilir. TinyCore Linux'a baktığımda, istemediğim tam bir masaüstü ortamına açılıyor.
dschatz

TinyCore'un MicroCore adında küçük bir erkek kardeşi var. GUI yok, bir göz atın.
n0pe

1
@MaxMackie Aslında makinenin kendisinde tcp / ip yığınının dışında bir arayüz istemiyorum. Uygulama bir bağlantı noktasını engelleyebilir ve o bağlantı noktasına gönderilen tcp paketleri aracılığıyla denetlenebilir.
dschatz

1
Çalışmakta olan küçük hizmetler ( linuxhelp.blogspot.com/2006/04/… ) ve uygulamanızın ve bağımlılıklarının yüklü olduğu başka bir şeyin olmadığı bir ortam öneriyorum .
n0pe

1
@dschatz iyi, o zaman çekirdeği hacklemeniz, diğer her şeyi kaldırmanız ve uygulamanızı derlemeniz gerekir. bash yok başka bir şey yok. sadece uygulamanız .. lol.
11'te bakytn

1

Gerçekten Linux çekirdeği, ağ oluşturma ve uygulamanızdan başka bir şey istemiyorsanız, bunu yapmanın tek yolu şudur:

  • Uygulamanızı bir çekirdek modülü yapmanız gerekir - hata ayıklandığından ve iyi test edildiğinden emin olun. Bu çekirdek modülü, kullanıcı arabirimi üzerinden set arabirimi IP adresleri ve tüm bu iyi şeyler gibi genel olarak yapılan şeyleri başlatmalıdır.
  • make menuconfigKendi özel çekirdeğinizi indirmeniz ve yapılandırmanız ( ) ve sistemin çalıştırılması ve ağ bağlantısı ile ilgili olmayan tüm özellikleri kaldırmanız gerekecektir. Katmanı engellemek için devre dışı bırakmak isteyeceksiniz, bunu son çekirdeklerde nasıl yapacağımı bilmiyorum make menuconfig.
  • Daha sonra modülün çekirdeğe dahil edilmesi gerekir, böylece çekilebilir bir modül değil çekirdeğin bir parçası olarak dahil edilir. Yüklenebilir modülleri muhtemelen yukarıdaki adımda devre dışı bırakabilirsiniz. Bir çekirdek modülü oluşturmak için yeterli C / C ++ biliyorsanız, bu sizin için kolay olmalıdır.
  • Çekirdeği paniğe kapılmamışsa, panik yapan herhangi bir parçayı değiştirmeniz initveya 1 ekstra kullanıcı alanı işlemiyle yaşamaya hazır olmanız gerekir.

Çekirdek modüllerin süreçler oluşturmasının mümkün olduğunu biliyorum - basit bir ps auxçok tipik bir sistemde (hepsi köşeli parantez içinde) birçok gösterecektir. Muhtemelen modülünüzün bir çekirdek süreci yaratmasını istersiniz. Sizinkilerin yanı sıra çekirdek tarafından oluşturulan tüm işlemlerden kurtulmak için, iş parçacıklarını [ kthreadd], güç yönetimini [ pm], olay katmanını [ events] ve diğerlerini devre dışı bırakmanız gerekir .


Çekirdek + 1 kullanıcı alanı işleminin daha pratik bir kurulumunu yapmak istiyorsanız, bu mümkündür.

Linux'un adı verilen bir çekirdek komut satırı seçeneği vardır init=- yükleme tamamlandığında çekirdeğin başlayacağı şey budur. Program root=, initrd ile veya initrd'de (önyükleyiciniz tarafından yüklenen) belirtilen kök aygıtta olmalıdır .

Bu program çıkarsa, Linux panikleyecektir, bu yüzden hiç çıkmadığından emin olun.

Bir nedenle Linux'un Birçok modern dağılımları bu kurulum var initinitrd'ye program başlamadan önce, bazı ek kullanıcı uzay başlatma yapar /sbin/initveya /sbin/systemd. Dağıtımınızın burada ne yaptığını (Debian için bilgi burada ) ve son "handoff" programını nerede belirtebileceğinizi bulmanız gerekecek ve oradan initveya yerine uygulamanızı başlatmasını söyleyebilirsiniz systemd.

systemdbina /dev, anasistem adı ayarlama ve diğer şeyler gibi birçok temel işlevi yönetir , bu nedenle systemdesnekseniz, tek bir işlem oluşturmak için yapılandırmaya bakmak ve başarısız olursa isteğe bağlı olarak yeniden başlatmak isteyebilirsiniz. Eğer yanılmıyorsam temelde bunu tek kullanıcı veya kurtarma modu için yapar - bir kabuk başlatır.

Çalışan 2 işleminiz olacaktır ( systemdve programınız), ancak programınız çıkar veya çökerse sistem panik yapmaz.

Ayrıca, Debian'ın hafif bir kurulumunu düşünün - "netinst" kurulumunun çekirdek, kabuk ve birkaç hizmet dışında çok fazla çalışması yoktur - veya OpenWRT / LEDE'yi düşünün - Luci için varsayılan olarak çalışan bir web sunucusu ve bir diğer hizmetleri birleştirmek ancak kolayca devre dışı bırakılır.

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.