关于 Linux 下面的 包管理器的 疑惑

2022-05-11 15:40:27 +08:00
 huyangq

linux 的包管理器很强大 下载软件十分的方便 但是下载的软件各个目录 好像是分散在 各个目录中的,比如下载了 redis 启动程序 好像在 /usr/bin 中 数据好像在 /usr/local/redis-3.2.0/data 为啥 要这种设计呢? 直接在一个固定的目录下面不行吗?

4136 次点击
所在节点    Linux
28 条回复
kujio
2022-05-11 15:45:07 +08:00
bin 里存放可执行文件
local 存放缓存数据
很合理啊。
richangfan
2022-05-11 15:48:45 +08:00
约定俗成,`/usr/bin`放系统软件,`/usr/local/bin`放用户软件
seers
2022-05-11 15:51:20 +08:00
linux fhs
ration
2022-05-11 15:52:18 +08:00
你放在一个目录,那你只能到目录里启动程序了。如同 windows 下也要配置环境变量,路径之类的
iamzuoxinyu
2022-05-11 15:53:39 +08:00
Unix 规范。现在有了 snap/flatpack 之类的容器化的打包方式,可以将一个应用的资源全部放在一块。
masterclock
2022-05-11 15:54:08 +08:00
这东西大概是 1969 年发明的,甚至早于创世纪,很难修改了
SaltyKitkat
2022-05-11 16:07:13 +08:00
根据 fhs 约定来如此安排的
好处是从某种角度的方便
头文件在 /usr/include
可执行文件在 /bin, /sbin, /usr/bin, /usr/sbin
动态链接库在 /lib, /usr/lib
可以免得安装一个库之后,其他依赖这个库的软件发生“找不到 libxxx.so”错误,还需要手动配置各种环境变量啥的

坏处就是像你说的,一个软件包安装之后就变成“散装”的了,各个文件散布在不同地方,包管理器需要记录每个软件包和它的文件的对应关系才能工作

至于你的想法“直接在一个固定的目录下面不行吗?”
当然行啊,只不过不符合一直以来比较主流的约定罢了
比如 NixOS 这个发行版,就可以认为是把每个软件都安装在 /nix/store 路径下面一个“固定的目录”里面(当然实际情况要比这复杂得多)
adoal
2022-05-11 16:09:10 +08:00
我见过很多不做运维的纯开发人员都对 FHS 困惑和反感😄

https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
adoal
2022-05-11 16:17:58 +08:00
把文件按作用分类到不同目录,而不是按业务领域,有些可能的好处。因为通常文件在文件系统里的权限、性能、易变性是按作用而不是按业务领域来划分的。

比如[/usr]/[bin|sbin]下的可执行程序、[/usr]/lib 下的动态链接库,/usr/share 下的静态数据,通常不需要普通用户有写入权限;/var/lib 下的数据库、/var/log 下的日志通常需要各自的 uid 有写入权限;/etc 下的配置通常在程序和数据做小版本升级时不需要改动,但管理员可能要单独修改;/run 下的 pid 、socket 最好在系统重启后就没了,以免判断错误。等等。
再比如,在资源受限的环境(比如路由器),可执行程序和不可变数据可以做成只读的压缩文件系统,启动后部分解到内存或者按需解开;配置文件需要改变后持久化到闪存;日志通常不需要持久保留。

按 FHS 划分就很容易为不同业务功能但相同作用的文件设置统一的存储策略。而按业务领域划分,从这个角度看反而是散乱的。
adoal
2022-05-11 16:20:55 +08:00
RPM 系和 DEB 系主流发行版里打包好的包都是按 FHS 来。

而单位自用业务系统里的业务功能部分,不论是搞外包的传统行业的信息化还是自养开发团队的互联网,普遍倾向于按业务领域划分,everything-under-business-prefix……
huyangq
2022-05-11 16:38:38 +08:00
哦哦 那问题来了 假如我在启动的时候 需要改一下配置文件 比如我改一下端口号 那还得找 那多麻烦啊
huyangq
2022-05-11 16:39:49 +08:00
@adoal 鱼跟熊掌不可兼得 有点理解了
libook
2022-05-11 16:47:06 +08:00
FHS 是个通用标准,大家尽量按照统一标准来做。

放独立目录也不是不可以,比如自己编译的一些软件可能会放在 opt 目录下,但你就得自己搞定环境变量啥的,不像统一放在 bin 、lib 目录下有统一的环境变量可以用。
yohole
2022-05-11 17:06:09 +08:00
不懂就问:macos 现在安装的软件是不是就放在一个文件中,卸载其实就是直接把这个文件删除掉?
iamzuoxinyu
2022-05-11 17:14:58 +08:00
@yohole 有一些其实就是个 xxx.app 文件夹,运行的依赖都在里面,常见于纯 GUI app 。cli app ,其实也大体遵从这个规范的。
libook
2022-05-11 17:19:52 +08:00
@huyangq #11 配置文件通常统一放在 etc 下面,很好找的,惯例也是只动这个目录下的配置文件,其他目录的作为默认配置被覆盖。
libook
2022-05-11 17:23:48 +08:00
@yohole #14 macos 安装软件分两种,一种是跑在苹果自己的应用框架下的应用程序,统一放在 Applications 里;另一种是 Unix 程序,也会放在 FHS 结构里。
andyhuzhill
2022-05-11 17:24:39 +08:00
@huyangq 都按照 FHS 标准的话 配置文件都在 /etc 目录下了 很好找啊
libook
2022-05-11 17:25:12 +08:00
@yohole #14 其实 Linux 也有类似 macos 的方案,比如 snap 应用,可以了解一下。
SenLief
2022-05-11 17:39:32 +08:00
linux 也有 snap 这种放在一起的。FHS 的标准好处是,你想要修改配置文件理论应该在 /etc/app/下面。

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

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

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

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

© 2021 V2EX