Я долгое время боролся с установкой Linux на мой Macbook 2,1 середины 2007 года безрезультатно. Наконец мне удалось установить Xubuntu i386 и я попробовал также Ubuntu 14.10 +mac ISO. Обе установки прошли успешно, но я использую довольно старое оборудование и, наконец, я хотел бы использовать Xubuntu 16.10, установочный ISO которого создан так же, как и новые ISO Ubuntu (какие изменения были описаны в Чем отличается ISO-образ Mac?), как мультикаталожные образы, и мой старый Macbook не может их загрузить. Поэтому у меня возник вопрос, как преобразовать такой многокаталожный ISO в "однокаталожный", чтобы старый Mac мог его загрузить?
Ответ находится в изображениях amd64+mac, больше не необходимых. Я попробовал это на iMac, в конце 2006, Core 2 Duo, и он работает.
Вы могли очевидно использовать mkisofs с правильно смешение опций, но этот метод является надежным.
Если Вам достаточно любопытно, вот программа C, которую я принимаю, делает trusty-desktop-amd64.iso загрузочное на Ваших 2,1.
Помещенный оба, копия ISO и программа C как make_single_eltorito.c в тот же каталог.
Скомпилируйте программу C: cc-g - Стена-o make_single_eltorito make_single_eltorito.c
Выполните его без аргументов (имя ISO является hardcoded в переменной 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);
}