V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
mantianyu
V2EX  ›  Linux

远离 /usr/local, /opt

  •  
  •   mantianyu · 2013-11-19 11:45:35 +08:00 · 12635 次点击
    这是一个创建于 4009 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我以前安装软件喜欢自己动手编译, 绝大部分软件喜欢把 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
    22 条回复
    ichou
        1
    ichou  
       2013-11-19 11:50:44 +08:00
    一直用发行版包装的肿么救
    raptor
        2
    raptor  
       2013-11-19 11:56:10 +08:00
    FreeBSD还在用怎么破……
    halfbloodrock
        3
    halfbloodrock  
       2013-11-19 12:00:43 +08:00   ❤️ 1
    /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
        4
    mantianyu  
    OP
       2013-11-19 12:15:51 +08:00
    @ichou 发行版安装包的时候基本不会安装到 /usr/local 的啊
    mantianyu
        5
    mantianyu  
    OP
       2013-11-19 12:18:01 +08:00
    @raptor FreeBSD 目录结构不太了解耶...没有包管理系统的吗?

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

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

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

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

    正如 halfbloodrock 所说,--prefix=/usr/local/nginx 已经不是标准的用法了,默认情形下(自己手动编译安装)的 prefix 是 /usr/local。再者说,无论你的 nginx 装在哪,你都可以手写一个启动脚本放到 /etc/init.d、/etc/rc
    infong
        11
    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
        12
    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
        13
    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
        14
    ShiningRay  
       2013-11-19 13:34:44 +08:00
    不建议是针对开发linux发行版的人来说的,不是针对用户
    likuku
        15
    likuku  
       2013-11-19 14:01:35 +08:00   ❤️ 1
    @mantianyu freebsd 有两套相互融合的包管理系统:2进制包和自动源代码编译包管理系统ports,包管理系统将所有软件都装在 /usr/local 下。基本系统(内核,基本工具,基本网络工具)独立于包管理系统之外,传统上只以基本系统的源代码包形式发布更新,更新基本系统需要自己编译安装。

    上面也有人提到自己装软件到 /usr/local 最好是一个软件一个独立目录。
    mantianyu
        16
    mantianyu  
    OP
       2013-11-19 14:22:44 +08:00
    @likuku 原来如此...受教啦!感谢已送!
    msg7086
        17
    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
        18
    Kvm  
       2013-11-19 18:02:49 +08:00   ❤️ 1
    编译放哪儿没多大问题,个人习惯就好
    像@tywtyw2002所说编译后做软连接和直接用包用的目录最好
    像@dorentus所说的有些人放着/etc/init.d不用非要死磕瞎搞弄一个个性出来, 自己用还行要是换人上去维护基本都想让人跳楼, 某阿里啥云和某万啥网提供的LAMP基本就是典型类似的脑残产物.
    Kvm
        19
    Kvm  
       2013-11-19 18:03:54 +08:00
    测试下再发个/etc/init.d 会出现楼上的情况不
    mantianyu
        20
    mantianyu  
    OP
       2013-11-19 18:43:11 +08:00
    @Kvm 阿里啥云的主机可以自己装AMP的啊, 它还提供已经配置好LAMP的主机啊?
    Kvm
        21
    Kvm  
       2013-11-19 18:47:23 +08:00
    @mantianyu 我是说官方出品的东西,不是说他主机, 请看清楚谢谢!!!
    Kvm
        22
    Kvm  
       2013-11-19 18:51:04 +08:00
    声明下观点以免误会:
    1.上面想说的是"典型"案例
    2.和任何主机无关
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2760 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:44 · PVG 16:44 · LAX 00:44 · JFK 03:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.