Como te han comentado, para desarrollar un OS que funcione, tú solo, seguramente necesitaras décadas de experiencia programando. Y si ese fuese el caso, no harías esta pregunta. Entonces en base a esto, deduzco tu nivel de conocimientos y te respondo de forma que puedas acercarte bastante a lo que tratas de conseguir.
Lo mas simple que puedes hacer, es olvidarte de programar un kernel, compilar proyectos de código enormes, meterle mano al código fuente y demás. Y en su lugar irse directamente a la capa de usuario, que al final es lo que se ve y los kernel y distros de Linux ya están genial, como para tener que pasarse años programando algo similar que va a ir peor xD.
Entonces:
Te recomiendo usar proot, bajarte un filesystem del OS que mas te guste, customizarlo todo y exportarlo.
Descargar proot:
curl -LO
https://proot.gitlab.io/proot/bin/proot && chmod +x ./proot
- Descargar el filesystem de Alpine Linux (Es de los que menos pesan)
curl -LO
https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/x86_64/alpine-minirootfs-3.15.0-x86_64.tar.gz- Extraer el sistema de archivos en una carpeta
tar -xvzf alpine-minirootfs-3.15.0-x86_64.tar.gz
- Renombrar la carpeta extraida al nombre que quieras.
Yo tengo 3 copias distintas de esta carpeta:
1. alpineClean - Esta carpeta está sin modificar, solo le cambie el nombre tras extraerla del .tar.gz. La utilizo para crear nuevos "OS" limpios.
2. customDistro - En esta carpeta hago todos los cambios que quiero. Por ejemplo instalo programas, edito el saludo que sale al iniciar, cambio el gestor de paquetes por otro custom, cambio la shell de sh/ash/bash a otra que me guste mas, añado programas mios, etc.
3. baseDistro - Esta carpeta es una copia de customDistro por si la lío y borro algo por accidente, no tener que rehacer todo de 0. O por si quiero hacer cambios.
Una vez tengo una distro lista, por ejemplo con 100 herramientas de hacking, la exporto y le doy un nombre. Y la puedo utilizar en cualquier lado con proot.
Aquí te dejo algunos scripts básicos para ayudarte a manejar las distros:
arrancarOS.sh
#!/usr/bin/env bash
proot -0 -r ./customDistro -w /root --kill-on-exit --kernel-release=5.4.0 --bind="/dev/urandom:/dev/random" --bind="/proc/self/fd:/dev/fd" --bind="/proc/self/fd/0:/dev/stdin" --bind="/proc/self/fd/1:/dev/stdout" --bind="/proc/self/fd/2:/dev/stderr"
exportarOS.sh
#!/usr/bin/env bash
7z a dist-custom-distro.7z customDistro
purgarOS.sh
#!/usr/bin/env bash
yes | rm -r customDistro; cp alpineClean customDistro -r
resetearOS.sh
#!/usr/bin/env bash
yes | rm -r customDistro; cp baseDistro customDistro -r
Con proot estás utilizando el kernel del sistema original, así las distros son mucho mas ligeras. Tengo alguna distro compleja que pesa menos de 10 Megas.
Puedes extraer el fileSystem de cualquier distro de Linux para customizarlo usando el comando tar si buscas la documentación oficial de Proot, te lo explican. Usar la de Alpine tiene sus ventajas y sus desventajas. Las principales ventajas es que es muy ligero (6 megas aprox) y fácil de utilizar. La principal desventaja es que utiliza muscl como librería de C, por lo que algunos programas puede que no los encuentres y tengas que compilarlos tú con esa librería.
Para instalar paquetes en alpine:
apk add curl
Para buscar paquetes:
apk search nmap
Para informacion sobre el paquete:
apk info nmap
Para desinstalar un paquete:
apk del curl