В чем разница между / opt и / usr / local?

404

В соответствии со стандартом иерархии файловых/opt систем , предназначен для «установки дополнительных программных пакетов приложений». /usr/local"для использования системным администратором при локальной установке программного обеспечения". Эти варианты использования кажутся довольно похожими. Программное обеспечение, не включенное в дистрибутивы, обычно настроено по умолчанию для установки в одном /usr/localили /optбез конкретной рифмы или причины, по которой они выбрали.

Есть ли какая-то разница, по которой я скучаю, или оба делают одно и то же, но существуют по историческим причинам?

Патчи
источник
3
Насколько я понимаю, /usr/localэто локальная версия /usrфайловой системы, в то время как /optзаполнитель для разных вещей.
yasouser
5
Подобный вопрос в Спросите Ubuntu , суперпользователь
Кенчю
Не по теме по историческим причинам: понимание bin, sbin, usr / bin, usr / sbin split .
Алексей

Ответы:

357

Хотя оба предназначены для хранения файлов, не относящихся к операционной системе, /optи /usr/localне предназначены для того, чтобы содержать один и тот же набор файлов.

/usr/localэто место для установки файлов, созданных администратором, обычно с помощью makeкоманды (например, ./configure; make; make install). Идея состоит в том, чтобы избежать столкновений с файлами, которые являются частью операционной системы, которые могут быть либо перезаписаны, либо перезаписаны локальными (в противном случае они /usr/bin/fooявляются частью ОС, а /usr/local/bin/fooявляются локальной альтернативой).

Все файлы /usrдоступны для совместного использования между экземплярами ОС, хотя это редко делается в Linux. Это часть, где FHS немного противоречит самому себе, так как /usrопределено, что она предназначена только для чтения, но /usr/local/binдля успешной локальной установки программного обеспечения требуется чтение и запись. Стандарт файловой системы SVR4, который был основным источником вдохновения FHS, рекомендует избегать /usr/localи использовать /opt/localвместо этого для преодоления этой проблемы.

/usr/localэто наследие от оригинального BSD. В то время исходный код /usr/binкоманд ОС находился в /usr/src/binи /usr/src/usr.bin, а источник локально разработанных команд - в /usr/local/src, а их двоичные файлы - в /usr/local/bin. Там не было никакого понятия упаковки (вне тарболы).

С другой стороны, /optэто каталог для установки разделенных пакетов (то есть пакетов, не входящих в дистрибутив операционной системы, но предоставленных независимым источником), каждый из которых находится в своем собственном подкаталоге. Они уже созданы целыми пакетами, предоставленными независимым сторонним дистрибьютором программного обеспечения. В отличие от /usr/localвещей, эти пакеты следуют соглашениям каталога (или, по крайней мере, они должны). Например, someappбудет установлен в /opt/someapp, с одной из его команд /opt/someapp/bin/foo, его файл конфигурации будет в /etc/opt/someapp/foo.conf, а его файлы журнала в /var/opt/someapp/logs/foo.access.

jlliagre
источник
53
/ usr / local, для собственного, внутреннего, скомпилированного и поддерживаемого программного обеспечения. Параметр / opt предназначен для внешней, предварительно упакованной области установки двоичного кода / пакета приложений. Хммм ... у нас нет C: \ программных файлов для всего ;-)
Nikhil Mulley
2
«С другой стороны, / opt - это каталог для установки разделенных пакетов» Что означает «разделенные» пакеты здесь?
Кевин Уилер
1
@KevinWheeler Это объясняется в следующем предложении. Unbundled означает пакеты, не являющиеся частью дистрибутива операционной системы, но предоставленные независимым источником.
Jlliagre
2
@jlliagre centos docs * state «Например, если каталог / usr / смонтирован как удаленный хост NFS с общим доступом только для чтения, все равно можно установить пакет или программу в каталог / usr / local /» Я не знаю, кто прав, но это, кажется, противоречит вашему заявлению о слабой области FHS. (* источник centos.org/docs/5/html/5.1/Deployment_Guide/… )
Кевин Уилер
1
@KevinWheeler Это именно та слабость, о которой я говорю. Установка пакета или программы в удаленном, доступном только для чтения каталоге просто невозможна. Обходной путь может заключаться в монтировании локальной файловой системы в / usr / local, но это больше похоже на временную работу, чем на что-то правильно спроектированное.
Jlliagre
84

Основным отличием является то, что /usr/localдля программного обеспечения не управляет системный упаковщик, но все еще следует стандартным правилам развертывания Unix.

Вот почему у вас есть /usr/local/bin, и /usr/local/sbin /usr/local/includeт.д ...

/optс другой стороны, для программного обеспечения, которое не следует этому и развернуто монолитным способом. Обычно это коммерческое и / или кроссплатформенное программное обеспечение, упакованное в стиле «Windows».

Позволь мне быть
источник
12
Я не согласен с вашей монолитной точкой. Стандарт FHS гласит, что пакеты, установленные в подкаталогах / opt, должны иметь свои файлы, специфичные для хоста, которые должны быть установлены вне / opt, соответственно в / etc / opt / package для файлов конфигурации и / var / opt / package для журналов, спула и тому подобного. / opt на самом деле ближе к правилам развертывания unix, чем / usr / local, который помещает все в каталог, который должен быть только для чтения, но не может быть по понятным причинам.
jlliagre
5
Конечно, если бы я делал опциональный пакет и хотел заявить о соответствии FHS. В противном случае стандарт - это больше, чем вы бы назвали «руководящие принципы». Тот факт, что NetBeans не использует / etc / opt / netbeans, не помешает мне поместить его в / opt для всей системы или в $ HOME / .local / opt для одного пользователя.
января
1
@jla Я полагаю, что ваш последний комментарий был адресован мне, поэтому, пожалуйста, используйте @ xxx, когда отвечаете кому-то еще, что ОП или автору ответа. Что касается / etc / opt, FHS не говорит, что это рекомендуемое местоположение (как руководство), но обязательное местоположение. Вы или разработчик Netbeans можете свободно нарушать этот стандарт, поскольку нет никаких полномочий для его применения, но не говорите, что делать это неправильно - это путь. Это просто неудачное недоразумение или преднамеренное нарушение.
Jlliagre
8
@jlliagre Как администратор моей системы, FHS представляет собой набор рекомендаций. Каталог / opt - это хорошо продуманное место для установки монолитного программного обеспечения / opt / <package> или / opt / <provider>. Когда я устанавливаю пакет, который хочет использовать <package | provider> / all / data / required / to / support, он включается в opt / даже если провайдер не соблюдает каждую деталь последней версии FHS. Я мог бы отправить электронное письмо или сообщить об ошибке, но я не собираюсь помещать этот монолитный пакет куда-то еще, чтобы лучше относиться к FHS в моей системе.
JLA
1
@jlliagre Я установил много вещей в / opt, и в / etc / opt не было создано никаких файлов. Должен?
erm3nda
18

Они на самом деле очень похожи, и использование того или другого - это вопрос мнения. Журнал Linux имел эту точку зрения / контрапункта по этой конкретной теме здесь .

philfr
источник
9
О, Боже. Я не хотел втягивать себя в «священную войну».
патчи
13

Лично для меня это то, что Билл сказал в ссылке @ philfr:

В системе разработки или в песочнице наличие каталога / opt, в котором вы можете просто бросить вещи и посмотреть, работают ли они, имеет большой смысл. Я знаю, что я не собираюсь самостоятельно собирать вещи, чтобы попробовать их. Если приложение не работает, вы можете просто открыть каталог / opt / mytestapp, и это приложение станет историей. Упаковка может иметь смысл, когда вы запускаете большое развертывание (бывают случаи, когда я создаю пакетные приложения), но во многих случаях неплохо добавлять вещи в / opt.

К сожалению, большинство make installсценариев помещает файлы в файлы, /usr/localа не просто создает там символическую ссылку: - /

pepoluan
источник
2
Какой в ​​этом смысл? Если вы все равно собираетесь создать символическую ссылку, почему бы просто не поместить туда исходный файл?
Let_Me_Be
8
Просто чтобы прокомментировать make installцель, в которую помещаются файлы /usr/local; эта функциональность легко изменчива, передавая --prefix=параметр командной строки в ./configureскрипт, или если нет ./configureсценария, вы можете передать параметр в makeцели следующим образом: make --prefix=/usr install.
Шон С.
3
Является ли / opt стандартным каталогом, включенным в $ PATH? Я знаю / usr / local есть.
LawrenceC
5
@Let_Me_Be преимущество будет в том, что очень легко сохранить старые версии. Допустим, у меня есть 2 версии 'foo', расположенные в /opt/foo-1.1и /opt/foo-1.2. Когда я обновляюсь, fooсимволическая ссылка /usr/local/binуказывает на foo-1.2. Если по какой-то причине мне необходимо выполнить откат, я просто заменяю символическую ссылку на ссылку, указывающую на foo-1.1. Если с 1.2 все в порядке через несколько недель, быстро rm -rf /opt/foo-1.1удаляет старую версию быстро и чисто.
pepoluan
7
@ultrasawblade нет, это не так. и никогда не должно быть. в конце концов, согласно FHS, / opt должен быть подразделен на подкаталоги с названием пакета. впихивание всего в PATH - верный путь к катастрофе. скорее, приложения должны устанавливать себя в / opt и ссылаться на свои вызываемые пользователем программы в / usr / local / bin (или sbin).
pepoluan
11

Во-первых, я не думаю, что есть строгий ответ; разные администраторы будут иметь разные мнения, в зависимости от их происхождения. Исторически, /usr/localпришел первым; это была конвенция в Беркли, IIRC. В какой-то момент во время разработки System V, если я не ошибаюсь (это все давно, и я не делал заметок), было решение или желание иметь возможность монтировать /usrтолько для чтения, что означало, что вы не можете добавить новое программное обеспечение к нему; возможно, именно поэтому /opt был изобретен. Так получилось, что было так много существующего программного обеспечения, которое писало так, /usrчто эта идея так и не началась.

Мое личное предпочтение /opt, с отдельным подкаталогом для каждого продукта; это делает удаление продукта простым случаем rm -fr. Но если все ваше программное обеспечение установлено с помощью хорошего менеджера пакетов, это не имеет значения, и если программное обеспечение, которое вы устанавливаете, не подчиняется строго этим соглашениям и записывает конфигурации и тому подобное где-то ниже /usr, это тоже не имеет значения, хотя по противоположным причинам.

Джеймс Канзе
источник
1
"" "все ваше программное обеспечение установлено через хороший менеджер пакетов" "" это невозможно, если вы не используете только часто используемое программное обеспечение.
Pacerier
1
@Pacerier это возможно, это зависит от того, какой дистрибутив вы используете. Каким бы ни было программное обеспечение, оно, вероятно, находится в репозитории пользователей Arch, а если нет, то относительно легко написать PKGBUILD.
StarlitGhost
9

У меня немного другое мнение по этому вопросу.
В то время как все в jlliagre «s ответ является правильным, практическое применение для меня, при развертывании программного обеспечения в кластере, сводится к переменным окружения по умолчанию и повторное использование LIBS по умолчанию.

Проще говоря - /usr/localи все его дочерние каталоги находятся в соответствующих переменных env, таких как PATHи MANPATH, и /usr/local/lib{,64}в ldconfig ( /etc/ld.so.conf.d/).

/opt/OTOH не является - что выгодно, когда требуется сосуществование нескольких версий или конфликтующих пакетов в системе, но требует некоторого вида управления средой (например, модулей среды или наборов программного обеспечения ), и невыгодно в том смысле, что это потенциально может «тратить» "пространство для хранения путем дублирования общих библиотек, поскольку каждая установка /optможет быть полностью автономной.

Для общей природы /usr/localработы предполагается, что, например, двоичные файлы устанавливаются непосредственно /usr/local/bin(и соответствующие страницы руководства /usr/local/share/man/...), а не /usr/local/app/{bin,share/man,...}и т. Д.

Dani_l
источник