Eph*_*era 45 linux kernel darwin
我已经通读并学习了Linux From Scratch(和 BLFS),我想知道,我可以按照本指南通过替换xnu内核来创建 Darwin 发行版吗?这个过程会与 LFS 中概述的过程大不相同吗?
我目前的理解是,使系统成为“达尔文”而不是“Linux”所需要的只是内核替换。这样对吗?
编辑:
针对killermist 的评论,我将完善这个问题。虽然我正在寻找有关此主题的一般信息,但我特别寻找的是类似于“达尔文发行版创建指南”的内容,就像 LFS 是“ Linux 发行版创建指南”一样。
我很欣赏这些信息可能只会来自Puredarwin、OpenDarwin或GNU/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 硬件而言)。
如果您有兴趣,以下是您必须执行的操作的完整概述:
确保它有一个 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 程序:提取源、构建、安装、测试、删除源。请注意 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文件是在正确的地方,你有适当的副本dyld,launchd等到位,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 所有事物的宝贵参考。
这是一个极具教育意义的工作年,我知道如何去做几乎和我实际做的一样高兴。我将不得不在某个阶段停止工作,现在是时候了。作为对苹果的最后一次徒劳的呼喊,当你发布小牛队时,要求再拥有一个达尔文版本是否太过分了?
| 归档时间: |
|
| 查看次数: |
12581 次 |
| 最近记录: |