Как установить пакет, для которого отсутствует зависимость нужной версии


Бывает что нужно установить пакет .deb для которого в стандартных репозиториях отсутствует нужная версия зависимости. Например, в зависимостях прописан пакет libcurl3, а в системе доступен только libcurl4; или в зависимостях libssl1.0.0, а в системе имеется только libssl1.0.2.

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

При этом высока вероятность, что интересующий нас .deb пакет будет нормально работать и с libcurl4 вместо libcurl3 (может даже лучше будет работать) и с libssl1.0.2 вместо libssl1.0.0 — и так далее по аналогии, у вас могут быть свои собственные зависимости, которые вызывают проблемы.

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

Я покажу, как подправить список зависимостей в пакете .deb на примере Viber, заодно мы немного познакомимся со структурой пакета .deb. Не то чтобы Viber это мой любимый мессенджер для общения — просто его установка прям классический пример того, о чём я говорил в самом начале: жёстко прописанные зависимости определённых версий, но программа прекрасно работает и с более новыми версиями.

Для установки пакета его нужно скачать с официального сайта:

wget https://download.cdn.viber.com/cdn/desktop/Linux/viber.deb

Пакет можно установить с помощью команды dpkg и ключей --ignore-depends:

sudo dpkg --ignore-depends libcurl3 --ignore-depends libssl1.0.0 -i viber.deb

но это приведёт к тому, что поломается apt. Будут показываться сообщения о неудовлетворённых зависимостях:

Чтение списков пакетов… Готово 
Построение дерева зависимостей Чтение информации о состоянии… Готово 
Возможно, для исправления этих ошибок вы захотите воспользоваться «apt --fix-broken install». 
Следующие пакеты имеют неудовлетворённые зависимости:
 viber : Зависит: libssl1.0.0 но он не может быть установлен 
 viber : Зависит: libcurl3 но он не может быть установлен 
E: Неудовлетворённые зависимости. Попытайтесь выполнить «apt --fix-broken install», не указывая имени пакета (или указав решение).

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

sudo apt remove viber

Поэтому лучше пойти другим путём.

По большому счёту, файл .deb — это архив, в который собраны файлы программы (исполняемые файлы, файлы настроек, конфигурационные файлы — всё то, что нужно для запуска и работы программы), а также служебные файлы, в которых содержится описание пакета, требуемые зависимости и прочая метаинформация.

Распаковываем скаченный пакет deb:

ar x viber.deb

Для распаковки используем утилиту ar, которая предназначена для создания, модификации и извлечения из архивов.

В результате будут извлечены следующие файлы:

  • control.tar.gz — архив с файлами в которых содержится метаинформация
  • data.tar.xz — архив с файлами самой программы
  • debian-binary

Вообще, поскольку data.tar.xz содержит саму программу, то может возникнуть идея просто раскидать файлы в системе по нужным путям — это тоже будет работать, но мы сделаем чуть более сложно, но и более правильно.

Распаковываем контрольный архив:

tar xzf control.tar.gz

Открываем текстовым редактором файл control:

gedit control

Найдём там строку, начинающуюся с Depends:

Depends: libxss1, libssl1.0.0, libpulse0, libasound2, libnss3, libxcomposite1, libxcursor1, libxdamage1, libcurl3, libgstreamer-plugins-base1.0-0, libgstreamer1.0-0, gstreamer1.0-plugins-base, gstreamer1.0-plugins-good, gstreamer1.0-plugins-ugly, gstreamer1.0-pulseaudio, gstreamer1.0-libav

То есть, это и есть список зависимостей.


Скорее всего, свой установочный файл .deb вы уже пробовали установить и уже и так знаете, каких зависимостей не хватает.

Можно сделать проверку следующим образом — берём список, который идёт после Depends:, удаляем запятые, чтобы не нарушить синтаксис apt, и пытаемся установить все эти зависимости просто дописав этот список после sudo apt install, получается следующая команда:


sudo apt install libxss1 libssl1.0.0 libpulse0 libasound2 libnss3 libxcomposite1 libxcursor1 libxdamage1 libcurl3 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gstreamer1.0-libav libssl1.0-dev

Результат:

Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Пакет libcurl3 недоступен, но упомянут в списке зависимостей другого
пакета. Это может означать, что пакет отсутствует, устарел или
доступен из источников, не упомянутых в sources.list
Однако следующие пакеты могут его заменить:
  libcurl4

Пакет libssl1.0.0 недоступен, но упомянут в списке зависимостей другого
пакета. Это может означать, что пакет отсутствует, устарел или
доступен из источников, не упомянутых в sources.list

E: Для пакета «libssl1.0.0» не найден кандидат на установку
E: Для пакета «libcurl3» не найден кандидат на установку

Итак, требуется libcurl3, но в системе есть только libcurl4. Я просто меняю в файле control запись libcurl3 на libcurl4.

Ещё один отсутствующий пакет libssl1.0.0. Поскольку указана конкретная версия, можно предположить, что версия в репозитории была обновлена и по этой причине невозможно найти то, что нужно.

Ищем по более короткому описанию версии, то есть, например вместо libssl1.0.0 я ищу libssl1:

apt search libssl1

Как можно увидеть, найдено целых два варианта: libssl1.0.2 и libssl1.1. На мой взгляд, libssl1.0.2 ближе к libssl1.0.0, поэтому я в файле control меняю запись libssl1.0.0 на libssl1.0.2.

Сохраняем и закрываем файл control.

Теперь собираем установочный файл — делаем это в обратном разбору порядке.

Я уже пробовал, поэтому я знаю, что команда пожалуется на отсутствие файла postrm, поэтому просто создаём пустой файл postrm командой:

touch postrm

Упаковываем всё наше «добро» в control.tar.gz:

tar --ignore-failed-read -cvzf control.tar.gz pre{inst,rm} post{inst,rm} md5sums control

Разберём последнюю команду чуть подробнее. Строки pre{inst,rm} post{inst,rm} раскрываются в следующие:

echo pre{inst,rm} post{inst,rm}
preinst prerm postinst postrm

То есть, фактически в создаваемый архив добавляются файлы postinst, postrm, preinst, prerm. Эти файлы представляют собой скрипты, выполняемые на различных этапах установки/удаления:


  • preinst — выполняется перед установкой пакета
  • postinst — выполняется после установки пакета
  • prerm — выполняется перед удалением пакета
  • postrm — выполняется после удаления пакета

Они являются необязательными — то есть могут отсутствовать. Если команда tar написала, что отсутствует какой-либо файл (например, файл postrm), то отредактируйте эту команду — уберите из списка отсутствующий файл, например, вместо создания postrm можно было записать команду следующим образом:

tar --ignore-failed-read -cvzf control.tar.gz pre{inst,rm} postinst md5sums control

Продолжаем. Вновь собираем deb:

ar rcs viber_fixed.deb debian-binary control.tar.gz data.tar.xz

Устанавливаем наш пофиксенный пакет:

sudo dpkg -i viber_fixed.deb

Ошибка «в значении поля «Description» обнаружена пустая строка»

Если при установки пакета возникла ошибка:

dpkg: ошибка при обработке архива viber_fixed.deb (--install):
 анализ файла «/var/lib/dpkg/tmp.ci/control» около строки 17 пакета «viber»:
 в значении поля «Description» обнаружена пустая строка
При обработке следующих пакетов произошли ошибки:
 viber_fixed.deb

То это означает, что в файле control есть последняя пустая строка — удалите эту пустую строку и пересоберите установочный файл.

После этого всё ставится как нужно:

Если вам действительно просто нужен Viber, то смотрите статью «Как установить Viber на Linux».

Вам понравилось «потрошить» .deb пакеты? Тогда смотрите подробную справочную информацию об их устройстве в статье «Структура APT пакета: разбираемся в строении пакета Debian».


Рекомендуется Вам:

10 комментариев to Как установить пакет, для которого отсутствует зависимость нужной версии

  1. black_beard:

    Написано, что нужно создать файл postrm перед обратной упаковкой, иначе команда будет ругаться (какая?). Но в последующем абзаце в команде сборки архива вместо postrm почему-то указан prerm.

    Я пробовал на примере пакета wpa_supplicant.deb. Там вообще нет ни postrm, ни prerm; просто упаковал обратно всё, что было изначально в архиве (с измененным control), и пакет установился без проблем.

    • Alexey:

      Приветствую! У вас отличная наблюдательность!

      Знаете, это для меня тоже загадка — статью «Как установить Viber на Linux», которая стала идеей для этой статьи, я написал 09.10.2018, команды тоже скопировал оттуда, поэтому точные обстоятельства уже не помню. Разберусь и поправлю команды — спасибо, что обратили внимание.

    • Alexey:

      Вдогонку — эта статья может читаться лаконично за 5 минут, но на решение проблемы (мне нужно было установить Viber) ушёл вечер, а может и два. За это время много чего перепробывал, читал, гуглил. В результате, когда оно всё-таки заработало, то возникает другая проблема — а какие именно действия привели к положительному результату? Пример проблемы: в начале или середины действий я установил такие-то пакеты — в конечном счёте они нужны или не нужны? Команду упаковки tar --ignore-failed-read -cvzf control.tar.gz pre{inst,rm} md5sums control я скопировал со stackoverflow.com или подобного сайта. Видимо, в начале она содержала упоминания этого самого файла и я создавал пустой файл, затем до меня дошло — что можно и без этого файла и в одном месте поправил, а в другом — нет.

      В инструкциях, которым несколько лет, может быть ещё больше странностей: на скришотах одно, а в тексте другое (просто со временем что-то поменялось и команды в тексте я исправил, а делать новые скриншоты нет времени или желания).

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

    • Alexey:

      Всё, поправил, вместо

      tar --ignore-failed-read -cvzf control.tar.gz pre{inst,rm} md5sums control

      должно быть:

      tar --ignore-failed-read -cvzf control.tar.gz pre{inst,rm} post{inst,rm} md5sums control

      Ошибка первой команды: мы забывали добавить файл postinst в новый собранный пакет. Этот файл не пустой:

      cat postinst
      #!/bin/bash
      chmod 755 /opt/viber/Viber

      Скрипты postinst, postrm, preinst, prerm являются опциональными — на самом деле, если их не было в исходном пакете, то не нужно их создавать специально. Поэтому команду для этой инструкции можно просто записать так:

      tar --ignore-failed-read -cvzf control.tar.gz pre{inst,rm} postinst md5sums control

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

  2. Арихин:

    bash: ar: команда не найдена

  3. Аноним:

    Подготовка к распаковке viber_fixed.deb …
    QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-pavka'
    chown: невозможно получить доступ к '/home/pavka/Documents/ViberDownloads': Нет такого файла или каталога
    Распаковывается viber (12.0.0.7) на замену (12.0.0.7) …
    dpkg: зависимости пакетов не позволяют настроить пакет viber:
     viber зависит от libssl1.1.1, однако:
      Пакет libssl1.1.1 не установлен.

    dpkg: ошибка при обработке пакета viber (--install):
     проблемы зависимостей — оставляем не настроенным
    Обрабатываются триггеры для gnome-menus (3.31.4-3) …
    Обрабатываются триггеры для desktop-file-utils (0.23-4) …
    Обрабатываются триггеры для mime-support (3.62) …
    Обрабатываются триггеры для hicolor-icon-theme (0.17-2) …
    При обработке следующих пакетов произошли ошибки:
     viber

     

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *