linux-磁盘相关

具体参考鸟叔的私房菜 如下内容为学习总结之用html

磁盘的组成

磁盘由磁盘盘,机械手臂,磁盘读取头、主轴马达组成
磁盘盘有两种单位,1.扇区,2.磁道
扇区的物理量设计有两种大小,1. 512bytes,2.4Kbytes
复制代码

盘片 片面 和 磁头

参考地 址https://www.cnblogs.com/jswang/p/9071847.htmlnode

硬盘中通常会有多个盘片组成,每一个盘片包含两个面,每一个盘面都对应地有一个读/写磁头。
受到硬盘总体体积和生产成本的限制,盘片数量都受到限制,通常都在5片之内。
盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。
以下图:
复制代码

图1linux

扇区 和 磁道

下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,
从圆心向外画直线,能够将磁道划分为若干个弧段,每一个磁道上一个弧段被称之为一个扇区(图践绿色部分)。
扇区是磁盘的最小组成单元,一般是512字节。(因为不断提升磁盘的大小,部分厂商设定每一个扇区的大小是4096字节)
复制代码

图2docker

磁头 和 柱面

硬盘一般由重叠的一组盘片构成,每一个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具备相同编号的磁道造成一个圆柱,称之为磁盘的柱面。
磁盘的柱面数与一个盘面上的磁道数是相等的。因为每一个盘面都有本身的磁头,所以,盘面数等于总的磁头数。 以下图
复制代码

图3windows

磁盘分区

为何须要磁盘分区

把不一样文件放于不一样分区
ex:1.系统文件在一分区,2.数据文件在二分区,3.日志文件在三分区
1.易于管理和使用
2.有利于数据安全;
3.节约寻找文件的时间
复制代码

磁盘分区方式-MSDOS(MBR)|GPT

一圈一圈的磁柱与分区有什么关系呢?爱的魔力转圈圈centos

从外圈0开始造成一个一个的磁柱,磁柱是分区槽的最小单位,意味着好比A分区最少为1磁柱,这个是MBR分区方式
可是GPT,因为GPT的分区表有更大的空间支持,因此分区的最小单位为1扇区
复制代码

MBR简介安全

MSDOS 全称Microsoft Disk Operating system 微软磁盘操做系统
MBR 全称 Master Boot record-主要开机记录取
因为linux早期为了兼容Windows磁盘,所以使用的是Windows的MBR的方式来处理开机管理程序与分区表
复制代码

MBRbash

MBR通常存在磁盘的第一个扇区
磁盘的第一个扇区
1.由主要启动记录器MBR:能够安装开机管理程序的地方,446bytes
2.分区表:记录整颗磁盘的分区状态,64bytes;
因为分区表只有64bytes,因此只能记录4组记录,意味着只能有4个分区
复制代码

分区类型oop

分区类型有两种1.主分区primary partion和2.Extended partion 扩展分区
主分区最多有4个,扩展分区最多有一个
由于扩展分区Extened还能够拆分红多个逻辑分区Logical partion
同时因为分区的最小单位为连续的磁道组成的磁柱,所以把扩展分区Extended partion放在最后一个分区
同时Extended 也方便扩容
推荐的分区方式 P P P E(L,L,L...)
复制代码

MBR的限制学习

1.操做系统没法抓取到2.2T以上的磁盘容量,所以要把磁盘一个一个拆出来 拆成逻辑分区
2.同时MBR只存在于一个扇区,若是损坏,将没法使用
3.MBR的开机管理程序区块只有446bytes,没法容纳更多的代码
复制代码

因此出现了GPT分区,GPT分区解决了上述问题

GPT

GPT扇区大小 512bytes----4KBytes
早期的扇区大小为:512bytes
GPT为了兼容全部磁盘,所以在扇区的定义上,大多使用逻辑区块地址(Logical Address,LBA)512bytes
GPT使用了34个LBA区块记录分区信息,整个磁盘的最后33个LBA也拿来作备份
这样GPT就解决了
1.操做系统没法抓取2.2T以上的磁盘容量
2.若是GPT的扇区损坏,能够用备份扇区
LBA0,存储了第一个阶段的开机管理程序
LBA1,GPT表头,记录了分区表的位置和大小和备份的分区表位置
LBA2-LBA33,实际记录分区信息

复制代码

lsblk(list block devices)

[root@VM_158_86_centos ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  50G  0 disk  #硬盘
└─vda1 253:1    0  50G  0 part / #分区

复制代码

查看分区类型 parted

[root@VM_158_86_centos ~]# parted /dev/vda1 print
Model: Virtio Block Device (virtblk)
Disk /dev/vda1: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: loop #这里显示为loop实际上是为MBR,若是为GPT会显示gpt
                            
Disk Flags: 

Number  Start  End     Size    File system  标志
 1      0.00B  53.7GB  53.7GB  ext3

复制代码

文件系统

文件系统简诉

磁盘分区完毕后须要格式化,以后操做系统才能使用这个文件系统,为何须要格式化呢?
由于每种操做系统设定的文件属性/权限并不相同

文件系统格式
windows98:FAT16
windows2000...:NTFS
Linux:Ext2

传统的磁盘与文件系统应用中,
一个分区槽只能被格式化成为一个文件系统,也就是一个partion对应一个文件系统

新的磁盘与文件系统应用中,
LVM:Logical Volume Manager,能够把一个partion格式化为多个文件系统
RAID:Redundant Arrays of Independent Drives,将多个分区槽合成一个文件系统
所以,目前咱们在格式化时已经再也不说针对partition来格式化了,一个可被挂载的数据为一个文件件系统,而不是一个分区槽
复制代码

文件系统三元素

superblock:记录此filesystem 的总体资讯,包括inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关资讯等;
inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的资料所在的block 号码;
block:实际记录档案的内容,若档案太大时,会占用多个block 。
复制代码

索引式文件系统

索引式
EXT2:有inode 记录了该文件全部占用的block号,能够直接经过inode取出全部block
非索引式
FAT:没有inode,不能直接取出所有,只能经过上一个block记录的下一个block取出
复制代码

文件系统一开始将inode与block规划好了

档案系统一开始就将inode与block规划好了,除非从新格式化(或者利用resize2fs等指令变动档案系统大小),不然inode与block固定后就再也不变更
复制代码

为何须要 block group

当文件系统高达数百GB时,若是把inode和block放在一块儿,inode和block就会太过于庞大,为了方便管理 引入 block group 来处理

ext2文件系统格式化时候基本上是区分多个block group,每一个block group都有独立的inode/block/superblock 而且文件系统最前面有一个启动扇区,至关于每一个文件系统的挂载点,能够安装不一样的开机管理程序

block的特性

原则上,block 的大小与数量在格式化完就不可以再改变了(除非从新格式化);
每一个block 内最多只可以放置一个档案的资料;
承上,若是档案大于block 的大小,则一个档案会占用多个block 数量;
承上,若档案小于block ,则该block 的剩余容量就不可以再被使用了(磁碟空间会浪费)。
复制代码

inode记录的属性

该文件的存取模式(read/write/excute);
该文件的拥有者与群组(owner/group);
该文件的容量;
该文件创建或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义文件特性的旗标(flag),如SetUID...;
该文件真正内容的指向(pointer);
复制代码

inode特性

每一个inode 大小均固定为128 bytes (新的ext4 与xfs 可设定到256 bytes);
每一个文件都仅会占用一个inode 而已;
承上,所以文件系统可以创建文件案数量与inode 的数量有关;
系统读取文件时须要先找到inode,并分析inode 所记录的权限与使用者是否符合,若符合才可以开始实际读取 block 的内容。
复制代码

block 与inode 的大小

block 为1, 2, 4K,
inode 为128bytes 或256bytes
复制代码

假设我一个档案有400MB 且每一个block 为4K 时, 那么至少也要十万笔block 号码的记录呢!inode 哪有这么多可记录的资讯?

所以Inode记录block号码的区域被系统灵活的设计为
12个直接指向,1个间接指向,1个双间接指向,1个三间接指向,
复制代码

当block大小为1k(1024byte)时,每一个block号码占用4byte,也就是1k能记录256个block号码 对应这256个block

inode以及对应的1k单位block的单一文件大小限制

12个直接指向: 12*1K=12K 
因为是直接指向,因此总共可记录12笔记录,所以总额大小为如上所示;

间接: 256*1K=256K 
每笔block号码的记录会花去4bytes,所以1K的大小可以记录256笔记录,所以一个间接能够记录的档案大小如上; 

双间接: 256*256*1K=256 2 K 
第一层block会指定256个第二层,每一个第二层能够指定256个号码,所以总额大小如上;

三间接: 256*256*256*1K=256 3 K 
第一层block会指定256个第二层,每一个第二层能够指定256个第三层,每一个第三层能够指定256个号码,所以总额大小如上;

总额:将直接、间接、双间接、三间接加总,获得12 + 256 + 256*256 + 256*256*256 (K) = 16GB
复制代码

当block为2k或4k时,计算结果也会相应的增大,分别为256GB和2TB

可是有些软件或文件系统不支持大于2k的block设计

superblock特性

block 与inode 的总量;
未使用与已使用的inode / block 数量;
block 与inode 的大小(block 为1, 2, 4K,inode 为128bytes 或256bytes);
filesystem 的挂载时间、最近一次写入资料的时间、最近一次检验磁碟(fsck) 的时间等档案系统的相关资讯;
一个valid bit 数值,若此档案系统已被挂载,则valid bit 为0 ,若未被挂载,则valid bit 为1 
复制代码

为何一个文件系统只有一个superblock 而不是一个block group一个superblock

每一个block group 均可能含有superblock
可是咱们也说一个档案系统应该仅有一个superblock 而已,那是怎么回事啊?
事实上除了第一个block group 内会含有superblock 以外,
后续的block group不必定含有superblock , 
而若含有superblock 则该superblock 主要是作为第一个block group 内superblock 的备份,
这样能够进行superblock的救援
复制代码

EXT家族查询inode block superblock

[root@VM_158_86_centos ~]# blkid
/dev/vda1: UUID="49f819fd-e56d-48a4-86d3-7ebe0a68ec88" TYPE="ext3" 
[root@VM_158_86_centos ~]# dumpe2fs -h /dev/vda1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          49f819fd-e56d-48a4-86d3-7ebe0a68ec88
Filesystem magic number:  0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3276800
Block count:              13106944
Reserved block count:     655341
Free blocks:              10647845
Free inodes:              3163700
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      508
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Thu Apr 21 15:00:29 2016
Last mount time:          Thu May 23 12:02:40 2019
Last write time:          Thu May 23 12:01:29 2019
Mount count:              16
Maximum mount count:      -1
Last checked:             Thu Apr 21 15:00:29 2016
Check interval:           0 (<none>)
Lifetime writes:          736 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       139996
Default directory hash:   half_md4
Directory Hash Seed:      e74c0d45-bdb1-4aaa-9864-f29ad06e91c1
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
日志大小:             128M
Journal length:           32768
Journal sequence:         0x0066dd50
Journal start:            22289


Group 0: (Blocks 0-32767)-   ##这个就是block group 0
  主 superblock at 0, Group descriptors at 1-4
  保留的GDT块位于 5-512
  Block bitmap at 513 (+513), Inode bitmap at 514 (+514)
  Inode表位于 515-1026 (+515)
  26201 free blocks, 8173 free inodes, 2 directories
复制代码

查询inode号码

[root@VM_158_86_centos ~]# ls -li
总用量 16
131079 -rw-------. 1 root root 2523 4月  21 2016 anaconda-ks.cfg
131086 drwxr-xr-x  2 root root 4096 9月   4 2018 dockerTest
133347 drwxr-xr-x  4 root root 4096 5月  17 16:08 linux_learn
223431 drwxr-xr-x  3 root root 4096 9月  29 2018 project
复制代码

目录的inode和block

当建立一个目录时,文件系统会分配一个inode以及至少一个block给目录
目录的inode:记录了目录的属性和权限,以及目录对应的block
目录的block:记录了该目录下的文件的inode和文件名

为何文件系统会分配至少一个block,而不是一个?
一个block号占用4byte,一个文件名(文件名不相同)大概就6byte,
这样假如1个1k的block只能记录100个文件,那当超出的文件就只能有inode的下一个直接指向来处理
复制代码

目录的block图:

文件的inode和block

当建立一个文件时,其余都目录相似,只是文件的block存储的是真实的数据
当第一个block容量不够时,会用下一个直接指向,间接指向...
复制代码

目录树读取

inode自己并不记录文件名,文件名的记录是在目录的block当中。那么由于档名是记录在目录的block当中,所以当咱们要读取某个档案时,就务必会通过目录的inode与block ,而后才可以找到那个待读取档案的inode号码,最终才会读到正确的档案的block内的资料。

因为目录树是由根目录开始读起,所以系统透过挂载的信息能够找到挂载点的inode 号码,此时就可以获得根目录的inode 内容,并依据该inode 读取根目录的block 内的档名资料,再一层一层的往下读到正确的档名
复制代码

若是我想要读取/etc/passwd 这个档案时,系统是如何读取的呢?

[root@VM_158_86_centos sbin]# ll -di / /etc /etc/passwd
     2 dr-xr-xr-x. 21 root root  4096 6月  11 16:48 /
458753 drwxr-xr-x. 89 root root 12288 5月  27 16:49 /etc
459310 -rw-r--r--   1 root root  1833 5月  27 16:49 /etc/passwd
复制代码
/的inode:
透过挂载点的信息找到inode号码为128的根目录inode,且inode规范的权限让咱们能够读取该block的内容(有r与x) ;

/的block:
通过上个步骤取得block的号码,并找到该内容有etc/目录的inode号码(33595521); 

etc/的inode:
读取33595521号inode得知dmtsai具备r与x的权限,所以能够读取etc/的block内容; 

etc/的block:
通过上个步骤取得block号码,并找到该内容有passwd档案的inode号码(36628004); 

passwd的inode:
读取36628004号inode得知dmtsai具备r的权限,所以能够读取passwd的block内容; 

passwd的block:
最后将该block内容的资料读出来。

复制代码

文件的存取

先肯定使用者对于欲新增档案的目录是否具备w 与x 的权限,如有的话才能新增;
根据inode bitmap 找到没有使用的inode 号码,并将新档案的权限/属性写入;
根据block bitmap 找到没有使用中的block 号码,并将实际的资料写入block 中,且更新inode 的block 指向资料;
将刚刚写入的inode 与block 资料同步更新inode bitmap 与block bitmap,并更新superblock 的内容。

复制代码

inode和block称为数据存放区域

inode bitmap和block bitmap称为中介数据metadata

数据不一致状况

例如你的档案在写入档案系统时,
由于不知名缘由致使系统中断(例如忽然的停电啊、系统核心发生错误啊~等等的怪事发生时),
因此写入的资料仅有inode table及data block而已,最后一个同步更新中介资料的步骤并无作完,
此时就会发生metadata的内容与实际资料存放区产生不一致(Inconsistent)的状况了。

既然有不一致固然就得要克服!在早期的Ext2档案系统中,若是发生这个问题,那么系统在从新开机的时候,就会藉由Superblock当中记录的valid bit (是否有挂载)与filesystem state (clean与否)等状态来判断是否强制进行资料一致性的检查!如有须要检查时则以e2fsck这支程式来进行的。

弊端:
不过,这样的检查真的是很费时~由于要针对metadata 区域与实际资料存放区来进行比对, 呵呵~得要搜寻整个filesystem 呢~若是你的档案系统有100GB 以上,并且里面的档案数量又多时, 哇!系统真忙碌~并且在对Internet 提供服务的伺服器主机上面, 这样的检查真的会形成主机复原时间的拉长~真是麻烦~这也就形成后来所谓日志式档案系统的兴起了。
复制代码

日志文件系统

预备:当系统要写入一个档案时,会先在日志记录区块中纪录某个档案准备要写入的资讯;
实际写入:开始写入档案的权限与资料;开始更新metadata 的资料;
结束:完成资料与metadata 的更新后,在日志记录区块当中完成该档案的纪录。
在这样的程序当中,万一资料的纪录过程中发生了问题,那么咱们的系统只要去检查日志记录区块, 就能够知道哪一个档案发生了问题,针对该问题来作一致性的检查便可,而没必要针对整块filesystem 去检查, 这样就能够达到快速修复filesystem 的能力了!这就是日志式档案最基础的功能啰~
复制代码

文件系统运做

系统会将经常使用的档案资料放置到主记忆体的缓冲区,以加速档案系统的读/写;
承上,所以Linux 的实体记忆体最后都会被用光!这是正常的状况!可加速系统效能;
你能够手动使用sync 来强迫记忆体中设定为Dirty 的档案回写到磁碟中;
若正常关机时,关机指令会主动呼叫sync 来将记忆体的资料回写入磁碟内;
但若不正常关机(如跳电、当机或其余不明缘由),因为资料还没有回写到磁碟内, 所以从新开机后可能会花不少时间在进行磁碟检验,甚至可能致使档案系统的损毁(非磁碟损毁)。
复制代码

挂载点

挂载点必定是目录,该目录为进入该文件系统的入口

[root@study ~]# ls -lid / /boot /home 
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /
 128 dr-xr-xr-x. 4 root root 4096 May 4 17 :59 /boot
 128 drwxr-xr-x. 5 root root 41 Jun 17 00:20 /hom
复制代码

因为XFS filesystem最顶层的目录之inode通常为128号,所以能够发现/, /boot, /home为三个不一样的filesystem,由于inode相同(每一个filesystem只会有一个惟一的inode),而文件属性不相同,因此不是同一个文件,为不一样的三个文件系统

[root@study ~]# ls -ild / /. /..
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /.
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /..
复制代码

inode相同,文件属性相同,因此为同一文件

Linux VFS (Virtual Filesystem Switch)管理文件系统 filesystem

假设你的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs , 那么你取用 /home/dmtsai/.bashrc 时,有特别指定要用的什么文件系统的模块来读取吗? 这个就是 VFS 的功能啦!透过这个 VFS 的功能来管理全部的 filesystem, 省去咱们须要自行配置读取文件系统的定义啊~方便不少!整个 VFS 能够约略用下图来讲明:

df:列出档案系统的总体磁盘使用量;

[root@VM_158_86_centos sbin]# df
文件系统          1K-块    已用     可用 已用% 挂载点
/dev/vda1      51474044 8896976 39955704   19% /
devtmpfs         930500       0   930500    0% /dev
tmpfs            941176      24   941152    1% /dev/shm
tmpfs            941176     440   940736    1% /run
tmpfs            941176       0   941176    0% /sys/fs/cgroup
tmpfs            188236       0   188236    0% /run/user/0
复制代码

du:评估文件系统的磁盘使用量(经常使用在推估目录所占容量)

-s :列出总量而已,而不列出每一个各别的目录占用容量
[root@VM_158_86_centos sbin]# du -s /*
4	/a.txt
0	/bin
173504	/boot
0	/b.txt
4	/data
0	/dev
39516	/etc
176	/home
0	/lib
0	/lib64
16	/lost+found
4	/media
4	/mnt
8	/opt
0	/proc
复制代码

硬连接与软链接

硬连接:

两个连接文件的inode都指向real-inode,删除其中一个对另外一个没有影响,修改其中一个的内容,另外一个的内容都相应被更改 局限:

不能跨 Filesystem;
不能 link 目录。
不能跨 Filesystem 还好理解,那不能 hard link 到目录又是怎么回事呢?
这是由于若是使用 hard link 连接到目录时, 连接的数据须要连同被连接目录底下的全部数据都建立连接
复制代码

建立硬连接

[root@VM_158_86_centos ~]# ln linux_learn/learn_01.sh 
[root@VM_158_86_centos ~]# ll -i /root/learn_01.sh linux_learn/learn_01.sh 
133351 -rwxr-xr-x 2 root root 99 3月   1 17:38 linux_learn/learn_01.sh
133351 -rwxr-xr-x 2 root root 99 3月   1 17:38 /root/learn_01.sh
复制代码

其中的2表示连结数量

符号连接(快捷方式):

[root@www ~]# ln -s /etc/crontab crontab2
[root@www ~]# ll -i /etc/crontab /root/crontab2
1912701 -rw-r--r-- 2 root root 255 Jan  6  2007 /etc/crontab
 654687 lrwxrwxrwx 1 root root  12 Oct 22 13:58 /root/crontab2 -> /etc/crontab
复制代码

由上表的结果咱们能够知道两个文件指向不一样的 inode 号码,固然就是两个独立的文件存在! 并且连结档的重要内容就是他会写上目标文件的『文件名』, 你能够发现为何上表中连结档的大小为 12 bytes 呢? 由于箭头(-->)右边的档名『/etc/crontab』总共有 12 个英文,每一个英文占用 1 个 byes ,因此文件大小就是 12bytes了

[root@www ~]# ln [-sf] 来源文件 目标文件
选项与参数:
-s  :若是不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f  :若是 目标文件 存在时,就主动的将目标文件直接移除后再建立!
复制代码

Symbolic Link 与 Windows 的快捷方式能够给他划上等号,由 Symbolic link 所建立的文件为一个独立的新的文件,因此会占用掉 inode 与 block

符号连接文件的block记录指向目标源文件的inode,当源文件被删除,经过符号连接将没法访问源文件。

相关文章
相关标签/搜索