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 .
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 .
Respuestas:
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 jessie
lanzamiento, 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 ~/.xinitrc
que 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.
init
, pero sin duda se puede hacer sin upstart, systemd,
o sysv. init
es sólo un archivo ejecutable llamado init
que sus invoca el núcleo cuando se monta initramfs.
en la mayoría de los casos estos otros tres no son aún init
pero que en realidad estamos exec
ed dentro de init,
la cual es comúnmentebusybox.
busybox
porque eso merece un tratamiento separado en una respuesta separada, pero no por mí.
Minimal init hello world program, paso a paso
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 /init
programa cuando se ejecute el núcleo.
Luego, cd
en 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/sdX
y:
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
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
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:
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.
busybox
pero 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.