如何转换多目录 Ubuntu ISO 映像以在 Macbook 2,1 上启动它?

如何转换多目录 Ubuntu ISO 映像以在 Macbook 2,1 上启动它?

从 2007 年中期开始,我一直在努力在我的 Macbook 2,1 上安装 Linux,但一直没有成功。最后我终于成功安装了 Xubuntu i386,还尝试了 Ubuntu 14.10 +mac ISO。两次安装都成功了,但我用的是一个相当旧的硬件,最后我想使用 Xubuntu 16.10,它的安装 ISO 的创建方式与最新的 Ubuntu ISO 一样(已经描述了有哪些变化Mac ISO 映像有何不同?,作为多目录映像,而我的旧 Macbook 无法启动它们。所以我有一个问题,如何将这种多目录 ISO 转换为“单目录”,以便旧 Mac 可以启动它?

答案1

答案就在 不再需要 amd64+mac 图像。我已在 2006 年末推出的 Core 2 Duo iMac 上尝试过此操作,并且成功了。

您可以使用 mkisofs 并正确混合选项,但这种方法是万无一失的。

如果您足够好奇,这里有一个 C 程序,我认为它使得 trusty-desktop-amd64.iso 可以在您的 2,1 上启动。

  • 将 ISO 的副本和 C 程序作为 make_single_eltorito.c 放入同一目录中。

  • 编译 C 程序:cc -g -Wall -o make_single_eltorito make_single_eltorito.c

  • 不带参数运行它(ISO名称在变量iso_name中硬编码):./make_single_eltorito

  • 将 ISO 放入 DVD 并尝试启动。

/*
 Removes all entries but the first one from the El Torito boot catalog of
   http://cdimage.ubuntu.com/daily-live/current/trusty-desktop-amd64.iso

 Compile by:
   cc -g -Wall -o make_single_eltorito make_single_eltorito.c

 Run without arguments in the directory where the ISO image is stored.
*/

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static char *iso_name = {"trusty-desktop-amd64.iso"};

int main(int argc, char **argv)
{
  int fd, ret;
  unsigned char buf[2048 - 64];
  off_t lba;
  size_t buf_size = 2048 - 64;

  fd = open(iso_name, O_RDWR);
  if (fd == -1)
    goto err_ex;
  if (lseek(fd, (off_t) 32768 + 2048 + 71, SEEK_SET) == -1)
    goto err_ex;
  ret = read(fd, buf, 4);
  if (ret == -1)
    goto err_ex;
  if (ret < 4) {
    fprintf(stderr, "Cannot read 4 bytes from %s\n", iso_name);
    exit(1);
  }
  lba = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
  if (lseek(fd, lba * 2048 + 64, SEEK_SET) == -1)
    goto err_ex;
  memset(buf, 0, buf_size);
  ret = write(fd, buf, buf_size);
  if (ret == -1)
    goto err_ex;
  if (ret < buf_size) {
    fprintf(stderr, "Cannot write %d bytes to %s\n", (int) buf_size, iso_name);
    exit(1);
  }
  close(fd);
  printf("done\n");
  exit(0);
err_ex:;
  perror(iso_name);
  exit(1);
}

相关内容