Переустановите все пакеты Debian, которые включают /usr
Запустите эту команду, чтобы указать apt
переустановить каждый пакет, который помещает файлы в /usr
:
dpkg-query -S '/usr/' |
sed 's/: .*$//' |
tr -d ',' |
xargs apt install -y --reinstall
Предупреждение: переустановка происходит без запроса подтверждения.
Если вы получили сообщение, как
Package PACKAGE-NAME is not available, but is referred to by another package.
где PACKAGE-NAME
является недоступным пакетом, вы можете исключить пакет для переустановки следующим образом:
dpkg-query -S '/usr/' |
sed 's/: .*$//' |
tr -d ',' |
tr ' ' '\n' |
grep -v 'PACKAGE-NAME' |
xargs apt install -y reinstall
Вы можете связать столько команд grep -v
сколько вам нужно.
объяснение
Возможно, что в системе Ubuntu, с которой вы сравнивались, не были установлены те же пакеты, что означало бы, что внутри /usr
может быть больше файлов с неправильными разрешениями.
Имея apt
переустановить пакеты, вы можете быть достаточно уверены, что все файлы в /usr
установленные операционной системой, имеют необходимые разрешения.
Переустановите все пип пакеты
В этом разделе предполагается, что вы установили пакеты Python с pip
от имени root.
Запустите эту команду, чтобы переустановить все пакеты pip:
sudo pip freeze --local | xargs sudo pip install --upgrade --force-reinstall
Запустите эту команду, чтобы удалить файлы байт-кода Python:
sudo find /usr/ -name '*.pyc' -delete
объяснение
Поскольку ваша проблема связана с Python, я полагаю, что вы можете установить общесистемные пакеты Python в пути, такие как /usr/local/lib/python2.7/dist-packages
и /usr/local/lib/python3/dist-packages
.
Когда интерпретатор Python запускается, он также создает файлы байт-кода (*.pyc
), на которые также могли повлиять их разрешения, когда вы рекурсивно испортили права доступа к папке /usr
. Удаление файлов .pyc
гарантирует, что Python восстановит их при следующем запуске ваших скриптов.
Переустановите все пакеты Debian
Если переустановка только пакетов, включающих каталог, не устранила вашу проблему, есть более экстремальный вариант.
Запустите эту команду, чтобы сказать apt
переустановить каждый пакет в системе:
dpkg --get-selections |
awk '{if($2=="install"){print $1}}' |
xargs sudo apt install -y --reinstall
Предупреждение: переустановка происходит без запроса подтверждения.
объяснение
Возможно, что-то за пределами вашей папки /usr
сломалось.
Именно это я обнаружил 7 февраля 2018 года, когда обнаружил, что произошел сбой в работе гипервизора Debian 8 (jessie). Узел не подключился после перезагрузки.
Когда я загрузил образ спасения Ubuntu, я не смог даже выполнить chroot
в сломанном гипервизоре, потому что /bin/bash
дал мне ошибку сегментации (вроде как ваш прерванный скрипт Python). На самом деле, большинство системных файлов были как-то повреждены.
На этом гипервизоре находилась производственная виртуальная машина, которой потребовалось немало усилий для повторного развертывания в другом месте из-за неисправного состояния гипервизора, поэтому я решил попробовать восстановить.
Я копировал известные хорошие двоичные и библиотечные файлы Debian 8 на компьютер, пока не смог выполнить chroot
и запустить apt
и dpkg
. Отсюда, я мог бы поручить apt
переустановить всю систему.
После нескольких странностей каждого пакета удалось переустановить. После перезагрузки сервер снова заработал, как будто он никогда не был поврежден.
Мне пришлось заново развертывать серверные пакеты Python отдельно, потому что они также были странно повреждены, но по крайней мере производственная виртуальная машина не пострадала.
Можно исправить сильно сломанную систему, переустановив то, что вы можете. В будущем я рекомендую сделать ваши серверные сборки настолько воспроизводимыми, насколько это возможно, чтобы, если ваше программное обеспечение каким-либо образом попало в аварию , вы могли легко выполнить повторную подготовку системы без особых усилий.