/etc/fstab文件的格式
GDT,超级块,Indode,校验码
inode表,inode组成,地址指针结构
创建文件:位图索引
查找文件:目录
硬链接,软链接
删除文件,复制文件,移动文件
开机后,首先挂载的是根,然后手动通过根中的mount命令,关联其他分区至根
自动挂载的实现
1)定义在/etc/fstab文件中
2)挂载的文件系统支持auto选项
/etc/fstab文件为何开机能自动挂载
系统初始化脚本会起用mount命令扫描/etc/fstab文件中的每一行
/etc/fstab文件定义的条目
1、文件系统非正常关机,开机时,是否检测?
2、文件系统中有重要的文件,是否备份?
/etc/fstab文件的格式
1
2
|
UUID=07151862-c2b9-45dc-bf7a-af8d2a6fa6c1 / ext3 defaults 1 1 要挂载的设备或伪文件系统 挂载点(设备挂载的位置) 文件系统类型 挂载选项 转储频率(备份频率) 自检次序 |
1)要挂载的设备或伪文件系统
LABEL="LABEL", UUID="UUID",伪文件系统(devpts,proc,sysfs),设备文件,目录
CentOS 6: 设备文件名,LABEL。当文件过多时,LABEL可能重复。设备文件名可能改变
CentOS 7: btrfs文件系统,UUID ,UUID_SUB,UUID:全局唯一标示符,就算设备名改变此 UUID不会改变
2)MOUNT_POINT: 目录
3)文件系统的类型: ext2,ext3,ext4,xfs,btrfs
4)挂载选项:mount -o OPTIONS中所有选项:
sync,nosuid,nodev,noatime,noexec,ro
5)转储/备份频率:多长时间备份一次
0 不备份,1 每天备份一次,2每隔一天备份一次
现在一般不会用到此功能:
1、对目录的备份:周期性任务计划
2、对文件系统的备份:用dump备份工具
3、数据库有专用的备份工具(mysqldump,lv_snapshot,percona-xtraDB)
6)自检的次序
0:不自检,1首先自检,通常为rootfs,2在1次序对应的设备自检完毕后,才能自检。.... 9
不同设备有相同的自检序号时,开机同时自检
实现开机自动挂载
1、清空磁盘
1
2
3
4
5
|
# dd if=/dev/zero of=/dev/sdb count=1 bs=512 ** dd 命令**更为底层的复制
将 if 中的文件复制至of中,of可为文件,可为文件系统
bs=512: ## 512bytes,0磁道,0扇区,0柱面MBR
count=1 ## 次数
|
2、分区
1
2
3
4
5
6
7
8
9
10
|
# fdisk /dev/sdb p 显示分区表
n 新增磁盘分区
+10G
w 保存退出
# cat /proc/partitions # ls /dev/sdb* # partx -a /dev/sdb |
3、格式化磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@localhost ~] # mkfs.ext4 -L 'My222' -U $(uuidgen) /dev/sdb1
mke2fs 1.41.12 (17-May-2010) 文件系统标签=My222 操作系统:Linux 块大小=4096 (log=2) ##默认
分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655776 inodes, 2622603 blocks 131130 blocks (5.00%) reserved for the super user ##默认
第一个数据块=0 Maximum filesystem blocks=2688548864 81 block groups
32768 blocks per group, 32768 fragments per group 8096 inodes per group Superblock backups stored on blocks: ##超级块路径
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 25 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. |
4、尝试挂载
1
2
3
4
|
[root@localhost ~] # mount /dev/sdb1 /mnt
[root@localhost ~] # ls /mnt
lost+found [root@localhost ~] # umount /mnt
|
5、定义于fstab文件
1
2
|
# vim /etc/fstab /dev/sdb1 /mydata ext4 defaults,acl 2 3
|
ext文件系统结构
文件系统创建时,划分成多个大小相等的块,再将几个块归并为一个组。整个文件系统的结构信息,保存于超级块中。每个组内的结构信息保存于GDT块中。
1、超级块
查看超级块结构信息:
1
2
3
4
5
6
|
[root@localhost ~] # dumpe2fs -h /dev/sdb1
[root@localhost ~] # tune2fs -l /dev/sdb1
整个分区: 有多少个块组,每组有多少个块或Inode,及使用情况
共有多少个Inode块,多少已用,多少未用。
共有多少个Block块,多少已用,多少未用。
|
超级块的位置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@localhost ~] # mkfs -t ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010) 文件系统标签= 操作系统:Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655776 inodes, 2622603 blocks 131130 blocks (5.00%) reserved for the super user
第一个数据块=0 Maximum filesystem blocks=2688548864 ## 共有块数
81 block groups ## 块组数
32768 blocks per group ## 每个组有多少Block
32768 fragments per group 8096 inodes per group ## 每个组有多少inode
Superblock backups stored on blocks: ## 超级块的位置
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
|
2、GDT块
查看GDT块结构信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@localhost ~] # dumpe2fs /dev/sdb1
Group 80 当前分区块组编号 (Blocks 2621440-2622602) [INODE_UNINIT, ITABLE_ZEROED] ##块组中块数量
Checksum 0x1b87 ##校验和
unused inodes 8096 ##没有使用的inode
Block bitmap at 2621440 (+0) ## 块位图
Inode bitmap at 2621456 (+16) ## inode位图
Inode table at 2621472-2621977 (+32) ## inode表
655 free blocks ## 块组中空闲的块
8096 free inodes ## 块组中空闲的inode
0 directories
8096 unused inodes 0
Free blocks: 2621441-2621455, 2621457-2621471, 2621978-2622602 ##空闲的块
Free inodes: 647681-655776 ##空闲的inode
|
基础名词:
校验码
作用:检查数据的完整性
校验方法:
1、数据提供校验码,
2、使用前,计算数据的检验码
3、将计算结果与之前的校验码比对,一样,数据可靠。不一样,不可靠的数据
inode ,inode index
inode是文件的一级索引(稠密索引,一个文件对应一个索引节点)
inode组成: size, perm, owner, group, timestamp + 地址指针:文件存储的数据块的编号
inode引用: inode编号
inode空间:计算机标识每个磁盘块,用一个二进制数字。
例如65535个数据块,用16个0到16个1之间的所有变化,每一种变化对应一个磁盘块。Inode中只用存储这些编号,即可找到文件中所有的数据块。
如果数据块过多,二进制位过长时,单个磁盘块的编号过长,inode空间可能存储不下。
inode地址指针结构:
直接指针: 直接引用固定个数的块的编号,引用的块的数量太少
间接指针: 每个块编号指向另一个连续的空间。目的为了扩展空间。类似于扩展分区
三级指针:另一个连续空间中的块中的编号,又指向一个连续的空间
在文件系统中创建文件的过程
遍历查找
在一级索引(Inode表)中以遍历的方式查找
1、找空闲Inode:在inode表中,根据inode的标志位遍历的方式找空闲的inode
2、找空闲block: 根据block的标志位遍历的方式找空闲的block,每次查找为单个inode分配固定个数的块。
如果此次存储的文件较小时,将没有用到的块的状态标识为0即可。
如果文件存储文件较大时,再次分配固定数量的块给inode,依次循环,直到存储完毕。
标志位:标示每个inode或block块使用的状态(使用为1 | 未使用为0 )
索引查找
由于遍历的文件过于低效,就在原基础之上在建立一个索引(位图索引),将使用状态为0归为一类,将使用状态为1归为一类
1、找空闲Inode:查找inode位图索引
2、找空闲block: 查找block位图索引
位图索引的建立时也需要全盘扫描,才知道每个标志位状态,为了便于建立块位图,inode位图,在每个块组中都有一个块位图和Inode位图。
在文件系统中查找文件的过程
1、找到inode块
2、找到block块
目录:存储在磁盘块中,磁盘块中记录了文件名及文件名对应的inode号码
查找/etc/sysconfig/network-scripts/ifcfg-eth0的过程
/内核开机挂载了根,就能识别根目录下文件及inode号码
根据etc文件名对应的inode号码在inode位图中找到inode所对应的inode,据inode中的数据块编号,在block bitmap中找到块,返回文件名及对应的inode号码,说明是一个目录
根据sysconfig文件名对应的inode号码在inode位图中找到inode所对应的inode,据inode中的数据块编号,在block bitmap中找到块,返回文件名及对应的inode号码,说明是一个目录
根据network-scripts文件名对应的inode号码在inode位图中找到inode所对应的inode,据inode中的数据块编号,在block bitmap中找到块,返回文件名及对应的inode号码,说明是一个目录
根据ifcfg-eth0文件名对应的inode号码在inode位图中找到inode所对应的inode,据inode中的数据块编号,在block bitmap中找到块,返回文件的内容,说明是一个文件。
硬链接和软链接的区别
硬链接:同一设备下不同文件指向相同的inode
创建: ln [-v] SRC DEST
测试两个文件是否为硬链接: [ FILE1 -ef FILE2 ]
使用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
***文件名,不能以数字开头*** 1、测试两个文件是否为硬链接 1)查看inode [root@localhost ~] # ls -li file.txt 131.txt
1968181 -rw-r--r-- 1 root root 28 Aug 9 08:28 131.txt 1968192 -rw-r--r-- 1 root root 28 Aug 10 14:34 file .txt
2)测试 [root@localhost ~] # [ 131.txt -ef file.txt ]
[root@localhost ~] # echo $?
1 2、创建硬链接 [root@localhost ~] # ln -v 131.txt 13110.txt
`13110.txt ' => `131.txt'
[root@localhost ~] # ls -li 13110.txt 131.txt
1968181 -rw-r--r-- 2 root root 28 Aug 9 08:28 13110.txt 1968181 -rw-r--r-- 2 root root 28 Aug 9 08:28 131.txt 3、测试 [root@localhost ~] # [ 13110.txt -ef 131.txt ]
[root@localhost ~] # echo $?
0 |
特性:
不能对目录,循环引用
不能跨分区
同一设备同一个inode,会增加Inode引用计数
删除硬链接指向的文件:表示删除文件的路径,把inode计数-1
1
2
3
4
5
6
7
8
9
10
11
12
13
|
1、查看引用计数 [root@localhost ~] # ls -li 13110.txt 131.txt
1968181 -rw-r--r-- 2 root root 28 Aug 9 08:28 13110.txt 1968181 -rw-r--r-- 2 root root 28 Aug 9 08:28 131.txt 2、删除硬链接 [root@localhost ~] # rm 13110.txt
rm : remove regular file `13110.txt'? y
3、查看引用计数 [root@localhost ~] # ls -li 13110.txt 131.txt
ls : cannot access 13110.txt: No such file or directory
1968181 -rw-r--r-- 1 root root 28 Aug 9 08:28 131.txt |
当引用计数为0时,Inode位图中此inode编号对应的Inode块状态为0,inode对应的磁盘块的状态为0
软链接:根据文件名对应的inode号码在inode位图中找到inode所对应的inode,inode中不是地址指针/数据块编号,是一串数字
创建:ln -s [-v] SRC DEST
1
2
3
4
5
|
[root@localhost ~] # ln -sv 131.txt 131.lk
`131.lk ' -> `131.txt'
[root@localhost ~] # ls -l 131.txt 131.lk
lrwxrwxrwx 1 root root 7 Aug 10 14:43 131.lk -> 131.txt -rw-r--r-- 1 root root 28 Aug 9 08:28 131.txt |
特性:
可以对目录和文件
可以跨分区
指向另一个文件的路径,其大小为路径字符串的长度,不会增加inode引用计数
删除软链接指向的文件:删除引用路径
1
2
3
4
5
6
7
8
9
10
|
[root@localhost ~] # ls -l 131.txt 131.lk
lrwxrwxrwx 1 root root 7 Aug 10 14:43 131.lk -> 131.txt -rw-r--r-- 1 root root 28 Aug 9 08:28 131.txt [root@localhost ~] # rm 131.txt
rm : remove regular file `131.txt'? y
[root@localhost ~] # ls -l 131.txt 131.lk
ls : cannot access 131.txt: No such file or directory
lrwxrwxrwx 1 root root 7 Aug 10 14:43 131.lk -> 131.txt |
复制文件和移动文件的区别
复制文件
创建新的文件,在Inode位图中查找,后在block位图中查找,引用新的Inode,block。读出数据和写入数据。
1
2
3
4
5
6
7
8
|
[root@localhost ~] # ls -li 1311.txt
1968186 -rw-r--r-- 1 root root 29 Aug 9 08:29 1311.txt [root@localhost ~] # cp 1311.txt a.txt
[root@localhost ~] # ls -li 1311.txt a.txt
1968186 -rw-r--r-- 1 root root 29 Aug 9 08:29 1311.txt 1968181 -rw-r--r-- 1 root root 29 Aug 10 14:52 a.txt |
移动文件
同分区,创建硬链接后,删除原文件
1
2
3
4
5
6
7
|
[root@localhost ~]# ls -li a.txt 1968181 -rw-r--r-- 1 root root 29 Aug 10 14 : 52 a.txt
[root@localhost ~]# mv a.txt b.txt [root@localhost ~]# ls -li b.txt 1968181 -rw-r--r-- 1 root root 29 Aug 10 14 : 52 b.txt
[root@localhost ~]# ls a.txt ls: cannot access a.txt: No such file or directory |
跨分区: 在新分区中创建新的文件,在新分区的位图中查找,引用新的Inode,block。读出数据和写入数据。