Хотя оба предназначены для хранения файлов, не относящихся к операционной системе, /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
.
/usr/local
это локальная версия/usr
файловой системы, в то время как/opt
заполнитель для разных вещей.