远离 /usr/local, /opt

2013-11-19 11:45:35 +08:00
 mantianyu
我以前安装软件喜欢自己动手编译, 绝大部分软件喜欢把 prefix 默认为 /usr/local, 我那时觉得这很好很不错, 我的软件我都要亲手编译, 都要放在 /usr/local 下.

今天我看了一篇文章才知道这实际上是个已废弃的目录, 软件安装在此目录会给系统管理等造成诸多不便, 看完这篇文章我回想了一下......
确实...过去我在本机启动个 nginx 都要 sudo /usr/local/nginx/bin/nginx, 二而不去用发行版包管理系统提供的 /etc/init.d 启动脚本, 笨拙!

唉, 不多说了, 发文章链接...

http://www.tldp.org/HOWTO/HighQuality-Apps-HOWTO/fhs.html

FHS:
http://www.pathname.com/fhs/pub/fhs-2.3.html#SRVDATAFORSERVICESPROVIDEDBYSYSTEM
12682 次点击
所在节点    Linux
22 条回复
ichou
2013-11-19 11:50:44 +08:00
一直用发行版包装的肿么救
raptor
2013-11-19 11:56:10 +08:00
FreeBSD还在用怎么破……
halfbloodrock
2013-11-19 12:00:43 +08:00
/usr/local其实是属于系统PATH的。问题在于你编译时候用了--prefix=/usr/local/nginx,


echo $PATH
/usr/local/sbin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/admintool/:/root/bin


正常情况下,makefile写的符合标准的话,./configure之后,默认的应该是把binary程序放到/usr/local/bin/ 或者sbin/的。


编译的软件一般放到/usr/local的原因是,如果make uninstall出问题了,确保不会把系统/bin等目录里东西删除。坏也就坏一个/usr/local目录。



连接里的文章没错,但是他对应的情况是如果打包成rpm或者deb情况。
mantianyu
2013-11-19 12:15:51 +08:00
@ichou 发行版安装包的时候基本不会安装到 /usr/local 的啊
mantianyu
2013-11-19 12:18:01 +08:00
@raptor FreeBSD 目录结构不太了解耶...没有包管理系统的吗?

@halfbloodrock 但我看了那篇文章之后, 觉得确实还是带给我们的麻烦多一些, 尤其是带给 sa 的麻烦, 而且, 我似乎还没用过 make uninstall XD...
mamimoluo
2013-11-19 12:19:17 +08:00
在个人Mac上从来不碰系统路径的人路过。
sinxccc
2013-11-19 12:22:58 +08:00
给有系统洁癖但不得不自己编译安装的人推荐 GNU stow
meta
2013-11-19 12:26:59 +08:00
“软件安装在此目录会给系统管理等造成诸多不便”,难道系统不是安装软件的人在管理,有什么不便的。

其实我认为/usr/local都算是系统目录,应用层面的程序应该全部安装在/opt。
steptodream
2013-11-19 12:29:49 +08:00
楼主新手
dorentus
2013-11-19 12:31:35 +08:00
tl;dr
/usr 归包管理系统;
/usr/local、/opt 归用户。

------------------------

/usr/local 就是给非包管理系统安装(比如自己编译)的情形时用的。

正如 halfbloodrock 所说,--prefix=/usr/local/nginx 已经不是标准的用法了,默认情形下(自己手动编译安装)的 prefix 是 /usr/local。再者说,无论你的 nginx 装在哪,你都可以手写一个启动脚本放到 /etc/init.d、/etc/rc
infong
2013-11-19 12:48:24 +08:00
我觉得这两个目录还是有用的,一般自己编译的包 --prefix 都会指定到 /opt 然后在 /opt/etc 下面写 init.d/rc 之类的。

FreeBSD 用 ports 安装的都在 /usr/local 下面,如果用 pkg_add 的话都是在 /usr/bin|/usr/sbin 下面的。
efi
2013-11-19 13:08:12 +08:00
完全可以--prefix=$HOME/$packagename。
export PATH=$PATH:$HOME/$packagename/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/$packagename/lib
tywtyw2002
2013-11-19 13:10:21 +08:00
习惯把软件扔到一个子目录里面呀

/usr/local/nginx
然后做 ln -s /usr/local/nginx/bin/nginx /usr/bin/nginx
这么搞呀,有的时候多装几个版本的nginx 就改下软链就好了。
编译安装后直接rm -rf 就等于把这个软件删了。。。。
ShiningRay
2013-11-19 13:34:44 +08:00
不建议是针对开发linux发行版的人来说的,不是针对用户
likuku
2013-11-19 14:01:35 +08:00
@mantianyu freebsd 有两套相互融合的包管理系统:2进制包和自动源代码编译包管理系统ports,包管理系统将所有软件都装在 /usr/local 下。基本系统(内核,基本工具,基本网络工具)独立于包管理系统之外,传统上只以基本系统的源代码包形式发布更新,更新基本系统需要自己编译安装。

上面也有人提到自己装软件到 /usr/local 最好是一个软件一个独立目录。
mantianyu
2013-11-19 14:22:44 +08:00
@likuku 原来如此...受教啦!感谢已送!
msg7086
2013-11-19 17:08:42 +08:00
/usr/local, /opt

These are obsolete folders. When UNIX didn't have a package system (like RPM), sysadmins needed to separate an optional (or local) Software from the main OS. These were the directories used for that.

所以通常源码编译的软件都会进这种奇怪的地方,但是跟着系统软件包更新的那些软件,都会进系统目录,由包管理来维护。

个人比较偏向应用层的软件扔~/bin/里,比如离线下载工具啊网盘上传工具啊btsync啊,编译完了ln或者cp进去。
Kvm
2013-11-19 18:02:49 +08:00
编译放哪儿没多大问题,个人习惯就好
像@tywtyw2002所说编译后做软连接和直接用包用的目录最好
像@dorentus所说的有些人放着/etc/init.d不用非要死磕瞎搞弄一个个性出来, 自己用还行要是换人上去维护基本都想让人跳楼, 某阿里啥云和某万啥网提供的LAMP基本就是典型类似的脑残产物.
Kvm
2013-11-19 18:03:54 +08:00
测试下再发个/etc/init.d 会出现楼上的情况不
mantianyu
2013-11-19 18:43:11 +08:00
@Kvm 阿里啥云的主机可以自己装AMP的啊, 它还提供已经配置好LAMP的主机啊?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/89777

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX