- 磁盘的相关知识
- 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
; - 查看系统主持的文件系统
- 1.扇区是磁盘存储的最小的物理单位,每个扇区的大小是
[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
主要用于记录整个文件系统相关信息的地方
block
和inode
的总量;- 已经使用和没有使用的
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
损坏造成的信息丢失,通常用于记录inode
和block
的总量和剩余量, - 2.
GDT
:Group_Description_Table
(块组描述符表),块组名,起始磁盘块,结束磁盘块等全局信息,需要备份多次; - 3.
Block_Bitmap:
用于标记每一个块是否使用,通常使用0|1
进行标记; - 4.
Inode_BitMap
- 5.
Inode_Table
- 6.
Data_Blocks
- 1.
- 目录里面的信息
- 在操作系统创建一个目录时
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 3月 14 13:01 /
* `inode`号码:
* 文件名称的长度:
* 文件类型:
* `name:`
* 以上为ext2
操作系统类型,接下来说说ext3
和ext2
的不同的地方
* 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 3月 14 13:01 /
2 dr-xr-xr-x. 5 root root 1024 3月 11 09:09 /boot/
[root@server22 ~]# ls -lid /
2 dr-xr-xr-x. 22 root root 4096 3月 14 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
:列出的不包括子目录下面的统计;