是否可以从源代码编译Darwin Distro,就像可以构建Linux Distro一样?


42

我已经阅读并进行了Linux From Scratch(和BLFS)的安装,我想知道,我是否可以按照本指南通过替换xnu内核来创建Darwin发行版?该过程与LFS中概述的过程有很大不同吗?

我目前的理解是,使系统“ Darwin”而不是“ Linux”所需的全部是内核替换。这个对吗?


编辑:

为了回应杀人主义者的评论,我将完善这个问题。我通常在寻找有关此主题的信息时,特别要寻找的是“ Darwin Distro创建指南 ”,就像LFS是“ Linux Distro创建指南 ”一样。

我很高兴知道这些信息可能仅来自PuredarwinOpenDarwinGNU / Darwin的人员,因此这是向他们寻求帮助的一种方式。像LFS这样的“ How-We-Made-PureDarwin-Nano-Start-To-Finish ”指南将是完美的,但是我知道这要求很多。


3
也许值得研究puredarwin,以了解构建基于darwin的发行版的过程(以及他们和opendarwin面临的问题)
Journeyman Geek

1
对于普通用户来说,这两个内核看起来非常相似,但是用于管理内核的软件和与之密切相关的软件(包括libc)却大不相同。在这个关键的第一步中,LFS文档不会有太大帮助。也许从(或至少研究)Debian的kFreeBSD分支更为相关。
vonbrand 2013年

1
提示:如果您实际上想问自己要做什么,不仅会增加找到已存在问题的机会,而且会增加吸引更多人了解如何回答问题的可能性。 。相对于困惑,真正的问题是什么。只是一个想法。
杀手主义者

1
Darwin在某种程度上基于BSD,与Linux不同。BSD的处理方式与内核相比有更多不同(文件系统首选项,目录结构,升级策略等)。
vesperto

2
恐怕与二进制兼容不是一回事。@Vesperto是正确的,达尔文与BSD系列的关系比与Linux的关系更紧密;尽管其内核与其他BSD完全不同。我认为,与基于LFS的指南相比,寻找BFS类型指南会更好。《 BSD手册》将是另一个很好的参考资料。您仍然需要使用Darwin参考资料获取相关信息。
杰里·W·杰克逊

Answers:


32

2015年4月19日更新:

两年之后,对该领域的兴趣似乎仍然很小。但是,Hackintosh社区仍然非常活跃,这意味着仍然可以维护少数能够启动xnu(变色龙和fork)的开源非Apple引导程序之一,并且可以引导Yosemite。也有在QEMU中启动OS X Yosemite的成功案例。此外,感谢一个靠winocm处理的(现在为Apple雇用的)开发人员,我们有了xnu内核ARM端口。她是我所知道的最活跃的开发人员。

Amit Singh的Mac OS X Internals即将推出续集。我通常不愿提及人们的个人网页;但是,包含所有信息的博客服务器似乎有点不可靠,因此请参见ameaijou的 Twitter页面上的信息框。

我已经设法构建了Apple的开发工具链(一个自主机,但是“ Darwin SDK” 也已移植到Linux上)。我相信,达尔文操作系统可能仍可以从头开始构建-我们可能缺少的只是一些开源Kexts。观看此空间,如果您知道如何激发兴趣,请告诉我!:)


这个问题的简短答案:

技术上:

实际上:否*

关于二进制作弊:可能但不合法(未经测试)

带有针对通用硬件的Binary Cheat:如上所述(未经测试)

*除非您在苹果公司工作(*清除加利福尼亚州的喉咙*)


更长的答案:

这将是相当长的。我建议喝咖啡。如果您没有时间/兴趣来阅读全部内容,则可以跳至“总结”。

实际可行(否):

可悲的是,Apple撤消了太多达尔文必需的KEXT和二进制文件的源代码,以致无法纯粹从源代码编译达尔文OS。从技术上讲,它仍然是可能的(您可以自己编写源代码以对其进行适当地修补),但是我根本没有时间,技能或意愿来做到这一点(我怀疑众筹社区会非常感兴趣)。

毫不奇怪,关键的转折点是Darwin 10的发布,该版本将xnu带入x86_64-land。在此之前,大多数必需的资源都在附近,但是仅x86。随着时间的流逝,Apple的“开放源代码”的含义似乎已转变为“仅在Apple硬件上开放源代码”,因为Apple的KEXT现在基本上是特定于硬件的,因此即使您可以进行所有操作并运行(请参阅下文),您仍然只能使用Apple硬件。

技术上可行(是):

但是,一切并没有丢失。LFS指南确实派上用场,并且可以肯定地进行所有必要的设置,而无需实际构建Darwin OS。此外,所提供的步骤为您提供了几乎完整的前进路线图,减去了内核,KEXT和引导加载程序。不过,我确实设法解决了引导程序问题(至少对于Apple硬件而言)。

如果您有兴趣,这里是您必须做的完整概述:

  • 擦除驱动器(内部或外部–无关紧要)上的分区(最好为8 GB或更大),并将其格式化为Mac OS扩展(日志式)(HFS +)。
  • 确保它具有GUID分区表(GPT),并且在执行操作时具有EFI分区。最简单的方法是通过Apple的磁盘实用程序,但是您可以根据需要在命令行上进行操作(其他地方有关于如何执行此操作的教程)。重要的一点是,当您运行时distil list diskNsM,以下信息应正确:

    分区类型:Apple_HFS

    可以安装操作系统:是

    只读媒体:否

    只读卷:否

  • 现在遵循LFS指南(进行改编)。

  • 将(显然使用实际的安装点)插入并DFS=/Volumes/DarwinOS.bashrc.bash_profile

  • 设置用户目录(在chown最后将其设置为0:0):

    sudo mkdir -v "$DFS"/usr
    
  • 输入root

    sudo su -
    
  • 进入sources目录并设置sticky位:

    mkdir -v "$DFS"/sources     # Make sure you still have $DFS defined; if not, redefine it.
    chmod -v a+wt "$DFS"/sources
    
  • 创建工具目录并对其建立符号链接,以便稍后将其轻松添加至$ PATH(root顺便说一下):

    mkdir -v "$DFS"/tools
    ln -sv "$DFS"/tools /
    logout          # Leave root
    
  • 下载所需的所有软件包的源。当然,这是您遇到困难的地方。所有必要的要素都没有。(顺便说一句,我还是更喜欢GNU binutils。)

假设您实际上可以下载所有需要的文件,让我们继续。

  • 为DFS创建一个特权用户(由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.
    
  • 请注意,您必须在Mac上手动设置新用户的homedir:

    sudo mkdir /Users/lfs
    sudo chown -R lfs:staff /Users/lfs/
    
  • 现在,授予新用户访问源和工具的权限

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

    su - lfs
    Password: dfs
    
  • 运行以下命令以清理环境(从LFS):

    cat > ~/.bash_profile << "EOF"
    echo "Entering clean environment…"
    exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
    EOF
    
  • 现在运行以下命令(如果不确定,请参阅LFS):

    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
    
  • GCC /configure非常灵活。尝试使用grep *-模式,或者只是运行gcc -v以查看主机的配置方式并将其复制。

  • 现在注销lfs用户并重新登录。您现在应该拥有一个干净的环境。
  • 从现在开始,一切都在lfs用户内部进行。您会注意到,我只是将一半的“ LFS”符号转换为“ DFS”符号有点懒惰。抱歉,您明白了。

现在转到假设部分。

从这里开始,很好的将是标准的LFS过程:提取源代码,构建,安装,测试,删除源代码。请注意,binutils,GCC和Glibc的2遍仍然是必需的,但是您还必须有一份有效的副本libc++.1.dylib–您也需要在2遍中进行。您可以查看LLVM项目的libcxx页面以获取更多详细信息。编译后,您可以将其放入/usr/lib。您需要编译并安装xnu内核(网络上有一些有关此操作的教程),然后安装KEXT。即使所有必需的KEXT都可用,您仍然需要手工将它们放入.kext包中。同样,这里关于如何在命令行上手工制作KEXT的教程

最后一点是使系统可启动。为此,您将运行以下命令:

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

实际上,要祝福的位置并没有真正改变。该文件夹只是Apple标准的。

无论如何,假设内核和KEXT位于正确的位置,您已经在适当的位置保存了,等等的副本dyldlaunchd并且boot.efi工作正常,则系统应该可以正常工作并可以启动!

请注意,如果您真的想运行launchd,可以运行一个仿冒程序 -只是运行bash提示的脚本-这就是PureDarwin Nano所做的。

同样,如果需要,请务必自行编写KEXT和二进制文件-从技术上讲,这可能的。完成后就给我打电话。


关于二进制作弊:可能但不合法(未经测试)

那么,为什么您不可以只从Mountain Lion中抓取二进制文件,KEXT和必需的文件,来保佑音量并继续前进呢?好吧,你可能可以。但是您还需要许可证才能执行此操作。另外,如果您执行此操作,则基本上已经复制了Mountain Lion。这不是重点吗?

带有针对通用硬件的Binary Cheat:如上所述(未经测试)

这几乎 OSx86项目。再次,您几乎立即遇到了法律问题。毫无疑问,这最后两种方法绝对是可能的-您可以在通用硬件上运行Mountain Lion就是事实的证明-但其全部目的是能够从源代码合法地编译自己的Darwin OS。


边注

您可能已经注意到,我故意避免使用32位。在每个主要操作系统都提供64位操作系统的世界中,编译32位操作系统没有多大意义。苹果公司没有实际提供达尔文的磁盘映像(直到达尔文9)在这里。他们在我的Windows机器上完美工作。

结束语

我想最终,人们不会为达尔文购买Mac,而是为Aqua购买Mac。结果,对达尔文作为独立的开放源代码产品的支持逐渐下降到了对开放源代码社区真正的象征意义。另一个具有讽刺意味的事实是,要了解很多内容,您必须直接进入OSx86项目,该项目并未得到严格的批准(说白了)。即使那样,周围也没有很多信息。PureDarwin是一个很好的起点,Jonathan Levin的书是xnu的宝贵参考。

这是非常有教育意义的一年,我几乎很高兴知道如何做到这一点。我将不得不在某个阶段停止工作,现在是时候了。作为对苹果的最后徒劳的​​喊话,当您发行Mavericks时,要求只再发行一个达尔文版本是否太多?


1

显然,您已经认识到LFS是用于Linux的,而Darwin与所应用的Linux LFS有很大不同,因此,除了您一个人努力将LFS应用于Darwin系统之外,这很简单。

社区有许多尝试替换/改进达尔文系统的尝试。尽管OpenDarwin项目并没有取得太大的成功,但您可以猜测Apple的代码太难了,而还有一个项目PureDarwin仍然存在:
PureDarwin SourceForge
PureDarwin主页

首先获取一个开发人员帐户,使用他们的构建工具,然后您可以获取制作自己的自定义内核的步骤。

Darwin Kernel与Linux Kernel没有相同的体系结构,因此,不能用Linux Kernel代替它,因此您需要对其进行编译。

实际上,您所需要做的就是坚持100%使用PureDarwin项目,然后调用以下脚本:Google代码-使用您制作的自定义内核图像的Pure Darwin Switch Kernel会很好。

但是,关于如何建立一个良好的达尔文内核,这将是一个新问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.