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?
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
.
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".
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 .
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: - /
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.
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.
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).