DevOps

Lima - подсистема macOS для Linux

Lima запускает виртуальные машины Linux на macOS с автоматическим общим  доступом, переадресацией портов и средой выполнения контейнеров containerd

Lima можно рассматривать как своего родна неофициальную подсистему macOS для Linux или containerd для Mac.

Ожидается, что Lima будет использоваться на хостах macOS, но может использоваться и на хостах Linux.

✅Автоматический обмен файлами

✅Автоматическая переадресация портов

✅Встроенная поддержка containerd ( можно использовать и другие контейнерные движки )

✅Intel на Intel

✅ ARM на Intel

✅ARM на ARM

Intel на ARM

✅Разные дистрибутивы Linux: AlmaLinux , Alpine , Arch Linux , Debian , Fedora , openSUSE , Oracle Linux , Rocky , Ubuntu ...

Связанный проект: sshocker (ssh с общим доступом к файлам и переадресацией портов)

Этот проект не имеет отношения к проекту драйвера Lima (драйвер для графических процессоров ARM Mali) .

Страница докладов содержит ссылки на слайды и видео из презентаций конференции о Лимa.

Примеры 

Консольная UNIX-утилита uname 

$ uname -a
Darwin macbook.local 20.4.0 Darwin Kernel Version 20.4.0: Thu Apr 22 21:46:47 PDT 2021; root:xnu-7195.101.2~1/RELEASE_X86_64 x86_64

$ lima uname -a
Linux lima-default 5.11.0-16-generic #17-Ubuntu SMP Wed Apr 14 20:12:43 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ LIMA_INSTANCE=arm lima uname -a
Linux lima-arm 5.11.0-16-generic #17-Ubuntu SMP Wed Apr 14 20:10:16 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

Совместное использование файлов в macOS и Linux 

$ echo "files under /Users on macOS filesystem are readable from Linux" > some-file

$ lima cat some-file
files under /Users on macOS filesystem are readable from Linux

$ lima sh -c 'echo "/tmp/lima is writable from both macOS and Linux" > /tmp/lima/another-file'

$ cat /tmp/lima/another-file
/tmp/lima is writable from both macOS and Linux"

Запуск контейнеров containerd (вместе с контейнерами Docker) 

$ lima nerdctl run -d --name nginx -p 127.0.0.1:8080:80 nginx:alpine

http://127.0.0.1:8080 доступен как из macOS, так и из Linux. 

Примечание: привилегированные порты (0-1023) не могут быть перенаправлены. Используйте containerd и nerdctl (containerd ctl).

Установка

Пакет Homebrew доступен.

brew install lima

Применение

[macOS]
$ limactl start
... INFO[0029] READY. Run `lima` to open the shell. [macOS]
$ lima uname
Linux

Справочник по командам

limactl start

limactl start [--name=NAME] [--tty=false] <template://TEMPLATE>: запустить экземпляр Linux

$ limactl start
? Creating an instance "default"  [Use arrows to move, type to filter]
> Proceed with the current configuration
  Open an editor to review or modify the current configuration
  Choose another example (docker, podman, archlinux, fedora, ...)
  Exit
...
INFO[0029] READY. Run `lima` to open the shell.

Выберите Proceed with the current configurationи подождите, пока сообщение «ГОТОВО» не будет напечатано на хост-терминале. Для автоматизации --tty=falseможно использовать флаг для отключения интерактивного пользовательского интерфейса.

Расширенное использование

Чтобы создать экземпляр «по умолчанию» из шаблона «докер»:

$ limactl start --name=default template://docker

ПРИМЕЧАНИЕ: limactl start template://TEMPLATEтребуется Lima версии 0.9.0 или выше. limactl start /usr/local/share/doc/lima/examples/TEMPLATE.yamlВместо этого требуются более старые выпуски .

Чтобы просмотреть список шаблонов:

$ limactl start --list-templates

Чтобы создать экземпляр «по умолчанию» из локального файла:

$ limactl start --name=default /usr/local/share/lima/examples/fedora.yaml

Чтобы создать экземпляр «по умолчанию» из удаленного URL-адреса (используйте осторожно, с надежным источником):

$ limactl start --name=default https://raw.githubusercontent.com/lima-vm/lima/master/examples/alpine.yaml

limactl shell

limactl shell <INSTANCE> <COMMAND>: запуск <COMMAND>в Linux.

Для экземпляра «по умолчанию» эту команду можно сократить до lima <COMMAND>. Команда limaтакже принимает имя экземпляра в качестве переменной среды $LIMA_INSTANCE.

limactl copy

limactl copy <SOURCE> ... <TARGET>: копировать файлы между экземплярами или между экземплярами и хостом

Используйте <INSTANCE>:<FILENAME>для указания источника или цели внутри экземпляра.

limactl list

limactl list [--json]: показать экземпляры

limactl stop

limactl stop [--force] <INSTANCE>: остановить экземпляр

limactl delete

limactl delete [--force] <INSTANCE>: удалить экземпляр

limactl factory-reset

limactl factory-reset <INSTANCE>: заводской сброс экземпляра

limactl edit

limactl edit <INSTANCE>: отредактировать экземпляр

limactl disk

limactl disk create <DISK> --size <SIZE>: создать новый внешний диск для подключения к экземпляру

limactl disk delete <DISK>: удалить существующий диск

limactl disk list: список всех существующих дисков

limactl completion

  • Чтобы включить завершение bash, добавьте source <(limactl completion bash)в ~/.bash_profile.

  • Чтобы включить завершение zsh, см.limactl completion zsh --help

⚠️ ВНИМАНИЕ: обязательно сделайте резервную копию ваших данных

В Lima могут быть ошибки, приводящие к потере данных.

Обязательно сделайте резервную копию своих данных перед запуском Lima.

В частности, следующие данные могут быть легко потеряны:

  • Данные в общих доступных для записи каталогах ( /tmp/limaпо умолчанию), возможно, после перехода хост-компьютера в спящий режим (например, после закрытия и повторного открытия крышки ноутбука).
  • Данные в образе ВМ, в основном при обновлении версии lima

Конфигурация

См ./examples/default.yaml. .

Текущая спецификация по умолчанию:

  • OS: Ubuntu 22.10 (Кинетик Куду)
  • CPU: 4 ядра
  • RAM: 4 ГиБ
  • HDD: 100 ГиБ
  • Mounts: ~(только чтение), /tmp/lima(доступно для записи)
  • SSH: 127.0.0.1:60022

Как это работает

FAQ

"Какой у меня пароль для входа?"

Пароль отключен и заблокирован по умолчанию. Вы должны использовать limactl shell bash(или lima bash), чтобы открыть оболочку.

Кроме того, вы также можете напрямую подключиться к гостевой системе по ssh: ssh -p 60022 -i ~/.lima/_config/user -o NoHostAuthenticationForLocalhost=yes 127.0.0.1.

«Работает ли Лима на ARM Mac?»

Да, должно работать, но регулярно не тестировалось на ARM (из-за отсутствия CI).

«Могу ли я запускать другие OS, отличных от Ubuntu?»

Также известно, что AlmaLinux, Alpine, Arch Linux, Debian, Fedora, openSUSE, Oracle Linux и Rocky работают. См ./examples/. .

Образ должен удовлетворять следующим требованиям:

  • systemd или OpenRC
  • облачная инициализация
  • Следующие бинарники должны быть предустановлены:
    • sudo
  • Следующие двоичные файлы должны быть предварительно установлены или установлены через менеджер пакетов:
    • sshfs
    • newuidmapиnewgidmap
  • apt-getdnfapkpacmanили zypper(если вы хотите внести свой вклад в поддержку другого менеджера пакетов, запустите, git grep apt-getчтобы узнать, где изменить)

«Могу ли я запускать другие контейнерные движки, такие как Docker и Podman? Или Kubernetes?»

Да, любой контейнерный движок должен работать с Lima.

Примеры среды выполнения контейнера:

Примеры конструктора образов контейнеров:

Примеры оркестратора контейнеров:

Образ Ubuntu по умолчанию также содержит LXD. Запустите lima sudo lxc initдля настройки LXD.

См. также сторонние проекты containerd на основе Lima:

  • Rancher Desktop : Kubernetes и управление контейнерами на рабочем столе
  • Colima : Docker (и Kubernetes) на macOS с минимальной настройкой

«Могу ли я запустить Lima на удаленной машине с Linux?»

Сама Lima не поддерживает подключение к удаленному Linux-компьютеру, но sshocker , предшественник Lima, предоставляет аналогичные функции для удаленных Linux-машин.

например, запустите sshocker -v /Users/foo:/home/foo/mnt -p 8080:80 <USER>@<HOST>для доступа /Users/fooк удаленной машине как /home/foo/mntи перенаправьте localhost:8080на порт 80 удаленной машины.

«Преимущества по сравнению с Docker для Mac?»

Lima — это бесплатное программное обеспечение (лицензия Apache 2.0), а Docker для Mac — нет. Их EULA даже запрещает раскрытие результатов бенчмаркинга.

С другой стороны, Moby , также известный как Docker для Linux, является бесплатным программным обеспечением, но в Moby/Docker отсутствуют некоторые новые функции containerd.

Сеть

«Не удается получить доступ к гостевому IP-адресу 192.168.5.15 с хоста»

Гостевой IP-адрес по умолчанию 192.168.5.15 недоступен для хоста и других гостей.

Чтобы добавить еще один IP-адрес, доступный с хоста и других виртуальных машин, включите socket_vmnet(начиная с Lima v0.12) или vde_vmnet(устарело).

См ./docs/network.md. .

«Ping показывает дубликаты пакетов и большое время отклика»

Lima использует сеть QEMU SLIRP, которая не поддерживает ping«из коробки»:

$ ping google.com
PING google.com (172.217.165.14): 56 data bytes
64 bytes from 172.217.165.14: seq=0 ttl=42 time=2395159.646 ms
64 bytes from 172.217.165.14: seq=0 ttl=42 time=2396160.798 ms (DUP!)

Дополнительные сведения см. в разделе Документация/Сеть .

Общий доступ к файловой системе

"Файловая система работает медленно"

Попробуйте виртуозы. Видетьdocs/mount.md

"Файловая система недоступна для записи"

По умолчанию домашний каталог монтируется как доступный только для чтения. Чтобы включить запись, укажите writable: trueв YAML:

mounts:
- location: "~"
  writable: true

Запустите limactl edit <INSTANCE>, чтобы открыть редактор YAML для существующего экземпляра.

Внешние проекты

«Я использую Rancher Desktop. Как быть с лежащим в основе Lima?»

На хостах macOS Rancher Desktop (начиная с версии 1.0) запускает Lima со следующей конфигурацией:

  • $LIMA_HOMEкаталог:$HOME/Library/Application Support/rancher-desktop/lima
  • limactlбинарный:/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl
  • Имя экземпляра Лимы:0

Чтобы открыть оболочку, выполните следующую команду:

LIMA_HOME="$HOME/Library/Application Support/rancher-desktop/lima" "/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl" shell 0

На хостах Linux попробуйте следующую команду:

LIMA_HOME="$HOME/.local/share/rancher-desktop/lima" /opt/rancher-desktop/resources/resources/linux/lima/bin/limactl shell 0

Если вы установили Rancher Desktop как AppImage:

LIMA_HOME="$HOME/.local/share/rancher-desktop/lima" "$(ls -d /tmp/.mount_ranche*/opt/rancher-desktop/resources/resources/linux/lima/bin)/limactl" shell 0

"Советы по отладке других проблем?"

  • Проверить журналы:
    • limactl --debug start
    • $HOME/.lima/<INSTANCE>/serial.log
    • /var/log/cloud-init-output.log(внутри гостя)
    • /var/log/cloud-init.log(внутри гостя)
  • Убедитесь, что вы не перепутали вкладки и пробелы в YAML.