Как иметь дело с проблемами общих библиотечных библиотеки в нерабочее пакете

Что-то вроде этого?

    #!/bin/bash
    if [ $# -ne 2 ]; then # $# - is a number of arguments if its not equal (-ne) to 2 then we print message below and exit script
        echo ${0}" [gzip|bzip2|xz] "
        echo -e "\tProgram will create backup of users home directory"
        exit 0 # 0 is a return code of script
    fi
    case $1 in # $1 is first argument of script and case statement runs code depending of its content. for example: if $1 is equal to "gzip" then set method to "z" 
    "gzip" )
        method="z" ;;
    "bzip2" )
        method="j" ;;
    "xz" )
        method="J" ;;
    *)
        # if $1 is none of above then run this
        echo "Wrong method [gzip|bzip2|xz]"
        exit 1 # and exit with return code 1 which means error
        ;;
    esac
    if [ ! -d /home/$2 ]; then # id not(!) existing directory(-d) /home/login ($2 is the second argument of script) then
        echo "User not exists"
        exit 1
    fi
    tar -${method} -cf ${2}_$(date +%F).tar.${1} /home/${2}

Это можно было бы сделать лучше и короче, но этот код позволяет кое-чему научиться. Дополнительную информацию о tar можно найти здесь: http://linux.die.net/man/1/tar

3
28.01.2019, 04:14
2 ответа

Я не пользуюсь Arch Linux, поэтому я немного рискую.

В статье, на которую вы ссылаетесь, указано, что это отсутствующая символическая ссылка, а не отсутствующий пакет. Это имеет смысл, потому что обычно в Linux общие библиотеки будут иметь по крайней мере два октета номера версии после «.so», а в ошибке упоминается только один.

Я предлагаю вам бежать

ls -l /usr/lib/libidn2.so*

и посмотрите, что он возвращает. Если он просто возвращает

/usr/lib/libidn2.so

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

ln -s /usr/lib/libidn2.so /usr/lib/libidn2.so.0
ln -s /usr/lib/libidn2.so /usr/lib/libidn2.so.4

Я предлагаю запустить обе программы, потому что кажется, что ваша программа ищет четвертую основную версию библиотеки, а статья, на которую вы ссылаетесь, ищет основную нулевую версию. Это исправление в основном создает два псевдонима для файла /usr/lib/libidn2.so, один с.0 и один с.4.

Если вы видите файл /usr/lib/libidn2.so.something.something,и /usr/lib/libidn2.so является символической ссылкой на него, может иметь смысл использовать символическую ссылку на более конкретный файл. Я действительно не знаю, какой путь обязательно будет лучшим.

Другой вариант для вас — понизить версию libidn2 до той, которая была до этой проблемы.

Что касается того, как это могло произойти -, похоже, что сопровождающий libidn2 для Arch Linux допустил ошибку. Меня смущает не то, что это вообще произошло, а... эта ошибка была добавлена ​​12 дней назад. На исправление ошибки, которую можно просто исправить с помощью символических ссылок вручную, уйдут часы, а не недели. Я не хочу умалять тех, кто занимается сопровождением Arch Linux; Я понятия не имею, что происходит с их стороны. Это просто... расстраивает. Я предполагаю, что это только вершина айсберга этой истории. В любом случае люди есть люди, и все мы ошибаемся. Кто-то, наверное, уже корит себя за это, и им для этого не нужна наша помощь.

2
27.01.2020, 21:21

Так как подобные ошибки часто возникают в Arch Linux, я написал специальный скрипт для анализа пакетов и определения правильности их сборки. (В 95% случаев пакет Arch Linux собран корректно):https://github.com/eli-schwartz/dotfiles/blob/master/bin/pkg-list-linked-libraries

Выполнение этого в пакете инструментов bind -и поиск libidn2 показывает, что последняя версия инструментов bind -связана с libidn.so.4:

$ pkg-list-linked-libraries bind-tools libidn2
==> checking linked libraries for bind-tools-9.13.5-4-x86_64.pkg.tar.xz...
/usr/bin/dig
  NEEDED               libidn2.so.4
/usr/bin/host
  NEEDED               libidn2.so.4
/usr/bin/nslookup
  NEEDED               libidn2.so.4

Откуда взялась эта библиотека?

$ pacman -Qo /usr/lib/libidn2.so.4
/usr/lib/libidn2.so.4 is owned by libidn2 2.1.0-1

Пакет инструментов bind -в Arch требует наличия пакета libidn2 в качестве зависимости, в соответствии с выводом pacman -Si bind-tools, что хорошо, поскольку он зависит от него.

Версии двух пакетов в официальных репозиториях Arch Linux на момент написания этой статьи соответствуют версии инструментов bind -и libidn2, которую я проверил выше:

$ expac -S '%n %v' libidn2 bind-tools
libidn2 2.1.0-1
bind-tools 9.13.5-4

Итак, у вас установлена ​​последняя версия инструментов -. Но вы утверждаете, что у вас нет библиотек libidn2, необходимых для двоичных файлов. Почему бы нет? Какая у вас сейчас установлена ​​версия libidn2? Проверьте вывод pacman -Q libidn2.

Поскольку этот пакет работает у тысяч других людей, я пришел к выводу, что ваша система не работает, и вам необходимо правильно обновить систему, чтобы установить последнюю версию libidn2. См.https://wiki.archlinux.org/index.php/System_maintenance#Partial_upgrades_are_unsupportedдля получения подробной информации о том, почему это может произойти, что нужно сделать, чтобы исправить это, и почему символические ссылки не только не являются решением, но еще больше сломают вашу систему.

Что касается ошибки Parabola, то это прямо противоположная проблема. Совершенно другой дистрибутив Linux, который , а не Arch Linux, не смог пересобрать свои пакеты с использованием нового libidn2, и в результате эти пакеты были ошибочно связаны с libidn2.so.0

.

Если вы действительно страдаете от этой ошибки Parabola, значит, вы вообще не используете Arch Linux, и вам нужно указать, что вы на самом деле используете Parabola, иначе люди не будут знать, как вам помочь.

1
27.01.2020, 21:21

Теги

Похожие вопросы