Причины и решения ошибки “Невозможно заблокировать (/var/lib/dpkg/)” в Ubuntu

Довольно часто, при установке/обновлении пакета из командной строки (с использованием apt-get или apt) в Ubuntu, мы получаем эту ошибку: E: Невозможно заблокировать административный каталог (/var/lib/dpkg/). С точки зрения новичка, это сложная ошибка, так как новые пользователи, как правило, не знают о каталоге “/var/lib/dpkg/” и о том, какое отношение он имеет к текущей операции, которую они выполняют.

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

Невозможно заблокировать (/var/lib/dpkg/) – диагностика проблемы

Когда вы сталкиваетесь с этой ошибкой, первым шагом должно быть внимательное чтение описания ошибки. Обычно оно содержит некоторые важные и экономящие время подсказки. Например, следующие скриншоты показывают команду “apt-get install”, выдающую похожие ошибки.

ошибка-доступа-к-админ-каталогу

ошибка-блокировки-админ-каталога

Однако, если вы присмотритесь внимательнее, вы заметите, что текст в скобках в первой строке и текст после запятой во второй строке различаются в обоих сценариях, что ясно указывает на то, что ошибка в первом сценарии связана с правами пользователя, в то время как во втором сценарии она связана с тем, что файл блокировки временно недоступен.

Если вы сталкиваетесь с ошибкой, связанной с правами (как показано на первом изображении выше), скорее всего, это связано с тем, что пользователь, выполняющий команду “apt-get” или “apt”, не имеет достаточных привилегий, и команда была выполнена без sudo. Как только команда будет выполнена с правами root, ошибка исчезнет.

Однако, если это ошибка, связанная с блокировкой, то потребуется дальнейшее расследование.

Также читайте: Исправление ошибки “имя пользователя не в файле sudoers. Этот инцидент будет зафиксирован” в Ubuntu

Что такое /var/lib/dpkg/?

“/var/lib/dpkg/” можно рассматривать как рабочий каталог для менеджера пакетов “dpkg”, который, в свою очередь, является движком для “apt-get” (а также для инструментов “apt” и “aptitude”). Каждый раз, когда вы используете эти инструменты для установки или удаления программного обеспечения, они блокируют базу данных пакетов (создавая файл “lock”) перед выполнением фактической операции, что на самом деле делается путем получения блокировки для каталога “/var/lib/dpkg/”. Этот шаг помогает избежать повреждения данных или прерывания текущей операции, выполняемой каким-либо другим процессом.

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

Шаг 1: Проверьте, есть ли другой процесс, удерживающий блокировку

Это теперь должно казаться вполне логичным, верно? И для этого вы можете воспользоваться помощью старой доброй команды ps и передать ее вывод команде grep, чтобы потратить меньше времени на поиск того, что вам нужно. Например, вот команда, которая позволяет вам узнать, запущен ли какой-либо процесс “apt”, “apt-get” или “aptitude”:

ps aux |grep apt

Шаг 2: Подождите немного, а затем действуйте

Если действительно есть команда, которая уже приобрела блокировку, вам следует дождаться ее завершения и освобождения блокировки. Однако, если команда занимает больше времени, чем ожидалось, и вы уверены, что она застряла, вы можете продолжить и завершить ее, используя доступные команды kill или killall (больше информации о них здесь). Это должно решить вашу проблему.

Стоит упомянуть, что завершение процесса “dpkg” напрямую никогда не рекомендуется – это может повредить базу данных пакетов. Я подчеркиваю этот момент, потому что теперь вы знаете, что такие инструменты, как “apt” и “apt-get”, внутренне вызывают “dpkg”, так что вполне возможно, что вы можете подумать о завершении процесса “dpkg”, если увидите его в выводе команды “ps”.

Завершение процессов, инициированных командами apt, apt-get или aptitude, обычно гораздо безопаснее.

Шаг 3: Когда вывод команды “ps” не помогает

Имейте в виду, что помимо инструментов командной строки, таких как apt и apt-get, некоторые графические приложения, такие как Центр программного обеспечения или Диспетчер обновлений, также захватывают эту блокировку.

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

Возвращаясь к графическим приложениям, о которых мы говорили, еще одним полезным и экономящим время вариантом является использование команды fuser.

С помощью “fuser” вам нужно только знать файл, к которому осуществляется доступ (“/var/lib/dpkg/lock” в нашем случае), и вы можете завершить процесс, получающий доступ к этому файлу, даже если не знаете, какой это процесс. Например:

sudofuser-cuk/var/lib/dpkg/lock

Имейте в виду, что команда fuser не освободит блокировку, полученную процессом, который вы только что завершили, поэтому вам придется сделать это вручную:

sudorm-f/var/lib/dpkg/lock

Примечание: “ освободить блокировку ” просто означает удалить файл “lock”, чтобы другие процессы могли “ приобрести блокировку ”, воссоздав его.

Вам также может понадобиться выполнить следующие две команды:

sudofuser-cuk/var/cache/apt/archives/lock; sudorm-f/var/cache/apt/archives/lock

Важный совет: никогда не удаляйте файлы блокировки в качестве первого шага – это должно быть вашим последним средством.

Заключение

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

Вы когда-либо сталкивались с ошибкой, о которой мы здесь говорили? Как вы ее решили? Оставьте свой ответ в комментариях.

Также читайте: Как исправить ошибку “Репозиторий не имеет файла выпуска”