LINUX.ORG.RU

Новая альтернатива flatpak и appimage - контейнер в виде одного файла

 , ,


5

6

Может кому пригодится. Conty - контейнер, упакованный в один единственный исполняемый файл. С помощью него можно запускать любые приложения, в том числе игры. В целом, это что-то вроде flatpak и AppImage в одном флаконе.

Так как это контейнер, соответственно, никакие зависимости в системе не требуются. Вы даже можете запускать 32-битные приложения на полностью 64-битном дистрибутиве. Root права не требуются.

Хотите запустить Steam? Пожалуйста:

./conty.sh steam

Wine? Тоже можно:

./conty.sh wine app.exe

Да и в целом, можно запускать все, что душе угодно.

Также поддерживается возможность изоляции файловой системы. Например:

export SANDBOX=1
export BIND="/home/username/.steam /home/username/.local/share/Steam"
./conty.sh steam

https://github.com/Kron4ek/Conty

★★★★★

Последнее исправление: maxcom (всего исправлений: 3)

Не увидел в ридми есть ли возможно создания отдельных профилей для разных программ? Типо боттлов для вайна.

kardjoe
()
Ответ на: комментарий от kardjoe

Ну да, многовато, это ведь полноценный дистрибутив, хоть и сжатый.

Kron4ek ★★★★★
() автор топика
Ответ на: комментарий от kardjoe

Можно это через обычные shell скрипты сделать. Например, скрипт для steam:

export SANDBOX=1
export BIND="/home/username/.steam /home/username/.local/share/Steam"
./conty.sh steam

Скрипт для firefox:

export SANDBOX=1
export BIND="/home/username/.mozilla /home/username/.cache/mozilla"
./conty.sh firefox

И так далее.

Kron4ek ★★★★★
() автор топика
Ответ на: комментарий от kardjoe

Отлично, значит как минимум еще и на Slackware нормально работает. Я пока только на Arch Linux и на Ubuntu 16.04 пробовал. И еще был бы рад знать, как оно на Nvidia работает, а то у меня только AMD.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 1)

Мне нравится. Ещё красивый cli бы добавить, как у флатпака, и можно будет конкурировать с гигантами. Только добавьте лицензию.

fernandos ★★★
()
Ответ на: комментарий от Kron4ek

У меня не работает на slackware64 15.0 alpha

SANDBOX=1 BIND="/home/user/.steam /home/user/.local/share/Steam" bash conty.sh steam

Running Conty
Filesystem sandbox is enabled
Binded items: /home/user/.steam /home/user/.local/share/Steam

Setting up Steam content in /home/user/.local/share/Steam
Running Steam on arch rolling 64-bit
STEAM_RUNTIME is enabled automatically
Pins potentially out-of-date, rebuilding...
No protocol specified
Unable to init server: Could not connect: Connection refused

(zenity:87): Gtk-WARNING **: 19:27:46.924: cannot open display: :0
Can't find 'steam-runtime-check-requirements', continuing anyway
/home/user/.local/share/Steam/ubuntu12_32/steam
[2021-03-27 19:27:48] Startup - updater built Feb 12 2021 23:21:33
ILocalize::AddFile() failed to load file "public/steambootstrapper_english.txt".
Installing breakpad exception handler for appid(steam)/version(0)
No protocol specified
src/steamexe/updateui_xwin.cpp (337) : Assertion Failed: Could not open connection to X
src/steamexe/updateui_xwin.cpp (337) : Assertion Failed: Could not open connection to X
Installing breakpad exception handler for appid(steam)/version(1.0)
crash_20210327192748_3.dmp[134]: Uploading dump (out-of-process)
/tmp/dumps/crash_20210327192748_3.dmp
src/steamexe/main.cpp (815) : Assertion Failed: failed to initialize update status ui, or create initial window
src/steamexe/main.cpp (815) : Assertion Failed: failed to initialize update status ui, or create initial window
user@hwsl:~/Downloads$ No protocol specified
Unable to init server: Could not connect: Connection refused

(zenity:131): Gtk-WARNING **: 19:27:48.158: cannot open display: :0
crash_20210327192748_3.dmp[134]: Finished uploading minidump (out-of-process): success = yes
crash_20210327192748_3.dmp[134]: response: CrashID=bp-16417507-06b9-44d3-b8d1-aea932210327
crash_20210327192748_3.dmp[134]: file ''/tmp/dumps/crash_20210327192748_3.dmp'', upload yes: ''CrashID=bp-16417507-06b9-44d3-b8d1-aea932210327''

На этом месте висит и ничего не происходит. Минут 5 ждал.

kardjoe
()
Ответ на: комментарий от kardjoe

cannot open display: :0

А X сервер запущен? Судя по ошибкам, он не может к дисплею подсоединиться.

И работает ли без SANDBOX? Какая видеокарта, кстати?

Проще не на Steam проверять, а на glxgears:

./conty.sh glxgears
Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 2)

Без обид, но, ИМХО, очередной "убийца снапа" не особо то и нужен.

Korchevatel ★★★★★
()

Откуда забираются сами контейнеры? Кто их хранит? И самое главное, зачем это всё?

intelfx ★★★★★
()
Ответ на: комментарий от kardjoe

Хм, интересно. А если так?

export SANDBOX=1
export BIND="/home/username"
./conty.sh glxgears

Вместо username, конечно, реальное имя пользователя.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 1)
Ответ на: комментарий от fernandos

Отлично. Спасибо, что проверили :)

Kron4ek ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Все генерируется скриптами из проекта.

И самое главное, зачем это всё?

Да просто сделал сначала для себя, потом понял, что и другим может быть интересно, поделился. Вот и все.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 1)
Ответ на: комментарий от kardjoe

Видимо какие-то из параметров (помимо изоляции ФС), которые я добавляю при включении SANDBOX, вызывают эту проблему. Какие-то из этих:

--unshare-user-try --unshare-pid --unshare-uts --unshare-cgroup-try --hostname Conty

Попробую воспроизвести на виртуалке и исправить.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 1)

Штука интересная. Правда здоровая. И не совсем понятен смысл складывания вообще всего в один файл. Ну, т.е. идея в стиле AppImage мне понятна. Однако, может кому-то надо steam, а кому-то только wine. Это разные сущности. И оно никак не обновляемое частями ведь?

P.S.: Где-то я тебя видел. Ты никакие раздачи не делаешь?

ls-h ★★★★★
()
Ответ на: комментарий от ls-h

Однако, может кому-то надо steam, а кому-то только wine.

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

И оно никак не обновляемое частями ведь?

Никак, оно упаковано в squashfs и доступно только для чтения. Обновление происходит при генерировании образа.

Где-то я тебя видел. Ты никакие раздачи не делаешь?

Вполне возможно, на рутрекере раздачи выкладываю иногда (в разделе Linux игр в основном).

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 3)
Ответ на: комментарий от Kron4ek

на рутрекере раздачи выкладываю иногда

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

Ещё мысль о песочнице. У тебя ведь внутри бинарный FUSE драйвер для squashfs? Т.е. если такую конструкцию использовать для распространения тех же раздач, например, то надо ей ещё до запуска доверять. Поэтому не совсем понятно, что и от чего песочница будет ограждать. Сейчас во многих дистрибутивах bwrap и поддержка squashfs есть, а ещё и udisks2. Можно udisksctl попросить смонтировать образ, передав смещение в виде параметра, а всё содержимое уже запускать внутр NS, созданного с помощью bwrap. Тогда остаётся только маленький скрипт, которому надо доверять, но его можно прочитать и понять, стоит ли. Скрипт так же может определять, есть ли в системе bwrap и предлагать его использовать.

Мне кажется, такой вариант хорошо бы подошёл для раздач именно. Всё в одном файле, который и на раздаче стоит и запускать из него можно. Монтируется и помещается в песочницу он только системными средствами через скрипт в 10 строчек, которые можно прочитать. Можно ещё пару опций добавить: --path-to-wine и --path-to-settings, чтобы при желании использовать внешний wine и конфиг править. Удобно!

ls-h ★★★★★
()
Ответ на: комментарий от Kron4ek

Приветствую!

Может в слаке по дефолту отключены cap_sys_admin для юзера, а они нужны для

--hostname Conty
, например.

Можно проверить через:

capsh --print | grep cap_sys_admin
chaos_dremel ★★
()
Ответ на: комментарий от ls-h

Таки да, для раздач удобно было бы, особенно для тех, что хорошо сжимаются. Но сначала надо хорошо оттестировать.

У тебя ведь внутри бинарный FUSE драйвер для squashfs?

Да, внутри бинарные squashfuse и bubblewrap и их зависимости (пытался статически собрать, но не получилось). Собраны они на Ubuntu 16.04, так что должны более менее везде работать. Я позже добавлю возможность использовать системные squashfuse и bwrap вместо встроенных.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 1)
Ответ на: комментарий от ls-h

На рутрекере уже раздают AppImage'ы со squashfs внутри, которая монтируется через fuse. Эту же схему юзает например проект wine-launcher. Технология отработанная. Я тоже когда-то считал, что надо маунтить именно через систему, но как показывает практика, плюсы от этого не перевешивают минусы.

chaos_dremel ★★
()
Ответ на: комментарий от chaos_dremel

Спасибо, проверю потом. Хотя, по идее, bubblewrap должен ругнуться в таком случае и отказаться запускаться, но может и не должен, точно не знаю.

Kron4ek ★★★★★
() автор топика
Ответ на: комментарий от ls-h

Необходимость в рут правах или запросе sudo. Необходимость в loop устройстве для монтирования, а loop устройства и так использутся кучей пакетных систем (snap’ом тем же), а количество loop устройств ограничено.

chaos_dremel ★★
()
Ответ на: комментарий от chaos_dremel

Необходимость в рут правах или запросе sudo

Вроде при использовании udisks2 такого не наблюдается.

ls-h ★★★★★
()
Ответ на: комментарий от i586

Честно говоря, я ни с docker, ни с podman не разбирался, так что не знаю, можно ли их так же в один исполняемый файл засунуть. Мне проще было несколько простых shell скриптов написать, которые делают то, что мне нужно.

Kron4ek ★★★★★
() автор топика
  • Проблема: у пакетов много зависимостей, надо сделать однофайловую сборку.
  • Решение: Appimage.
  • Проблема: пакеты слишком большие, надо бы разбить их на зависимости.
  • Решение: Flatpak.
  • Проблема: у пакетов много зависимостей, надо сделать однофайловую сборку.
  • Решение: Conty.

Серьезно?

qtm ★★★
()
Ответ на: комментарий от qtm

Да, вполне серьезно, что хочу, то и делаю. Никому насильно в глотку не пихаю, так что каждый сам решает, что ему использовать.

AppImage - не контейнер, а flatpak - контейнер, но не однофайловый.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 2)
Ответ на: комментарий от Kron4ek

Да без проблем. Но мне бы хотелось, чтоб люди с мозгами собирали космический корабль, а не рассекали на своих уникальных велосипедах.

qtm ★★★
()
Ответ на: комментарий от qtm

Ну, велосипеды - часть развития, ничего плохого в них нет. Да и я бы не сказал, что это прям велосипед - отличия и от AppImage, и от flatpak есть. Как я уже сказал, AppImage - не контейнер, из-за чего некоторые приложения туда полноценно фиг запихнешь (тот же Wine, например). Flatpak - контейнер и такой проблемой не страдает, но это скорее пакетный менеджер, просто оперирующий крупными автономными единицами. Я не имею ничего ни против AppImage, ни против flatpak. Мне хотелось портативный исполняемый файл как AppImage, но в то же время контейнер как flatpak, и я это сделал.

К тому же, если бы это никому неинтересно и ненужно было, я бы такого положительного фидбэка не получил.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 4)
Ответ на: комментарий от Kron4ek

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

qtm ★★★
()
Ответ на: комментарий от qtm

Но почему при наличии четырнадцати существующих технологий, надо обязательно придумывать свою, пятнадцатую?

А, известный мем с xkcd. Я полагаю, так уж люди устроены, вечные велосипеды, вечные новые стандарты :)

Kron4ek ★★★★★
() автор топика
Ответ на: комментарий от Kron4ek

Майнеры включены?

...нет, никаких вредоносов и малвари.

Ты не можешь это утверждать, размещая бинари на сервере корпораций. Тем более без MD5 и SHA1.

p.s. У меня был опыт «незаметного» встраивания малвари в windows-инсталлер владельцами SourceForge.

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)

Интересно, но опять мимо. Я вдруг понял, что сидя на Арче (ну ладно, на Манджаре) у меня и нет простых программ, которые хотелось бы запустить в самодостаточном виде. А сложнособираеме я не соберу. Например - Zeroballistics - очень жаль, что разработка прекратилась, а сорцы не собираются на современных линуксах уже лет десять.

ChekPuk ★★★
()
Ответ на: комментарий от Kron4ek

И еще был бы рад знать, как оно на Nvidia работает, а то у меня только AMD.

ноут с оптимусом на нвидии стим не завелся. лутрис завелся и даже запустил батлнет. стим ругается на:

Installing breakpad exception handler for appid(steam)/version(1616532526)
SteamUpdateUI: An X Error occurred
X Error of failed request:  BadValue (integer parameter out of range for operation)

на встроенной стим запускается но не запускает игорей.

также ./conty -e ругается на много открытых файлов, а после увеличения лимитов жалуется на xattrs и просит суперюзера.

это все на арче.

fakeroot
()
Последнее исправление: fakeroot (всего исправлений: 1)
Ответ на: комментарий от ls-h

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

А как тогда Вайн поменять, патч или мод поставить? RО для этого неудобно.

einhander ★★★★★
()
Ответ на: комментарий от fakeroot

ноут с оптимусом на нвидии стим не завелся. лутрис завелся и даже запустил батлнет. стим ругается на

А как на дискретке пытался запустить: через prime-run, primusrun или как-то иначе?

также ./conty -e ругается на много открытых файлов, а после увеличения лимитов жалуется на xattrs и просит суперюзера.

Да, есть такое, исправлю.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 1)
Ответ на: комментарий от Novator

Честно говоря, я не верю, что GitHub может такое учудить. Хотя про SourceForge я бы то же самое сказал, так что всякое всякое бывает, видимо. MD5 буду прикладывать.

Kron4ek ★★★★★
() автор топика
Последнее исправление: Kron4ek (всего исправлений: 1)
Ответ на: комментарий от kardjoe

Кстати, все параметры до имени команды передаются напрямую bwrap, так что можно даже вот так попробовать.

./conty.sh --unshare-user-try --unshare-pid --unshare-uts --unshare-cgroup-try --hostname Conty glxgears

Так ведь тоже не работает? Если да, то попробуй их по-одному убирать и скажи, какой из них у тебя проблему вызывает.

Kron4ek ★★★★★
() автор топика
Ответ на: комментарий от Kron4ek

Кстати, у тебя внутри конейнера где-то засунуто vblank_mode=1? Запуск glxgears из контейнера дает 50-70 fps, тогда как нативно выдает 20000-21000 fps.

kardjoe
()
Последнее исправление: kardjoe (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.