Назад к обновлениям
New releaseAug 26, 2026

ish builds/813

Оболочка Linux для iOS

Поделиться

iSH

Build Status goto counter fuck counter shit counter

Проект, позволяющий запустить командную оболочку Linux на iOS с помощью эмуляции x86 в пользовательском режиме и трансляции системных вызовов.

Текущее состояние проекта можно узнать в разделе Issues и в логах коммитов.

Разработка

В проекте используется подмодуль Git; обязательно клонируйте репозиторий с ключом --recurse-submodules или выполните git submodule update --init после клонирования.

Для сборки проекта вам понадобятся:

  • Python 3
    • Meson (pip3 install meson)
  • Ninja
  • Clang и LLD (на Mac: brew install llvm, на Linux: sudo apt install clang lld или sudo pacman -S clang lld и т.п.)
  • sqlite3 (настолько распространён, что на Linux, скорее всего, уже установлен, а на Mac — точно. Если нет, выполните что-то вроде sudo apt install libsqlite3-dev)
  • libarchive (brew install libarchive, sudo port install libarchive, sudo apt install libarchive-dev) TODO: избавиться от этой зависимости

Сборка для iOS

Откройте проект в Xcode, откройте iSH.xcconfig и измените ROOT_BUNDLE_IDENTIFIER на что-нибудь уникальное. Также нужно обновить идентификатор команды разработчика в настройках сборки проекта (не цели!). Затем нажмите Run. Остальное сделают скрипты автоматически. Если возникнут проблемы, создавайте Issue, я постараюсь помочь.

Сборка инструмента командной строки для тестирования

Чтобы настроить окружение, перейдите в каталог проекта и выполните meson build, чтобы создать каталог сборки build. Затем перейдите в каталог build и выполните ninja.

Чтобы создать самодостаточную файловую систему Alpine Linux, скачайте tarball Alpine minirootfs для i386 с сайта Alpine и выполните ./tools/fakefsify, передав tarball minirootfs первым аргументом, а имя выходного каталога — вторым. Затем можно запускать программы внутри файловой системы Alpine с помощью ./ish -f alpine /bin/sh, если выходной каталог называется alpine. Если tools/fakefsify отсутствует в вашем каталоге сборки, это может быть связано с тем, что он не нашёл libarchive в вашей системе (см. выше способы его установки).

Вы можете заменить ish на tools/ptraceomatic, чтобы запускать программу в реальном процессе, выполнять пошаговое выполнение и сравнивать регистры на каждом шаге. Я использую это для отладки. Требуется 64-битный Linux 4.11 или новее.

Логирование

iSH имеет несколько каналов журналирования, которые можно включить во время сборки. По умолчанию все они отключены. Чтобы их включить:

  • В Xcode: установите параметр ISH_LOG в iSH.xcconfig в список каналов журналирования, разделённых пробелами.
  • В Meson (инструмент командной строки для тестирования): выполните meson configure -Dlog="<список каналов журналирования через пробел>".

Доступные каналы:

  • strace: наиболее полезный канал, записывает параметры и возвращаемое значение почти каждого системного вызова.
  • instr: записывает каждую инструкцию, выполненную эмулятором. Это сильно замедляет работу.
  • verbose: отладочные логи, не подходящие под другие категории.
  • Ищите DEFAULT_CHANNEL, чтобы узнать, не были ли добавлены новые каналы журналирования после обновления этого списка.

Замечание об интерпретаторе

Пожалуй, самое интересное, что я написал для iSH, — это интерпретатор. Это не совсем JIT, поскольку он не генерирует машинный код. Вместо этого он создаёт массив указателей на функции, называемые "gadgets", и каждый gadget завершается tailcall'ом к следующей функции; это похоже на технику threaded code, используемую некоторыми интерпретаторами Forth. В результате скорость работы увеличивается примерно в 3–5 раз по сравнению с эмуляцией с помощью простого switch-диспетчера.

К сожалению, я решил написать почти все gadgets на ассемблере. Вероятно, это было хорошим решением с точки зрения производительности (хотя я никогда не узнаю наверняка), но ужасным — с точки зрения читаемости, поддерживаемости и моего душевного спокойствия. Количество глупостей, которые мне пришлось терпеть от компилятора/ассемблера/линковщика, просто безумно. Такое ощущение, что там сидит демон, который следит, чтобы мой код был достаточно уродлив, а если нет, то придумывает идиотские причины, почему он не должен компилироваться. Чтобы сохранить рассудок при написании этого кода, мне пришлось игнорировать лучшие практики структурирования кода и именования. Вы найдёте макросы и переменные с такими описательными именами, как ss, s и a. Макросы ассемблера, вложенные до невероятности. И в довершение всего — почти нет комментариев.

Так что предупреждение: длительное воздействие этого кода может привести к потере рассудка, кошмарам о макросах GAS и ошибках линковщика, а также к любым другим изнурительным побочным эффектам. Этот код признан штатом Калифорния причиняющим рак, врождённые дефекты и нарушение репродуктивной функции.

Категории