Вопрос или проблема
Я выполнил команду apt update
несколько дней назад, и она так и не завершилась. Я ctrl-c
прервал ее, и она сказала, что мне нужно выполнить dpkg --configure -a
. Я сделал это, и она пытается настроить util-linux
. Однако это никогда не завершалось. Я даже оставил ее работать более 12 часов на ночь, но она по-прежнему не завершилась. Она также не выдает никаких ошибок. Она просто зависает.
$ sudo dpkg --configure -a
Настройка util-linux (2.34-0.1ubuntu2.2) ...
Я пытался запустить ее с подробным отладочным выводом, но все равно не увидел полезного вывода.
$ sudo dpkg --configure -a -D42442
D000040: проверка зависимостей util-linux:amd64 (- <none>)
D000400: проверка группы ...
D000400: проверка возможности -> fdisk
D000400: проверка непредоставленного пакета fdisk:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> login
D000400: проверка непредоставленного пакета login:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libaudit1
D000400: проверка непредоставленного пакета libaudit1:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libblkid1
D000400: проверка непредоставленного пакета libblkid1:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libc6
D000400: проверка непредоставленного пакета libc6:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libcap-ng0
D000400: проверка непредоставленного пакета libcap-ng0:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libmount1
D000400: проверка непредоставленного пакета libmount1:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libpam0g
D000400: проверка непредоставленного пакета libpam0g:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libselinux1
D000400: проверка непредоставленного пакета libselinux1:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libsmartcols1
D000400: проверка непредоставленного пакета libsmartcols1:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libsystemd0
D000400: проверка непредоставленного пакета libsystemd0:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libtinfo6
D000400: проверка непредоставленного пакета libtinfo6:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libudev1
D000400: проверка непредоставленного пакета libudev1:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> libuuid1
D000400: проверка непредоставленного пакета libuuid1:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000400: проверка группы ...
D000400: проверка возможности -> zlib1g
D000400: проверка непредоставленного пакета zlib1g:amd64
D000400: установлен, в порядке и найден
D000400: найдено 3
D000400: найдено 3 соответствий 0 possfixbytrig -
D000040: ok 2 сообщений >><<
D000040: проверка Breaks
D000400: проверка нарушителя login:amd64 virtbroken <none>
D000400: проверка нарушителя fdisk:amd64 virtbroken <none>
Настройка util-linux (2.34-0.1ubuntu2.2) ...
D000002: fork/exec /var/lib/dpkg/info/util-linux.postinst ( настройка 2.34-0.1ubuntu2.1 )
Она просто зависает там.
Я не могу выполнять другие команды apt
, пока пакет не настроен, и не хочу перезагружать без надлежащего, полностью установленного пакета util-linux
.
У меня нет идеи, что делать. Любая помощь будет крайне признательна.
Я использую чистый Debian, но с этой же проблемой столкнулся, и нашел решение — я публикую этот ответ на случай, если он поможет кому-то вернуться к нормальной работе.
После зависания на util-linux.postinst, я изменил упомянутый файл postinst, добавив кучу логирования:
#!/bin/sh
set -e
LOGFILE=/root/log.file
echo "Система: " >$LOGFILE
env >>$LOGFILE
echo "update-alternatives" >>$LOGFILE
update-alternatives --install /usr/bin/pager pager /bin/more 50 \
--slave /usr/share/man/man1/pager.1.gz pager.1.gz \
/usr/share/man/man1/more.1.gz
# Мы перестали поставлять утилиту 'pg', поэтому удалим ее в качестве альтернативы pager
# при обновлениях с Stretch.
echo "update-alternatives remove pager" >>$LOGFILE
update-alternatives --remove pager /usr/bin/pg
# Автоматически добавлено dh_installinit/13.1
echo "шаг 3" >>$LOGFILE
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
if [ -x "/etc/init.d/hwclock.sh" ]; then
update-rc.d hwclock.sh defaults >/dev/null || exit 1
fi
fi
# Конец автоматически добавленного раздела
# Автоматически добавлено dh_installsystemd/13.1
echo "шаг 4" >>$LOGFILE
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
# Это удалит только маски, созданные d-s-h при удалении пакета.
deb-systemd-helper unmask 'fstrim.timer' >/dev/null || true
# was-enabled по умолчанию истинно, поэтому новые установки выполняют enable.
if deb-systemd-helper --quiet was-enabled 'fstrim.timer'; then
# Включает юнит при первом установке, создает новые
# символические ссылки при обновлениях, если файл юнита изменился.
deb-systemd-helper enable 'fstrim.timer' >/dev/null || true
else
# Обновляет файл состояния, чтобы добавить новые символические ссылки (если есть), которые необходимо
# очистить при удалении. Также удаляет старые символические ссылки.
deb-systemd-helper update-state 'fstrim.timer' >/dev/null || true
fi
fi
# Конец автоматически добавленного раздела
# Автоматически добавлено dh_installsystemd/13.1
echo "шаг 5" >>$LOGFILE
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
echo "шаг 5.1" >>$LOGFILE
if [ -d /run/systemd/system ]; then
echo "шаг 5.2" >>$LOGFILE
systemctl --system daemon-reload >/dev/null || true
echo "шаг 5.3" >>$LOGFILE
if [ -n "$2" ]; then
echo "шаг 5.4" >>$LOGFILE
_dh_action=restart
else
echo "шаг 5.5" >>$LOGFILE
_dh_action=start
fi
echo "шаг 5.6" >>$LOGFILE
deb-systemd-invoke $_dh_action 'fstrim.timer' >/dev/null || true
echo "шаг 5.7" >>$LOGFILE
fi
echo "шаг 5.8" >>$LOGFILE
fi
# Конец автоматически добавленного раздела
# Автоматически добавлено dh_installsystemd/13.1
echo "шаг 6" >>$LOGFILE
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
if [ -d /run/systemd/system ]; then
systemctl --system daemon-reload >/dev/null || true
if [ -n "$2" ]; then
_dh_action=restart
else
_dh_action=start
fi
deb-systemd-invoke $_dh_action 'fstrim.service' >/dev/null || true
fi
fi
# Конец автоматически добавленного раздела
echo "шаг 7" >>$LOGFILE
Изучив вывод в /root/log.file, я обнаружил, что шаг 5.6 был блокирующим. Ручной запуск команд systemctl также вызывал зависание. Быстрый поиск в Google показал, что система будет работать нормально без fstrim (временно – это создает проблемы с долговечностью дисков, особенно для SSD), поэтому я закомментировал все команды fstrim и повторно запустил dpkg --configure util-linux
успешно.
Надеюсь, это поможет!
Это помогло мне, когда я обновил Raspbian Buster до Raspbian Bullseye.
cd /var/lib/dpkg/info
sudo nano util-linux.postinst
закомментируйте это – deb-systemd-invoke $_dh_action ‘fstrim.timer’ >/dev/null || true
sudo apt -f install util-linux
sudo apt –fix-broken install
спасибо @JackM
Ответ или решение
Если процесс настройки пакета util-linux
застревает на этапе dpkg --configure -a
, это может служить поводом для серьезной обеспокоенности, особенно если команда зависла без сообщения об ошибке. Правильное понимание и диагностика этой проблемы требуют системного подхода, и я представлю вам подробный алгоритм действий.
Описание проблемы
Вы столкнулись с ситуацией, когда команда apt update
не завершила выполнение и была прервана. Следовательно, выполнение dpkg --configure -a
застревает во время настройки пакета util-linux
, при этом не выводя никаких ошибок и оставаясь в состоянии "ожидания" более 12 часов.
1. Предварительные действия
Прежде чем углубиться в возможные причины и решения, убедитесь, что ваша система в порядке:
- Проверьте его занятость: Убедитесь, что система не выполняет другие обновления или операции, которые могут блокировать
dpkg
. Вы можете проверить это с помощью команды:ps aux | grep dpkg
Если
dpkg
используется другой активной задачей, дождитесь ее завершения.
2. Логи и диагностика
Для дальнейшей диагностики важно исследовать скрипт util-linux.postinst
, который отвечает за настройку пакета.
- Обратитесь к файлу скрипта пост-инсталляции:
Перейдите в директорию, содержащую информацию о пакете:cd /var/lib/dpkg/info
Откройте файл
util-linux.postinst
в текстовом редакторе, например:sudo nano util-linux.postinst
Добавьте отладочные журналы, используя команды echo
, чтобы определить, на каком этапе скрипт застревает. Например, вы можете вставить в начале и конце каждого блока кода команды, которые будут записывать в лог-файл:
LOGFILE=/root/log.file
echo "Starting util-linux post-installation script" > $LOGFILE
3. Найдите блокирующий этап
При добавлении логирования важно испробовать каждый шаг. Из анализа вашего лог-файла видно, что застревание происходило на команде deb-systemd-invoke
. Она отвечает за управление системными сервисами.
Если вы видите, что ваша система зависает на этой команде (например systemctl --system daemon-reload
), это может указывать на необходимость вмешательства.
4. Комментарий блокирующих строк
Если вы обнаружили, что проблема кроется в fstrim
, вы можете временно закомментировать строки, связанные с этой командой:
# deb-systemd-invoke $_dh_action 'fstrim.timer' > /dev/null || true
5. Повторите процесс настройки
После редактирования скрипта вернитесь в терминал и попробуйте снова запустить настройку:
sudo dpkg --configure -a
Таким образом, это может привести к успешной конфигурации пакета util-linux
.
6. Завершение процесса
После завершения настройки выполните восстановление зависших процессов, если такие имеются:
sudo apt --fix-broken install
Эти команды помогают устранить неполадки и возвращают систему в рабочее состояние.
Заключение
Если описанные шаги не помогли, проверьте наличие обновлений для системы, а также изучите другие возможные проблемы с совместимостью пакетов. Не забудьте сделать резервные копии данных перед изменениями, чтобы предотвратить потерю важной информации.
Решение подобных проблем требует терпения и аккуратности, но следуя этим рекомендациям, вы не только справитесь с данной ситуацией, но и значительно повысите свои навыки работы с dpkg
в будущем.