Como criar uma distribuição Linux customizada que execute apenas um programa e nada mais?

8

Eu estou querendo saber como eu poderia criar minha própria distribuição Linux "customizada" que rodaria apenas um programa, exatamente da mesma maneira que XBMCbuntu . Eu não estou pedindo um guia passo a passo, apenas talvez um link para algo que possa me ajudar no caminho.

    
por user3462992 02.04.2014 / 11:11

5 respostas

5

Eu não começaria a mexer com o LFS, que é um caminho de jardim que leva a algumas florestas escuras.

Comece com uma distro em que você tenha muito controle sobre a instalação inicial, como o Arch, ou uma edição sem cabeçalho, como o servidor Ubuntu. O objetivo disso não é tanto economizar espaço, mas sim delimitar a complexidade da configuração do init; a partir de uma distribuição sem cabeça, se o aplicativo que você deseja executar requerer uma GUI, você pode adicionar o que é necessário para isso sem ter que ter um login GUI (também conhecido como gerenciador de exibição ou DM) iniciado pelo init e uma área de trabalho completa. ambiente para acompanhar.

Você então quer aprender como configurar o sistema init para seus propósitos - note que você não pode fazer sem o init e pode ser o melhor meio de atingir seu objetivo. Existem três variações no init comumente usadas no linux (mas existem algumas outras ):

  • O Debian usa uma variação do estilo clássico Unix SysV init . A partir do release jessie , o Debian também mudou para systemd ( link )

  • O Ubuntu e os derivados usam o upstart .

  • Fedora, Arch e derivados usam systemd .

Se você ainda não sabe nada sobre nenhum deles, nenhum deles é particularmente mais difícil de usar do que qualquer um dos outros. Se você for com um dos dois mais recentes, eles fornecem alguns mecanismos para compatibilidade retroativa com o SysV, mas não se incomode com isso , NÃO é mais simples. 1

O ponto aqui é minimizar o que o init faz no boot, e é assim que você pode criar um sistema que irá rodar uma quantidade mínima de software para suportar o aplicativo que você quer focar - isso é essencialmente como um servidor é configurar, BTW, por isso é uma tarefa comum (note que você não pode literalmente ter "apenas um" processo userland em execução, pelo menos não utilmente).

Se o aplicativo que você deseja executar for um programa GUI (um bom exemplo de por que você não pode literalmente executar apenas um aplicativo, já que os aplicativos GUI exigem um servidor X), você pode ter um ~/.xinitrc semelhante a este ;

#!/bin/sh

myprogram

Quando você, em seguida, startx , seu programa será a única coisa em execução e será impossível alterar os desktops ou iniciar qualquer outra coisa, parcialmente porque não há gerenciador de janelas ou ambiente de área de trabalho (portanto, não haverá janela frame ou barra de título também.

1. Para minimizar um pouco o ponto: quando você está pesquisando isso, você pode encontrar algumas reclamações sobre systemd e upstart de pessoas que já estavam familiarizadas com o SysV alegando, por exemplo, que elas são muito complicadas. No entanto, objetivamente, eles não são mais complexos do que o SysV (o sistema IMO é mais simples de usar, na verdade), mas a maioria dos cães prefere seus truques antigos, por assim dizer. Este aperto está começando a diminuir agora ambos os sistemas estão em uso há algum tempo.

    
por 02.04.2014 / 12:44
12

Iniciativa mínima hello world passo a passo

Compileummundohellosemnenhumadependênciaquetermineemumloopinfinito.init.S:

.global_start_start:mov$1,%raxmov$1,%rdimov$message,%rsimov$message_len,%rdxsyscalljmp.message:.ascii"FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
    .equ message_len, . - message

Não podemos usar a chamada do sistema de saída, senão o kernel entra em pane.

Então:

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"

Isso cria um sistema de arquivos com o nosso hello world em /init , que é o primeiro programa de userland que o kernel executará. Poderíamos também ter adicionado mais arquivos a d/ e eles seriam acessíveis a partir do programa /init quando o kernel fosse executado.

Então cd na árvore do kernel Linux, a compilação é como sempre, e execute no QEMU:

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"

E você deve ver uma linha:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

na tela do emulador! Note que não é a última linha, então você tem que olhar um pouco mais para cima.

Você também pode usar programas em C se os vincular estaticamente:

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

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

com:

gcc -static init.c -o init

A vinculação dinâmica exigiria a configuração de um executável de vinculador dinâmico, sendo que os mais comuns fazem parte de bibliotecas padrão C, como a glibc.

Você pode executar em hardware real com um USB em /dev/sdX e:

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

Grande fonte sobre este assunto: Dica técnica: como usar o initramfs | landley.net Também explica como usar gen_initramfs_list.sh , que é um script da árvore de código-fonte do kernel do Linux para ajudar a automatizar o processo.

Próximo passo: configure o BusyBox para que você possa interagir com o sistema: link

Testado no Ubuntu 16.10, QEMU 2.6.1.

    
por 25.10.2015 / 23:23
1

se você é um pouco de programador e quer criá-lo do zero, pode usar o LFS, isto é, Linux from Scratch link

se você quiser personalizar o ubutnu, você pode usar o ubunt-builder e, se desejar, no rpm base, você pode usar o SUsE-Studio, o Suse studio permitirá que você faça o custom suse linux

felicidades

    
por 02.04.2014 / 11:22
1

É mais sobre o que seu "programa único" exige.

Você ainda pode ter um bom começo de entender como montar as coisas construindo um LFS (também conhecido como " Linux From Scratch <" / strong> ") . Então você irá adicionar coisas requeridas pelo seu programa ou ir para uma distribuição completa porque construir um sub-sistema pesado como o Gnome ou KDE no LFS pode ser uma verdadeira dor de cabeça. -ass.

É claro que retroceder pode ser mais fácil no início, mas remover coisas de um distribuidor completo pode ser problemático: faça isso em uma VM e copie essa VM a cada etapa.

(meus 2 centavos)

Editar :

Como apontado por SecurityBeast ao invés de começar com uma distribuição completa como CentOS ou Ubuntu , você também pode dar uma olhada na construção de distribuição ferramentas como:

por 02.04.2014 / 11:24
1

O que você precisa perguntar é o que seu "programa único" precisa e quais recursos você tem.

Se você precisa de uma ampla seleção de bibliotecas e binários de suporte, pode ser melhor usar uma distro Linux "regular" (Debian ou similar) e mexer um pouco com o processo de inicialização.

Se precisar de uma seleção mais restrita de material de suporte, mas ainda requer coisas como rede ou suporte para uma variedade de hardware usando módulos de kernel diferentes ou bits de suporte de usuário e você não quer a sobrecarga de espaço de uma distro regular, então eu sugiro olhar para distros embutidos (buildroot ou similar) ou talvez um linux do zero (embora isso possa ser uma dor de cabeça de manutenção)

Se você precisa apenas do que um kernel não-modular pode fornecer e nada mais, então executar o seu próprio binário diretamente no kernel pode funcionar e ser a solução mais leve ...

    
por 04.04.2016 / 14:31