Virt-Manager не запускается из-за проблемы с импортом libxml2 в Python.

Вопрос или проблема

Я счастливо использую KVM и virt-manager на Arch Linux около года. Сегодня утром одна из моих виртуальных машин сломалась (это отдельная история, которую я не считаю связанной), и я решил, что будет проще удалить её и установить virt-install снова.

Однако после удаления этой виртуальной машины через интерфейс virt-manager я больше не смог запустить virt-manager:

$ virt-install
Traceback (most recent call last):
  File "/usr/share/virt-manager/virt-install", line 15, in <module>
    import virtinst
  File "/usr/share/virt-manager/virtinst/__init__.py", line 49, in <module>
    from virtinst.domain import *  # pylint: disable=wildcard-import
  File "/usr/share/virt-manager/virtinst/domain/__init__.py", line 5, in <module>
    from .blkiotune import DomainBlkiotune
  File "/usr/share/virt-manager/virtinst/domain/blkiotune.py", line 8, in <module>
    from ..xmlbuilder import XMLBuilder, XMLChildProperty, XMLProperty
  File "/usr/share/virt-manager/virtinst/xmlbuilder.py", line 16, in <module>
    from .xmlapi import XMLAPI
  File "/usr/share/virt-manager/virtinst/xmlapi.py", line 7, in <module>
    import libxml2
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 779, in exec_module
  File "<frozen importlib._bootstrap_external>", line 911, in get_code
  File "<frozen importlib._bootstrap_external>", line 580, in _compile_bytecode
EOFError: marshal data too short

Похоже, что libxml2 сломан каким-то образом:

Python 3.8.3 (default, May 17 2020, 18:15:42) 
[GCC 10.1.0] на linux
Введите "help", "copyright", "credits" или "license" для получения дополнительной информации.
>>> import libxml2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 779, in exec_module
  File "<frozen importlib._bootstrap_external>", line 911, in get_code
  File "<frozen importlib._bootstrap_external>", line 580, in _compile_bytecode
EOFError: marshal data too short

Я пробовал обновить свою систему, а также удалить и переустановить очевидные пакеты, libvirt, virt-manager, libxml2 и libvirt-python, и это не помогло, как и довольно опасная команда pacman -Syyu.

Есть идеи о том, что здесь могло сломаться?

Я использую LTS ядро, 5.4. Версия Python — 3.8. Версия virt-manager — 2.2.1

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

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

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

~]$ strace python -c 'import libxml2'
# вывод был слишком большим, чтобы вставить его сюда, поэтому я вырезал все, кроме последней части, которая, похоже, наиболее актуальна
###..........много строк удалено....####
###..........много строк удалено....####
###..........много строк удалено....####
getcwd("/home/boss", 1024)              = 11
stat("/home/boss", {st_mode=S_IFDIR|0750, st_size=3488, ...}) = 0
stat("/home/boss", {st_mode=S_IFDIR|0750, st_size=3488, ...}) = 0
stat("/home/boss", {st_mode=S_IFDIR|0750, st_size=3488, ...}) = 0
openat(AT_FDCWD, "/home/boss", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0750, st_size=3488, ...}) = 0
getdents64(3, /* 41 entries */, 32768)  = 1416
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
stat("/usr/lib/python3.8", {st_mode=S_IFDIR|0755, st_size=8192, ...}) = 0
stat("/usr/lib/python3.8/lib-dynload", {st_mode=S_IFDIR|0755, st_size=8192, ...}) = 0
stat("/home/boss/.local/lib/python3.8/site-packages", {st_mode=S_IFDIR|0700, st_size=3488, ...}) = 0
stat("/usr/lib/python3.8/site-packages", {st_mode=S_IFDIR|0755, st_size=8192, ...}) = 0
stat("/usr/lib/python3.8/site-packages/libxml2.py", {st_mode=S_IFREG|0644, st_size=345896, ...}) = 0
stat("/usr/lib/python3.8/site-packages/libxml2.py", {st_mode=S_IFREG|0644, st_size=345896, ...}) = 0
openat(AT_FDCWD, "/usr/lib/python3.8/site-packages/__pycache__/libxml2.cpython-38.pyc", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=139264, ...}) = 0
ioctl(3, TCGETS, 0x7fffbe383200)        = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_CUR)                   = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=139264, ...}) = 0
mmap(NULL, 143360, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2172e15000
read(3, "U\r\r\n\0\0\0\0\203\224\246^(G\5\0\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 139265) = 139264
read(3, "", 1)                          = 0
close(3)                                = 0
mmap(NULL, 262144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2172dd5000
write(2, "Traceback (most recent call last"..., 35Traceback (most recent call last):
) = 35
write(2, "  File \"<string>\", line 1, in <m"..., 39  File \"<string>\", line 1, in <module>
) = 39
openat(AT_FDCWD, "<string>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "<string>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python38.zip/<string>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/<string>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/lib-dynload/<string>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/boss/.local/lib/python3.8/site-packages/<string>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/site-packages/<string>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "  File \"<frozen importlib._boots"..., 68  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load
) = 68
openat(AT_FDCWD, "<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python38.zip/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/lib-dynload/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/boss/.local/lib/python3.8/site-packages/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/site-packages/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "  File \"<frozen importlib._boots"..., 77  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked
) = 77
openat(AT_FDCWD, "<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python38.zip/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/lib-dynload/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/boss/.local/lib/python3.8/site-packages/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/site-packages/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "  File \"<frozen importlib._boots"..., 68  File \"<frozen importlib._bootstrap>\", line 671, in _load_unlocked
) = 68
openat(AT_FDCWD, "<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python38.zip/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/lib-dynload/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/boss/.local/lib/python3.8/site-packages/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/site-packages/<frozen importlib._bootstrap>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "  File \"<frozen importlib._boots"..., 74  File \"<frozen importlib._bootstrap_external>\", line 779, in exec_module
) = 74
openat(AT_FDCWD, "<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python38.zip/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/lib-dynload/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/boss/.local/lib/python3.8/site-packages/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/site-packages/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "  File \"<frozen importlib._boots"..., 80  File \"<frozen importlib._bootstrap_external>\", line 580, in _compile_bytecode
) = 80
openat(AT_FDCWD, "<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python38.zip/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/lib-dynload/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/boss/.local/lib/python3.8/site-packages/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/python3.8/site-packages/<frozen importlib._bootstrap_external>", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "EOFError: marshal data too short"..., 33EOFError: marshal data too short
) = 33
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f21734763e0}, {sa_handler=0x7f21736ca3a2, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f21734763e0}, 8) = 0
munmap(0x7f2172dd5000, 262144)          = 0
munmap(0x7f2172e15000, 143360)          = 0
sigaltstack(NULL, {ss_sp=0x5610230bc580, ss_flags=0, ss_size=16384}) = 0
sigaltstack({ss_sp=NULL, ss_flags=SS_DISABLE, ss_size=0}, NULL) = 0
exit_group(1)                           = ?
+++ завершено с 1 +++

редактировать:
Эта тема кажется многообещающей, но я не представляю, где мне проверить, отсутствует ли __init__.py.

Вероятно, причина заключается в поврежденном .pyc файле.

Попробуйте strace на процессе python, в котором вы import libxml2, чтобы увидеть, какой файл он открывает перед ошибкой marshal.

Затем удалите этот файл (python не требует наличия .pyc файлов для работы) и снова импортируйте libxml2. Если импорт прошел успешно, удалите python-libxml2 и переустановите его (что должно заново сгенерировать поврежденный .pyc файл).

Ответ или решение

Проблема с запуском Virt-Manager и ошибкой импорта libxml2 в Python, судя по вашему описанию, указывает на возможное повреждение файлов скомпилированных байт-кодов .pyc. Давайте разберем, как вы можете решить эту ситуацию, сохранив при этом целостность вашей системы.

1. Причина ошибки

Ошибка EOFError: marshal data too short часто возникает, когда Python пытается загрузить поврежденный байт-код из файла .pyc. Это может случиться по нескольким причинам:

  • Неправильная установка или обновление библиотек.
  • Повреждение файлов из-за нехватки дискового пространства.
  • Перезапись или удаление исходных файлов, на которые ссылаются .pyc файлы.

2. Шаги по устранению проблемы

Шаг 1: Определение поврежденного файла

  1. Использование strace. Вы уже начали этот процесс. Выполните команду:

    strace python -c 'import libxml2'

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

  2. Проверка кэша Python. В вашем случае, это путь:

    /usr/lib/python3.8/site-packages/__pycache__/libxml2.cpython-38.pyc

    Откройте директорию __pycache__ и проверьте, существует ли этот файл.

Шаг 2: Удаление поврежденного файла

Если вы идентифицировали файл .pyc, который, вероятно, является поврежденным:

  1. Удалите этот файл:

    rm /usr/lib/python3.8/site-packages/__pycache__/libxml2.cpython-38.pyc

    (или другой файл, который вы нашли ранее).

  2. Запустите импорт снова:

    python -c 'import libxml2'

    Если ошибка не появляется, это означает, что файл действительно был поврежден.

Шаг 3: Переустановка библиотек

  1. Переустановите python-libxml2:

    sudo pacman -S python-libxml2

    Это восстановит все необходимые файлы и создаст новый файл .pyc, что должно решить вашу проблему.

  2. Проверка других пакетов. Также будет полезно проверить и переустановить другие пакеты, которые могли быть затронуты, такие как virt-manager, libvirt и libvirt-python.

3. Проверка

После выполнения всех указанных шагов, попробуйте запустить Virt-Manager:

virt-manager

Если все исправлено, интерфейс успешно загрузится.

4. Альтернативное решение

Если проблема сохраняется:

  • Попробуйте удалить кэшированные файлы Python в домашних директориях:
    find ~/.local/lib/python3.8/site-packages/ -name '*.pyc' -delete

    Это удалит все байт-коды, и Python автоматически перестроит их при следующем запуске программ.

Заключение

Проблема с libxml2 в Python часто указывает на поврежденные файлы байт-кодов. Удаление этих файлов и переустановка соответствующих пакетов, в большинстве случаев, позволит решить проблему. Если после выполнения всех предложенных шагов проблема не решается, дополнительная диагностика системы в отношении других библиотек может быть необходима. Старайтесь следить за достаточным объемом дискового пространства, чтобы избежать подобных ситуаций в будущем.

Оцените материал
Добавить комментарий

Капча загружается...