GNU/Linux >> Tutoriales Linux >  >> Linux

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

Actualización del 19 de abril de 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 cargadores de arranque de código abierto que no son de Apple capaz de arrancar xnu (Chameleon y forks) aún se mantiene y puede arrancar Yosemite. También hay historias de éxito al iniciar OS X Yosemite dentro de QEMU. Además, gracias a un desarrollador (ahora empleado de Apple) que se hace llamar winocm , tenemos un puerto ARM del kernel xnu. Ha sido la desarrolladora más activa que conozco en esta área.

También habrá 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 un poco poco confiable, así que consulte el cuadro de información en la página de Twitter de ameaijou.

Me las arreglé para construir la cadena de herramientas de desarrollo de Apple (un host propio, sin embargo, el "SDK de Darwin" también se ha portado a Linux). Creo que todavía es posible crear un sistema operativo Darwin desde cero; casi todo lo que nos puede faltar son algunos Kext de código abierto. Mira este espacio, y si sabes cómo generar interés, ¡avísame! :)

Respuestas breves 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 a California*)

Respuesta más larga:

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

Prácticamente posible (No):

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

Como era de esperar, el punto de inflexión 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 de esa fecha, 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, en general, específicos del hardware, por lo que incluso si pudiera obtener todo y ejecutando (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 muy útil y, sin duda, toda la configuración necesaria se puede realizar sin tener que construir el sistema operativo Darwin. Además, los pasos presentados le brindan una hoja de ruta casi exacta del camino a seguir, menos el kernel, los KEXT y el gestor de arranque. Sin embargo, logré resolver el problema del gestor 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 formatéela como Mac OS Extended (con registro) (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 hacer esto es a través de la Utilidad de disco 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 ejecutas 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 DFS=/Volumes/DarwinOS (usando el punto de montaje real, obviamente) en .bashrc y .bash_profile

  • Cree el directorio de usuarios (chown a 0:0 al final):

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

    sudo su -
    
  • Cree el directorio de fuentes y configure el bit adhesivo:

    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 (todavía en root por cierto):

    mkdir -v "$DFS"/tools
    ln -sv "$DFS"/tools /
    logout          # Leave root
    
  • Descarga el código fuente de todos los paquetes que quieras. Esto es, por supuesto, donde te quedas atascado. Todos los necesarios no están allí. (Por cierto, prefiero binutils de GNU de todos 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 crear manualmente el directorio de inicio del nuevo usuario 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 ejecuta el siguiente comando (ver LFS para lo que hace si no estás 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
    
  • /configure de GCC es bastante flexible. Intenta grepear el *- patrón, o simplemente ejecute gcc -v para ver cómo se configuró su máquina host y copiar eso.

  • Ahora cierre la sesión del usuario lfs y vuelva a iniciar sesión. Ahora debería tener un entorno limpio.
  • Todo a partir de ahora tiene lugar dentro del usuario lfs. Notarás que fui un poco perezoso 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.

De aquí en adelante, será bastante bien el procedimiento estándar de LFS:extraer fuentes, compilar, instalar, probar, eliminar fuentes. Tenga en cuenta que los 2 pases de binutils, GCC y Glibc siguen siendo necesarios PERO TAMBIÉN debe tener una copia funcional de libc++.1.dylib – y también tendrás que hacerlo en 2 pasadas. Puede ver la página libcxx del proyecto LLVM para obtener algunos detalles más. Una vez compilado, puedes ponerlo en /usr/lib . Deberá compilar e instalar el kernel 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 colocarlos a mano en el paquete .kext. Una vez más, hay tutoriales sobre cómo crear a mano un KEXT en la línea de comandos.

El bit final es hacer que el sistema sea de arranque. Para hacerlo, ejecutaría el siguiente comando:

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

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

En cualquier caso, suponiendo que el kernel y los KEXT estuvieran en los lugares correctos, tenía copias adecuadas de dyld , launchd , etc en su lugar y boot.efi funcionaba correctamente, ¡el sistema debería funcionar y ser arrancable!

Tenga en cuenta que si realmente quisiera, podría ejecutar un faux-launchd eso es solo un script para ejecutar un indicador de bash, eso es lo que hace PureDarwin Nano.

Nuevamente, por todos los medios, 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 es legal (no probado)

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

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

Esto más o menos es el proyecto OSx86. Una vez más, prácticamente 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 una prueba de ello, 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 por Darwin, compra Mac por Aqua. Como resultado, el apoyo a Darwin como un producto independiente de código abierto ha disminuido gradualmente hasta el punto en que en realidad 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 de esto, tienes que saltar directamente al proyecto OSx86, que no está exactamente sancionado (por decirlo suavemente). 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 todo lo relacionado con xnu.

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


Linux
  1. Instale Apache 2 desde la fuente en Linux

  2. ¿Puedes hacerlo? Compile programas C en Linux usando el comando Make

  3. Cómo compilar e instalar software desde el código fuente en Linux

  4. ¿Se puede ejecutar Xcode en Linux?

  5. ¿Cómo compilar mi propia biblioteca estándar glibc C desde la fuente y usarla?

Linux Mint KDE todavía es posible

Cómo instalar software desde la fuente en Linux

Cómo compilar PHP7.0/PHP7.1 desde la fuente en Arch Linux

¿Necesita Java? Entonces puedes instalarlo Java en Linux

Cómo construir el kernel de Linux desde cero

Cómo compilar el kernel de Linux desde el origen para crear un kernel personalizado