Как установить Ubuntu на Apple M1 и ничего не сломать


    Команда разработчиков Corellium выпустила порт Ubuntu на Mac Mini с процессором Apple M1. Публикации по теме рассказывают только про успех умельцев, но не раскрывают подробности. Я решил на собственном опыте проверить, как установить и использовать. Ubuntu на Mac Mini, и описал все существующие подводные камни.

    Авторы порта Ubuntu под Mac, компания Corellium, занимается виртуализацией на ARM64. У них есть опыт и желание, чтобы делать такие смелые вещи.
    Corellium ранее работала над проектом Project Sandcastle, который позволяет установить ОС Android на iPhone 7 благодаря уязвимости checkm8. Установкой Android на iPhone не занимались со времени iDroid Project и iPhone 3G. Как и iDroid Project, Project Sandcastle не предоставляет ОС для повседневного использования, это скорее масштабный Proof-of-Concept с открытым исходным кодом.
    Подобные проекты очень трудоемки с точки зрения разработки, сложны для эксплуатации обычными пользователями и вряд ли будут использоваться широкой аудиторией. Тем не менее, стоит воспользоваться возможностью посмотреть все своими глазами.

    В чем сложность


    Наиболее подробно — в соответствующей статье в блоге Corellium.

    Ни для кого не секрет, что Apple отступается от принятых стандартов и часто использует собственные решения. Для начала отметим, что macOS загружается несколько иначе, чем операционные системы семейств Windows и *nix. В качестве загрузчика в «яблочных» устройствах используется iBoot. Он загружает ядро в формате Mach-O, которое может быть сжато, подписано и лежать в контейнере IMG4.

    Более сложные вещи начинаются, когда появляется необходимость запустить остальные ядра процессора. В обычных ARM64-процессорах это производится через интерфейс Power State Coordination Interface (PSCI). Но в M1 другие ядра запускаются со смещения, которое указано в соответствующем Memory-mapped I/O (MMIO) регистре.

    Но даже это еще не все. Apple создали свой собственный контроллер прерываний, который не соответствует ни одному стандарту ARM Generic Interrupt Controller (GIC). Также прерывания, генерируемые таймером, используют специальный тип запросов FIQ (Fast Interrupt Request) вместо IRQ, что пока не поддерживается ядром Linux.

    Для взаимодействия процессорных ядер между собой используются специальные прерывания — Inter-Processor Interrupt (IPI), которые в M1 формируются также с помощью FIQ. Таким образом, поддержка FIQ — один из наиболее важных моментов в этом порте.

    Ядро Linux на M1 (источник twitter.com)

    Сотрудникам Corellium пришлось разработать собственный драйвер для обработки прерываний через FIQ, написать «обертку», которая позволила бы запустить все ядра, и решить еще несколько аппаратных проблем. Только после этого они смогли запустить ядро Ubuntu.

    Впрочем, запуск ядра — это только начало. Для успешной эксплуатации необходимо подключить устройства ввода, такие как клавиатура и мышь. Есть три способа: использовать USB-хост в чипе M1 (для ThunderBolt/USB Type-C), использовать xHСI-хост (для USB Type-A) или воспользоваться Bluetooth.

    Bluetooth работает на нестандартном PCIe-подобном протоколе, поэтому разработка собственного модуля ядра для неизвестного протокола могла затянуться. В Corellium приняли решение настроить USB, и через пару дней работы им удалось подключить устройства ввода.

    На момент написания статьи уже доступен Proof-of-Concept, который можно попробовать самостоятельно. Учтите, что все дальнейшие действия вы можете делать исключительно на свой страх и риск.

    Установка Ubuntu


    Для начала использования Ubuntu нам потребуется следующее:

    • Mac с процессором Apple M1 (поддерживаются Mac Mini, Macbook Pro и Macbook Air);
    • флешка с разъемом USB Type-C объемом от 16 ГБ;
    • USB-клавиатура и USB-мышь.

    В качестве флешки я использовал Kingston DataTraveler microDuo 3C объемом 32 ГБ, поддерживающую USB Type-A и USB Type-C. Инструкция Corellium настаивает на использовании Type-C флешки, так как загрузка с Type-A не поддерживается на момент написания данной статьи. Мышь и клавиатуру я подключал по USB Type-A.

    Есть и менее очевидные требования. Во-первых, на Mac Mini должна быть установлена macOS 11.2 или выше. В старых версиях ОС в утилите kmutil отсутствует команда configure-boot, необходимая для корректной «подмены» ядра.

    Также необходимо «отвязать» Mac от Find My Mac. Наличие «привязки» не позволяет отключить системы безопасности в полной мере и выполнить все необходимые команды.

    В первую очередь подготовим образ для флешки. Скачиваем, а затем распаковываем архив. Подготовку следует выполнять в терминале Mac, на котором планируем запустить Ubuntu.

    tar -xjvf ubuntu-20.10-preinstalled-desktop-arm64+raspi.img.bz2

    Далее разворачиваем образ на флешку:

    sudo dd if=ubuntu-20.10-preinstalled-desktop-arm64+raspi.img of=/dev/rYOURUSBDISK bs=1m

    Обратите внимание, что необходимо указать именно флешку, а не раздел на ней. Например, /dev/rdisk6. Далее копируем драйвера на Wi-Fi:

    cp -RLav /usr/share/firmware/wifi /Volumes/system-boot

    Если вы используете проводное подключение к Интернету, то флешку можно подготовить на компьютере под управлением ОС Linux.
    Далее подключаем флешку в USB Type-C порт и перезагружаемся в Recovery OS, известную как 1TR (the One True Recovery), и открываем терминал. На новых Mac это происходит следующим образом:

    1. Выключаем Mac;
    2. Удерживаем кнопку включения до появления текста «Загрузка параметров запуска»;
    3. Выбираем опцию «Параметры» и нажимаем «Продолжить»;
    4. В верхнем меню открываем «Утилиты» — «Терминал».

    Обратите внимание, что Recovery при запуске не должен просить ввести пароль от ОС или от Apple ID. Если он все же просит, то необходимо отключить Find My Mac в настройках macOS.
    Устанавливаем ядро Ubuntu:

    bash -c "$(curl -fsSL https://downloads.corellium.info/linuxusbboot.sh)"

    Содержимое скрипта
    #!/bin/sh
    bputil -d | grep "CustomerKC" | grep -v "absent"
    KC=$?
    if [ $KC -eq 1 ]
    then
      bputil -n -k -c -a -s
      csrutil disable
      csrutil authenticated-root disable
    fi
    curl https://downloads.corellium.info/linux.macho > linux.macho
    kmutil configure-boot -c linux.macho -v /Volumes/Macintosh\ HD/
    echo "Kernel installed. Please reboot";
    


    Данный скрипт проверяет политики загрузки (BootPolicy) и отключает системы проверки целостности macOS, если это необходимо. После этого скрипт загружает ядро Linux в формате Mach-O в корень системного диска и настраивает iBoot на ядро Linux.

    В процессе выполнения скрипта будет запрос пароля для получения прав суперпользователя macOS. Выполняемые команды также предупредят вас о том, что выполняемые действия значительно снижают безопасность Mac. Но если вы хотите запустить Ubuntu, то придется принять это как должное.

    После завершения скрипта можно перезагрузить Mac, далее начнется загрузка Ubuntu 20.04.

    Опыт использования


    Первый запуск Ubuntu будет не очень быстрым. В логах загрузки «упадет» четыре-пять сервисов и еще шесть «подвиснут». Ubuntu загружается относительно долго: несколько минут. Более того, первое время отзывчивость ОС будет очень низкой. Запуск новых приложений, даже без графической оболочки, может занимать минуты. Эта проблема самоустраняется вскоре после загрузки.


    Нетрудно заметить, что образ сделан на основе Ubuntu для Raspberry Pi. Поэтому в системе пользователи root и pi имеют пароль raspberry. К сожалению, сделать красивый и показательный скриншот с выводом screenfetch не получается. ОС не определяет модель процессора, поэтому в выводе лишь безликое Unknown.

    Вывод lscpu
    Architecture:                    aarch64
    CPU op-mode(s):                  64-bit
    Byte Order:                      Little Endian
    CPU(s):                          8
    On-line CPU(s) list:             0-7
    Thread(s) per core:              1
    Core(s) per socket:              8
    Socket(s):                       1
    Vendor ID:                       0x61
    Model:                           1
    Stepping:                        0x1
    CPU max MHz:                     3204.0669
    CPU min MHz:                     600.0030
    BogoMIPS:                        48.00
    Vulnerability Itlb multihit:     Not affected
    Vulnerability L1tf:              Not affected
    Vulnerability Mds:               Not affected
    Vulnerability Meltdown:          Not affected
    Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
    Vulnerability Spectre v1:        Mitigation; __user pointer sanitization
    Vulnerability Spectre v2:        Not affected
    Vulnerability Srbds:             Not affected
    Vulnerability Tsx async abort:   Not affected
    Flags:                           fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit uscat ilrcpc flagm ssbs sb dcpodp flagm2 frint
    


    То, что это образ ОС для RPi, будет заметно при попытке установить ПО из пакетного менеджера. Он попытается установить не только требуемый администратором софт, но и обновление ОС с созданием initramfs для «малинки». Подобные действия приведут к появлению ошибок в логах, несмотря на успешность установки запрошенного ПО.

    Как и ожидалось, в ОС присутствует минимально необходимый набор драйверов. Звуковая карта, модуль Bluetooth и графический ускоритель не поддерживаются. Большинство системных утилит, таких как lspci, lsusb и lshw, выдают очень скудную информацию о железе.

    Несмотря на множество ограничений, я решил провести тест sysbench.
    Устройство Количество вычислений в секунду
    Mac Mini (Ubuntu 20.10) 838
    Lenovo ThinkPad E14 (Ubuntu 20.04) 483
    Хотя данный тест нельзя считать идеальным и показательным, восьмиядерный Apple M1 в два раза превосходит восьмиядерный Intel Core i5-1045U. К сожалению, мне не удалось запустить sysbench на macOS.

    Заключение


    Установка альтернативных операционных систем на Mac — это всегда увлекательный с технической точки зрения процесс. Новые процессоры Apple M1 стали отличным вызовом для энтузиастов.

    А вам приходилось использовать Windows или Linux на Mac?

    Хотите попробовать новый Mac Mini в работе? Дадим его на тест бесплатно!
    Просто переходите по ссылке.
    Selectel
    IT-инфраструктура для бизнеса

    Похожие публикации

    Комментарии 13

      +1
      Как установить Ubuntu на Apple M1, а зачем?
        –5
        Чтобы мучаться, очевидно)
        Лучше бы серверное что-нибудь запустили, а не этот обломок 2000 года)
          0

          А какой надо устанавливать?

            0
            Это наверное к kaljan вопрос? Мое мнение — никакой не надо. Хотите linux — есть варианты куда дешевле и мощнее.
          0

          Читать такое на ночь было идеей так себе, конечно.
          То ли прон, то ли триллер, то ли одно другому не мешает…
          Вопрос только в Apple — зачем?
          Think different, доведенное до абсурда.

            +6

            Мои коллеги, которые купили себе маки на M1, пока что не нарадуются — работает быстро, греется мало, батарейки хватает на долго.
            Ну а макось не всем нужна — кто-то (например, я) бы хотел на хорошем ARM железе и на линуксе поработать.

              0
              Оптимизация Linux под M1 всегда будет позади. Ближайшие год-два будет глюк на глюке и половина не работает. В чем смысл так мучиться?

              Tiger Lake вроде бы тоже достаточно энергоэффективный и графика постепенно улучшается, проще какой-нибудь Dell XPS 13 взять под установку Linux.
                +5

                По-моему это просто прикольно. Задача звучит как вызов для инженеров и решая такие вещи можно реально почувствовать себя крутым.
                Это все как спорт

                  –3
                  Оптимизация Linux под M1 всегда будет позади
                  вы имеете в виду «linux под ARM» или именно «linux под M1»? Потому что не понятно с чего вы взяли первое, а M1 это вполне себе ARM чип.
                    +1

                    Кроме ISA есть очень много всяких вещей: работа с прерываниями, управление частотами и отключением ядер, шедулинг задач с учётом топологии, модель памяти с 16kb страницами, режимы ожидания/сна, управление питанием, GPU и вся подсистема вывода, NVMe контроллер, PCIe контроллер...

                      0
                      Linux под ARM — это уже ваша фантазия, я написал M1, имея в виду Apple Silicon вообще.
                0
                К сожалению, сделать красивый и показательный скриншот с выводом screenfetch не получается.


                Ближайший аналог screenfetch neofetch определяет процессоры M1.
                  0
                  Сделал пару скриншотов на Macbook Air с М1. К сожалению, не на линуксе, но результат налицо.
                  neofetch vs screenfetch


                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое