web-dev-qa-db-fra.com

Quelle est la différence entre / opt et / usr / local?

Selon le Filesystem Hierarchy Standard , /opt est pour "l'installation de progiciels d'application complémentaires". /usr/local est "à utiliser par l'administrateur système lors de l'installation locale du logiciel". Ces cas d'utilisation semblent assez similaires. Les logiciels non inclus dans les distributions sont généralement configurés par défaut pour être installés dans /usr/local ou /opt sans rime ni raison particulière pour laquelle ils ont choisi.

Y a-t-il une différence qui me manque, ou les deux font-ils la même chose, mais existent pour des raisons historiques?

440
Patches

Bien que les deux soient conçus pour contenir des fichiers n'appartenant pas au système d'exploitation, /opt et /usr/local ne sont pas destinés à contenir le même ensemble de fichiers.

/usr/local est un endroit pour installer des fichiers créés par l'administrateur, généralement à l'aide de la commande make (par exemple, ./configure; make; make install). L'idée est d'éviter les conflits avec des fichiers qui font partie du système d'exploitation, qui seraient soit écrasés, soit écrasés les fichiers locaux autrement (par exemple, /usr/bin/foo fait partie du système d'exploitation tandis que /usr/local/bin/foo est une alternative locale).

Tous les fichiers sous /usr sont partageables entre les instances de système d'exploitation, bien que cela soit rarement fait avec Linux. C'est une partie où le FHS est légèrement contradictoire, comme /usr est défini pour être en lecture seule, mais /usr/local/bin doit être en lecture-écriture pour que l'installation locale du logiciel réussisse. La norme du système de fichiers SVR4, qui était la principale source d'inspiration du FHS, recommande d'éviter /usr/local et utilise /opt/local au lieu de résoudre ce problème.

/usr/local est un héritage du BSD d'origine. A cette époque, le code source de /usr/bin Les commandes du système d'exploitation étaient dans /usr/src/bin et /usr/src/usr.bin, alors que la source des commandes développées localement était dans /usr/local/src, et leurs binaires dans /usr/local/bin. Il n'y avait aucune notion d'emballage (hors tarballs).

D'autre part, /opt est un répertoire pour installer les packages dégroupés (c'est-à-dire les packages ne faisant pas partie de la distribution du système d'exploitation, mais fournis par une source indépendante), chacun dans son propre sous-répertoire. Ils sont déjà construits des packages entiers fournis par un distributeur de logiciels tiers indépendant. Contrairement à /usr/local stuff, ces packages suivent les conventions de répertoire (ou du moins ils devraient). Par exemple, someapp serait installé dans /opt/someapp, l'une de ses commandes étant /opt/someapp/bin/foo, son fichier de configuration serait dans /etc/opt/someapp/foo.conf, et ses fichiers journaux dans /var/opt/someapp/logs/foo.access.

393
jlliagre

La différence fondamentale est que /usr/local est destiné aux logiciels non gérés par le packager système, mais respectant toujours les règles de déploiement standard d'Unix.

Voilà pourquoi vous avez /usr/local/bin, /usr/local/sbin/usr/local/include etc...

/opt d'autre part, pour les logiciels qui ne suivent pas cela et qui sont déployés de façon monolithique. Cela inclut généralement les logiciels commerciaux et/ou multiplateformes qui sont fournis dans le style "Windows".

89
Šimon Tóth

Ils sont en effet très similaires, et l'utilisation de l'un ou de l'autre est plutôt une question d'opinion. Le journal Linux a eu cette discussion point/contrepoint sur ce sujet exact ici .

18
philfr

Pour moi, personnellement, c'est ce que Bill a dit dans le lien de @ philfr:

Sur un système de développement, ou un bac à sable, avoir un répertoire/opt où vous pouvez simplement lancer des choses et voir si elles fonctionnent a beaucoup de sens. Je sais que je ne vais pas faire l'effort d'emballer les choses moi-même pour les essayer. Si l'application ne fonctionne pas, vous pouvez simplement rm le répertoire/opt/mytestapp et cette application est historique. L'empaquetage peut avoir du sens lorsque vous exécutez un grand déploiement (il y a des moments où je fais des applications de package), mais beaucoup de fois, c'est bien de jeter des trucs dans/opt.

Malheureusement, la plupart make install les scripts poussent les fichiers dans /usr/local au lieu de simplement y créer un lien symbolique: - /

13
pepoluan

Premièrement, je ne pense pas qu'il y ait de réponse stricte; différents administrateurs auront des opinions différentes, selon leurs antécédents. Historiquement, /usr/local est venu en premier; c'était la convention à Berkley, IIRC. À un moment donné pendant le développement du système V, si je ne me trompe pas (c'est il y a longtemps et je n'ai pas pris de notes), il y a eu une décision ou un désir de pouvoir monter /usr en lecture seule, ce qui signifie que vous ne pouvez pas y ajouter de nouveaux logiciels; c'est peut-être la raison pour laquelle /opt a été inventé. En fait, il y avait tellement de logiciels existants qui écrivaient sur /usr que cette idée n'a jamais vraiment décollé.

Ma préférence personnelle est /opt, avec un sous-répertoire distinct pour chaque produit; cela fait de la suppression d'un produit un simple cas de rm -fr. Mais si tous vos logiciels sont installés via un bon gestionnaire de paquets, cela n'a pas d'importance, et si le logiciel que vous installez ne respecte pas strictement ces conventions, et écrit les configurations et autres quelque part sous /usr, cela n'a pas d'importance non plus, bien que pour les raisons opposées.

12
James Kanze

J'ai une vision légèrement différente de cette question.
Alors que tout dans jlliagreréponse est correct, l'application pratique pour moi, lors du déploiement de logiciels dans un cluster, se résume aux variables d'environnement par défaut et par défaut réutilisation des bibliothèques.

Tout simplement - /usr/local et tous ses répertoires enfants sont dans les variables env appropriées telles que PATH et MANPATH et /usr/local/lib{,64} sont dans ldconfig (/etc/ld.so.conf.d/).

/opt/ OTOH n'est pas - ce qui est à la fois avantageux lorsque plusieurs versions ou packages en conflit coexistent dans le système, mais nécessite une sorte de gestion de l'environnement (par exemple, modules-d'environnement ou collections de logiciels ), et désavantageux en ce qu'il risquerait de "gaspiller" l'espace de stockage en dupliquant les bibliothèques partagées, comme chaque installation dans /opt peut être complètement autonome.

Pour la nature partagée de /usr/local pour travailler, on suppose que par ex. les binaires sont installés directement sur /usr/local/bin (et les pages de manuel pour les /usr/local/share/man/...) plutôt que /usr/local/app/{bin,share/man,...} etc.

10
Dani_l

En résumé, mon instinct répond ...

Ayant utilisé ma juste part de FreeBSD depuis 2.2.6 et de Red Hat Linux depuis la version 9 ...

/usr/local == Old School Conventions
/opt       == New School Conventions

L'arrangement des choses sur les systèmes de fichiers UNIX/Linux a plus à voir avec les conventions et la tradition qu'avec la logique absolue.

Sinon, je suis surtout d'accord avec tout le monde. :-)

Il y a toujours une exception à la règle. À la fin de la journée, vous décidez de ce qui convient le mieux à votre configuration (quand vous le pouvez).

0
Anthony Rutledge