11、FHS(Filesystem Hierarchy Standard,文件系统层级标准)

1. 文件系统概念

计算机实质上就是处理数据的设备,这些数据在存储介质中是以文件(File)的形式存在的,而具体该如何保存,以及如何对硬件进行逻辑抽象管理,使其可以保存,就是文件系统的功能之一。

计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

广义角度来讲,Linux系统是有底层的Kernel与上层Application组成。其在计算机启动之前也是以文件的形式存在于外存中,而这些文件保存在外存(以下称为磁盘)的何处位置,Linux的众多发行组织均可以自定义。如此对于用户的学习和使用而言是极为不便的,亦不利于其传播。鉴于此,Linux Foundation(Linux基金会)定义了Linux发行版中,文件所应该遵从的组织方式,即FHS(Filesystem Hierarchy Standard,文件系统层级标准)


FSN

2. 根文件系统

该规范说明了系统上应该存在哪些目录,以及不同文件所应该保存的位置,以下为简要说明

目录 说明
/bin 所有用户可用的基本命令程序文件
/boot 引导加载器必须用到的各静态文件,如kernel、ramfs(initrd),以及grub(bootloader)等
/dev 设备文件与特殊文件
/etc 系统程序的静态配置文件
/home 普通的家目录的集中位置;一般每个普通用户的家目录默认为此目录下与用户名同名的子目录
/lib 为系统启动或根文件系统上的应用程序(/bin,/sbin等)提供共享库,以及为内核提供内核模块
/lib64 特定字长系统上的库文件,如64位系统上为/lib64
/media 挂载点目录,通常用来挂载移动设备
/mnt 挂载点目录,通常挂载额外的临时文件系统
/opt, /options 附加应用程序的安装位置,可选
/proc 虚拟文件系统,用于为内核及进程存储其相关信息
/root 管理员的家目录,可选
/run 存放动态的,不持久的应用程序运行数据
/sbin 供管理员使用的工具程序
/srv 系统上运行的服务用到的数据
/sys sysfs虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径;其主要作用在于为管理Linux设备提供一种统一模型的的接口
/tmp 临时文件
/usr 全局共享的只读数据路径
/var 频繁发生变化的文件
/misc 备用目录,可选
/selinux SELinux(Security Enhanced Linux)相关的安全策略等信息的存储位置
[root@localhost ~]# ls /

bin   dev  home  lib64  mnt  proc  run   srv  tmp  var

boot  etc  lib   media  opt  root  sbin  sys  usr

3. /usr目录层级

usr意为universal shared read-only file,全局共享只读文件,即该目录可以在所有遵循FHS的主机间共享(只读)

目录 说明
/usr/include C程序头文件
/usr/bin 普通用户命令
/usr/sbin 供管理员使用的命令
/usr/lib 库文件
/usr/lib<qual> 特定字长系统上的库文件,如64位系统上为/usr/lib64
/usr/share 命令手册也和自带文档等架构特有的文件的存储位置,例如doc, man等
/usr/X11R6 X-Window程序的安装位置(可选)
/usr/src 程序源码文件的存储位置
/usr/local 第三方软件的安装路径,也是一个独立层级
/usr/games 游戏或教育程序

/usr/local:local目录层级

该目录也是一个独立的层级,其中有bin,sbin等目录,如下内容引用自 https://refspecs.linuxfoundation.org/FHS_2.3/fhs2.3.html#USRLOCALLOCALHIERARCHY

The /usr/local hierarchy is for use by the system administrator when installing software locally. It needs to be safe from being overwritten when the system software is updated. It may be used for programs and data that are shareable amongst a group of hosts, but not found in /usr.
Locally installed software must be placed within /usr/local rather than /usr unless it is being installed to replace or upgrade software in /usr.

Directory Description
bin Local binaries
etc Host-specific system configuration for local binaries
games Local game binaries
include Local C header files
lib Local libraries
man Local online manuals
sbin Local system binaries
share Local architecture-independent hierarchy
src Local source code

4. /var目录层级

/var contains variable data files. This includes spool directories and files, administrative and logging data, and transient and temporary files.

Some portions of /var are not shareable between different systems. For instance, /var/log, /var/lock, and /var/run. Other portions may be shared, notably /var/mail, /var/cache/man, /var/cache/fonts, and /var/spool/news.

/var is specified here in order to make it possible to mount /usr read-only. Everything that once went into /usr that is written to during system operation (as opposed to installation and software maintenance) must be in /var.

If /var cannot be made a separate partition, it is often preferable to move /var out of the root partition and into the /usr partition. (This is sometimes done to reduce the size of the root partition or when space runs low in the root partition.) However, /var must not be linked to /usr because this makes separation of /usr and /var more difficult and is likely to create a naming conflict. Instead, link /var to /usr/var.

Applications must generally not add directories to the top level of /var. Such directories should only be added if they have some system-wide implication, and in consultation with the FHS mailing list.14
目录 说明
/var/log 日志目录及文件
/var/run 运行中的进程相关的数据,通常用于存放进程的PID文件
/var/cache 应用程序缓存数据目录
/var/lib 应用程序状态信息数据
/var/local 专用于为/usr/local下的应用程序存储可变数据
/var/opt 专用于为/opt下的应用程序存储可变数据
/var/spool 应用程序数据池
/vat/tmp 保存系统两次重启之间产生的临时数据

5. /sys目录内容

sys 下的子目录 所包含的内容
/sys/devices 这是内核对系统中所有设备的分层次表达模型,也是 /sys 文件系统管理设备的最重要的目录结构,下文会对它的内部结构作进一步分析;
/sys/dev 这个目录下维护一个按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件,它是在内核 2.6.26 首次引入;
/sys/bus 这是内核设备按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成 Linux 统一设备模型的一部分;
/sys/class 这是按照设备功能分类的设备模型,如系统所有输入设备都会出现在 /sys/class/input 之下,而不论它们是以何种总线连接到系统。它也是构成 Linux 统一设备模型的一部分;
/sys/block 这里是系统中当前所有的块设备所在,按照功能来说放置在 /sys/class 之下会更合适,但只是由于历史遗留因素而一直存在于 /sys/block, 但从 2.6.22 开始就已标记为过时,只有在打开了 CONFIG_SYSFS_DEPRECATED 配置下编译才会有这个目录的存在,并且在 2.6.26 内核中已正式移到 /sys/class/block, 旧的接口 /sys/block 为了向后兼容保留存在,但其中的内容已经变为指向它们在 /sys/devices/ 中真实设备的符号链接文件;
/sys/firmware 这里是系统加载固件机制的对用户空间的接口,关于固件有专用于固件加载的一套API,在附录 LDD3 一书中有关于内核支持固件加载机制的更详细的介绍;
/sys/fs 这里按照设计是用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,但目前只有 fuse,gfs2 等少数文件系统支持 sysfs 接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在 sysctl (/proc/sys/fs) 接口中;
/sys/kernel 这里是内核所有可调整参数的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于 sysctl (/proc/sys/kernel) 接口中 ;
/sys/module 这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在 /sys/module 中:
● 编译为外部模块(ko文件)在加载后会出现对应的 /sys/module/<module_name>/, 并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等;
● 编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的 /sys/module/<module_name>, 这些模块的可用参数会出现在 /sys/modules//parameters/<param_name> 中,
●● 如 /sys/module/printk/parameters/time 这个可读写参数控制着内联模块 printk 在打印内核消息时是否加上时间前缀;
●● 所有内联模块的参数也可以由 “<module_name>.<param_name>=” 的形式写在内核启动参数上,如启动内核时加上参数 “printk.time=1” 与 向 “/sys/module/printk/parameters/time” 写入1的效果相同;
● 没有非0属性参数的内联模块不会出现于此。
/sys/power 这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机、重启等。
/sys/slab (对应 2.6.23 内核,在 2.6.24 以后移至 /sys/kernel/slab) 从2.6.23 开始可以选择 SLAB 内存分配器的实现,并且新的 SLUB(Unqueued Slab Allocator)被设置为缺省值;如果编译了此选项,在 /sys 下就会出现 /sys/slab ,里面有每一个 kmem_cache 结构体的可调整参数。对应于旧的 SLAB 内存分配器下的 /proc/slabinfo 动态调整接口,新式的 /sys/kernel/slab/<slab_name> 接口中的各项信息和可调整项显得更为清晰。

6.其他说明

设备文件

  • 块设备(b)

  • 字符设备(c)

  • 设备号:对设备文件使用ls -l查看时,显示文件大小的位置显示为2个数字,即主设备号(major number)与次设备号(minor number)

    • 主设备号,用于标识设备类型,进而确定要加载的驱动程序
    • 次设备号,用于标识同一类型中的不同的设备;

如:

    [root@localhost ~]# ls -l /dev
    total 0
    crw-rw----. 1 root video    10, 175 Dec 28 22:21 agpgart
    crw-------. 1 root root     10, 235 Dec 28 22:21 autofs
    drwxr-xr-x. 2 root root         180 Dec 28 22:21 block
    drwxr-xr-x. 2 root root          80 Dec 28 22:21 bsg
    crw-------. 1 root root     10, 234 Dec 28 22:21 btrfs-control        
    drwxr-xr-x. 3 root root          60 Dec 28 22:21 bus
    lrwxrwxrwx. 1 root root           3 Dec 28 22:21 cdrom -> sr0
    drwxr-xr-x. 2 root root         100 Dec 28 22:21 centos
    drwxr-xr-x. 2 root root        3060 Dec 28 22:21 char
    crw-------. 1 root root      5,   1 Dec 28 22:21 console
    lrwxrwxrwx. 1 root root          11 Dec 28 22:21 core -> /proc/kcore
    drwxr-xr-x. 6 root root         140 Dec 28 22:21 cpu

/etc中常见目录

  • /etc/opt:/opt下程序的配置文件

  • /etc/sysconfig: 系统级别应用配置

  • /etc/init.d: 系统服务脚本

  • /etc/X11:X协议相关配置文件

  • /etc/sgml:SGML相关配置文件

  • /etc/xml:XML相关配置文件

库文件

  • 在/lib与/lib64中保存有共享库文件

  • 静态库:.a文件,直接链接到程序的地址空间中,作为程序的一部分额运行,便于程序单独管理

  • 动态库:.so(shared object)文件,即使有多个程序要使用,在内存中也只有一份

  • libc.so.*:动态链接的C库

  • ld*:运行时链接器/加载器

  • modules:内核模块文件存储目录

  • Linux上的应用程序的组成部分总结

  • 二进制程序: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin

  • 库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, usr/local/lib64

  • 配置文件:/etc, /etc/DIRECTORY, /usr/local/etc

  • 帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc


END

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,725评论 0 10
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_阅读 1,804评论 0 3
  • Liunx的目录结构 /:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/e...
    TESTME阅读 454评论 0 0
  • FHS介绍 FHS(Filesystem Hierarchy Standard),文件系统层次化标准:http:/...
    Zhang21阅读 2,759评论 0 9
  • /bin:二进制可执行命令。 /dev:设备特殊文件。 /etc:系统管理和配置文件。 /etc/rc.d:启动的...
    CKJ890301阅读 364评论 0 4