LINUX.ORG.RU
ФорумAdmin

Запуск программ с GUI (графическим интерфейсом) из chroot. Новогодний рецепт.

 ,


2

3

Мне понадобился Hexchat. Как-то привык к нему. Но в новых дистрах он требует старый gtk+2. Решил на отдельном диске завести ещё один дистрибутив, но без установки.

Для примера был взят дистрибутив Calculate Linux 2024 года.

  1. Грузимся с Live ISO, Создаём отдельный раздел для системы, монтируем, допустим в:

mount /dev/sda8/ /mnt/d1

И копируем файлы с Live ISO Linux на этот отдельный раздел (допустим ext4), с опцией -a

cp -a /bin /mnt/d1 и т.д. (/mnt /media лучше создать вручную, дабы избежать рекурсии :) run, proc, sys копировать не надо, но можно создать эти директории)

  1. Загружаемся в основную систему.

  2. Ставим на хост:

emerge x11-apps/xhost

Выполняем на хосте:

export DISPLAY=:0 xhost +local:

  1. Делем chroot

(Может, придется поставить права на диск вроде chmod 777 /dev/sdaХ (но 777 я, конечно, круто взял :) первое что пришло в голову в качестве примера. Решайте сами, какие права нужны вам))

mount /dev/sda8 /mnt/d1

mount --rbind /dev /mnt/d1/dev

mount --make-rslave /mnt/d1/dev

mount -t proc /proc /mnt/d1/proc

mount --rbind /sys /mnt/d1/sys

mount --make-rslave /mnt/d1/sys

mount --rbind /tmp /mnt/d1/tmp

mount --bind /run /mnt/d1/run

chroot /mnt/d1 /bin/bash

. /etc/profile

export PS1="(chroot) $PS1"

(Можно продублировать в chroot, если что-то лишнее накрутили, как у меня это было:

export DISPLAY=:0)

su guest

hexchat

С Новым Годом!



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

Много лишнего, и есть куда менее кривые варианты. Во-первых, можно собрать snap/flatpak/appimage. Во-вторых, если использовать chroot-подобные подходы, то есть bwrap.

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

Да, но менее избыточно чем докер.

Ну да, ещё одно ядро, ещё один набор фирмварей и всей остальной обвязки это менее избыточно. Удачи вам двим с таким подходом.

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

Как в голову пришло в тот момент, так и сделал. Я как памятку оставил, чтобы потом не искать.

Вариации и улучшения приветствуются.

(Первый велосипед был трехколесный, с деревянными ободами, у него не было цепи :))

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

Вариации и улучшения приветствуются

Тогда вот два момента уже -

  1. можно разворачивать его просто в папке. На разделе я даже не знаю когда лучше, если создать раздел, на нем неизбежно будет пустое место, которое будет отъедено от основной системы и не будет использоваться. С папкой такой проблемы нет (/srv/chroot/debian12 к примеру)

  2. sudo debootstrap bookworm /srv/chroot/debian12 http://ftp.debian.org/debian/ вместо копирования содержимого LiveCD, развернет действительно минимальное окружение без ядра, прошивок и прочего, что тут не нужно. Но там не будет и графики, поэтому

  3. apt install hexchat в чруте установит сам hexchat и притянет все нужное, в том числе и gtk2.

  4. Придется добавить юзера, по умолчанию после debootstrap будет только рут: useradd guest

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

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

Докер этого не решает.

Лет 20 назад в Gentoo пакетный менеджер emerge имел опцию –configure которая решала данную задачу. Сегодня пионеры ее похерили.

Пример как создавать правильный, необходимый и достаточный chroot для некого процесса:

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

Идея создания минимального chroot, чтобы с помощью ldd посмотреть необходимые бинарю либы и скопировать только их. Вместо копирования всей системы.

anonymous
()

Можно вот так ещё, cdebootstrap + firejail

#Раз
sudo cdebootstrap stable chroot --flavour=minimal --include=hexchat http://deb.debian.org/debian/
#Два
firejail --chroot=chroot hexchat
#Всё!

А дальше можно этот чрут многократно переиспользовать, наваливать туда софта с которым в хосте возится лень, компилять, мусорить и прочее. Я часто так делаю :) Хотя один фиг основной хост обляпал dev пакетами, но это вина ленивой жопы

LINUX-ORG-RU ★★★★★
()

Мне кажется, ты дольше выяснял как это провернуть, чем скомпилил бы старые gtk и hexchat указав пути сборки в нужную директорию. Но я не пробовал. Может там реально проблема? (вот уж не думаю)

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

Она и стоит. Только версия unupdatable из-за слабого бука. Калькулейт бинарный дистрибутив. Мне легче было скопировать. И в дистрибутиве уже лежат сертификаты нужные для guest.

Да, там необязательно для chroot всё копировать. Но главное знать - что можно не копировать.

AnonymUser
() автор топика

Чисто для информации - всё это можно делать через linux containers (LXC).

По крайней мере chroot и mount –bind будут автоматизированы. И там всё-таки изоляция получше за счет linux namespaces, ну там сеть отдельная и доступ к железу можно ограничить.

(GUI запускать приблизительно как ты написал, только это все в конфигах прописать можно).

MirandaUser2 ★★
()
Ответ на: комментарий от LINUX-ORG-RU

Хотя один фиг основной хост обляпал dev пакетами, но это вина ленивой жопы

Воистину! На своем железе, сделаем всё по уму, а потом будем делать как душа подскажет.

anc ★★★★★
()
31 января 2026 г.
Ответ на: комментарий от LINUX-ORG-RU

Привет, извиняюсь что дергаю. Если можно, то mky закастовать (он должен быть в теме unshare).

Можно официальные разъяснение между chroot + pivot_root и namespaces mount?

Я правильно увидел что первое это ситсемный вызов ядра, когда нужен «швейцфрский нож», например с intrd; в то время как namespace mount это часть api прозводящая тоже самое, но «в связке швейцарских ножей, но для изоляции иных подсистем на самом и полноценном хосте»?

Заранее Спасибо! Просьба писать по делу и с указанием ссылки на первоисточники. В н.в. не хватает вычитки, т.к. тему не часто освещают или я те так писал запросы и не те мануалы смотрел.

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

Я не особо в курсе, и не совсем понял вопрос. Извеняюсь, если написал не по делу.

ЕМНИП, pivot_root() как системный вызов появился во времена initrd, когда никаких namespace'ов в ядре не было. Исходно вобще нельзя было менять корень, потом сделали initrd и смену корня через, /proc/sys/kernel/real-root-dev, которая работала один раз. Потом придумали pivot_root(), как-бы мегаизвращённый mount. Потом придумали namespac'ы и pivot_root() стал работать внутри mount namespace. Через unshare мы можем создать новый namespace, а потом через mount(), umount() и pivot_root() менять его.

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

Благодарю! Последние две строки ответа отвечают на мой вопрос. Для ясности, мотив вопроса и его основной контекст: если одни и те же системные вызовы используются в: chroot + pivot_root и namespace mount. То вероятно, первое это было давно и с течением времени стало нарицательным названием механизма/спецификации; второе (сравнительно недавно) появившийся namespace mount. Вывод, оба инструмента испльзуются в разных ситуация и ни отличаются набором используемых системных вызовов, - решают одну и ту же задачу. Соответственно, в зависимости от условий такой задачи разницы между chroot + pivot_root и namespace mount нет.

ЗЫ. когда прорабатывал информацию, из https://www.redhat.com/en/blog/7-linux-namespaces зациклился на этом вопросе и в манах была отсылка на «точку входа» CAP_SYS_ADMIN, но уже квалификации для оценки специфики clone(2), CLONE_NEWNS не хватило.

mky, LINUX-ORG-RU Благодарю за оперативность, содействие и исчерпывающие ответы.

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

Вынужденно уточняю, так как не понимаю/не получается. Только с помощью unshare возможно сделать unprivileged rootless chroot? Если нет, то правильно ли утверждение: делай chroot и используй его как песочницу для запуска отдельных процессов через unshare?

Какую задачу пытаюсь решить: gentoo stage3 и обычный пользователь для организации binhost. Цель: если возможно делать chroot от обычной учётки, то я хочу!

Из того что смог добиться, - unshare; unshared chroot и mount -t proc /proc… корень вижу, но корень nobody. Естественно, по мануалу gentoo распаковка идёт от root (там ошибки, ну и логично что root и должен быть. Ведь так?)

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

Вы, лучше, пишите какие команды команды и с какими опциями выполняете. После unshare вы получаете копию текущей ФС, и, то что вы там как-бы root не означает, что вы можете писать куда угодно. На самом деле файлы/каталог будут создаваться с правами обычного пользователя, поэтому после unshare нужен chroot в каталог, доступный этому пользователю для записи. И, наверное, лучше сделать отделное пространство PID. Как-то так:

# Создание chroot каталога для целостности примера
[k@comp ~]$ mkdir -p ~k/CHRT/proc ~k/CHRT/dev ~k/CHRT/sys
[k@comp ~]$ cp /bin/busybox ~k/CHRT

[k@comp ~]$ unshare --user --mount --map-root-user --fork --pid --mount-proc=/home/k/CHRT/proc/
# Это, наверное, для сборки gentoo не надо,
# там итак должен быть свой мин. /dev с null, zero...
[root@comp ~]# mount --rbind /sys /home/k/CHRT/sys
[root@comp ~]# mount --rbind /dev /home/k/CHRT/dev

[root@comp ~]# chroot /home/k/CHRT/ /busybox sh
/ # echo BBB > test
/ # ls -l
total 2240
-rwxr-xr-x    1 0        0          2286816 Feb 17 16:14 busybox
drwxr-xr-x   19 65534    65534         4340 Feb 17 08:56 dev
dr-xr-xr-x  463 65534    65534            0 Feb 17 16:11 proc
dr-xr-xr-x   12 65534    65534            0 Feb 17 15:41 sys
-rw-r--r--    1 0        0                4 Feb 17 16:23 test

Файлы создаются от root (id 0), а снаружи от обычного пользователя. И, как я понимаю, в таком chroot нельзя создать файлы от другого пользователя. Но, может я ошибаюсь. Помешает ли это сборке gentoo не знаю.

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

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

Попробую поколдовать как здесь https://wiki.gentoo.org/wiki/Steam#Chroot

Т.е. по той гипотезе, что с начала подготовка под обычный chroot, но после можно воспользоваться unshare

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

Благодарю, еще попробую. В основном проблемы в осознании «Курица или яйцо?», т.е. на #, $ подсматриваю, но в «mount -t …» / «mount –make-rslave …» начинаю путаться, т.к. по мануалу unshare, в принципе, будет ругать на отсутствие блочных устройств и т.п.; А с другой, вытекает, что до запуска unshare нужно проводить подготовку mount для псевдофайловых систем.

Вдумчиво вчитаюсь. В сети данная тема рассматривается не в «каноническом виде»: то контейнеры берут, то отдеьлные процессы запускают… А вот что бы полноценный chroot сделать… Или я шишки набиваю или туп для этой технологии.

Спасибо за ответы.

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

Оставлю на всякий пожарный, помню про рекомендацию писать те команды и опции что указываю, «шпору»: https://github.com/VAibhav1031/Scripts/blob/main/Container_Setup/container_run.sh

Т.к. до конца не понимаю что делаю, не пишу команды. Для понимания, нюанса, почему https://oldforum.puppylinux.com/viewtopic.php?t=115471 . В современных мануалах эти вещи расписывают уже по другому https://selectel.ru/blog/namespaces-and-seccomp/

anonymous
()