Вопрос или проблема
Я обновил свою систему до Debian bookworm, и процесс, казалось, прошел нормально, но закончился с некоторыми ошибками. Когда я пытаюсь использовать apt для решения проблемы, я сталкиваюсь с экраном, полным следующей ошибки:
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
Кажется, что любая попытка использовать grep приводит к этой ошибке, независимо от простоты команды. Так что, полагаю, grep каким-то образом сломался на этой системе теперь, что затрудняет любые попытки исправить это с помощью apt или dpkg, например:
$ sudo apt install -f
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
2 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up initramfs-tools (0.142+deb12u1) ...
update-initramfs: deferring update (trigger activated)
Setting up linux-image-6.1.0-31-amd64 (6.1.128-1) ...
/etc/kernel/postinst.d/dracut:
dracut: Generating /boot/initrd.img-6.1.0-31-amd64
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
[... еще 6 раз ...]
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
dracut: Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]!=y
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
[... еще 27 раз ...]
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
The default plymouth plugin () doesn't exist
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
[... еще 41 раз ...]
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-6.1.0-31-amd64
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
W: zstd compression (CONFIG_RD_ZSTD) not supported by kernel, using gzip
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
E: gzip compression (CONFIG_RD_GZIP) not supported by kernel
update-initramfs: failed for /boot/initrd.img-6.1.0-31-amd64 with 1.
run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1
dpkg: error processing package linux-image-6.1.0-31-amd64 (--configure):
installed linux-image-6.1.0-31-amd64 package post-installation script subprocess returned error exit status 1
Processing triggers for initramfs-tools (0.142+deb12u1) ...
update-initramfs: Generating /boot/initrd.img-6.1.0-31-amd64
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
W: zstd compression (CONFIG_RD_ZSTD) not supported by kernel, using gzip
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
E: gzip compression (CONFIG_RD_GZIP) не поддерживается ядром
update-initramfs: failed for /boot/initrd.img-6.1.0-31-amd64 with 1.
dpkg: error processing package initramfs-tools (--configure):
installed initramfs-tools package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
linux-image-6.1.0-31-amd64
initramfs-tools
E: Sub-process /usr/bin/dpkg returned an error code (1)
$ apt policy grep libpcre2-8-0
grep:
Installed: 3.8-5
Candidate: 3.8-5
Version table:
*** 3.8-5 500
500 https://deb.debian.org/debian bookworm/main amd64 Packages
100 /var/lib/dpkg/status
libpcre2-8-0:
Installed: 10.42-1
Candidate: 10.42-1
Version table:
*** 10.42-1 500
500 https://deb.debian.org/debian bookworm/main amd64 Packages
100 /var/lib/dpkg/status
$ ldd /bin/grep
linux-vdso.so.1 (0x00007fff81ff6000)
libpcre2-8.so.0 => /usr/local/lib/libpcre2-8.so.0 (0x00007fa6c7800000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa6c761f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa6c7c7e000)
$ LD_DEBUG=all grep 2>&1 | busybox grep pcre2_set_compile_extra_options_
155549: symbol=pcre2_set_compile_extra_options_8; lookup in file=grep [0]
155549: symbol=pcre2_set_compile_extra_options_8; lookup in file=/usr/local/lib/libpcre2-8.so.0 [0]
155549: symbol=pcre2_set_compile_extra_options_8; lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0]
155549: symbol=pcre2_set_compile_extra_options_8; lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
155549: grep: error: symbol lookup error: undefined symbol: pcre2_set_compile_extra_options_8 (fatal)
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
$dpkg -S {/usr,}/lib/x86_64-linux-gnu/libpcre2-8*
libpcre2-dev:amd64: /usr/lib/x86_64-linux-gnu/libpcre2-8.a
libpcre2-dev:amd64: /usr/lib/x86_64-linux-gnu/libpcre2-8.so
libpcre2-8-0:amd64: /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0
libpcre2-8-0:amd64: /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.11.2
dpkg-query: no path found matching pattern /lib/x86_64-linux-gnu/libpcre2-8.a
dpkg-query: no path found matching pattern /lib/x86_64-linux-gnu/libpcre2-8.so
dpkg-query: no path found matching pattern /lib/x86_64-linux-gnu/libpcre2-8.so.0
dpkg-query: no path found matching pattern /lib/x86_64-linux-gnu/libpcre2-8.so.0.11.2
$ (cd / && md5sum -c < /var/lib/dpkg/info/libpcre2-8-0:amd64.md5sums)
usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.11.2: OK
usr/share/doc/libpcre2-8-0/README.Debian: OK
usr/share/doc/libpcre2-8-0/changelog.Debian.gz: OK
usr/share/doc/libpcre2-8-0/changelog.gz: OK
usr/share/doc/libpcre2-8-0/copyright: OK
Проблема кажется эзотерической, и мои усилия найти решение были безрезультатными. Любая помощь?
Ответ или решение
Проблема, с которой вы столкнулись, связана с ошибкой в работе утилиты grep на операционной системе Debian после обновления до версии bookworm. Ошибка "grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8" указывает на проблему с библиотекой PCRE (Perl Compatible Regular Expressions), которая используется для обработки регулярных выражений в grep. Давайте подробно рассмотрим, как можно решить эту проблему.
Теория
Символы и их разрешение – ключевая часть динамической компоновки в операционных системах UNIX-подобного типа. В вашем случае проблема связана с тем, что утилита grep не может найти определенный символ в динамической библиотеке PCRE2.
Каждая программа, использующая динамические библиотеки, полагается на правильную синхронизацию версий этих библиотек с самими программами. Обновление операционной системы может в некоторых случаях привести к несовместимости версий, если старая версия библиотеки осталась в системе и не была обновлена.
Пример
Как указано в вашем вопросе, проблема заключается в следующем:
- При попытке запуска grep или любой другой команды, использующей эту утилиту, вы видите ошибку символа:
grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
- Пакеты libpcre2-8-0 и grep, как указано в выводе команды
apt policy
, установлены в последних версиях, доступных из репозиториев Debian bookworm. - Однако, как видно из вывода
ldd /bin/grep
, grep ссылается на библиотеку pcre2, находящуюся в нестандартном пути/usr/local/lib/libpcre2-8.so.0
.
Применение
Для решения проблемы возможны несколько шагов:
-
Удаление нестандартных версий библиотек:
Проверьте наличие других версий библиотек PCRE2 в директории
/usr/local/lib
и удалите их, если они существуют. Это может быть причиной проблемы, так как компоновщик находит библиотеку там, а не в стандартном системном пути. Используйте команды:sudo rm /usr/local/lib/libpcre2-8.so.0
-
Обновление динамических связей:
После удаления лишней версии библиотеки, обновите кэш динамических библиотек:
sudo ldconfig
Эта команда пересоздаст кэш динамических библиотек, гарантируя, что используется правильная версия, установленная через стандартные репозитории.
-
Проверка установленных пакетов:
Убедитесь, что все пакеты обновлены и исправлены:
sudo apt update sudo apt upgrade sudo apt --fix-broken install
-
Переустановка пакетов:
Если проблема не исчезла, попробуйте переустановить пакеты grep и libpcre2-8-0:
sudo apt remove --purge grep libpcre2-8-0 sudo apt install grep libpcre2-8-0
Это гарантирует, что все файлы и зависимости будут пересозданы и установлены заново.
-
Проверка версии библиотеки:
Перейдите в стандартное место хранения библиотек и проверьте, существует ли необходимая версия:
ls -l /usr/lib/x86_64-linux-gnu | grep pcre2
-
Минимальное использование grep:
В качестве временного решения вы можете воспользоваться альтернативными утилитами, такими как awk или перехватом stdout в сценариях, чтобы избегать использования grep до полного решения проблемы.
Заключение
Эти шаги должны помочь устранить конфликт с библиотекой, который вызывает ошибку. Если после выполнения всех действий указанная ошибка не исчезла, рекомендуется проверить логи системных ошибок и концептуально рассмотреть возможность обращения в службу поддержки Debian или консультации с профилированными специалистами по Unix-системам. В случае сложных проблем динамической компоновки, каждый случай может иметь уникальные факторы, требующие индивидуального подхода.