Как исправить неработающий grep на Debian

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

Я обновил свою систему до 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.

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

Пример

Как указано в вашем вопросе, проблема заключается в следующем:

  1. При попытке запуска grep или любой другой команды, использующей эту утилиту, вы видите ошибку символа:
    grep: symbol lookup error: grep: undefined symbol: pcre2_set_compile_extra_options_8
  2. Пакеты libpcre2-8-0 и grep, как указано в выводе команды apt policy, установлены в последних версиях, доступных из репозиториев Debian bookworm.
  3. Однако, как видно из вывода ldd /bin/grep, grep ссылается на библиотеку pcre2, находящуюся в нестандартном пути /usr/local/lib/libpcre2-8.so.0.

Применение

Для решения проблемы возможны несколько шагов:

  1. Удаление нестандартных версий библиотек:

    Проверьте наличие других версий библиотек PCRE2 в директории /usr/local/lib и удалите их, если они существуют. Это может быть причиной проблемы, так как компоновщик находит библиотеку там, а не в стандартном системном пути. Используйте команды:

    sudo rm /usr/local/lib/libpcre2-8.so.0
  2. Обновление динамических связей:

    После удаления лишней версии библиотеки, обновите кэш динамических библиотек:

    sudo ldconfig

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

  3. Проверка установленных пакетов:

    Убедитесь, что все пакеты обновлены и исправлены:

    sudo apt update
    sudo apt upgrade
    sudo apt --fix-broken install
  4. Переустановка пакетов:

    Если проблема не исчезла, попробуйте переустановить пакеты grep и libpcre2-8-0:

    sudo apt remove --purge grep libpcre2-8-0
    sudo apt install grep libpcre2-8-0

    Это гарантирует, что все файлы и зависимости будут пересозданы и установлены заново.

  5. Проверка версии библиотеки:

    Перейдите в стандартное место хранения библиотек и проверьте, существует ли необходимая версия:

    ls -l /usr/lib/x86_64-linux-gnu | grep pcre2
  6. Минимальное использование grep:

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

Заключение

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

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

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