Intereting Posts
Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)? Флеш-накопитель, не работающий на конкретной машине RHEL Компиляция GCC – откуда берется символ __stack_chk_fail@GLIBC_2.4? Установка дистрибутивов Linux на двух отдельных жестких дисках Проблемы с курсором мыши и видео с момента обновления до Lubuntu 16.04 Windows 8 не отображается в Grub Конфигурация Shorewall: провайдеры и LAN Изменить пароль пользователя с помощью UID Thunderbird: новое уведомление по электронной почте не работает использовать iptables, чтобы разрешить входящие подключения к компьютеру на порту XYZ? Как использовать awk через несколько файлов? Почему Linux-игры менее эффективны, чем Win 7? перенаправить вывод скрипта python в файл Нужно удалить почту для нескольких дат в Linux mutt: имя, закодированное в кодировке с кодовым названием

Как я могу установить и запустить конфликтующие пакеты в Debian / Ubuntu?

Я хотел бы установить python3.7 и idle-python3.7 на мою stable idle-python3.7 Debian, но они из sid и требуют более новых версий libc , что потребует обновления загрузок и загрузок основных пакетов до нестабильных версий, если я сделаю это нормальный способ . Кроме того, это потребовало бы обновления или удаления большого количества пакетов, которые по какой-либо причине указывают именно python3.5 качестве одной из их зависимостей. Я не хочу этого делать.

Я также не могу скомпилировать python3.7 по некоторым причинам; когда я пытаюсь, тесты не проходят. Однако сопровождающим Debian удалось скомпилировать его для моей архитектуры, поэтому я хочу использовать их версию.

Как я могу установить эти конфликтующие пакеты?

Они оба доступны на Buster (Тестирование) https://packages.debian.org/search?keywords=python3.7

Вы должны быть в состоянии скопировать их из Тестирования в стабильный https://backports.debian.org/Instructions/

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


Чтобы сделать это, мы установим новую копию Debian в вашей файловой системе, chroot в нее chroot для установки некоторых пакетов, а затем создадим некую гибридную систему в отдельном пространстве имен для запуска программы. Корневой доступ требуется для некоторых шагов, и должен быть необязательным для других (но я еще не решил это). Вам понадобятся shell, debootstrap , chroot и gcc (последний, потому что нам нужен специальный инструмент).

Установка минимального экземпляра Debian

Для этого нам понадобится программа под названием debootstrap . Эта программа, как следует из названия, позволяет вам запустить установку Debian. Вы можете установить его с помощью:

 sudo apt-get install debootstrap 

Теперь, когда это сделано, мы можем приступить к фактической установке.

  1. Сначала проверьте, в какой версии Debian находятся нужные вам пакеты.
    Мои в sid на момент написания.
  2. Теперь определите, где вы хотите хранить этот образ Debian.
    Мне скучно, и я ожидаю, что мне придется делать это несколько раз, поэтому я назвал мой chroot.0 и вставил его прямо в CWD (что тоже ~ ).
  3. Запустите эту команду:

     sudo debootstrap --variant=minbase sid chroot.0 

    заменив sid нужной версией Debian, а chroot.0 – путем к каталогу, который вы хотите использовать.

    Вы также можете использовать --variant=fakeroot и потенциально избегать использования sudo здесь, но это установит множество дополнительных пакетов (если вы не можете объединить --variant s) и может лишить законной силы остальную часть ответа из-за проблем с разрешениями ,

Пока это работает, вы можете читать следующий раздел этого ответа.

Установка пакетов

Это легкая часть. После того, как система установлена, вы можете войти в нее, установив нужные вам пакеты.

  1. chroot в минимальный экземпляр Debian:

     sudo chroot chroot.0 

    (снова замените chroot.0 на путь, который вы использовали).

  2. Теперь вы должны находиться в корневой оболочке, где вы можете установить нужные вам пакеты:

     apt install idle-python3.7 python3.7 
  3. Оставьте chroot , запустив exit .

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

Создать инструмент

Сохраните это где-нибудь:

 #include  #include  #include  #include  int main(int argc, char **argv) { if (argc < 3) { printf( "This is a single-use, disposable program that binds specified directories from\n" "a chroot's root to the current root.\n" "\n" "Argument #1 should be the path to the chroot directory, sans trailing /.\n" "Subsequent arguments should be paths relative to the root, with preceeding /.\n" ); return 2; } for (int i = 2; i < argc; i += 1) { char source[PATH_MAX]; /* Not really MAX, but quite big. */ strcpy(&source, argv[1]); strcat(&source, argv[i]); if (mount(&source, argv[i], NULL, MS_BIND, NULL) == -1) { return 1; } } return 0; } 

и скомпилируйте его с помощью gcc :

 gcc bindfromchroot.c -o bindfromchroot 

Я назвал это bindfromchroot потому что это то, что он делает. Причина, по которой мы не можем просто использовать mount --bind заключается в том, что необходимо как минимум 2 вызова для mount ; один из них будет mount теневое mount а другой - его библиотеки - обе из них прекратят работу mount в следующий раз и оставят нам нарушенное пространство имен, из которого нам придется exit .

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

Создайте пространство имен и запустите программу

  1. Запустите sudo unshare -m su YOUR_USERNAME или sudo unshare -m su $(id -un) чтобы запустить оболочку в отдельном пространстве имен как вы (или текущий пользователь). Это «отдельное пространство имен» важно; это означает, что когда мы монтируем части нашего минимального экземпляра Debian поверх хоста Debian, изменения будут применяться только к нашей новой оболочке и ее дочерним процессам (в отличие от каждого процесса). Возможно, было бы неплохо добавить -c /bin/sh к команде, потому что bash отображает раздражающие предупреждающие сообщения о том, что все происходит катастрофически неправильно после того, как мы выполним следующий шаг.
  2. Запустите инструмент, который вы скомпилировали ранее. Это требует sudo , и не говорит вам об ошибках, сохраненных через echo $? , но он выполняет свою работу. То, сколько Debian вам нужно связать, зависит от программы, но я настоятельно рекомендую быть как можно более конкретным и не привязывать к /etc , /dev или /boot . Чтобы заставить Python 3.7 работать на моей машине, я запустил:

     sudo ./bindfromchroot chroot.0 /usr /lib 
  3. Протестируйте программу, которую вы хотите запустить, например, idle-python3.7 . Если это не работает, проверьте сообщения об ошибках, выясните, чего не хватает, exit и повторите попытку с шага 1.

Написание сценария оболочки для автоматического запуска вашей программы

Я справился с одним вкладышем для этого. Изменить соответствующим образом:

 sudo unshare -m su wizzwizz4 -c sh -c 'sudo -S ./bindfromchroot chroot.0 /usr /lib; idle-python3.7' 

Если вы хотите сохранить переменные окружения, используйте эту версию:

 sudo -E unshare -m su wizzwizz4 -mc sh -c 'sudo -ES ./bindfromchroot chroot.0 /usr /lib; idle-python3.7' 

Вы можете изменить sudo -ES на sudo -EA чтобы запустить программу, определенную в SUDO_ASKPASS окружения SUDO_ASKPASS , которая может быть графической подсказкой (такой как та, что поставляется с git gui ), если хотите.