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

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

我已阅读并承诺Linux 从头开始(和 BLFS)我想知道,我是否可以按照本指南通过替换内核来创建 Darwin 发行版xnu?这个过程与 LFS 中概述的过程会有很大不同吗?

我目前的理解是,要使系统变成“Darwin”而不是“Linux”,只需替换内核即可。这样对吗?


编辑:

为了回应 killermist 的评论,我将完善这个问题。虽然我一般都在寻找有关此主题的信息,但我特别想寻找的是类似“Darwin 发行版创建指南“就像 LFS 一样”Linux 发行版创建指南“。

我理解这些信息可能只来自普达尔文开放达尔文或者GNU/达尔文所以这可以说是向他们发出的求助信号。我们如何打造 PureDarwin Nano“像 LFS 这样的指南会很完美,但我知道这要求太高了。

答案1

2015年4月19日更新:

两年过去了,似乎人们对这个领域仍然兴趣不大。然而,Hackintosh 社区仍然非常活跃,这意味着少数能够启动 xnu(Chameleon 和 forks)的开源非 Apple 引导加载程序之一仍在维护,并且可以启动 Yosemite。在 QEMU 中启动 OS X Yosemite 也有成功案例。此外,感谢一位(现在受雇于 Apple)的开发人员,他的昵称维诺,我们有一个xnu 内核的 ARM 移植。她是我所知道的这个领域最活跃的开发人员。

还有续集Amit Singh 的 Mac OS X 内部原理即将推出。我通常不喜欢提及人们的个人页面;但是,包含所有信息的博客服务器似乎有点不可靠,因此请参阅amaijou 的Twitter 页面。

我已经成功构建了 Apple 的开发工具链(自托管,但是“Darwin SDK”也已移植到 Linux)。我相信 Darwin OS 仍有可能从头开始构建——我们可能缺少的只是一些开源 Kext。请关注这个空间,如果你知道如何引起人们的兴趣,请告诉我!:)


这个问题的简短答案:

技术上:是的

几乎:不*

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

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

*除非你在苹果工作 (*清了清嗓子,大致朝着加利福尼亚的方向*)


较长的答案:

这篇文章会很长。我建议喝杯咖啡。如果你没有时间/兴趣阅读所有内容,你可以跳到“结束语”。

实际可能(否):

遗憾的是,苹果已经撤回了太多达尔文的必要 KEXT和二进制文件,使 Darwin OS 的编译完全从源代码开始成为可能。从技术上讲,这仍然是可行的(您可以自己编写源代码以正确修补),但我根本没有时间、技能或意愿去做这件事(而且我怀疑众筹社区不会对此很感兴趣)。

不出所料,关键的转折点是 Darwin 10 的发布,它将 xnu 带入了 x86_64 领域。大多数必要的源代码在此之前就已经存在,但仅限于 x86。随着时间的推移,Apple 的“开源”的含义似乎已转变为“仅在 Apple 硬件上开源”,因为 Apple 的 KEXT 现在基本上是硬件专用的,因此即使您可以启动并运行所有东西(见下文),您仍然会局限于 Apple 硬件。

技术上可行(是):

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

如果您有兴趣,这里是您需要做的事情的完整概述:

  • 擦除驱动器(内部或外部 - 无所谓)上的分区(最好是 8 GB 或更大)并将其格式化为 Mac OS Extended(日志式)(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 -
    
  • 创建源目录并设置粘滞位:

    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
    
  • 下载所有你需要的软件包的源代码。当然,这就是你遇到困难的地方。所有需要的软件包都不在那里。(顺便说一句,我binutils还是更喜欢 GNU 的。)

假设你确实可以下载所有你需要的内容,那就继续吧。

  • 为 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 上手动创建新用户的主目录:

    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 和二进制文件 - 它从技术上来说可行。完成后给我打电话即可。


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

那么,为什么你不能直接将二进制文件、KEXT 和所需文件从 Mountain Lion 中取出,然后保存卷并开始使用呢?好吧,你可能可以。但你还需要许可证才能这样做。此外,如果你这样做,你基本上就是复制了 Mountain Lion。这不是有点离题了吗?

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

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


边注

你可能已经注意到我刻意避免使用 32 位。在一个所有主流操作系统都提供 64 位版本的世界里,编译 32 位版本没有多大意义。Apple 确实提供了 Darwin 的磁盘映像(直到 Darwin 9)这里。它们在我的 Windows 机器上运行完美。

结束语

我想,归根结底,人们购买 Mac 不是为了 Da​​rwin,而是为了 Aqua。因此,对 Darwin 作为独立开源产品的支持逐渐减少,以至于它实际上只是对开源社区的一种象征性姿态。另一个略带讽刺的事实是,为了了解其中的很多内容,您必须直接进入 OSx86 项目,而该项目并没有得到完全批准(说得委婉一点)。即便如此,也没有太多的信息。纯达尔文是一个很好的起点,并且乔纳森·莱文的书对于所有 xnu 事物来说都是一个无价的参考。

这是非常有教育意义的一年,我知道如何做这件事,几乎和我实际做这件事一样高兴。不过,我将不得不在某个阶段停止这项工作,现在就是那个时候。最后向苹果公司无谓地呼喊,当你们发布 Mavericks 时,要求再多一个 Darwin 版本会不会太过分?

答案2

显然,您已经认识到 LFS 适用于 Linux,而 Darwin 与应用的 Linux LFS 有很大不同,因此将 LFS 应用于 Darwin 系统非常简单,超出您一个人的努力。

有许多社区尝试替换/改进 Darwin 系统。虽然 OpenDarwin 项目没有取得太大成功,但猜测 Apple 的代码太难了,而还有一个项目 PureDarwin 剩余:
PureDarwin SourceForge
PureDarwin 主页

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

Darwin 内核与 Linux 内核的架构不同,所以不能用 Linux 内核替换它,所以需要对其进行编译。

实际上您需要做的就是 100% 坚持使用 PureDarwin 项目,然后调用以下脚本:Google 代码 - 纯达尔文切换内核使用您制作的自定义内核图像就可以了。

但如何构建一个运行良好的达尔文内核,这将是一个新问题。

相关内容