您当前的位置:首页 > 计算机 > 系统应用 > Linux

Linux文件系统中/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin文件夹的区别是什么?

时间:02-10来源:作者:点击数:

/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下,各个文件夹的作用为

  • bin:程序,包括elf程序和脚本
  • lib:库。在支持multilib的系统上可能分为lib和lib64
  • libexec:不能直接运行的程序,需要被其他程序调用。一些发行版合并进了bin
  • sbin:管理员才有权限执行的程序。一些发行版合并进了bin
  • share: 非程序文件
  • include: 头文件
  • etc: 配置文件

最近在进行Linux应用软件的一些编译和安装工作。因为对Linux源码编译软件,包安装,依赖解决等流程一直都不是很熟悉,所以想借此机会梳理一下有关知识点。在以往的工作中遇到问题,要么就是通过yum命令直接安装软件包,要么就是按网上的教程无脑执行指令,大概率也能解决问题。

首先需要了解清楚Linux的目录结构,目录设计都是有一定规范的,编译,安装,更新,解决依赖,读取动态库等都会遵循这些目录,因此熟悉掌握Linux目录对工作中编译安装软件,环境配置,或者解决各种找不到文件,找不到依赖等问题,会非常有帮助。

【 / 】

安装tree命令,执行tree -L 1 /

以下是根目录[ / ]下的结构 + 每个目录的解释

根目录[ / ]下的不常用的目录功能只需要大概了解一下就行,不需要熟记

重要目录一定要记得功能和了解

重要的目录有:etc lib lib64 root bin sbin usr var

【 /usr 】

【第一个是/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 】

【第二个是/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】

【第三个是/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

  • 含基础命令,开机到最小救援都包含。
  • 示例:ls、cp、mv、bash 等。

/sbin

  • 系统管理、修复、分区等关键工具,主要是救援/启动早期使用。
  • 示例:reboot、fdisk、init 等。
注意这些目录下断网断挂载也要能用。

发行版的标准配给目录

/usr/bin(标准应用区)

  • 发行版仓库装来的大多数用户程序。
  • 示例:gcc、python、vim、git。

/usr/sbin(标准运维区)

  • 官方提供的服务端/管理类程序与工具。
  • 示例:useradd、cron、sshd。
主要安装区。提供绝大多数系统可执行文件。

本机自装地盘

/usr/local/bin(自带装备)

  • 你自己手动编译/安装、给所有用户用的程序与脚本。
  • 很典型的,例如:源码 make install 的可执行文件、自定义脚本。

/usr/local/sbin(自建运维角)

  • 你自装的管理员工具、服务启动脚本、定制小工具或者脚本。

bin对应普通用户,sbin对应管理员(当然他也可以用bin)。

谁提供:系统/发行版(/usr) ,本机管理员(/usr/local)。

是否启动必需:必须(/bin、/sbin) ,非必需(/usr/*)。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐