*nix
Development for Linux
February 2018 23

Linux в одном файле для Macbook



TL;DR Можно уместить полноценный Linux Live дистрибутив в один файл, если вкомпилировать в ядро initramfs с корневой файловой системой. Компьютеры с UEFI умеют загружать такой файл напрямую, без помощи загрузчика типа GRUB. У меня получилось уместить дистрибутив с программами aircrack-ng, reaver и драйверами для карт Wi-Fi в файл размером 12 мегабайт (наверняка можно еще меньше).

Основные преимущества


  • Работает на любых компьютерах с UEFI — один и тот же файл будет работать на PC и Mac.
  • Не требует установки — достаточно скопировать один файл на EFI-раздел диска и указать в переменных NVRAM путь к этому файлу.
  • Не нужно устанавливать загрузчики GRUB, rEFInd — ядро Linux собранное с поддержкой EFI Stub можно грузить напрямую без промежуточного загрузчика.
  • Не нужны USB-флешки — скопированный на раздел EFI дистрибутив остается там навсегда, и его можно будет загрузить в любой момент. Он не занимает места на разделе основной системы, так как раздел EFI не используется в ОС.
  • Не изменяет процесс загрузки — систему можно загрузить один раз, без изменения порядка загрузки в настройках UEFI. Следующая перезагрузка компьютера загрузит обычную операционную систему. Никаких следов Linux в очередности загрузки не останется.
  • Совместимо с шифрованием диска FileVault и т.д. — файл копируется на EFI System Partition, специальный зарезервированный раздел диска. В компьютерах Mac его размер около 200 мегабайт. Он выделен под Boot Camp и обычно не используется

Зачем это нужно?


Для всех случаев, когда нужен нативный Linux без виртуальной машины.
Чтобы использовать PCIe-устройства в Linux, когда их нельзя прокинуть в виртуальную машину. Например, встроенную Wi-Fi-карту для инъекции пакетов. Когда лень устанавливать виртуальную машину и качать большой ISO файл с дистрибутивом. Когда не хочется возиться с USB флешками.
Единожды скопированный файл позволит всегда иметь под рукой дистрибутив Linux, который переживет даже переустановку системы.

Инструкция по установке на Mac


Все команды нужно выполнять из macOS.

Конфигурация загрузки не имеет значения, способ не нарушает работу BootCamp, rEFInd и любых других нестандартных конфигураций. Поддерживаются компьютеры Mac не старше 2009 года (работоспособность на более старых не проверялась, но может и заработать).

  1. Скачать файл OneFileLinux.efi (20 мегабайт)
  2. Смонтировать EFI-раздел в систему.

    diskutil mount disk_номер_раздела 
    

    Узнать номер раздела EFI можно командой diskutil list.


    В моем случае команда будет выглядеть так:
    diskutil mount disk0s1 
    

  3. Скопировать OneFileLinux.efi в раздел EFI

    cp ~/Downloads/OneFileLinux.efi /Volumes/EFI/

  4. Добавить вариант загрузки в NVRAM

    bless --mount /Volumes/EFI --setBoot --nextonly --file /Volumes/EFI/OneFileLinux.efi
    

    Опция nextonly означает, что данный вариант загрузки будет выполнен один раз. Следующая перезагрузка восстановит прежние настройки. Поэтому, чтобы вернуться из Linux в macOS, достаточно перезагрузиться еще раз.

В последних версиях macOS, начиная с El Capitan, используется технология System Integrity Protection (SIP), так называемый «без root-вый режим». Эта технология запрещает модификацию системных файлов и переменных даже суперпользователю. SIP включен по умолчанию, поэтому последняя команда bless вернет ошибку. Ее можно выполнить из Recovery Mode. Для это нужно зажать cmd+R при включении компьютера и открыть консоль
Utilities —> Terminal. В консоли выполнить шаги 2 и 4. Команды в Recover консоле нужно вводить без sudo.

Теперь каждый раз, когда вам потребуется загрузить OneFileLinux.efi, достаточно выполнить шаги 2 и 4 в консоли Recovery, или из основной системы, если SIP выключен.
Наверное, можно выполнить bless без монтирования раздела, но я не нашел, как это сделать. Тогда было бы достаточно одной команды.

Инструкция для PC


Вариантов загрузки на PC множество. Если ваша материнская плата имеет встроенный UEFI Shell, достаточно в нем указать путь к файлу OneFileLinux.efi, чтобы единожды загрузиться в Linux. Я опишу процесс настройки на моем Thinkpad X220.

  1. Скачать OneFileLinux.efi и положить его на EFI-раздел
  2. Добавить опцию загрузки в NVRAM

    
    efibootmgr --disk /dev/sda --part 2 --create --label "One File Linux" --loader /OneFileLinux.efi
  3. Во время загрузки нажать F12 и выбрать нужный вариант



Инструкция по сборке из исходников


Исходники проекта github.com/zhovner/OneFileLinux
Дистрибутив собран на чистом ядре 4.16-rc1 с kernel.org и Alpine Linux Mini Root filesystem.
Его можно легко собрать самостоятельно.

Подготовка initramfs


Initramfs — это образ диска, который монтируется в памяти при загрузке ядра. В обычных дистрибутивах в него помещаются драйвера, требующиеся на раннем этапе загрузки. В него можно поместить полноценную корневую файловую систему.

Я использовал корневую файловую систему от Alpine Linux. Это минималистичный дистрибутив для встраиваемых систем и контейнеров. У него существует вариант поставки без ядра и предустановленных программ, только корневая файловая система на базе busybox и пакетный менеджер apk.

chroot-имся в alpine linux:

chroot ./alpine-minirootfs /bin/ash

Находясь внутри окружения, можно внести нужные изменения. Добавить пакеты через «apk add», модифицировать сервисы используя openrc.

Вся необходимая информацию есть в wiki.

Сборка


Запустить скрипт сборки. Он соберет модули ядра, поместит их в initramfs, и соберет ядро.

./build.sh


Помогите!!111



На данный момент дистрибутив достаточно кривой. Если вы умеете линуксы, я буду очень признателен за любую помощь. Будет круто, если получится допилить этот проект до приемлемого уровня.

Известные проблемы:

  • Отключена загрузка модулей ядра — все драйвера вкомпиливаются в ядро.
    Наверное, правильно сделать их отдельными модулями и положить в initramfs

    Исправлено
  • Шрифты на HiDPI-дисплеях — из-за огромного разрешения HiDPI-экранов,
    стандартные шрифты 8x16 выглядят очень мелко. Я вкомпилил шрифт 16x32, который выглядит нормально при большой плотности пикселей, но слишком большой для обычных экранов. По-хорошему, шрифт должен выбираться в зависимости от разрешения экрана.

    Исправлено. Теперь автоматически выбирается большой шрифт для HiDPI экранов. Также размер шрифта можно изменить в любой момент командой fontsize.
  • Только один драйвер карты WiFi — сейчас вкомпилен один драйвер для встроенного в макбуки адаптера Broadcom 43602. По-хорошему, нужно собрать все популярные драйвера в виде модулей ядра, а также firmware к ним.
    Исправлено. Добавлена поддержка многих популярных WiFi адаптеров.
  • Сломан udev/mdev? — я не знаю, как он работает. Как правильно загружать модули в зависимости от конфигурации железа?
    Исправлено
  • Мусор — сейчас вместе с ядром устанавливается большое количество устаревших драйверов. В несжатом виде модули ядра весят более 100 мегабайт. Большую часть из них можно исключить.

Приглашаю всех коммитить и создавать issues о проблемах github.com/zhovner/OneFileLinux.
+76
26.6k 264
Support the author
Comments 47
Similar posts
Top of the day