É possível compilar uma distribuição Darwin a partir da fonte, como você pode construir uma distribuição Linux?

42

Eu li e realizei o Linux From Scratch (e BLFS) e fiquei pensando: posso seguir este guia para criar uma distribuição Darwin substituindo o xnukernel? O processo seria muito diferente daquele descrito no LFS?

Meu entendimento atual é que tudo o que seria necessário para tornar o sistema "Darwin" em vez de "Linux" seria a substituição do kernel. Isso está correto?


EDITAR:

Em resposta ao comentário de killermist, refinarei esta questão. Enquanto procuro informações sobre esse tópico em geral, o que estou procurando especificamente é algo como um " Guia de criação de distribuição de Darwin ", assim como o LFS é um " Guia de criação de distribuição de Linux ".

Compreendo que essas informações provavelmente venham apenas do pessoal de Puredarwin , OpenDarwin ou GNU / Darwin, portanto, isso é um indicativo para ajuda. Um guia " Como fizemos o PureDarwin-Nano-começar-a-terminar " como o LFS seria perfeito, mas sei que isso é pedir muito.

Coisas efêmeras
fonte
3
É provavelmente vale a pena olhar puredarwin para ver o que vai para a construção de uma distro baseada Darwin (e os problemas que eles e OpenDarwin enfrentou neste)
Journeyman Geek
11
Para usuários regulares, os dois kernels parecem muito semelhantes, mas o software usado para gerenciar o kernel e o software intimamente envolvido com ele (incluindo a libc) são bem diferentes. A documentação do LFS não será de grande ajuda nessas primeiras etapas críticas. Talvez a partir de (ou pelo menos estudando) o ramo kFreeBSD do Debian seja mais relevante.
vonbrand
11
Dica: se você realmente faz uma pergunta sobre o que está tentando fazer, aumenta as chances de encontrar um acerto nas perguntas já existentes, mas também aumenta a probabilidade de atrair mais pessoas com idéias sobre como responder à pergunta. . Em vez de ficar confuso sobre o que realmente é a pergunta. Apenas um pensamento.
killermist
11
Darwin é um pouco baseado no BSD, que é diferente do Linux. O modo BSD de fazer as coisas é diferente em mais coisas do que apenas no kernel (preferências do sistema de arquivos, estruturas de diretório, política de atualização, etc.).
vesperto 23/03
2
Ser compatível com binários não é a mesma coisa, receio. @Vesperto está certo, Darwin está mais relacionado à família BSD do que ao Linux; embora com um kernel decididamente diferente dos outros BSDs. Eu acho que você teria melhor sorte procurando um guia do tipo BFS do que um baseado no LFS. O Manual do BSD seria outra boa fonte de referência. Você ainda precisará usar as referências do Darwin para obter informações relevantes.
perfil completo de Jerry W Jackson

Respostas:

32

Atualização 19 de abril de 2015:

Depois de dois anos, ainda parece haver muito pouco interesse nessa esfera. No entanto, a comunidade Hackintosh ainda é altamente ativa, o que significa que um dos poucos gerenciadores de inicialização de código aberto que não são da Apple capazes de inicializar o xnu (Chameleon e forks) ainda é mantido e pode inicializar o Yosemite. Também existem histórias de sucesso ao inicializar o OS X Yosemite no QEMU. Além disso, graças a um desenvolvedor (atualmente empregado pela Apple) que usa o winocm , temos uma porta ARM do kernel xnu . Ela é a desenvolvedora mais ativa que conheço nessa área.

Em breve, também haverá uma sequência dos Mac OS X Internals de Amit Singh . Eu geralmente não gosto de mencionar as páginas pessoais das pessoas; no entanto, o servidor do blog com todas as informações parece um pouco confiável, portanto, veja a caixa de informações na página do Twitter da ameaijou .

Consegui construir a cadeia de ferramentas de desenvolvimento da Apple (um host próprio, no entanto, o "Darwin SDK" também foi portado para o Linux ). Acredito que ainda seja possível construir um sistema operacional Darwin do zero - sobre tudo o que podemos estar perdendo são alguns Kexts de código aberto. Assista a este espaço e, se você souber como despertar interesse, me avise! :)


Respostas curtas para esta pergunta:

Tecnicamente: Sim

Praticamente: Não *

Com fraudes binárias: Provavelmente, mas também não é legal (não testada)

Com fraudes binárias para hardware genérico: Como acima (não testado)

* a menos que você trabalhe na Apple (* pigarreia na direção geral da Califórnia *)


Resposta mais longa:

Isso vai demorar bastante. Eu sugiro café. Se você não tem tempo / inclinação para ler tudo, pode pular para "Comentários finais".

Praticamente possível (não):

Infelizmente, a Apple retirou o código fonte de muitos KEXTs e binários necessários de Darwin para tornar possível a compilação de um sistema operacional Darwin puramente a partir da fonte. Ainda é tecnicamente possível (você pode escrever a fonte para corrigi-la adequadamente), mas eu simplesmente não tenho tempo, habilidades ou inclinação para fazer isso (e duvido que a comunidade de financiamento coletivo esteja muito interessada).

Sem surpresa, o principal ponto de inflexão foi o lançamento do Darwin 10, que trouxe o xnu para o x86_64-land. A maioria das fontes necessárias existia antes disso, mas eram apenas x86. Com o passar do tempo, o significado de "Código aberto" da Apple parece ter mudado para "Código aberto apenas no hardware da Apple", já que os KEXTs da Apple agora são específicos de hardware em geral, portanto, mesmo que você possa obter tudo, executando (veja abaixo) você ainda estaria confinado ao hardware da Apple.

Tecnicamente possível (Sim):

No entanto, nem tudo está perdido. O guia LFS foi útil e certamente toda a configuração necessária pode ser realizada sem a criação do sistema operacional Darwin. Além disso, as etapas apresentadas fornecem um roteiro quase exato do caminho a seguir, menos o kernel, os KEXTs e o carregador de inicialização. Mas consegui resolver o problema do gerenciador de inicialização (pelo menos no hardware da Apple).

Se você estiver interessado, aqui está uma visão geral completa do que você precisará fazer:

  • Apague uma partição (8 GB ou mais, de preferência) em uma unidade (interna ou externa - não importa) e formate-a como Mac OS Extended (Diário) (HFS +).
  • Verifique se ele possui uma tabela de partição GUID (GPT) e se, ao fazê-lo, possui uma partição EFI. A maneira mais fácil de fazer isso é através do Utilitário de Disco da Apple, mas você pode fazê-lo na linha de comando, se desejar (existem tutoriais em outros lugares sobre como fazer isso). O ponto importante é que, quando você executa distil list diskNsM, as seguintes informações devem estar corretas:

    Tipo de partição: Apple_HFS

    OS pode ser instalado: Sim

    Mídia somente leitura: não

    Volume somente leitura: não

  • Agora, siga o guia do LFS (com adaptações).

  • Insira (usando o ponto de montagem real, obviamente) em eDFS=/Volumes/DarwinOS.bashrc.bash_profile

  • Crie o diretório do usuário ( chownpara 0: 0 no final):

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

    sudo su -
    
  • Crie o diretório de fontes e defina o bit adesivo:

    mkdir -v "$DFS"/sources     # Make sure you still have $DFS defined; if not, redefine it.
    chmod -v a+wt "$DFS"/sources
    
  • Crie o diretório tools e faça um link simbólico para que possamos adicioná-lo facilmente ao $ PATH mais tarde (ainda rootpor sinal):

    mkdir -v "$DFS"/tools
    ln -sv "$DFS"/tools /
    logout          # Leave root
    
  • Faça o download da fonte de todos os pacotes que você deseja. É claro que é aí que você fica preso. Todos os necessários não estão lá. (Aliás, eu prefiro o GNU de binutilsqualquer maneira.)

Supondo que você possa, de fato, baixar todos os necessários, vamos continuar.

  • Crie um usuário menos privilegiado especificamente para o DFS (sugerido pelo 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.
    
  • Observe que você deve fazer o homedir do novo usuário manualmente em um Mac:

    sudo mkdir /Users/lfs
    sudo chown -R lfs:staff /Users/lfs/
    
  • Agora conceda ao novo usuário acesso às fontes e ferramentas

    sudo chown -v lfs $DFS/tools
    sudo chown -v lfs $DFS/sources
    
  • Entrar:

    su - lfs
    Password: dfs
    
  • Execute o seguinte comando para limpar o ambiente (do LFS):

    cat > ~/.bash_profile << "EOF"
    echo "Entering clean environment…"
    exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
    EOF
    
  • Agora execute o seguinte comando (consulte LFS para saber o que ele faz se você não tiver certeza):

    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
    
  • O CCG /configureé bastante flexível. Tente grepping o *-padrão, ou apenas corra gcc -vpara ver como sua máquina host foi configurada e copie isso.

  • Agora efetue logout do usuário lfs e efetue login novamente. Agora você deve ter um ambiente limpo.
  • Tudo a partir de agora ocorre dentro do usuário lfs. Você notará que fiquei um pouco preguiçoso ao converter apenas metade dos símbolos 'LFS' em símbolos 'DFS'. Desculpe por isso, mas você entendeu.

Ok agora para a seção hipotética.

A partir daqui, será muito bem o procedimento LFS padrão: Extraia fontes, construa, instale, teste, exclua fontes. Observe que as 2 passagens de binutils, GCC e Glibc ainda são necessárias, mas você TAMBÉM precisa ter uma cópia de trabalho libc++.1.dylib- e você precisará fazer isso em 2 passagens também. Você pode ver a página libcxx do projeto LLVM para mais alguns detalhes. Depois de compilado, você pode inseri-lo /usr/lib. Você precisará compilar e instalar o kernel xnu (existem alguns tutoriais na Web para saber como fazer isso) e depois instalar os KEXTs. Mesmo se todos os KEXTs necessários estivessem disponíveis, você ainda precisaria colocá-los no pacote .kext manualmente. Novamente, existem tutoriais sobre como criar manualmente um KEXT na linha de comando.

O bit final está tornando o sistema inicializável. Para fazer isso, você deve executar o seguinte comando:

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

Na verdade, o local para abençoar realmente não faz diferença. Essa pasta é apenas padrão da Apple.

Em qualquer caso, assumindo o kernel e kexts estavam nos lugares certos, você tinha cópias adequadas de dyld, launchd, etc no lugar e boot.efiestava funcionando corretamente, o sistema deve estar funcionando e inicializável!

Nota se você realmente quiser você pode executar um faux- launchdque é apenas um script para executar uma festança pronto - Isso é o que PureDarwin Nano faz.

Novamente, por todos os meios, escreva os KEXTs e os binários, se quiser - é tecnicamente possível. Apenas me ligue quando terminar.


Com fraudes binárias: Provavelmente, mas também não é legal (não testada)

Então, por que você não pode simplesmente extrair binários, KEXTs e arquivos necessários do Mountain Lion, abençoar o volume e partir? Bem, você provavelmente pode. Mas você também precisa de uma licença para fazer isso. Além disso, se você fizer isso, basicamente fará uma cópia do Mountain Lion. Isso não vem ao caso?

Com fraudes binárias para hardware genérico: Como acima (não testado)

Isso é basicamente o projeto OSx86. Novamente, você praticamente se depara com questões legais imediatamente. Não há dúvida de que esses dois últimos métodos são definitivamente possíveis - o fato de que você pode executar o Mountain Lion em hardware genérico é uma prova disso -, mas o ponto principal disso era poder legitimamente compilar seu próprio sistema operacional Darwin a partir da fonte.


Nota

Você deve ter notado que evitei deliberadamente qualquer coisa de 32 bits. Em um mundo em que todos os principais sistemas operacionais estão disponíveis em 64 bits, não faz muito sentido compilar um sistema operacional de 32 bits. A Apple realmente forneceu imagens de disco de Darwin (até Darwin 9) aqui . Eles funcionaram perfeitamente na minha caixa do Windows.

Observações finais

Acho que no final do dia, as pessoas não compram Mac para Darwin, elas compram Mac para Aqua. Como resultado, o suporte a Darwin como um produto autônomo de código aberto diminuiu gradualmente a ponto de realmente ser apenas um gesto simbólico para a comunidade de código aberto. O outro fato levemente irônico é que, para aprender muito sobre isso, você precisa pular direto para o projeto OSx86, que não é exatamente sancionado (para dizer o mínimo). Mesmo assim, não há muita informação por aí. PureDarwin é um excelente lugar para começar, e o livro de Jonathan Levin é uma referência inestimável para todas as coisas que o xnu.

Este foi um ano de trabalho extremamente educativo, e estou quase tão feliz em saber como fazê-lo quanto realmente faria. Vou ter que parar de trabalhar nisso em algum momento e agora é a hora. Como um grito fútil final para a Apple, seria pedir demais para ter apenas mais uma compilação de Darwin quando você lançar o Mavericks?

Coisas efêmeras
fonte
1

Obviamente, você reconheceu que o LFS é para Linux e o Darwin é muito diferente do Linux LFS aplicado; portanto, além dos esforços individuais, é simples aplicar o LFS aos sistemas Darwin.

Existem muitas tentativas da comunidade de substituir / melhorar os sistemas de Darwin. enquanto o projeto OpenDarwin não tiver muito êxito, acho que o código da Apple é muito difícil, enquanto ainda há um projeto PureDarwin restante:
PureDarwin SourceForge
PureDarwin HomePage

Obtenha uma conta de desenvolvedor primeiro, agarre suas ferramentas de compilação e, em seguida, você poderá obter as etapas para criar seu próprio Kernel personalizado.

O Darwin Kernel não possui a mesma arquitetura do Linux Kernel, portanto, ele não pode ser substituído pelo Linux Kernel, portanto você precisa compilá-lo.

Na verdade, tudo o que você precisa fazer é manter-se 100% com o projeto PureDarwin e, em seguida, chamar o seguinte script: Google Code - Pure Darwin Switch Kernel com as imagens personalizadas do Kernel que você criou vai ficar bem.

Mas, sobre como construir um bom Darwin Kernel funcional, essa seria uma nova pergunta.


fonte