¿Es posible compilar una distribución de Darwin desde la fuente, como se puede construir una distribución de Linux?

42

He leído y realizado Linux From Scratch (y BLFS) y me preguntaba, ¿puedo seguir esta guía para crear una distribución de Darwin sustituyendo el xnukernel? ¿El proceso sería muy diferente al descrito en LFS?

Mi comprensión actual es que todo lo que se necesitaría para hacer que el sistema "Darwin" en lugar de "Linux" fuera la sustitución del núcleo. ¿Es esto correcto?


EDITAR:

En respuesta al comentario de Killermist, refinaré esta pregunta. Mientras busco información sobre este tema en general, lo que busco específicamente es algo así como una " Guía de creación de distribución de Darwin ", al igual que el LFS es una " Guía de creación de distribución de Linux ".

Aprecio que tal información probablemente solo provenga de personas de Puredarwin , OpenDarwin o GNU / Darwin, por lo que es una especie de reclamo de ayuda. Una guía " How-We-Made-Pure-Darwin-Nano-Start-To-Finish " como LFS sería perfecta, pero sé que es mucho pedir.

Efímera
fuente
3
Probablemente valga la pena mirar puredarwin para ver qué implica construir una distribución basada en darwin (y los problemas que ellos y opendarwin enfrentaron en esto)
Journeyman Geek
1
Para el usuario regular, ambos núcleos se ven muy similares, pero el software utilizado para administrar el núcleo y el software íntimamente relacionado con él (incluido libc) son bastante diferentes. La documentación de LFS no será de mucha ayuda en estos primeros pasos críticos. Quizás comenzar (o al menos estudiar) la rama kFreeBSD de Debian es más relevante.
vonbrand
1
Sugerencia: si realmente hace una pregunta de lo que está tratando de hacer, ambos aumentan sus posibilidades de encontrar un éxito en las preguntas ya existentes, pero también aumentan la probabilidad de que atraiga a más personas con ideas sobre cómo responder la pregunta . En lugar de estar confundido cuál es la pregunta realmente. Solo un pensamiento.
Killermist
1
Darwin está basado en BSD, que es diferente de Linux. La forma BSD de hacer las cosas es diferente en más cosas que solo el núcleo (preferencias del sistema de archivos, estructuras de directorios, política de actualización, etc.).
vesperto
2
Ser binario compatible con no es lo mismo, me temo. @Vesperto tiene razón, Darwin está más relacionado con la familia BSD que con Linux; aunque con un kernel decididamente diferente que otros BSD. Creo que tendría más suerte buscando una guía de tipo BFS que una basada en LFS. El Manual BSD sería otra buena fuente de referencia. Aún necesitaría usar sus referencias de Darwin para obtener información relevante.
Jerry W Jackson

Respuestas:

32

Actualización 19 abr 2015:

Después de dos años, todavía parece haber muy poco interés en esta esfera. Sin embargo, la comunidad Hackintosh sigue siendo muy activa, lo que significa que uno de los pocos gestores de arranque de código abierto que no son Apple capaces de arrancar xnu (Chameleon and forks) todavía se mantiene y puede arrancar Yosemite. También hay historias de éxito que arrancan OS X Yosemite dentro de QEMU. Además, gracias a un desarrollador (ahora empleado por Apple) que utiliza el winocm , tenemos un puerto ARM del núcleo xnu . Ella ha sido la desarrolladora más activa que conozco en esta área.

También hay una secuela de Mac OS X Internals de Amit Singh próximamente. Por lo general, no me gusta mencionar las páginas personales de las personas; sin embargo, el servidor de blogs con toda la información parece ser poco confiable, por lo tanto, consulte el cuadro de información en la página de Twitter de ameaijou .

He logrado construir la cadena de herramientas de desarrollo de Apple (un auto-host, sin embargo, el "Darwin SDK" también se ha portado a Linux ). Creo que un sistema operativo Darwin aún puede ser posible construir desde cero, sobre todo lo que podría faltar son algunos Kexts de código abierto. Mire este espacio, y si sabe cómo despertar interés, ¡hágamelo saber! :)


Respuestas cortas a esta pregunta:

Técnicamente:

Prácticamente: no *

Con trucos binarios: probablemente, pero tampoco legal (no probado)

Con trucos binarios para hardware genérico: como arriba (no probado)

* a menos que trabajes en Apple (* se aclara la garganta en dirección general de California *)


Respuesta más larga:

Esto va a ser bastante largo. Sugiero café. Si no tiene el tiempo / ganas de leerlo todo, puede saltar a "Observaciones finales".

Prácticamente posible (No):

Lamentablemente, Apple ha retirado el código fuente de demasiados KEXTs y binarios necesarios de Darwin para hacer posible la compilación de un sistema operativo Darwin únicamente desde la fuente. Todavía es técnicamente posible (podría escribir la fuente usted mismo para repararlo correctamente), pero simplemente no tengo el tiempo, las habilidades o la inclinación para hacerlo (y dudo que la comunidad de financiación colectiva esté muy interesada).

Como era de esperar, el punto clave fue el lanzamiento de Darwin 10, que llevó a xnu a x86_64-land. La mayoría de las fuentes necesarias existían antes, pero solo eran x86. A medida que pasó el tiempo, el significado de "código abierto" de Apple parece haber cambiado a "código abierto solo en el hardware de Apple", ya que los KEXT de Apple ahora son específicos de hardware en general, por lo que incluso si pudiera obtener todo corriendo (ver más abajo) todavía estaría confinado al hardware de Apple.

Técnicamente posible (sí):

Sin embargo, no todo está perdido. La guía LFS fue útil y ciertamente toda la configuración necesaria se puede llevar a cabo sin construir realmente el sistema operativo Darwin. Además, los pasos presentados le dan una hoja de ruta casi exacta de la ruta por delante, menos el núcleo, los KEXT y el gestor de arranque. Sin embargo, logré resolver el problema del cargador de arranque (al menos para el hardware de Apple).

Si está interesado, aquí hay una descripción completa de lo que tendrá que hacer:

  • Borre una partición (preferiblemente de 8 GB o más) en una unidad (interna o externa, no importa) y formateela como Mac OS Extended (Journaled) (HFS +).
  • Asegúrese de que tenga una tabla de particiones GUID (GPT) y que cuando lo haga tenga una partición EFI. La forma más fácil de hacerlo es a través de la Utilidad de Discos de Apple, pero puede hacerlo en la línea de comandos si lo desea (hay tutoriales en otros lugares sobre cómo hacerlo). El punto importante es que cuando ejecuta distil list diskNsM, la siguiente información debe ser correcta:

    Tipo de partición: Apple_HFS

    Se puede instalar el sistema operativo: Sí

    Medios de solo lectura: No

    Volumen de solo lectura: No

  • Ahora a seguir la guía LFS (con adaptaciones).

  • Insertar (usando el punto de montaje real, obviamente) en yDFS=/Volumes/DarwinOS.bashrc.bash_profile

  • Haga el directorio del usuario ( chowna 0: 0 al final):

    sudo mkdir -v "$DFS"/usr
    
  • Ingrese root:

    sudo su -
    
  • Haga el directorio de fuentes y establezca el bit fijo:

    mkdir -v "$DFS"/sources     # Make sure you still have $DFS defined; if not, redefine it.
    chmod -v a+wt "$DFS"/sources
    
  • Cree el directorio de herramientas y cree un enlace simbólico para que podamos agregarlo fácilmente a $ PATH más tarde (aún rootpor cierto):

    mkdir -v "$DFS"/tools
    ln -sv "$DFS"/tools /
    logout          # Leave root
    
  • Descargue la fuente de todos los paquetes que desee. Esto es, por supuesto, donde te quedas atascado. Todos los necesarios no están allí. (Por cierto, prefiero GNU de binutilstodos modos).

Suponiendo que de hecho pudieras descargar todos los que necesitabas, sigamos adelante.

  • Cree un usuario desfavorecido específicamente para DFS (sugerido por LFS):

    sudo dscl . -create /Users/lfs
    sudo dscl . -create /Users/lfs UserShell /bin/bash
    sudo dscl . -create /Users/lfs RealName "LFS DFS"
    sudo dscl . -create /Users/lfs UniqueID "2070"      # whatever you like
    sudo dscl . -create /Users/lfs PrimaryGroupID 20    # Default 'staff'
    sudo dscl . -create /Users/lfs NFSHomeDirectory /Users/lfs
    sudo dscl . -passwd /Users/lfs dfs          # Again to taste.
    
  • Tenga en cuenta que debe realizar el homedir del nuevo usuario manualmente en una Mac:

    sudo mkdir /Users/lfs
    sudo chown -R lfs:staff /Users/lfs/
    
  • Ahora otorgue al nuevo usuario acceso a las fuentes y herramientas

    sudo chown -v lfs $DFS/tools
    sudo chown -v lfs $DFS/sources
    
  • Iniciar sesión:

    su - lfs
    Password: dfs
    
  • Ejecute el siguiente comando para limpiar el entorno (desde LFS):

    cat > ~/.bash_profile << "EOF"
    echo "Entering clean environment…"
    exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
    EOF
    
  • Ahora ejecute el siguiente comando (consulte LFS para saber qué hace si no está seguro):

    cat > ~/.bashrc << "EOF"
    set +h
    umask 022
    DFS=/Volumes/*DarwinOS*     # As previously
    LC_ALL=POSIX
    LFS_TGT=$(uname -m)-dfs-darwin1242  # Look inside gcc/configure for possibilities!
    PATH=/tools/bin:/bin:/usr/bin       # Note symlink from before
    export LFS LC_ALL LFS_TGT PATH
    echo ".bashrc script complete. Environment is ready."
    EOF
    
  • El CCG /configurees bastante flexible. Intente ajustar el *-patrón, o simplemente ejecute gcc -vpara ver cómo se configuró su máquina host y copie eso.

  • Ahora cierre la sesión del usuario lfs e inicie sesión nuevamente. Ahora debe tener un entorno limpio.
  • Todo a partir de ahora tiene lugar dentro del usuario lfs. Notarás que fui un poco flojo al convertir solo la mitad de los símbolos 'LFS' en símbolos 'DFS'. Lo siento, pero entiendes la idea.

Bien ahora a la sección hipotética.

A partir de aquí, será un procedimiento LFS estándar: extraer fuentes, construir, instalar, probar, eliminar fuentes. Tenga en cuenta que los 2 pases de binutils, GCC y Glibc todavía son necesarios, PERO TAMBIÉN debe tener una copia de trabajo libc++.1.dylib, y también deberá hacerlo en 2 pases. Puede ver la página libcxx del proyecto LLVM para obtener más detalles. Una vez compilado, puedes ponerlo /usr/lib. Tendrá que compilar e instalar el núcleo xnu (hay algunos tutoriales en la web sobre cómo hacerlo) y luego instalar los KEXT. Incluso si todos los KEXT requeridos estuvieran disponibles, aún tendría que ponerlos en el paquete .kext a mano. Una vez más, hay tutoriales sobre cómo crear un KEXT a mano en la línea de comandos.

El último bit es hacer que el sistema sea de arranque. Para hacer eso, ejecutarías el siguiente comando:

 "$DFS/usr/sbin/bless" --folder "$MOUNT/System/Library/CoreServices" --bootefi --verbose

En realidad, el lugar para bendecir realmente no hace la diferencia. Esa carpeta es solo estándar de Apple.

En cualquier caso, suponiendo que el núcleo y kexts estaban en los lugares adecuados, que tenía copias adecuadas de dyld, launchd, etc en su lugar y boot.efifuncionaba correctamente, el sistema debería estar trabajando y arranque!

Tenga en cuenta que si realmente quisiera, podría ejecutar una imitación, launchdeso es solo un script para ejecutar un indicador de bash, eso es lo que hace PureDarwin Nano .

Nuevamente, por supuesto, escriba los KEXT y los binarios usted mismo si lo desea: es técnicamente posible. Solo llámame cuando hayas terminado.


Con trucos binarios: probablemente, pero tampoco legal (no probado)

Entonces, ¿por qué no puedes simplemente extraer los binarios, los KEXT y los archivos necesarios de Mountain Lion, bendecir el volumen y listo? Bueno, probablemente puedas. Pero también necesitas una licencia para hacer esto. Además, si haces esto, básicamente has hecho una copia de Mountain Lion. ¿No es eso algo fuera de lugar?

Con trucos binarios para hardware genérico: como arriba (no probado)

Esto es más o menos el proyecto OSx86. Una vez más, te encuentras con problemas legales de inmediato. No hay duda de que estos dos últimos métodos son definitivamente posibles; el hecho de que pueda ejecutar Mountain Lion en hardware genérico es prueba de eso, pero el objetivo de esto era poder compilar legítimamente su propio sistema operativo Darwin desde la fuente.


Nota al margen

Es posible que haya notado que he evitado deliberadamente cualquier cosa de 32 bits. En un mundo donde todos los principales sistemas operativos están disponibles en 64 bits, no tiene mucho sentido compilar uno de 32 bits. Apple realmente proporcionó imágenes de disco de Darwin (hasta Darwin 9) aquí . Funcionaron perfectamente en mi caja de Windows.

Observaciones finales

Supongo que al final del día, la gente no compra Mac para Darwin, sino que compra Mac para Aqua. Como resultado, el apoyo a Darwin como producto independiente de código abierto ha disminuido gradualmente hasta el punto en que realmente es solo un gesto simbólico para la comunidad de código abierto. El otro hecho un poco irónico es que para aprender mucho sobre esto, debe saltar directamente al proyecto OSx86, que no está sancionado exactamente (para decirlo con suavidad). Incluso entonces, no hay mucha información disponible. PureDarwin es un excelente lugar para comenzar, y el libro de Jonathan Levin es una referencia invaluable para todas las cosas xnu.

Este ha sido un año de trabajo extremadamente educativo, y estoy casi tan feliz de saber cómo hacerlo como lo estaría haciendo realmente. Sin embargo, voy a tener que dejar de trabajar en eso en algún momento y ahora es ese momento. Como último grito inútil a Apple, ¿sería demasiado pedir tener una versión más de Darwin cuando lance Mavericks?

Efímera
fuente
1

Obviamente, usted ha reconocido que el LFS es para Linux y que Darwin es muy diferente del LFS de Linux aplicado, por lo que es más simple que sus esfuerzos individuales para aplicar el LFS a los sistemas de Darwin.

Hay muchos intentos de la comunidad para reemplazar / mejorar los sistemas Darwin. Si bien el proyecto OpenDarwin no tiene mucho éxito, supongo que el código de Apple es demasiado difícil, mientras que todavía queda un proyecto PureDarwin:
PureDarwin SourceForge
PureDarwin HomePage

Primero obtenga una cuenta de desarrollador, tome sus herramientas de compilación, luego puede obtener los pasos para hacer su propio kernel personalizado.

Darwin Kernel no tiene la misma arquitectura que Linux Kernel, por lo tanto, no se puede reemplazar con Linux Kernel, por lo que debe compilarlo.

En realidad, todo lo que necesita hacer es apegarse al 100% con el proyecto PureDarwin, luego llamar al siguiente script: Google Code: Kernel de conmutador Darwin puro con las imágenes de kernel personalizadas que haya creado estarán bien.

Pero con respecto a cómo construir un buen Darwin Kernel que funcione, esa sería una nueva pregunta.


fuente