Linux之文件系统自动挂载和ext文件系统结构、硬/软链接


/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块中


Linux之文件系统自动挂载和ext文件系统结构、硬/软链接

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,依次循环,直到存储完毕。


        Linux之文件系统自动挂载和ext文件系统结构、硬/软链接

        标志位:标示每个inode或block块使用的状态(使用为1 | 未使用为0 )

    

    索引查找

        由于遍历的文件过于低效,就在原基础之上在建立一个索引(位图索引),将使用状态为0归为一类,将使用状态为1归为一类

        1、找空闲Inode:查找inode位图索引

        2、找空闲block:  查找block位图索引

Linux之文件系统自动挂载和ext文件系统结构、硬/软链接

    

位图索引的建立时也需要全盘扫描,才知道每个标志位状态,为了便于建立块位图,inode位图,在每个块组中都有一个块位图和Inode位图。

Linux之文件系统自动挂载和ext文件系统结构、硬/软链接

在文件系统中查找文件的过程

        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中找到块,返回文件的内容,说明是一个文件。


Linux之文件系统自动挂载和ext文件系统结构、硬/软链接


硬链接和软链接的区别



硬链接:同一设备下不同文件指向相同的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。读出数据和写入数据。










本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1955143,如需转载请自行联系原作者
上一篇:Android插件化开发之动态加载技术学习


下一篇:如何在 Flink 集群部署 Alink?