Linux磁盘和文件系统

  • 磁盘的相关知识
    • 1.扇区是磁盘存储的最小的物理单位,每个扇区的大小是512KB;
    • 2.磁盘的第一个扇区通常包含:主引导分区(Master Boot Record),通常用于保存引导程序,大小为446bytes, 分区表partition table:用于记录整块硬盘分区的状态,包含46bytes;
    • 3.进行分区的操作,就是在parttion table里面写入数据,默认只能够写入4组信息,这四组分区成为主分区Primary或者扩展分区Extend;
    • 4.分区的最小单位是柱面cylinder;
    • 5.主分区和扩展分区最多只能够存在4个;
    • 6.扩展分区最多只能够有一个;
    • 7.逻辑分区是扩展分区切割出来的分区;
    • 8.扩展分无法被格式化;
    • 关于低级格式化与高级格式化
    • 低级格式化: 磁盘在出厂的时候的会进行低级格式化,通常指进行磁道划分,扇区划分等操作;
    • 高级格式化: 就会进行创建文件系统的操作,分区是文件系统的逻辑边界;
    • 数据的存储
    • 需要借助于文件系统来存取数据,但是文件系统是不在分区上面的,文件系统的数据是在分区上面的分区上面的;
    • 数据通常分为:
    • 1.元数据(Metadate):数据条目区域(Index Node):用于存放文件在真是数据存储区域的位置信息;存在全局唯一的Inode号码用来标识不同的文件,里面包含:inode号码,对应文件的权限,属主和属组,时间戳,大小,以及存储的磁盘块等信息,但是不包含文件名;
      • 1.对于大数据文件的存储,可以使用指针的方式间接指向磁盘块的某些区域,用来标识所占用的磁盘块,因为Inode里面可能没有办法包含所有的磁盘块,通过各级指针引用文件的方式,决定了单个文件的最大大小;
      • 2.对于目录来说也是文件,目录对应存放内容的磁盘块里面存放的内容包括:文件的Inode号码以及对应的文件名,这类似于一个表;
      • 3.块位图(Bit Map):在元数据区域通过块位图来标记真实数据区域的某些磁盘块是否使用;
    • 2.真实数据存储区域:
      • 磁盘块:是逻辑概念,通常是存在编号的,在磁盘块上面通常还需要标记是否已经被使用,通常需要规模扫描;
    • 查找目录里面文件的过程
    • 例如查找/var/log/messages:
    • 1.首先查找根,根是自引用的;
    • 2.找到根对应的存储实际数据的磁盘块,根据对应的表,查找到var的inode信息
    • 3.然后在查找anode索引表,找到对应的var的磁盘块,查找inode_filename(dentry)对应的表,找到log对应的inode;
    • 4.根据log对应的anode号码,找到log对应的磁盘块;
    • 5.查找到messages对应的inode号码,去查找对应的磁盘块;
    • 上面这个过程说明目录的是指是:目录也是一个inode_filename的映射表,也是文件;
    • 解释新建文件的过程:
    • 例如新建/backup/test.txt
    • 1.首先确认backup目录是存在的,对于目录不存在的情况,通常是返回错误;
    • 2.然后扫描inode_map,申请一个新的inode号码;
    • 3.查找目录对应inode,并且找到对应的磁盘块;
    • 4.在表里面新建立inode_file里面新建立条目;
    • 5.查找bitmap位图查找空闲的磁盘块,一次划分的可能多余实际需要的,是为了防止文件碎片的;
    • 解释删除一个文件的过程
    • 1.找到对应目录里面的条目,删除条目,回收Inode;
    • 2.重新标记Bit_map为未使用;
    • 复制文件和剪切文件的区别[在同一个文件系统里面]:
    • 文件复制目录项以及文件内容都需要更改;
    • 文件剪切:剪切只是目录项的新建立;
    • 关于链接文件:
    • 硬连接:
      • 指向同一个Inode节点的不同目录(访问路径)称为硬链接;图片来自于维基百科
      • 硬链接次数小于2时,被删除,文件就会消失;
      • 1.只能够对于文件创建,不能够对于目录进行创建,这是为了循环链接路径的出现但是目录的链接次数是2,因为.指向当前目录;
      • 2.硬链接是不能够跨文件系统创建的;
      • 3.创建硬链接会增加文件被链接的次数;
    • 软链接:在访问某个路径信息,查找到对应的磁盘块信息后,得到的内容是另一个路径的链接,还需要通过链接区访问的到具体的磁盘信息;
      • 软链接文件的大小是存储链接字符的个数,软链接的权限是777用于确保任何用户都可以找到这个链接文件,但是具体的权限依据链接指向文件;
      • 1.符号链接可以在目录上面创建;
      • 2.可以跨文件系统;
      • 3.不会增减被链接文件的链接次数;
      • 4.其大小为指定的路径所包含的字符的个数;
    • 一张图来说明软硬链接的区别
      这里写图片描述
    • Linux的文件系统
    • 文件系统是内核提供的功能,但是管理文件系统的进程是用户空间的进程;
    • 常见的文件系统包括ext2,ext3,xfs等,由于文件系统是内核提供的功能,需要通过系统系统调用来完成操作,对于不同的文件系统提供的调用的接口可能不同;为了防止上述情况的出现,使用中间的vfs来统一各个文件系统之间不同的差异,向用户提供统一的接口,Linux提供的Virtual FileSystem来提供这种功能;
    • 常见的文件系统:
    • ext2:
    • ext3:在这个文件系统之后支持日志操作;
    • ext4:
    • reiserfs:文件系统性能比较优异;
    • GFS:IBM.日志文件系统;
    • NFS:网络文件系统;
    • ocfs:集群文件系统;
    • GFS:全局文件系统;
    • 总结以上文件系统:
    • 传统文件系统:ext2,mini,MS-DOS/FAT,ISO9660[光盘];
    • 日志文件系统:ext3,ReiserFS,NTFS,JFS;
    • 网络文件系统:NFS/SMBFS;
    • 查看系统主持的文件系统
[root@server22 ~]# ls -l /lib/modules/2.6.32-431.el6.x86_64/kernel/fs/ | wc -l
30
这里一共支持大约30个文件系统
  • 已经加载到内核中的文件系统包括
[root@server22 ~]# cat /proc/filesystems 
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   binfmt_misc
nodev   debugfs
nodev   securityfs
nodev   sockfs
.....   
  • 关于Linux VFS

    • Linux Virtual FileSystem,是Linux内核提供的用于弥合各个操作系统提供的不同的应用接口,而提供一个抽象层,用于向用户程序提供统一的操作各个文件系统的接口;原因是因为不同的操作系统的开发时,提供的API可能是不一样,对于用于来说使用不同的命令或者函数来管理数量众多的文件系统很不现实,VFS就充当了中间层;
      借用鸟哥的图
  • ext2文件系统示意图
    借用鸟哥的图

  • 为了方便对于多个块的管理,ext2文件系统不止存在一个块组,而是将整个文件系统划分成为多个块组,每一个块组里面的结构和上面的示意是一样的;
  • boot sector:表示启动扇区,用来引导操作系统,用于解决多重引导的覆盖MBR的问题;
  • data block:用来存放实际内容的地方.block的大小通常包括1kB,2KB,4KB,block的大小在格式化时确定,如果需要重新更改,就需要重新进行格式化,对于block来说都是存在唯一的inode进行标示的;
  • inode_table:主要用于记录文件的属性以及文件的实际位置在哪几个block里面;
    • 文件的访问模式:也就是文件的权限;
    • 文件的所有者和所有组;
    • 文件的大小;
    • 文件的创建时间和改变时间ctime;
    • 文件最近一次的读取时间atime;
    • 文件最近的修改时间mtine;
    • 文件的特殊权限,比如sUID;
    • 文件内容的真实指向内容;
    • 每个inode的大小固定为128bytes;
    • 每个文件仅仅占用一个inode号码;
    • 针对与最后一条,每个文件所能够创建的文件数量和文件系统中包含的inode数量有关;
  • Super Block主要用于记录整个文件系统相关信息的地方
    • blockinode的总量;
    • 已经使用和没有使用的block以及inode的总量;
    • block以及inode的大小;
    • 文件系统的挂载时间,最近一次写入数据的时间,最近一次检查磁盘的时间等;
    • 用于显示文件系统是否被挂载的validbit,未被挂载为0,否则显示为1;
    • 每一个块组里面的superblock主要是整个文件系统的superblock的备份;
  • File System Description:文件描述符,用于描述每一个block group开始和结束的block号码,以及用于说明super block, bitmap, innode_map,data block位于哪一些block之间;
  • block bitmap:主要用于记录那些inode是空的,用于快速的查找出空闲块记录数据;
  • innode bitmap:主要用于记录innode的使用和没有使用的情况;

  • 一点注意的内容

  • 对于各个目录之间存在的相互包含的关系,但是在分区上面不一定是相互包含的,很有可能是两个相互独立的分区;
    • 原因:
      • 1.首先内核是在内存中,高于硬盘的,内核是可以找到根的位置的;
      • 2./var这个目录在1号分区,里面存储着inode_filename信息;
      • 3.将这块空间作为var的访问入口,实际的数据信息存储在2号分区;
  • 这里也就说明了inode是全局统一的;
  • 磁盘的只是补充:
    • 1.一个磁盘块只能够属于一个文件;
    • 2.对于文件系统来说,块的大小必须是2^n个字节,block_size:1024(1K),2048,4096,不同的系统和CPU的划定是不一样的;
    • 3.对于内存中页框的大小通常是4K;
    • 4.创建文件,首先找到inode,有可能需要磁盘块进行数据存储(符号连接不一定需要磁盘块),设备文件,管道文件都是不需要磁盘块进行数据存储的;
    • 5.为了加快空闲磁盘块的查找,引入了bitmap,为了加快bitmap的查找,引入了blockgroup的概念,blockgroup是磁盘块的划分;
    • 6.磁盘块是用一位0|1来表示是否是使用的,位图的一个位和一个磁盘块相对应;
    • 7.超级块用户包含,块组的大小,以及块组的个数等信息.超级块的信息是应该备份在不同的区域里面的,为了防止超级块损坏;
  • 超级块里面的信息:
    • 1.块组的数量;
    • 2.块组的大小;
    • 3.块组中包含多少个块;
    • 4.块的大小;
    • 5.空闲磁盘块,已用磁盘块,空闲inode,已用inode;
  • 块组描述符表:
    • 1.是一个新的块,用于保存当前系统上面包含多少个块,每一个块组从哪些个块开始结束等信息;
    • 2.每一个块组里面也应该包含自己所拥有的Inode信息,块组里面也应该包含块位图以及inode位图;
  • BootBlock:
  • 这个块是不能够使用的,需要预留出来的,这属于引导块,如果在这个分区上面安装了操作系统,那么操作系统的引导信息,就需要安装在这里,用于安装多操作系统使用,是任何一个分区的第0个块,多系统互存是需要使用这里来进行引导的;
  • 查看文件系统关于块组的信息;
    *dumfspe这个命令主要用于输出关于文件系统的相关信息;
    • -b:用于列出保留为坏道的部分;
    • -s:仅仅用于列出关于superblock的信息;
[root@server22 ~]# dumpe2fs /dev/vda1 
Filesystem volume name:   <none>    <====文件系统卷标名称
Last mounted on:          /boot         <====文件系统他最后一次挂载位置
Filesystem UUID:          b4e88b39-a39f-4fce-bc99-1fa3b92c6983 <==全局UID
Filesystem magic number:  0xEF53        <====文件系统魔数
Filesystem revision #:    1 (dynamic)   <====文件系统版本
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_
recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize   <==文件系统的特性
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl    <==默认的关在选项
Filesystem state:         clean         <==表示文件系统是clean的,如果为dirty,表示出现脏页;
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              128016        <==Inode总数
Block count:              512000        <==块总数
Reserved block count:     25600         <==保留块总数
Free blocks:              462372        <==空闲块总数
Free inodes:              127978
First block:              1         <==第一个块的ID
Block size:               1024          <==块的大小
Fragment size:            1024          
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         2032          <==每一个组的block数量
Inode blocks per group:   254           
Flex block group size:    16
Filesystem created:       Sun Mar 11 09:06:56 2018
Last mount time:          Wed Mar 14 13:01:11 2018
Last write time:          Wed Mar 14 13:01:11 2018
Mount count:              3
Maximum mount count:      -1  <==表示最大挂载次数,不进行限制
Last checked:             Sun Mar 11 09:06:56 2018  <==表示文件系统的自检时间
Check interval:           0 (<none>)
Lifetime writes:          47 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           128   <==表示inode的大小
Journal inode:            8 <==日志的inode号码
Default directory hash:   half_md4
Directory Hash Seed:      02d46f4f-5c96-4485-b14d-1bcc0afb4eab
Journal backup:           inode blocks
Journal features:         (none)
Journal size:             8M
Journal length:           8192
Journal sequence:         0x00000014
Journal start:            1


Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x74ec, unused inodes 2015
  Primary superblock at 1, Group descriptors at 2-3
  Reserved GDT blocks at 4-259
  Block bitmap at 260 (+259), Inode bitmap at 276 (+275)
  Inode table at 292-545 (+291)
  3820 free blocks, 2015 free inodes, 2 directories, 2015 unused inodes
  Free blocks: 4373-8192
  Free inodes: 18-2032
Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x3494, unused inodes 2032
  Backup superblock at 8193, Group descriptors at 8194-8195  <==表示superblock在这个块组中进行了备份,这里有相关的信息
  Reserved GDT blocks at 8196-8451
  Block bitmap at 261 (+4294959364), Inode bitmap at 277 (+4294959380)
  Inode table at 546-799 (+4294959649)
  1146 free blocks, 2032 free inodes, 0 directories, 2032 unused inodes
  Free blocks: 9158-10240, 16322-16384
  Free inodes: 2033-4064
  • 查看磁盘坏道
[root@server22 ~]# dumpe2fs  -b /dev/vda1 
dumpe2fs 1.41.12 (17-May-2010)
因为/dev/vda1 是在虚拟磁盘上面划分的分区,所以没有任何信息显示
  • 操作系统引导的两个过程:
    *MBR正常:BIOS引导加载MBR里面的Bootloader里面的信息,MBR损坏,开机无法正常进行,MBR损坏,BootBlock里面的信息正常也无法正常引导加载;
    • 原因:BootBlock里面的Bootloader是需要被MBR里面的Bootloader里面的信息来进行引导的,所以MBR损坏这里也无法正常使用;
  • 块组里面的信息
    • 1.Super_Block:就是备份Super_Block里面的内容,防止Super_Block损坏造成的信息丢失,通常用于记录inodeblock的总量和剩余量,
    • 2.GDT:Group_Description_Table(块组描述符表),块组名,起始磁盘块,结束磁盘块等全局信息,需要备份多次;
    • 3.Block_Bitmap:用于标记每一个块是否使用,通常使用0|1进行标记;
    • 4.Inode_BitMap
    • 5.Inode_Table
    • 6.Data_Blocks
  • 目录里面的信息
  • 在操作系统创建一个目录时ext2,首先分配inode以及block给该目录,其中inode主要用于记录该目录的相关权限和属性,并且需要记录分配到的block号码,而block主要用于记录目录下面的文件名称和文件占用的inode号码
  • 这部分信息可以通过ls -li来进行查看
[root@server22 ~]# ls -li
total 20
270973 -rw-------. 1 root root  1043 3月  11 09:10 anaconda-ks.cfg
261638 -rw-r--r--. 1 root root 10544 3月  11 09:10 install.log
261640 -rw-r--r--. 1 root root  3091 3月  11 09:08 install.log.syslog
其中第一列表示的就是`inode`号码
  • 查看目录本身占据的block的大小
[root@server22 ~]# ls -ld /
dr-xr-xr-x. 22 root root 4096 314 13:01 /
* `inode`号码:
* 文件名称的长度:
* 文件类型:
* `name:`

* 以上为ext2操作系统类型,接下来说说ext3ext2的不同的地方
* 1.ext3支持日志称为日志文件系统(journal file system):是为了防止系统在存储文件时,因为异常导致文件存储不完整而出错;
* 2.日志文件系统就是为了防止这种错误,从而将磁盘划分称为三个区域:数据区,元数据区,以及日志区域;
* 1.将Inode存储在日志区域;
* 2.数据正常存储,Inode转移到元数据区域;
* 3.数据异常存储,Inode在日志区域不动,用于检查;
* 关于挂载点
* 挂载点一定是目录,通常用于作为文件系统的访问入口存在;
* 如果这个目录存在文件,那么系统会在挂载之前将文件进行备份,然后再卸载之后,将备份的文件进行还原;
* 对于文件系统最顶层的目录权限一般是2

[root@server22 ~]# ls / /boot/  -lid
2 dr-xr-xr-x. 22 root root 4096 314 13:01 /
2 dr-xr-xr-x.  5 root root 1024 311 09:09 /boot/
[root@server22 ~]# ls -lid /
2 dr-xr-xr-x. 22 root root 4096 314 13:01 /
  • 文件系统的操作
  • 用于查看磁盘和容量,介绍两个命令
  • df:用于列出系统上面的文件系统整体的磁盘使用量
    • -a:用于列出所有的文件系统,包括/proc;
    • -k:显示的单位是kB
    • -m:显示的单位是MB;
    • -h:自动选择合适的方式进行显示;
    • -T:用于显示分区名称;
    • -i:显示关于inode的信息;
[root@server22 ~]# df -T 
Filesystem                   Type  1K-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root ext4    7853764 932836   6521980  13% /
tmpfs                        tmpfs    251136      0    251136   0% /dev/shm
/dev/vda1                    ext4     495844  33472    436772   8% /boot

[root@server22 ~]# df -ihT 
Filesystem                   Type  Inodes IUsed IFree IUse% Mounted on
/dev/mapper/VolGroup-lv_root ext4    488K   25K  463K    5% /
tmpfs                        tmpfs    62K     1   62K    1% /dev/shm
/dev/vda1                    ext4    126K    38  125K    1% /boot
  • 介绍一个有趣的用法
[root@server22 ~]# df -ih /etc/
Filesystem                   Inodes IUsed IFree IUse% Mounted on
/dev/mapper/VolGroup-lv_root   488K   25K  463K    5% /
表示用于显示/etc所在文件系统的使用情况;
  • df命令显示的空间使用情况表示的是磁盘空间使用情况,并不表示内存,所以对于内核映射在内存中的文件系统/proc这个的大小为0;
  • du命令的使用
    • -a:用于列出所有的文件和目录容量,默认只统计当前目录下的使用情况;
    • -s:用于列出总容量,而不是每个目录底下的容量;
    • -S:列出的不包括子目录下面的统计;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值