/usr本来是因为开发Unix时/已经满了,新的硬盘挂载到/usr下存放不太重要的程序和文件。在早期Unix中/usr除了程序,还存储游戏(/usr/games), X11环境(/usr/X11r6),源码(/usr/src),目标文件(/usr/obj),早年没有/home,用户目录也是位于/usr下面的。
在/和/usr分为不同分区的安装方式下,系统先挂载/,然后启动时再挂载/usr,因此/bin、/sbin、/lib下的程序必须足以支撑启动到挂载/usr时。
然而,现在的Linux已经和当初Unix的时代有很大不同了,通常/和/usr会安装到一个分区下,因此区分/和/usr下的bin、lib已经没有多少意义了,很多发行版和程序作者甚至不愿意处理分离的/和/usr,这也包括推动Linux“现代化”的systemd。
自systemd 255起,systemd已经不再支持分离的/和/usr分区。因此原本位于/下的程序必须迁移至/usr,这被称为usr-merge。此外,容器化部署的Linux系统实际上将/和/usr作出了另一种解释,即/下的其他配置文件和数据属于持久保持的状态,而/usr是操作系统的程序文件,系统可以原子的更新或者回退/usr而不影响/下的数据。
而/usr/local的布局和/usr一样,在Linux上用于部署非Linux发行版打包,而是系统管理员自己编译的软件(通常预编译的二进制软件安装在/opt下)。在BSD上,/usr/local存储包管理器(如ports)安装的第三方软件。理论上,删除/usr/local下的所有文件都不会影响系统的运行。
在/、/usr或者/usr/local下,各个文件夹的作用为
最近在进行Linux应用软件的一些编译和安装工作。因为对Linux源码编译软件,包安装,依赖解决等流程一直都不是很熟悉,所以想借此机会梳理一下有关知识点。在以往的工作中遇到问题,要么就是通过yum命令直接安装软件包,要么就是按网上的教程无脑执行指令,大概率也能解决问题。
首先需要了解清楚Linux的目录结构,目录设计都是有一定规范的,编译,安装,更新,解决依赖,读取动态库等都会遵循这些目录,因此熟悉掌握Linux目录对工作中编译安装软件,环境配置,或者解决各种找不到文件,找不到依赖等问题,会非常有帮助。
安装tree命令,执行tree -L 1 /
以下是根目录[ / ]下的结构 + 每个目录的解释

根目录[ / ]下的不常用的目录功能只需要大概了解一下就行,不需要熟记
重要目录一定要记得功能和了解
重要的目录有:etc lib lib64 root bin sbin usr var
【第一个是/usr】:执行tree -L 1 /usr
以下是目录[ /usr ]下的结构

解释如下:
[usr/bin]
所有一般用户能够使用的指令都放在这里!
而使用链接文件的方式将 /bin 也链接至此!
也就是说,/usr/bin 与 /bin 是一模一样了!
另外,FHS要求在此目录下不应该有子目录!
所以此目录下不会存在目录,都是能够使用的命令!
[/usr/etc]
用来存放用户所需要的配置文件和子目录
[/usr/games]
与游戏比较相关的数据放置处
[/usr/include]
c/c++等程序语言的头文件(header)等
当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时
会使用到里头的许多包含档
[/usr/lib/]
与 /lib 功能相同,/lib 也是链接到此目录的!
[/usr/lib64/]
与 /lib 功能相同,不过存放的是64位的
[/usr/libexec/]
某些不被一般使用者惯用的可执行文件或脚本(script)等等,会放置在此目录中
例如大部分的 X 窗口下面的操作指令, 很多都是放在此目录下的
[/usr/sbin/]
系统正常运行所需要的系统指令
基本功能与 /sbin 也差不多, 因此 /sbin 也是链接到此目录中!
[/usr/share/]
主要放置只读架构的数据文件,当然也包括共享文件。在这个目录下放
置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文字文
件嘛!在此目录下常见的还有这些次目录:
/usr/share/man:线上说明文档
/usr/share/doc:软件杂项的文件说明
/usr/share/zoneinfo:与时区有关的时区文件
[/usr/src/]
一般源代码建议放置到这里,src有source的意思
至于核心源代码则建议放置到/usr/src/linux/目录下
[/usr/local/]
系统管理员在本机自行安装自己下载的软件建议安装到此目录,这样会比较便于管理
举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版
此时你可以将新版软件安装于/usr/local/目录下,就与原先的旧版软件有分别啦!
你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib的次目录!
【第二个是/usr/local/】:执行tree -L 1 /usr/local
以下是目录[ /usr/local ]下的结构

因为[ /usr/local ]目录和前面的目录有相似之处,这里就作个对比:
[/bin] = 直接连接到/usr/bin
[/usr/bin] = 存放着系统的命令,可执行程序等
[/usr/local/bin] = 存放着用户安装的可执行程序
[/etc] = 存放所有的系统管理所需要的配置文件和子目录
[/usr/etc] = 存放系统软件的配置文件
[/usr/local/etc] = 存放用户安装软件的配置
[/games] = 存放系统游戏相关数据
[/usr/games] = 存放系统游戏相关数据
[/usr/local/games] = 存放用户游戏相关数据
[无] =
[/usr/include] = c/c++用到的头文件,很多程序编译都会调用
[/usr/local/include] = 自己写的c/c++头文件,自己使用的
[/lib] = 直接连接到/usr/lib
[/usr/lib] = 存放着系统默认的动态库,静态库,常用并重要的系统库都放在这里
[/usr/local/lib] = 存放着用户安装软件时编译的库(32位库)
[/lib64] = 直接连接到/usr/lib64
[/usr/lib64] = 存放着系统默认的动态库,静态库,常用并重要的系统库都放在这里
[/usr/local/lib64] = 存放着用户安装软件时编译的库(64位库)
[/无] =
[/usr/libexec] = 存放着系统某些不被一般使用者惯用的可执行文件或脚本
[/usr/local/libexec] = 存放着用户某些不被一般使用者惯用的可执行文件或脚本
[/无] =
[/usr/share/man] = 存放系统软件的配置文件,一些共享文件,类似于指导帮助手册
[/usr/local/man] = 用户安装软件时,放置类似指导帮助手册
[/sbin] = 直接连接到/usr/sbin
[/usr/sbin] = 存放的是系统管理员使用的,系统才能执行的程序
[/usr/local/sbin] = 存放的是用户安装的软件,系统才能执行的程序
[无] =
[/usr/share] = 放置系统的只读架构的数据文件,也包括共享文件
[/usr/local/share] = 放置用户的只读架构的数据文件,也包括共享文件
[无] =
[/usr/src] = 存放系统软件的的源代码
[/usr/local/src] = 存放用户下载的软件的源代码
特别说明
在根外面的
/bin ---> /usr/bin
/sbin ---> /usr/sbin
/lib ---> /usr/lib
/lib64 ---> /usr/lib64
都需要被链接到/usr里面
这里说一下链接的原因:
早期 Linux 在设计的时候,若发生问题时,救援模式通常仅挂载根目录而已
因此有五个重要的目录被要求一定要与根目录放置在一起, 那就是: /etc, /bin, /dev, /lib, /sbin
现在许多的 Linux distributions 由于已经将许多非必要的文件移出 /usr 之外了, 所以 /usr 也是越来越精简
同时因为 /usr 被建议为“即使挂载成为只读,系统还是可以正常运行”的模样,所以救援模式也能同时挂载 /usr 喔
因此那个五大目录的限制已经被打破了呦!就将/sbin, /bin, /lib 通通移动到 /usr 下面了
【第三个是/usr/local/app-name】:执行tree -L 1 /usr/local/app-name
以下是目录[ /usr/local/app-name]下的结构

这就是通过源码安装软件后,安装目录下的结构,都是有一定规范的
有些可能还带有src,doc等,不一定都是完全这样,但都差不多
根据上面的目录分析,很容易理解软件安装下的目录的含义了
注意:
用户自己安装软件路径一般是可选择的,不一定是在/usr/lcoal/目录下。
但一般都以/usr/lcoal/app-name为默认安装路径
比较常用和重要目录
用户可执行文件:/bin、 /usr/bin、 /usr/local/bin
系统可执行文件:/sbin、 /usr/sbin、 /usr/local/sbin
共享库:/lib、 /usr/lib、 /usr/local/lib 或者 /lib64、 /usr/lib64、 /usr/local/lib64
源文件:/usr/src、 /usr/local/src
配置:/etc、 /usr/etc、 /usr/local/etc
头文件:/usr/include、 /usr/local/include
一般目录
主目录:/root、 /home/username
其他挂载点:/media、 /mnt
分享目录:/usr/share、 /usr/local/share
内核和Bootloader:/boot
服务器数据:/var、 /srv
系统信息:/proc、 /sys
正好之前设计过相关的知识卡片,先放出来:

图示解析
这几个目录,本质上其实是三个目录和两种用户之间的排列组合的结果:
三个目录(根目录、/usr、/usr/local) × 两种用户(bin 给所有用户,sbin 给管理员用户)。
注意这些目录下断网断挂载也要能用。
主要安装区。提供绝大多数系统可执行文件。
bin对应普通用户,sbin对应管理员(当然他也可以用bin)。
谁提供:系统/发行版(/usr) ,本机管理员(/usr/local)。
是否启动必需:必须(/bin、/sbin) ,非必需(/usr/*)。

