Упаковка: / usr / lib vs. / usr / lib / * - linux-gnu

5

Я создавал новую версию Spice в контейнере LXC, в основном для экспериментов. Однако одна странная вещь, с которой я столкнулся, заключалась в том, что make install установил libspice-server.so.1.9.0 в /usr/lib . Результатом было неприятное segfault при использовании драйвера QXL из-за того, что libspice-server.so.1.8.0 из репозиториев находилось в /usr/lib/x86_64-linux-gnu , у которого более высокий приоритет в ldconfig . Таким образом, это динамически связывало более старую версию библиотеки с более новым кодом - нехорошо.

В любом случае, это заставило меня задуматься: кроме ldconfig ordering (что, я думаю, не имеет к этому никакого отношения) есть функциональная или философская разница между размещением библиотеки в /usr/lib и размещением библиотеки в /usr/lib/{x86_64,i386}-linux-gnu ?

Я понимаю необходимость отдельных каталогов /usr/lib/i386-linux-gnu и /usr/lib/x86_64-linux-gnu из-за того, что Debian не использует иерархию /usr/lib /usr/lib32 , используемую некоторыми другими дистрибутивами. Но имеют ли библиотеки, которые находятся непосредственно в /usr/lib , какое-то особое значение, или просто для обратной совместимости, возможно?

    
задан Chuck R 02.12.2014 в 11:31
источник

2 ответа

3

В Debian и Ubuntu, и действительно FHS, /usr/lib и варианты «принадлежат» поставщику. В этом случае это означает ваше распределение. Вы не должны размещать файлы там сами. Конечно, вы можете делать, как вам нравится, но инструменты (например, dpkg) просто перезаписывают файлы, которые вы там размещаете, без подсказки, потому что система по дизайну рассматривает эти пространства только для пакетов распространения. Ваша система ваша, чтобы сломать, как вы пожелаете, но вы также можете сохранить фигуры: -)

Пространство, зарезервированное для владельца / администратора системы для размещения дополнительных общесистемных библиотек, составляет /usr/local/lib . Это относится к FHS, поэтому должно быть доступно и настроено во всех стандартно-распределенных дистрибутивах. По умолчанию у программного обеспечения Upstream должно быть make install библиотек.

  

... существует функциональное или философское различие между размещением библиотеки в / usr / lib и размещением библиотеки в / usr / lib / {x86_64, i386} -linux-gnu?

В дистрибутивных пакетах, в которых используется /usr/lib , не могут быть установлены сразу разные архитектуры (например, i386 vs. amd64), что, как указывали другие, полезно для настольных компьютеров с 32-разрядным и 64-разрядным программным обеспечением и для разработчиков, запускающих код, построенный для других архитектур путем эмуляции. Это единственная причина для подкаталогов multiarch.

То же самое касается и библиотек, которые вы устанавливаете самостоятельно. Если вы делаете это в /usr/lib или /usr/local/lib , вы не сможете одновременно поддерживать несколько архитектур. Вы всегда можете добавить многомиллиардные пути, например /usr/local/lib/{x86_64,i386}-linux-gnu , в /etc/ld.so.conf.d/ , чтобы включить это, конечно.

    
ответ дан Robie Basak 20.01.2017 в 17:31
источник
2

Вы правы, в традиционной системе все библиотеки были установлены в /usr/lib . Как вы уже упоминали, тот факт, что пользователи любят выполнять 32-битные двоичные файлы на 64-битных платформах, является одной из причин разделения библиотек по их архитектуре. Этот подход известен как Multiarch (по крайней мере, в мире Debian).

Кроме того, разработчикам нравится устанавливать библиотеки других архитектур (например, ARM) для кросс-компиляции своих приложений.

FHS рекомендует помещать 32- / 64-разрядные библиотеки в папки /usr/lib{32,64} . Этот подход является негибким, поскольку нет поддержки для других архитектур (например, ARM). Там даже существует несколько 64-разрядных ABI, которые несовместимы друг с другом и попадают в одну и ту же папку.

Дополнительная информация:

ответ дан ted 09.12.2014 в 19:53