【问题标题】:Emulating Linux binaries under Mac OS X在 Mac OS X 下模拟 Linux 二进制文件
【发布时间】:2010-12-29 13:55:45
【问题描述】:

如何在 Mac OS X 下运行 Linux 二进制文件?

谷歌搜索我发现了几个模拟器,但没有一个可以在 Mac 上运行 Linux 二进制文件。有很多关于在 Linux 上运行 Mac OS X 之类的帖子 - 但这与我想做的相反。

更新:

感谢所有答案!我完全了解 MacPorts 和 Fink 或任何其他东西;不,我不想要任何这些实用程序,也不想要任何包管理器,我更喜欢自己编译东西。我也有 Parallels,可以设置虚拟机和所有爵士乐...

我唯一想做的就是找到一种方法来运行我没有源代码并且已经为 Linux 编译的二进制文件,但我不想在 Linux 下运行它,而是在 Mac OS X 下运行它. 因此我关于模拟器的问题。

【问题讨论】:

  • 如果您只是想从 *nix/POSIX 世界运行软件,只要它不依赖于操作系统特定的库,它可能会编译。 Fink 或 MacPorts 可以在这方面有所帮助。
  • 我想不出任何适用于 Linux 的软件,但不适用于 Mac(很遗憾,因为我是 Linux 人)。你为什么要找这样的东西?
  • 军团要塞 2 专用服务器是仅适用于 Windows 和 Linux 的示例:-/
  • @David Cloudera 经理
  • 好问题!我也有一个在 Linux 中运行的企业软件,但我的开发机器是 Mac。希望有人想出一个解决方案 - Mac 上 Linux 二进制文件的仿真层。

标签: linux macos binary emulation


【解决方案1】:

noah 不允许二进制文件为我正确执行。使用Docker Desktop for Mac

只要做: docker pull centos:latest # 73MB CentOS docker image

为运行二进制文件和 Dockerfile 所需的文件创建一个文件夹:

FROM centos
COPY your_binary /bin/
ENTRYPOINT ["your_binary"]

你可以用它来构建它

docker build -t image_name

然后执行

docker run image_name 就好像它是二进制文件本身一样。为我工作。希望它可以帮助别人。如果您需要特定的输出或将文件存储在某处,您可以使用 -v 将卷挂载到 docker 上,例如:

docker run -v path_to_my_stuff:/docker_stuff image_name,

虽然在Dockerfile 之前的ENTRYPOINT 之前添加WORKDIR /docker_stuff 行可能是最好的。

如果您将ENTRYPOINT 更改为

ENTRYPOINT ["bash", "-c"] 并添加

CMD ["your_binary"]

在它下面,您实际上可以将命令传递到图像中

docker run -v path_on_local:/in_container_path image_name "your_binary some_parameters -optionrequiringzerowhitespacebeforeinputvalue"

【讨论】:

    【解决方案2】:

    使用 Qemu 的 User Space Emulator 在 Mac OS X 下运行 Linux 可执行文件可能会有一些运气

    【讨论】:

      【解决方案3】:

      我最近发现了Noah,您可以使用它在 macOS 上运行 Linux 二进制文件。您可以通过自制软件 (brew install linux-noah/noah/noah) 安装 Noah。那么你应该能够做到这一点:

      noah linux_binary
      

      根据我的经验,二进制文件的行为与我在 Ubuntu 机器上看到的一致。

      【讨论】:

      • 好建议,但我在尝试执行 Go 程序时收到错误 fatal error: runtime: cannot reserve arena virtual address space
      • @常倩,那不好。我刚刚用一个小的 Go 程序尝试了类似的东西,并看到了同样的错误。也许 Noah 应该更具体地说是允许您在 macOS 上运行 Linux C 二进制文件。我之前真正尝试过的都是 C 程序。
      • 也许 Docker for Mac 是终极解决方案。
      • 在使用 Noah 时出现错误“操作不允许”,尽管我已为终端提供了完整的磁盘访问权限
      【解决方案4】:

      有一个项目将 Linux 的 binfmt_misc 之类的东西引入 OS X,所以现在你需要一个 ELF 加载器,一个可以加载 Mach-O 和 ELF 的动态链接器,以及一些将 Linux 调用转换为 OS X 调用的机制.

      只是为了获得灵感,您可以以忽略文件扩展名的方式实现动态链接器 - libfoo.so.1(作为 Linux ELF)和 libfoo.1.dylib(作为 Mach-O)都可以加载以便可以重用 OS X 版本的系统库,这样您就不需要编写“托管在 OS X 上”的 libc.so,并且系统调用可以由将 Linux 调用转换为内核中的 OS X 调用的 kext 处理。

      或者,以更优雅的方式,将精简的 Linux 内核实现为 kext,使 OS X 内核具有双重用途。但是,这将要求您使用两组库。 (二进制文件不冲突,所以基本上没问题)

      【讨论】:

      • 你有这个链接吗?
      【解决方案5】:

      设置一个虚拟机(我个人使用 VMWare Fusion),然后在虚拟机上安装您想要的任何 Linux 发行版。

      或者,如果您有 Linux 程序的源代码,您可以在 Mac 上重新编译它并在本地运行它。如果你安装FinkMacPorts,你可以安装很多开源程序而不用太麻烦。

      【讨论】:

      • 我添加了 Fink 和 DarwinPorts 的链接,因为它们通常比下载源代码并尝试编译它更容易,意识到你需要先安装其他东西,然后下载它并尝试编译它等等等
      • 酷。顺便说一句,它现在实际上是 MacPorts。 ;)
      【解决方案6】:

      如果您决定走虚拟化路线,还可以考虑VirtualBox

      另外,如果您只需要类似 UNIX 的命令行工具,还有 MacPorts 项目。这基本上是我在 Mac 上设置 git 的方式:安装 MacPorts 后,您只需运行 sudo port install git 命令即可在系统上安装 git

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 2018-07-04
        相关资源
        最近更新 更多