1

Я работаю на машине с Linux под управлением Ubuntu Bionic Beaver, выпуск 18.04.

На днях я по ошибке изменил каталог /usr/ чтобы он принадлежал пользователю, а не пользователю root. К сожалению, я сделал это рекурсивно, и поэтому немного испортил систему, потому что это также изменило разрешения suid для некоторых команд (например, passwd , sudo). Мы действительно не можем переустановить (ну, мы можем, но это будет стоить!), Поэтому я загрузился с LiveUSB и вручную изменил все правильные пользователя / группы / разрешения для каждого файла, который я мог идентифицировать, имел не Root:Root Группа пользователей. Я сделал это, сравнив вывод другого компьютера с Ubuntu из ls -lha /usr/ .

Кажется, что это в основном исправлено, но теперь я запускаю ошибку 'std::bad_alloc' после запуска некоторых довольно стандартных скриптов на python. Странная часть этого в том, что это иногда возникает. Например, если я открою python из командной строки и скопирую и вставлю код, весь код будет работать без ошибок. Однако, если я запускаю весь скрипт из командной строки (например, python script.py), я получаю эту ошибку. Полное сообщение об ошибке:

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted (core dumped)

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

Если у кого-то есть идеи относительно того, где конкретно искать, чтобы исправить это, это было бы здорово! Я собираюсь попробовать сделать то же самое, что и раньше, но с ls -lha /usr/ из релиза 18.04, так как у меня был только 16 релизов под рукой.

1 ответ1

1

Переустановите все пакеты 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 отдельно, потому что они также были странно повреждены, но по крайней мере производственная виртуальная машина не пострадала.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .