Управление общими библиотеками в Linux

CompTIABeginner
Практиковаться сейчас

Введение

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

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

Определение зависимостей общих библиотек с помощью ldd

На этом этапе вы научитесь определять, от каких общих библиотек зависит исполняемая программа. В Linux большинство программ не содержат в себе весь код, необходимый для запуска. Вместо этого они полагаются на общие библиотеки — наборы функций, которые могут использоваться несколькими программами одновременно. Такой подход экономит дисковое пространство и память. Команда ldd (List Dynamic Dependencies) — это утилита, которая выводит список общих библиотек, требуемых для каждой программы или библиотеки.

Давайте воспользуемся ldd для проверки команды ping, стандартной сетевой утилиты. Это покажет нам, какие библиотеки нужны ping для работы. Выполните следующую команду в терминале:

ldd /bin/ping

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

        linux-vdso.so.1 (0x00007ffcfa17e000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f29235c4000)
        libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f29235a3000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f292337a000)
        libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f29231d0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f29235f5000)

Этот список содержит общие библиотеки, необходимые для /bin/ping. Каждая строка представляет собой отдельную зависимость.

  • libc.so.6 — это стандартная библиотека C, которая предоставляет базовые функции, такие как открытие файлов, вывод на экран и управление памятью. Символ => указывает путь, по которому динамический компоновщик системы нашел файл библиотеки.
  • libcap.so.2 предоставляет функции управления привилегиями (capabilities) в Linux.
  • libidn2.so.0 обеспечивает поддержку интернационализированных доменных имен.
  • libunistring.so.2 предоставляет функции для работы со строками Unicode.
  • linux-vdso.so.1 — это виртуальная библиотека, предоставляемая ядром для ускорения определенных системных вызовов.
  • /lib64/ld-linux-x86-64.so.2 — это сам интерпретатор программ, отвечающий за загрузку остальных общих библиотек.

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

Поиск конкретной общей библиотеки с помощью find

На предыдущем этапе вы использовали команду ldd и увидели, что /bin/ping зависит от библиотеки libc.so.6. Теперь вы научитесь находить точное местоположение этого файла в файловой системе вашей системы. Для этой задачи мы воспользуемся командой find — мощным инструментом для поиска файлов и каталогов.

Команда find выполняет поиск файлов в иерархии каталогов. Ее базовый синтаксис: find [начальный-каталог] -name [имя-файла]. Мы начнем поиск с каталога /usr, где обычно хранятся многие системные библиотеки.

Чтобы найти файл libc.so.6, выполните следующую команду в терминале. Мы используем sudo, чтобы предоставить команде права администратора, что предотвратит ошибки "Permission denied" (Доступ запрещен) при поиске в защищенных системных папках.

sudo find /usr -name libc.so.6

Команда должна завершиться довольно быстро, так как мы ищем только в пределах /usr. Вы увидите примерно такой результат:

/usr/lib/x86_64-linux-gnu/libc.so.6

Это показывает расположение файла стандартной библиотеки C в каталоге /usr. Обратите внимание, что этот путь может отличаться от того, что показала ldd (/lib/x86_64-linux-gnu/libc.so.6). Это происходит потому, что в разных местах могут находиться копии библиотек, и система обычно использует символические ссылки для управления тем, какая именно версия загружается.

Если вы хотите найти все копии библиотеки во всей файловой системе, используйте корневой каталог / в качестве отправной точки:

sudo find / -name libc.so.6

Хотя find является универсальным инструментом для поиска любых файлов, в Linux существует специализированный и гораздо более быстрый механизм управления и поиска общих библиотек, известный как кэш библиотек. На следующем этапе вы узнаете, как просматривать этот кэш.

Просмотр кэша общих библиотек с помощью ldconfig -p

На предыдущем этапе вы использовали команду find для поиска библиотеки по всей файловой системе, что может быть медленным процессом. Чтобы ускорить поиск общих библиотек, системы Linux поддерживают файл кэша, который обычно находится по адресу /etc/ld.so.cache. Этот кэш содержит скомпилированный список общих библиотек, доступных в стандартных системных каталогах, что позволяет программам загружать свои зависимости гораздо быстрее.

Команда ldconfig является основным инструментом для управления этим кэшем. Чтобы просмотреть содержимое текущего кэша библиотек, можно использовать опцию -p (print).

Выполните следующую команду, чтобы вывести список всех библиотек, известных кэшу:

ldconfig -p

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

1234 libs found in cache `/etc/ld.so.cache'
 libzstd.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libzstd.so.1
 libz.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so.1
 libz.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so
 libyield.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libyield.so.2
...
 libc.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libc.so.6
...

Каждая строка содержит имя библиотеки, ее архитектуру и ABI (например, libc6,x86-64), а также полный путь к файлу библиотеки.

Чтобы не пролистывать весь список вручную, вы можете перенаправить вывод в grep для поиска конкретной библиотеки. Давайте найдем запись для libc.so.6, с которой мы работали ранее:

ldconfig -p | grep libc.so.6

Это отфильтрует список и покажет только записи, относящиеся к libc.so.6:

        libc.so.6 (libc6,x86-64, OS ABI: Linux 3.2.0) => /lib/x86_64-linux-gnu/libc.so.6

Как видите, это гораздо более быстрый и прямой способ найти расположение кэшированной библиотеки, чем поиск по всей файловой системе. Вывод показывает не только имя и путь, но и информацию об архитектуре (libc6,x86-64) и совместимости с OS ABI (OS ABI: Linux 3.2.0). Однако этот кэш не обновляется автоматически в режиме реального времени. Если вы установите новую библиотеку, вам нужно будет обновить кэш, чтобы система смогла ее найти. На следующем этапе вы узнаете, как это сделать.

Обновление кэша общих библиотек с помощью ldconfig -v

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

Мы снова воспользуемся командой ldconfig, но на этот раз для выполнения обновления. При запуске без опции -p команда ldconfig сканирует доверенные каталоги (определенные в /etc/ld.so.conf и /etc/ld.so.conf.d/*.conf) на наличие общих библиотек и пересобирает файл кэша /etc/ld.so.cache.

Чтобы увидеть этот процесс в деталях, мы используем опцию -v (verbose — подробный режим), которая заставляет ldconfig выводить названия сканируемых каталогов и создаваемые символические ссылки. Поскольку эта команда изменяет системный файл, ее необходимо запускать с помощью sudo.

Выполните следующую команду в терминале:

sudo ldconfig -v

Команда выведет большой объем информации по мере обработки всех каталогов библиотек в вашей системе. Вывод будет выглядеть примерно так:

/lib/x86_64-linux-gnu:
 libip6tc.so.2 -> libip6tc.so.2.0.0
 libip4tc.so.2 -> libip4tc.so.2.0.0
 libxtables.so.12 -> libxtables.so.12.1.0
 ...
/usr/lib/x86_64-linux-gnu:
 libfakeroot-0.so -> libfakeroot-0.so
 ...
/lib:
...
(etc.)

В выводе сначала указывается путь к сканируемому каталогу (например, /lib/x86_64-linux-gnu:), а затем перечисляются символические ссылки, которые проверяются или создаются внутри этого каталога. Такой подробный отчет — отличный способ подтвердить, что кэш был успешно обновлен и включает все ожидаемые пути к библиотекам.

Теперь вы освоили основные задачи по управлению общими библиотеками в Linux: определение зависимостей, поиск файлов библиотек и управление кэшем динамического компоновщика.

Резюме

В этой лабораторной работе вы приобрели важные навыки управления общими библиотеками в среде Linux. Вы начали с использования команды ldd для определения динамических зависимостей исполняемого файла, выяснив, какие библиотеки необходимы для его работы. Затем вы попрактиковались в использовании команды find для поиска физического расположения файлов библиотек, что полезно для диагностики и проверки системы.

Кроме того, вы изучили роль кэша общих библиотек, который система использует для ускорения процесса поиска файлов. Вы научились просматривать содержимое этого кэша с помощью команды ldconfig -p. Наконец, вы использовали ldconfig -v для обновления кэша — критически важного шага после установки новых библиотек, гарантирующего их распознавание и доступность в системе.