文件系统相关知识
在了解文件系统知识前,先来了解几个预备知识。
关于 Linux 的 glibc
库
众所周知,程序编译的方式有两种:
动态链接(如
php
、python
)静态编译(如
c
、c++
)
进程的类型
终端:硬件设备,关联一个用户接口。
所以进程可以分为以下两类:
与终端相关:通过终端启动
与终端无关:操作系统引导启动过程中自动启动
操作系统的组成
从静态的角度可以看成由 kernel
和 application
组成。
从文件系统的角度,可以看成由层级结构组成。
FHS
文件系统层次结构标准(英语:Filesystem Hierarchy Standard,FHS)定义了 Linux 操作系统中的主要目录及目录内容。FHS 由 Linux 基金会维护,当前版本为 3.0 版,于 2015 年发布。
/bin
Essential user command binaries (for use by all users)
存放所有用户可用的基本命令程序文件。
/sbin
存放供系统管理员使用的命令程序文件。
/boot
存放引导加载器必须用到的各类静态文件,例如:kernel
、initramfs(initrd)
、gurb 等。
/dev
存放特殊文件或设备文件,设备有两种类型:
字符设备(线性设备),例如:键盘、屏幕等。
块设备(随机设备),例如:硬盘、内存条等。
/etc
存放系统程序的配置文件,只能为静态文件。
/home
(可选)
普通用户家目录的集中位置。一般每个普通用户的家目录默认为此目录下与用户名相同的子目录,/home/USERNAME
。
/root
(可选)
管理员的家目录。
/lib
为系统启动或根文件系统上的应用程序(/bin,/sbin等)提供共享库,以及为内核提供内核模块
libc.so.*
:动态链接的 C 库。
ld*
:运行时链接器/加载器。
modules
:用于储存内核模块的目录。
/lib64
64 位系统特有的存放 64 位共享库的目录。
/media
便携式设备挂载点(如:USB,移动硬盘),cdrom
、floppy
等
/mnt
其它文件系统的临时挂载点。
/opt
(可选路径)
附加应用程序的安装位置。(早期的程序一般都安装在这个位置,例如 Oracal)
/srv
存放当前主机为服务提供的数据。
/tmp
为那些会产生临时文件的程序提供用于存储临时文件的目录。(此目录可供所有用户执行写入操作,有特殊权限。)
/usr
全局共享的只读数据目录,并且此目录也有层级结构。(此目录是除了根目录以外最重要的目录)
/usr/bin
:和/bin
一样存放所有用户可用的基本命令程序文件,但并不是系统启动就需要用到。
/usr/sbin
:和/sbin
一样存放管理员可用的基本命令程序文件,但并不是系统启动就需要用到。
/usr/lib
:存放/usr/bin
和/usr/sbin
目录下的程序需要用到的C
库文件。
/usr/lib64
:存放/usr/bin
和/usr/sbin
目录下的程序需要用到的 64 位系统C
库文件。
/usr/include
:存放 C 程序头文件。
/usr/share
:存放架构特有的文件,例如CentOS
一般存放:命令手册页,命令自带文档
/usr/local
:也是一个层级结构,下文会专门讲解。
/usr/X11R6
:存放X-Window
程序。
/usr/src
:存放程序源码文件。
/usr/local
让系统管理员安装本地应用程序的目录,也通常用于安装第三方程序。
此目录也是一个层级结构,因此可以独立安装一个文件系统(挂载一个设备)。
它的目录包括 bin
、etc
、game
、include
、lib
、man
、sbin
、share
、src
,层级结构和 /usr
相似,因此不再详细介绍每个目录的作用。
/var
用来存放经常变化的数据的目录。
/var/cache
:存放应用程序的缓存数据
/var/lib
:存放变量状态信息
/var/local
:存放/usr/local
中的程序的变量数据
/var/lock
:存放锁定文件
/var/log
:存放日志文件和目录
/var/opt
:存放/opt
的程序的变量数据
/var/run
:存放与运行进程相关的数据,例如pid
文件
/var/spool
:存放应用程序假脱机数据
/var/tmp
:存放系统重新启动之后仍需要保留的临时文件
/proc
基于内存的虚拟文件系统,用于为内核及进程存储其相关信息,它们多为内核参数,例如 net.ipv4.ip_forward
,虚拟为 net/ipv4/ip_forward
,存储于 /proc/sys/
,因此其完整路径为 /proc/sys/net/ipv4/ip_forward
。
/sys
sysfs
虚拟文件系统提供了一种比 proc
更为理想的访问内核数据的途径,其主要作用在于为管理 Linux 设备提供一种统一模型的接口。
文件类型
在使用 ls -l
命令后会输出如下格式的数据:
drwxr-xr-x. 13 root root 4096 Jan 9 2018 usr
其中第一个字符 d
就代表文件的类型,Linux 中的各字符代表各种文件类型如下:
-
常规文件,即 f
。
d
目录文件(directory)。
b
块设备文件(block device),支持以 block
为单位进行随机访问。
c
字符设备文件(character device),支持以 character
为单位进行访问。
在使用
ls -l /dev
命令后,会输出如下数据:
crw-r--r-- 1 root root 10, 235 Aug 12 2018 autofs
crw------- 1 root root 10, 234 Aug 12 2018 btrfs-control
其中
10, 235
和10, 234
分别代表了major number
(主设备号)和minor number
(次设备号)
major number
用于标识设备类型,进而确定要加载的驱动程序
minor number
用于标识同一类型中不同的设备,范围一般是 0-255(8 位二进制)。
l
符号链接文件(symbolic link)。
p
命名管道(pipe)。
s
套接字文件(socket),主要用于服务提供。
基础命令
命令类型
Linux 的命令类型分为 shell 内建命令
和 外部命令
。
区分内建命令
和外部命令
的方式是使用 type
命令进行查看。
运行
type cd
后,会在屏幕中输出cd is a shell builtin
,所以这是一个内建命令。运行
type whereis
后,会在屏幕中输出whereis is /usr/bin/whereis
,所以这是一个外部命令。需要注意的是,命令还可以有别名,若别名与原名相同,则原名就会被隐藏,如果依然需要运行原命令,而不使用别名,则使用
\COMMAND
即可。例如:运行
type ls
后,会在屏幕中输出ls is aliased to 'ls --color=auto'
分别运行 ls
和 \ls
后的效果:
命令别名
-
获取所有可用别名的定义:
alias
-
定义别名:
alias NAME=COMMAND
,例如:定义clear
命令的别名为cls
,运行alias cls=clear
即可。 -
撤销别名:
unalias NAME
,例如:撤销刚刚定义的cls
命令,使用unalias cls
即可。
注意:定义的别名仅对当前 shell 进程有效,也就是说重新登录后会失效,其他会话也无法使用当前会话定义的别名。
which
命令
shows the full path of (shell) commands.
该命令用来显示 shell 命令的完整路径。
格式: which [options] [--] programname [...]
,例如:which which
、which ls
。
options:
–skip-alias:which 默认会显示命令的别名,使用该选项可以忽略显示命令的别名
whereis
命令
locate the binary, source, and manual page files for a command.
whereis
比 which
更强大,不仅能显示二进制程序的路径,还能显示 source
和 manual
文件的路径。
格式: whereis [options] [-BMS directory... -f] name...
,例如:whereis ls
、whereis which
、whereis whereis
。
options:
-b
:只查找二进制程序路径。
-m
:只查找使用手册文件路径。
who
命令
显示当前系统中所有登录者的信息(show who is logged on)。
格式: who [OPTION]... [ FILE | ARG1 ARG2 ]
options:
-b
:显示系统此次启动的时间。
-d
:显示系统中死亡的进程。
-u
:显示系统中死亡的进程。
-r
:显示运行级别。
w
命令
Show who is logged on and what they are doing.
可以认为此命令是一个增强版的 who
命令。
格式: w [options] user [...]
mkdir
命令
创建目录(make directories)。
格式:mkdir [OPTION]... DIRECTORY...
options:
-p
:自动按需创建父目录。
-v
:verbose,显示详细过程。
-m MODE
:创建时直接给定权限。注意:路径基名方为命令的作用对象,基名之前的路径必须得存在。
rmdir
命令
删除空目录(remove empty directories)。
格式:rmdir [OPTION]... DIRECTORY...
options:
-p
:自动按需创建父目录。
-v
:verbose,显示详细过程。
