zaLinux.ru

Как правильно и навсегда исправить ошибку «E: Не удалось получить доступ к файлу блокировки /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)»


Ошибки «E: Не удалось получить доступ к файлу блокировки /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)» и «E: Невозможно заблокировать каталог /var/lib/apt/lists/»

Пакеты (программы) в Linux можно устанавливать и обновлять с использованием графического интерфейса, либо с помощью утилит командной строки.

Иногда при использовании утилитой apt (консольного менеджера пакетов), например, при обновлении информации о пакетах, либо про попытке установить новый пакет, возникает примерно следующая ошибка:

sudo apt update && sudo apt dist-upgrade -y
[sudo] password for mial:
Чтение списков пакетов… Готово
E: Не удалось получить доступ к файлу блокировки /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Невозможно заблокировать каталог /var/lib/apt/lists/

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

На некоторых сайтах советуют удалить файлы блокировки, например, /var/lib/apt/lists/lock, но не торопитесь это делать! Это может привести к необходимости затем исправлять ошибки с пакетами программ. Чтобы разобраться, из-за чего это происходит, а также правильно исправить эту ошибку, давайте изучим механизм её возникновения.

Её причиной является то, что одновременно запущено два экземпляра apt. Дело в том, что когда программа apt начинает свою работу, она создаёт пару файлов блокировки (один из них /var/lib/apt/lists/lock). При каждом своём запуске apt обращается к этим файлам – и если они уже присутствуют, значит ранее был запущен другой экземпляр apt. Чтобы не внести беспорядок в пакетах и не навредить системе, второй запущенный экземпляр apt останавливает свою работу и выводит показанное выше сообщение об ошибке.

Вряд ли вы сами запустили в двух разных окнах программу apt. Дело в том, что у apt имеется свой демон (фоновый процесс), который в некоторых дистрибутивах установлен на автоматическое выполнение. Т.е. чаще всего вы сталкиваетесь с этой ошибкой в тот момент, когда apt выполняет свои фоновые процессы. Это не является большой редкостью, поскольку работа демона apt может быть продолжительной, например, когда нужно скачать большое количество обновлений, а Интернет-подключение медленное.

Если в этой ситуации удалить файлы-блокировщики (/var/lib/apt/lists/lock), как это иногда советуют, то в результате фоновый процесс apt преждевременно завершит свою работу, либо вы запустите второй экземпляр apt – оба эти варианта приведут к проблемам с пакетами, и, вероятнее всего, при последующей попытке использовать apt система предложит вам запустить программу с ключом -f:

sudo apt install -f -y

Правильный способ исправить ошибку E: Не удалось получить доступ к файлу блокировки /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

Итак, первый способ исправить ошибку очевиден – не нужно ничего делать, просто дождитесь, когда фоновый процесс apt сам завершит свою работу. В результате он сам скачает/обновит новые пакеты.

Как отключить автоматический запуск службы apt

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

Чтобы увидеть, какие службы apt присутствуют в системе, выполните команду:

systemctl list-unit-files | grep apt

Вероятно, вы увидите там такие службы как:

  • apt-daily.timer – ежедневный таймер службы для скачивания новых пакетов
  • apt-daily-upgrade.timer – ежедневный таймер службы для обновления и очистки пакетов
  • apt-daily.service – непосредственно запускает скачивание новых пакетов (команда /usr/lib/apt/apt.systemd.daily update), вызывается таймером
  • apt-daily-upgrade.service – непосредственно запускает установку новых пакетов и очистку кэша (команда /usr/lib/apt/apt.systemd.daily install), вызывается таймером

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


systemctl list-unit-files | grep enabled | grep apt

Скорее всего, это службы apt-daily-upgrade.timer и apt-daily.timer, чтобы отключить их автоматический запуск при старте системы, выполните команды:

sudo systemctl disable apt-daily-upgrade.timer
sudo systemctl disable apt-daily.timer

Отключение unattended-upgrades

Кроме автоматического запуска apt, в системах на базе Debian имеются включенные по умолчанию unattended-upgrades – те же самые автоматические обновления.

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

Для изменения этих настроек можно отредактировать файл /etc/apt/apt.conf.d/20auto-upgrades, в нём имеются следующие строки:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Первая отвечает за обновление списка пакетов, а вторая – за обновления самих пакетов в системе. Этот файл можно изменить вручную (чтобы остановить автоматическое обновление, вместо 1 впишите 0) либо запустить конфигуратор:


sudo dpkg-reconfigure -plow unattended-upgrades

Переключения между кнопками, используйте клавишу <TAB>, для выбора используйте <ENTER>.

Что характерно, в Kali Linux по умолчанию отключены автоматические службы apt как и вообще все сетевые службы, которые так или иначе используют доступ в сеть, но почему-то включены unattended-upgrades – либо авторы известного дистрибутива забыли о них, либо считают эти обновления важными.

Отключение автоматической загрузки обновлений программ в GNOME 3

Но даже это ещё не всё! По-прежнему ваш компьютер может автоматически скачивать обновления. Если у вас GNOME 3, то центр программного обеспечения GNOME скорее всего настроен на автоматическую загрузку пакетов. После загрузки в области уведомлений будет показано сообщение, что имеются обновления системы. Эта настройка по умолчанию включена даже в Kali Linux. Чтобы получить текущий статус этой настройки выполните команду:

gsettings get org.gnome.software download-updates

Если там будет true, значит автоматическая загрузка обновлений включена.

Чтобы её отключить выполните:

sudo gsettings set org.gnome.software download-updates false

Как обновить Linux в командной строке

С одной стороны, отключение автоматических обновлений и скачивание новых файлов пакетов навсегда избавит вас от ошибки «E: Невозможно заблокировать каталог /var/lib/apt/lists/» и других подобных, но при этом вам нужно будет самостоятельно выполнять обновление и очистку пакетов.

Для полного обновления системы выполняйте:

sudo apt update && sudo apt full-upgrade -y

А для очистки пакетов используются команды:


sudo apt autoremove -y
sudo apt clean -y

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

Если рассматриваемая ошибка была вызвана тем, что система была выключена во время обновления, то для её исправления нужно выполнить:

sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend

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

sudo dpkg --configure -a

Заключение

Если вы постоянно используете apt в командной строке, то вряд ли нужна автоматическая служба apt. Если же вы выполняете какую-то инструкцию и случайно столкнулись с описанной ошибкой, то, наверное, правильнее не удалять демон apt, а просто дождаться когда он корректно завершит свою работу.


Рекомендуемые статьи:

7 Комментарии

  1. wimpex

    Добрый день.

    В Kali Linux 2018.4 после выполнения команды

    sudo gsettings set org.gnome.software download-updates false

    через некоторое время снова true, с перезагрузкой и без.

    Как исправить?

    1. Alexey (Автор записи)

      Вы не ошибаетесь? У меня есть система, на которой я применил эту настройку пару месяцев назад, с тех пор система пережила обновление с 2018.3 до 2018.4 и вообще много всего пережила, но там как было false, так это и осталось. Другие настройки, которые я упоминаю в статье, вы также применили?

      1. wimpex

        Добрый день.

        Нет, сейчас проверил ещё раз, ничего не изменилось.

        Забыл указать, что загружаюсь с Live USB persistence.

        Может в этом дело?

        1. Alexey (Автор записи)

          Получается настройка изначально просто не применяется. А другие изменения сохраняются? Например, если вы устанавливаете обновление, после перезагрузки это обновление остаётся?

          1. wimpex

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

  2. Андрей Небесный

    Для обновления всего и вся удобно пользоваться утилитой uCareSystem. Просто запускаешь ее и она сама делает все что нужно для полного счастья))

    1. Kali

      Очень вредный совет.

Оставить комментарий

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