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

Автор: admin от 23-02-2018, 17:40, посмотрело: 721

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


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



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






  • Работает на любых компьютерах с UEFI — один и тот же файл будет работать на PC и Mac.

  • Не требует установки — достаточно скопировать один файл на EFI-раздел диска и указать в переменных NVRAM путь к этому файлу.

  • Не нужно устанавливать загрузчики GRUB, rEFInd — ядро Linux собранное с поддержкой EFI Stub можно грузить напрямую без промежуточного загрузчика.

  • Не нужны USB-флешки — скопированный на раздел EFI дистрибутив остается там навсегда, и его можно будет загрузить в любой момент. Он не занимает места на разделе основной системы, так как раздел EFI не используется в ОС.

  • Не изменяет процесс загрузки — систему можно загрузить один раз, без изменения порядка загрузки в настройках UEFI. Следующая перезагрузка компьютера загрузит обычную операционную систему. Никаких следов Linux в очередности загрузки не останется.

  • Совместимо с шифрованием диска FileVault и т.д. — файл копируется на EFI System Partition, специальный зарезервированный раздел диска. В компьютерах Mac его размер около 200 мегабайт. Он выделен под Boot Camp и обычно не используется





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

    mkdir /tmp/efi
    sudo mount -t msdos /tmp/efi /dev/disk_номер_раздела
    


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

    В моем случае путь будет /dev/disk0s1.

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

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

    cp ~/Downloads/OneFileLinux.efi /tmp/efi/



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

    sudo bless --mount /tmp/efi --setBoot --nextonly --file /tmp/OneFileLinux.efi
    


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




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

    Utilities —> Terminal. В консоли выполнить шаги 2 и 4



    Теперь каждый раз, когда вам потребуется загрузить 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 и выбрать нужный вариант

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





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



    Исходники проекта 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 wiki.alpinelinux.org



    Когда все изменения внесены, нужно упаковать файловую систему в архив cpio.

    exit #выйти из chroot
    cd alpine-minirootfs
    find . | cpio -H newc -o > ../alpineramfs.cpio




    Сборка ядра



    Полученный архив cpio нужно вкомпилить в ядро. Для этого нужно указать путь к архиву в конфиге ядра.



    
    $ make menuconfig 
    General Setup --
       Initramfs source file
    




    И собрать ядро

    make -j4




    Скопировать полученный файл

    cp ./linux-4.16-rc1/arch/x86/boot/bzImage ./OneFileLinux.efi
    




    Помогите!!111



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


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



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


    • Отключена загрузка модулей ядра — все драйвера вкомпиливаются в ядро.

      Наверное, правильно сделать их отдельными модулями и положить в initramfs

    • Шрифты на HiDPI-дисплеях — из-за огромного разрешения HiDPI-экранов,

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

    • Только один драйвер карты WiFi — сейчас вкомпилен один драйвер для встроенного в макбуки адаптера Broadcom 43602. По-хорошему, нужно собрать все популярные драйвера в виде модулей ядра, а также firmware к ним.

    • Сломан udev/mdev? — я не знаю, как он работает. Как правильно загружать модули в зависимости от конфигурации железа?

    • Мусор в ядре — в конфигурации ядра много лишних функций, которые можно выбросить. Это уменьшит размер итогового файла.





    Приглашаю всех коммитить и создавать issues о проблемах github.com/zhovner/OneFileLinux

    Источник: Хабрахабр

    Категория: Операционные системы / Linux

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

    Добавление комментария

    Имя:*
    E-Mail:
    Комментарий:
    • bowtiesmilelaughingblushsmileyrelaxedsmirk
      heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
      winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
      worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
      expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
      disappointedconfoundedfearfulcold_sweatperseverecrysob
      joyastonishedscreamtired_faceangryragetriumph
      sleepyyummasksunglassesdizzy_faceimpsmiling_imp
      neutral_faceno_mouthinnocent