¿Cómo crear una distribución de Linux personalizada que ejecute solo un programa y nada más?


12

Cómo podría crear mi propia distribución de Linux "personalizada" que ejecute solo un programa, casi exactamente de la misma manera que XBMCbuntu .


Bienvenido a U&L, realice una visita guiada y tómese el tiempo para aprender a hacer una pregunta, ¿qué desea hacer? porque la definición de aplicación es bastante vaga y no significa nada en absoluto, porque mi consejo sería usar, busyboxpero eso probablemente no sea lo que quieres. así que por favor, tómese el tiempo necesario para expresar su necesidad y podríamos ayudarlo. No dude en editar su pregunta para agregarle cualquier elemento relevante.
Kiwy

1
Me parece bastante claro ...
goldilocks

@ TAFKA 'goldilocks' bueno, no, porque apuesto a que todavía puedes tener acceso a un terminal o algo similar en XBMCubuntu mientras parece que solo una aplicación se está ejecutando gráficamente, pero no solo una aplicación. He hecho una pequeña distribución una vez desde cero con solo un kernel y busybox, en ese caso, incluso si hay servicios que se inician por el kernel, puedes decir que busybox es tu única aplicación.
Kiwy

@ Kiwi Esa es una buena respuesta entonces (mejor que LFS). Tenga en cuenta: 1) Esta pregunta puede ser útil para otras personas cuyo propósito general es el mismo, por lo que un rango de respuestas es bueno, 2) Si bien hay un rango de posibles soluciones aquí, es decir, TIMTOWTDI , y algunas pueden ser mejor adaptado a un objetivo más específico que otros, estoy bastante seguro de que todos funcionarán y un aspecto significativo de la decisión sobre una solución será subjetivo (por ejemplo, debido al conocimiento y la experiencia previa del OP, no a la naturaleza objetiva de la tarea) .
Ricitos de Oro

Respuestas:


6

No comenzaría a jugar con LFS, que es un camino de jardín que conduce a algunos bosques oscuros.

Comience con una distribución donde tenga mucho control sobre la instalación inicial, como Arch, o una edición sin cabeza como el servidor Ubuntu. El objetivo de esto no es tanto para ahorrar espacio como para delimitar la complejidad de la configuración de inicio; a partir de una distribución sin cabeza, si la aplicación que desea ejecutar requiere una GUI, puede agregar lo que se requiere para eso sin tener que terminar con un inicio de sesión GUI (también conocido como el administrador de pantalla o DM) iniciado por init, y un escritorio completo ambiente para ir con eso.

Luego, desea aprender cómo configurar el sistema init para sus propósitos; tenga en cuenta que no puede prescindir de init, y puede ser el mejor medio para lograr su objetivo. Hay tres variaciones en init comúnmente usadas en Linux (pero hay algunas otras ):

  • Debian utiliza una variación en el clásico estilo Unix SysV init . A partir del jessielanzamiento, Debian también cambió a systemd( https://wiki.debian.org/systemd )

  • Ubuntu y derivados usan advenedizo .

  • Fedora, Arch y derivados usan systemd .

Si aún no sabe nada de ninguno de estos, ninguno de ellos es particularmente más difícil de usar que cualquiera de los otros. Si opta por uno de los dos últimos, proporcionan algunos mecanismos para la compatibilidad con SysV, pero no se moleste con eso , NO es más simple. 1

El punto aquí es minimizar lo que hace init en el arranque, y así es como puede crear un sistema que ejecute una cantidad mínima de software para admitir la aplicación en la que desea enfocarse: así es esencialmente cómo se configura un servidor, Por cierto, por lo que es una tarea común (tenga en cuenta que, literalmente, no puede tener "solo un" proceso de usuario en ejecución, al menos no útil).

Si la aplicación que desea ejecutar es un programa GUI (un buen ejemplo de por qué literalmente no puede simplemente ejecutar una aplicación, ya que las aplicaciones GUI requieren un servidor X), puede tener una ~/.xinitrcque se vea así;

#!/bin/sh

myprogram

Cuando lo haga startx, su programa será lo único que se ejecutará, y será imposible cambiar los escritorios o iniciar cualquier otra cosa, en parte porque no hay un administrador de ventanas o un entorno de escritorio (por lo tanto, tampoco habrá un marco de ventana o barra de título).

1. Para aclarar un poco el punto: cuando esté investigando esto, puede encontrar algunas dudas acerca de systemd y de personas que antes estaban familiarizadas con SysV que afirman, por ejemplo, que son demasiado complicadas. Sin embargo, objetivamente no son más complejos que SysV (el sistema IMO es más sencillo de usar, de hecho), pero la mayoría de los perros prefieren sus viejos trucos, por así decirlo. Este agarre está comenzando a disminuir ahora que ambos sistemas han estado en uso durante un tiempo.


1
No se puede prescindir init, pero sin duda se puede hacer sin upstart, systemd,o sysv. inites sólo un archivo ejecutable llamado initque sus invoca el núcleo cuando se monta initramfs.en la mayoría de los casos estos otros tres no son aún initpero que en realidad estamos execed dentro de init,la cual es comúnmentebusybox.
mikeserv

@mikeserv Absolutamente (y mencioné explícitamente que estas no son las únicas tres opciones). Tenga en cuenta también que excluí deliberadamente busyboxporque eso merece un tratamiento separado en una respuesta separada, pero no por mí.
Ricitos de Oro

¡Qué amable de tu parte ofrecer! Pero de ninguna manera.
mikeserv

Sería interesante saber si este enfoque realmente funciona en la práctica. ¿Alguien realmente lo intentó?
Faheem Mitha

@FaheemMitha Si te refieres a lo que estoy recomendando aquí (personalizar la configuración de inicio), por supuesto que sí, así es como funciona el sistema, solo estarías produciendo una versión simplificada y simplificada (estoy seguro de que esto es qué es XBMCbutu) Si quiere decir, reemplazar init con un ejecutable más especializado en ala busybox, probablemente sea más problemático de lo que vale a menos que deba hacerlo de esa manera: el propósito principal de busybox es usarlo en entornos pequeños integrados (con, por ejemplo, solo unos pocos MB de RAM).
Ricitos de Oro

18

Minimal init hello world program, paso a paso

ingrese la descripción de la imagen aquí

Compile un mundo hola sin ninguna dependencia que termine en un bucle infinito. 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

No podemos usar la llamada al sistema de salida, o de lo contrario el kernel entra en pánico.

Entonces:

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"

Esto crea un sistema de archivos con nuestro hello world en /init, que es el primer programa de usuario que ejecutará el kernel. También podríamos haber agregado más archivos d/y serían accesibles desde el /initprograma cuando se ejecute el núcleo.

Luego, cden el árbol del kernel de Linux, la compilación es la habitual y ejecútela en 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"

Y deberías ver una línea:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

en la pantalla del emulador! Tenga en cuenta que no es la última línea, por lo que debe buscar un poco más arriba.

También puede usar programas en C si los vincula estáticamente:

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

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

con:

gcc -static init.c -o init

La vinculación dinámica requeriría configurar un ejecutable del vinculador dinámico, el más común de los cuales forma parte de bibliotecas estándar de C como glibc.

Puede ejecutar en hardware real con un USB encendido /dev/sdXy:

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

Gran fuente sobre este tema: Consejo técnico: cómo usar initramfs | landley.net También explica cómo usar gen_initramfs_list.sh, que es un script del árbol de fuentes del kernel de Linux para ayudar a automatizar el proceso.

Probado en Ubuntu 16.10, QEMU 2.6.1.

Próximos pasos

Lo siguiente que quiere hacer es configurar BusyBox .

BusyBox implementa utilidades básicas de POSIX-y CLI, incluido un shell POSIX-y, que le permite experimentar más fácilmente con el sistema de forma interactiva.

Personalmente, en este punto prefiero confiar en Buildroot , que es un increíble conjunto de scripts que automatiza la construcción de todo, desde la fuente y la creación del sistema de archivos raíz.

He subido un asistente altamente detallado y automatizado para eso en: https://github.com/cirosantilli/linux-kernel-module-cheat


44
Esta es probablemente la respuesta más subestimada aquí: D. ¡Increíble!
msouth


1

si estás un poco programado y quieres crearlo desde cero, puedes usar LFS, es decir, Linux desde cero http://www.linuxfromscratch.org/

si desea personalizar ubutnu, puede usar ubunt-builder y si lo desea en base rpm puede usar SUsE-Studio, Suse studio le permitirá hacer suse linux personalizado

salud


1

Se trata más de lo que requiere su "programa único".

Todavía puede tener un buen comienzo para comprender cómo armar las cosas construyendo un LFS (también conocido como " Linux From Scratch ") . Luego agregará las cosas requeridas por su programa o irá a una distribución completa porque construir un subsistema pesado como Gnome o KDE en LFS puede ser un verdadero fastidio.

Por supuesto, retroceder puede ser más fácil al principio, pero eliminar cosas de una distribución completa puede ser problemático: haga esto en una VM y haga una copia de esta VM en cada paso.

(mis 2 centavos)

Editar :

Como señaló SecurityBeast en lugar de comenzar desde una distribución completa como CentOS o Ubuntu , también puede echar un vistazo a la creación de herramientas de distribución como:


1

Lo que debe preguntar es qué necesita su "programa único" y qué recursos tiene.

Si necesita una amplia selección de bibliotecas y archivos binarios de soporte, es mejor que use una distribución de Linux "regular" (Debian o similar) y que solo juegue un poco con el proceso de arranque.

Si necesita una selección más limitada de material de soporte, pero aún requiere elementos como redes o soporte para una variedad de hardware usando diferentes módulos de kernel o bits de soporte de usuario y no desea el espacio en disco de una distribución regular, entonces sugeriría mirar distribuciones integradas (buildroot o similar) o quizás un enfoque Linux desde cero (aunque eso puede ser un dolor de cabeza de mantenimiento)

Si necesita lo que puede proporcionar un kernel no modular y nada más, ejecutar su propio binario directamente en el kernel puede funcionar y ser la solución más ligera.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.