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

Eph*_*era 45 linux kernel darwin

我已经通读并学习了Linux From Scratch(和 BLFS),我想知道,我可以按照本指南通过替换xnu内核来创建 Darwin 发行版吗?这个过程会与 LFS 中概述的过程大不相同吗?

我目前的理解是,使系统成为“达尔文”而不是“Linux”所需要的只是内核替换。这样对吗?


编辑:

针对killermist 的评论,我将完善这个问题。虽然我正在寻找有关此主题的一般信息,但我特别寻找的是类似于“达尔文发行版创建指南”的内容,就像 LFS 是“ Linux 发行版创建指南”一样。

我很欣赏这些信息可能只会来自PuredarwinOpenDarwinGNU/Darwin 的人,所以这是向他们寻求帮助的一种呼唤。像 LFS 这样的“ How-We-Made-PureDarwin-Nano-Start-To-Finish ”指南将是完美的,但我知道这要求很高

Eph*_*era 35

2015 年 4 月 19 日更新:

两年后,对这个领域的兴趣似乎仍然很少。然而,Hackintosh 社区仍然非常活跃,这意味着能够启动 xnu(变色龙和分支)的少数开源非 Apple 引导加载程序之一仍在维护并且可以引导 Yosemite。也有在 QEMU 中启动 OS X Yosemite 的成功案例。此外,多亏了一位(现在苹果雇佣的)开发人员,他使用了winocm句柄,我们有了xnu 内核ARM 端口。她是我所知道的在这方面最活跃的开发人员。

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

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


这个问题的简短回答:

技术上:是的

实际上:否*

使用二进制秘籍:可能,但也不合法(未经测试)

使用通用硬件的二进制秘籍:如上所述(未经测试)

*除非你在苹果公司工作(*在加州大方向清嗓子*)


更长的答案:

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

实际可能(否):

可悲的是,Apple 已经撤回了太多Darwin 必需的 KEXT和二进制文件的源代码,使完全从源代码编译 Darwin OS 成为可能。它在技术上仍然是可能的(你可以自己编写源代码来正确地修补它),但我根本没有时间、技能或意愿来做这件事(我怀疑众筹社区是否会非常感兴趣)。

不出所料,关键的转折点是 Darwin 10 的发布,它将 xnu 带入了 x86_64 领域。大多数必要的来源在那之前就已经存在,但仅限于 x86。随着时间的推移,Apple 的“开源”的含义似乎已经转变为“仅在 Apple 的硬件上开源”,因为 Apple 的 KEXT 现在基本上是特定于硬件的,因此即使您可以搞定一切并且运行(见下文)你仍然会被限制在苹果硬件上。

技术上可行(是):

然而,并没有失去一切。LFS 指南确实派上了用场,当然所有必要的设置都可以在不实际构建 Darwin OS 的情况下进行。此外,所提供的步骤为您提供了一个几乎准确的前进路线图,减去内核、KEXT 和引导加载程序。不过,我确实设法解决了引导加载程序问题(至少对于 Apple 硬件而言)。

如果您有兴趣,以下是您必须执行的操作的完整概述:

  • 擦除驱动器(内部或外部 – 无所谓)上的分区(最好是 8GB 或更大),并将其格式化为 Mac OS Extended (Journaled) (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
    
    Run Code Online (Sandbox Code Playgroud)
  • 输入root

    sudo su -
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建源目录并设置粘滞位:

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

    mkdir -v "$DFS"/tools
    ln -sv "$DFS"/tools /
    logout          # Leave root
    
    Run Code Online (Sandbox Code Playgroud)
  • 下载您想要的所有软件包的源代码。当然,这就是你陷入困境的地方。所有必要的都不存在。(顺便说一句,我更喜欢 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.
    
    Run Code Online (Sandbox Code Playgroud)
  • 请注意,您必须在 Mac 上手动创建新用户的 homedir:

    sudo mkdir /Users/lfs
    sudo chown -R lfs:staff /Users/lfs/
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在授予新用户访问源和工具的权限

    sudo chown -v lfs $DFS/tools
    sudo chown -v lfs $DFS/sources
    
    Run Code Online (Sandbox Code Playgroud)
  • 登录:

    su - lfs
    Password: dfs
    
    Run Code Online (Sandbox Code Playgroud)
  • 运行以下命令来清理环境(来自 LFS):

    cat > ~/.bash_profile << "EOF"
    echo "Entering clean environment…"
    exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
    EOF
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在运行以下命令(如果不确定,请参阅 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
    
    Run Code Online (Sandbox Code Playgroud)
  • GCC 的/configure非常灵活。尝试 grepping*-模式,或者只是运行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
Run Code Online (Sandbox Code Playgroud)

实际上,祝福的位置并没有真正产生影响。该文件夹只是 Apple 标准的。

在任何情况下,假设内核和kext文件是在正确的地方,你有适当的副本dyldlaunchd等到位,boot.efi在正常工作时,系统应工作,并启动!

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

同样,无论如何,如果您愿意,可以自己编写 KEXT 和二进制文件——这技术上是可行的。完成后给我打电话。


使用二进制秘籍:可能,但也不合法(未经测试)

那么,您为什么不能直接从 Mountain Lion 中提取二进制文件、KEXT 和所需文件,然后保佑该卷并继续运行呢?嗯,你可能可以。但是您还需要获得许可才能执行此操作。此外,如果您这样做,您就基本上制作了 Mountain Lion 的副本。是不是有点离题了?

使用通用硬件的二进制秘籍:如上所述(未经测试)

这几乎OSx86 项目。同样,您几乎会立即遇到法律问题。毫无疑问,最后两种方法绝对可行——您可以在通用硬件上运行 Mountain Lion 的事实证明了这一点——但其全部意义在于能够从源代码合法地编译您自己的 Darwin 操作系统。


边注

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

结束语

我想说到底,人们不是为 Darwin 购买 Mac,而是为 Aqua 购买 Mac。因此,对 Darwin 作为一个独立的开源产品的支持逐渐下降,以至于它实际上只是对开源社区的一种象征性姿态。另一个略带讽刺意味的事实是,为了了解其中的很多内容,您必须直接进入 OSx86 项目,该项目并未得到完全批准(坦率地说)。即便如此,周围的信息也不多。PureDarwin是一个很好的起点,Jonathan Levin 的书是 xnu 所有事物的宝贵参考。

这是一个极具教育意义的工作年,我知道如何去做几乎和我实际做的一样高兴。我将不得不在某个阶段停止工作,现在是时候了。作为对苹果的最后一次徒劳的呼喊,当你发布小牛队时,要求再拥有一个达尔文版本是否太过分了?