1 Linux文件系统分层结构:FHS
FHS(Filesystem Hierarchy Standard:文件系统层次化标准),是由Linux基金会维护的,帮助发行版厂商和开发者们使用共同的标准来约定其发行的Linux系统或开发的软件遵守共同的文件和目录标准。
FHS是多数Linux版本采用的文件组织形式,采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。
官方网站:https://www.pathname.com/fhs/
- 文件和目录被组织成一个单根倒置树结构
- 文件系统从根目录下开始,用“/”表示
- 根文件系统(rootfs):root filesystem
- 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
- 以 . 开头的文件为隐藏文件
- 路径以 / 分隔
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 蓝色–>目录,绿色–>可执行文件,红色–>压缩文件,浅蓝色–>链接文件,灰色–>其他文件等
- 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
- 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
2 常见的文件系统目录功能
/boot #引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
/bin #所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin #管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib #启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64 #专用于x86_64系统上的辅助共享库文件存放位置
/etc #配置文件目录
/home/USERNAME #普通用户家目录
/root #管理员的家目录
/media #便携式移动设备挂载点
/mnt #临时文件系统挂载点
/dev #设备文件及特殊文件存储位置,b:block device,随机访问,c:character device,线性访问
/opt #第三方应用程序的安装位置
/srv #系统上运行的服务用到的数据
/tmp #临时文件存储位置
/usr #universal shared, read-only data
/usr/bin #保证系统拥有完整功能而提供的应用程序
/usr/sbin #同上
/usr/lib #32位使用
/usr/lib64 #只存在64位系统
/usr/include #C程序的头文件(header files)
/usr/share #结构化独立的数据,例如doc, man等
/var #variable data files,可变数据目录
/var/cache #应用程序缓存数据目录
/var/lib #应用程序状态信息数据
/var/local #专用于为/usr/local下的应用程序存储可变数据
/var/lock #锁文件
/var/log #日志目录及文件
/var/opt #专用于为/opt下的应用程序存储可变数据
/var/run #运行中的进程相关数据,通常用于存储进程pid文件
/var/spool #应用程序数据池
/var/tmp #保存系统两次重启之间产生的临时数据
/proc #用于输出内核与进程信息相关的虚拟文件系统
/sys #用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux #security enhanced Linux,selinux相关的安全策略等信息的存储位置
3 应用程序的组成部分
不同类型文件常用的目录
文件类型 |
常用目录 |
二进制文件 |
/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 |
4 Linux下的文件类型
linux 系统中的文件类型标识符
文件类型 |
标识符 |
说明 |
普通文件 |
– |
|
目录文件 |
d |
directory |
符号链接文件 |
l |
link |
块设备文件 |
b |
block |
字符设备文件 |
c |
character |
管道文件 |
p |
pipe |
套接字文件 |
s |
socket |
示例:
5 linux系统中的文件类型颜色标识
linux系统中,每种颜色都有对应的含义,可以根据文件在终端中显示的颜色,来判断是什么类型的文
件
6 文件通配符模式wildcard pattern
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元meta字符
常见的通配符如下:
* #匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? #匹配任何单个字符,一个汉字也算一个字符
~ #当前用户家目录
. #当前工作目录
~+ #当前工作目录
~- #前一个工作目录
~mage #用户mage家目录
[0-9] #匹配数字范围
[a-z] #一个字母
[A-Z] #一个字母
[wang] #匹配列表中的任何的一个字符
[^wang] #匹配列表中的所有字符以外的字符
[^a-z] #匹配列表中的所有字符以外的字符
另外还有在Linux系统中预定义的字符类表示法如下:
[:digit:] #任意数字,相当于0-9
[:lower:] #任意小写字母,表示 a-z
[:upper:] #任意大写字母,表示 A-Z
[:alpha:] #任意大小写字母
[:alnum:] #任意数字或字母
[:blank:] #水平空白字符
[:space:] #水平或垂直空白字符
[:punct:] #标点符号
[:print:] #可打印字符
[:cntrl:] #控制(非打印)字符
[:graph:] #图形字符
[:xdigit:] #十六进制字符
7 文件元数据和节点表结构
7.1 inode表结构
在Linux系统中,一切皆文件,每个文件,又分为文件元数据和具体内容两部份,
一个文件元数据和其具体内容数据,在磁盘分区上,是分开存放的。这种存储文件元数据的区域就叫 inode,中文译作 “索引节点”,
每个文件都有一个inode和n(n>=1)个block 数据块,inode 存储文件元数据,数据块存储文件具体内容数据
磁盘在格式化时,系统会自动将磁盘分为两个区域,
一个是 inode 区(inode table),用来存放文件的 inode,
另一个是数据区,分成很多个block(块),用来存放文件的具体内容数据,
一个磁盘分区上有多少个inode和多少个block,由系统自行决定,跟文件系统,磁盘分区大小,数据块大小有关,
一个磁盘分区,能存放多少个文件,由文件大小,磁盘分区大小,inode数量决定,
inode 编号可重复使用,当删除一个文件之后,其 inode 编号会被回收,供下次新文件使用
每一个inode表记录对应的保存了以下信息:
- inode number(索引节点编号)
- 文件类型
- 权限
- 属主属组
- 链接数
- 文件大小
- 各时间戳
- 指向具体数据块的指针
- 有关文件的其他数据
以指针大小为4字节,block块大小为4KB为前置条件
指针大小和block 块大小跟操作系统平台,以及文件系统有关;
直接指针
12个直接指针,直接指向具体数据块,如果block 大小为 4096(4K),则直接指针可以保存 48KB的文件
间接指针
1个间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体 数据
如果block 大小为 4096(4K),一个指针占用4字节,所以此处可以存储 4096/4=1024个 block 地址;
则可以存储的数据大小为 1024*4096=4MB
双重间接指针
1个双重间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
如果block 大小为 4096(4K),一个指针占用4字节,所以此处可以存储 4096/4=1024个 block 地址;
同理,其指向的 1024个block上,也都是存储的指针地址;
则此处可以存储的数据大小为 1024x1024x4096=4GB
三重间接指针
1个三重间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
如果block 大小为 4096(4K),一个指针占用4字节,所以此处可以存储 4096/4=1024个 block 地址;
同理,其指向的 1024个block上,也都是存储的指针地址
则此处可以存储的数据大小为 1024x1024x1024x4096=4TB
单文件最大容量
12x直接指针 + 间接指针 + 双重间接指针 + 三重间接指针
目录
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系
- 文件引用是一个inode号
- 通过文件名来引用一个文件
- 一个目录是目录下的文件名和文件inode号之间的映射
cp和inode
cp命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
rm和inode
rm命令:
- 链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv和inode
mv命令:
- 如果mv命令的目标和源在相同的文件系统,作为mv命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
- 如果目标和源在一个不同的文件系统, mv相当于cp和rm
inode编号耗尽 & 磁盘已满
#分区越大,可用的节点编号就越多,当前分区有多少个节点编号,就是说能在当前分区上创建多少个文件
#如果当前分区上的节点编号用光,则无法再创建新文件,系统会提示 “No space left on device”
#如果当前分区上的空间用光,同样无法创建新文件,系统同样提示 “No space left on device”
示例:
#查看文件系统类型
[root@ubuntu2204 ~]#df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
tmpfs tmpfs 195M 960K 194M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 97G 5.9G 87G 7% /
tmpfs tmpfs 971M 0 971M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 ext4 2.0G 253M 1.6G 14% /boot
tmpfs tmpfs 195M 0 195M 0% /run/user/0
#查看分区inode
[root@ubuntu2204 ~]#df -i
文件系统 Inodes 已用(I) 可用(I) 已用(I)% 挂载点
tmpfs 248529 756 247773 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 6488064 102830 6385234 2% /
tmpfs 248529 1 248528 1% /dev/shm
tmpfs 248529 3 248526 1% /run/lock
/dev/sda2 131072 320 130752 1% /boot
tmpfs 49705 21 49684 1% /run/user/0
#查看文件inode
[root@ubuntu2204 ~]#stat install.sh
文件:install.sh
大小:2481 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:524307 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2023-04-07 16:34:25.134205647 +0800
最近更改:2023-04-07 16:34:25.134205647 +0800
最近改动:2023-04-07 16:34:25.138205680 +0800
创建时间:2023-04-07 16:34:25.134205647 +0800
7.2 硬(hard)链接
hard link
硬链接的作用是允许一个文件拥有多个有效的路径名,
新增一个文件,指向某个文件的inode,这两个文件就互为硬链接,
也就是多个文件名,都是指向同一个inode,这是硬链接的本质。
硬链接特性
- 创建硬链接会在对应的目录中增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
格式:
ln filename linkname
7.3 符号 symbolic (或软 soft)链接
symbolic link,也称为符号链接,类似于windows中的快捷方式,
软链接是建立一个独立的文件,这个文件的指向的是目标的文件名。
软链接特点
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 软链接如果使用相对路径,是相对于原文件的路径,而非相对于当前目录
- 删除软链接本身,不会删除源目录内容
- 删除源目录的文件,不会删除链接文件
格式:
ln -s filename linkname
示例:为root目录下abc文件创建软链接abc.link
创建跨目录的软链接时,源文件不能以当前路径为准,要以目标文件的路径为准
#错误
[root@rocky86 /]# ln -sv abc /boot/abc.link
'/boot/abc.link' -> 'abc'
[root@rocky86 /]# ll /boot/abc.link
lrwxrwxrwx 1 root root 3 Jul 12 15:08 /boot/abc.link -> abc
#正确
[root@rocky86 /]# ln -sv /root/abc /boot/abc.link2
'/boot/abc.link2' -> '/root/abc'
[root@rocky86 /]# ll /boot/abc.link2
lrwxrwxrwx 1 root root 9 Jul 12 15:10 /boot/abc.link2 -> /root/abc
示例:删除软链接
[root@rocky86 0712]# ll
total 0
drwxr-xr-x 2 root root 48 Jul 12 15:17 dir1
lrwxrwxrwx 1 root root 5 Jul 12 15:18 dir1.link -> dir1/
#这样是删除链接指向的目录
[root@rocky86 0712]# rm -rf dir1.link/
#这样是删除链接文件
[root@rocky86 0712]# rm -rf dir1.link
硬链接和软链接区别总结
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com