1. 文件系统概念
计算机实质上就是处理数据的设备,这些数据在存储介质中是以文件(File)的形式存在的,而具体该如何保存,以及如何对硬件进行逻辑抽象管理,使其可以保存,就是文件系统的功能之一。
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。
广义角度来讲,Linux系统是有底层的Kernel与上层Application组成。其在计算机启动之前也是以文件的形式存在于外存中,而这些文件保存在外存(以下称为磁盘)的何处位置,Linux的众多发行组织均可以自定义。如此对于用户的学习和使用而言是极为不便的,亦不利于其传播。鉴于此,Linux Foundation(Linux基金会)定义了Linux发行版中,文件所应该遵从的组织方式,即FHS(Filesystem Hierarchy Standard,文件系统层级标准)
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 |
---|