Π˜Π½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π° ΠΏΠΎ ΡΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΡŽ зависимостСй Ρƒ libsystemd

Π‘Ρ€Π΅Π΄ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² систСмного ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° systemd вСдётся обсуТдСниС вопроса сокращСния зависимостСй Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libsystemd, которая связываСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ systemd, Π½ΠΎ ΠΈ со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ внСшними прилоТСниями. НапримСр, Π² Fedora Π±ΠΎΠ»Π΅Π΅ 150 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ libsystemd Π² зависимостях. Π˜Π½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€ обсуТдСния считаСт, Ρ‡Ρ‚ΠΎ подтягиваниС Π² libsystemd Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ systemd, сущСствСнно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ Π² случаС ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚Π°Ρ†ΠΈΠΈ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠ°ΠΊ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ liblzma.

Помимо liblzma ΠΈ glibc Π² libsystemd Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libzstd, liblz4 ΠΈ libgcrypt, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ бСзопасности Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… становится критичСски Π²Π°ΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. Π’ libsystemd прСдоставляСтся доступ ΠΊ 12 Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ API (sd-bus, sd-daemon, sd-device, sd-event, sd-hwdb, sd-id128, sd-journal, sd-login, sd-netlink, sd-network, sd-path ΠΈ sd-resolve) ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ситуация, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ libsystemd Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sd_notify для информирования systemd ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния ΠΈΠ»ΠΈ sd_journal для записи Π΄Π°Π½Π½Ρ‹Ρ… Π² Π»ΠΎΠ³, связываСтся со всСми ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ API. Π’ качСствС Π²Ρ‹Ρ…ΠΎΠ΄Π° прСдлагаСтся Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ libsystemd Π½Π° нСсколько ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ API, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ сторонниС зависимости Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ systemd ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ цСлСсообразным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² libsystemd ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ взаимосвязаны. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ Π»ΠΈΠ±ΠΎ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ эффСктивности, Π»ΠΈΠ±ΠΎ ΠΊ нСобходимости дублирования ΠΊΠΎΠ΄Π°. Для сокращСния Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ памяти Π² libsystemd Π½Π΅Π΄Π°Π²Π½ΠΎ принято ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ c Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ динамичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ liblzma, libzstd ΠΈ liblz4 ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° dlopen(), Π² ситуациях ΠΊΠΎΠ³Π΄Π° ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹. АналогичноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ начиная со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ выпуска Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΈ для libgcrypt.

ПодобноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ стало ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ вмСсто явного ΠΈ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠ³ΠΎ связывания, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π΅ явно, Ρ‡Ρ‚ΠΎ услоТнит диагностику, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π° связь API-Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² libsystemd c Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π‘Π°ΠΌ ΠΏΠΎ сСбС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ dlopen() Π½Π΅ мСняСт Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, Π° лишь скрываСт внСшниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΡ‚ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π›Π΅Π½Π°Ρ€Ρ‚ ΠŸΠΎΡ‚Ρ‚Π΅Ρ€ΠΈΠ½Π³ Π²Ρ‹Ρ€Π°Π·ΠΈΠ» катСгоричСскоС нСсогласиС с ΠΈΠ΄Π΅Π΅ΠΉ раздСлСния libsystemd Π½Π° нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠΉ шаг сущСствСнно услоТнит совмСстноС использованиС ΠΊΠΎΠ΄Π° Π² systemd ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пСрСвСсти всС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² разряд ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ статичСски Π²ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ΠΌ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ API ΠΈ пространствами ΠΈΠΌΡ‘Π½, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ — ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ·-Π·Π° дублирования ΠΊΠΎΠ΄Π°.

РСализованная для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ выпуска Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ нСобходимости воспринимаСтся Π›Π΅Π½Π°Ρ€Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°Ρ стратСгия. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с услоТнСниСм получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… прСдлагаСтся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ»Ρ‹ ELF Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… динамичСских зависимостях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡΡŒΡ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ readelf.

Π§Ρ‚ΠΎ касаСтся связывания c libsystemd большого числа ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ‚ΠΎ Π›Π΅Π½Π°Ρ€Ρ‚ ΠΏΠΎΡ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ libsystemd Ρ€Π°Π΄ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ прилоТСния. НапримСр, рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ sd_notify() достаточно Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π° ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ Π² нСсколько строк ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ использовании UNIX-сокСтов (AF_UNIX). Подобная обособлСнная рСализация sd_notify с 2017 Π³ΠΎΠ΄Π° доступна для OpenSSH ΠΈ Π½Π° днях принята Π² состав пСрСносимой Π²Π΅Ρ‚ΠΊΠΈ OpenSSH 9.8, Ρ€Π΅Π»ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°ΠΌΠ΅Ρ‡Π΅Π½ Π½Π° сСрСдину Π»Π΅Ρ‚Π°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ