磁盘 文件系统

磁盘是用来存储数据的,磁盘刚买来是不能直接使用的,我们先要对磁盘进行分区,然后进行文件系统的创建,最后才是将磁盘挂载到操作系统上的某个目录。这样就可以使用了

那么问题来了。。。

为什么要叫磁盘?和硬盘有啥区别?还有软盘,光盘?傻傻分不清楚

1、磁盘顾名思义就是磁性材料制造的一种带磁性的盘。是采用磁信号记录数据的盘状物。磁信号是什么?为什么他能记录数据?参见 磁存储系统原理

2、磁盘分为硬盘和软盘(Floppy Disk)。软盘的存取速度慢,容量小,只有几MB,软盘的读写要通过软盘驱动器。

3、光盘(Optical disc/Compact Disc)就是我们小时候看的VCD或DVD碟片,是以光信号为介质存储数据的。

4、除了介质不同,光盘比软盘摸起来要硬一点,容量大(一部电影的大小),光盘盘面容易划坏,软盘外面套了个方形的塑料外壳,有保护不容易弄坏,光盘读盘的速度比软盘快。https://zhidao.baidu.com/question/36434585.html

为什么硬盘要分区?

作者:北极
链接:https://www.zhihu.com/question/40408383/answer/86824178
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

Linux和Windows的分区在原理上没有区别,只是在格式上有区别。

分区的作用是把一个物理存储设备分割成多个不同的逻辑存储设备,对于Windows来说,表现的结果就是不同的盘符,对于Linux来说,就是不同的挂载点。分区不是一个操作系统的概念(Disk partitioning)。

分区是通过在分区表中写入特定的数据来告诉操作系统这个设备被分割成几个逻辑存储区域。分区表有公共的格式(Partition table),只要在分区表中写入正确的数据,就可以对设备分区。

至于分区内部的格式,这个由各个操作系统自己决定,NTFS/ext/FAT这些都指的是分区内部的数据结构,这个与分区表无关。

扫描二维码关注公众号,回复: 6241294 查看本文章

分区表格式,分为MBR格式和GPT格式两种,MBR格式就是利用MBR记录后边的64个字节,来描述磁盘的分区情况。因为MBR分区表里只能保存4个分区记录,所以才有了主分区只有4个的限制。而逻辑分区则是把多个分区放到一个扩展分区里,把一个扩展分区拆分成更多的分区,让一个磁盘能划分成超过4个的磁盘分区。

因为MBR分区表只有64个字节,能记录的数据非常有限,所以已经逐步被GPT格式取代,GPT分区表能保存更多的信息。

具体分区表的格式可以参见:
mbr(主引导记录(Master Boot Record))
GPT(计算机技术)

为什么要对硬盘进行分区呢?因为一块大容量硬盘正如一个大柜子,要在这个柜子里存放各种文件,有很多种方法,但为了便于管理和使用,一般都会把大柜子分成一个一个的相对独立的“隔间”或“抽屉”,绝不会就把大柜子当做一个大抽屉来使用。硬盘的分区,正如大柜子的使用,把它们分成一个一个的逻辑分区(表现为一个个的逻辑盘符),大大提高了管理效率。

文件系统是什么?为什么要有文件系统?

文件系统就是指明要怎么组织数据到硬盘分区上,以及要怎么操作硬盘上的数据。(说白了就是一套API接口了,对于操作系统来说,只管调用文件系统的一些接口来存储和读取数据,而不用关系文件系统怎么组织数据)

打个比方, 分区就像是把一块荒地分为2个部分A区和B区,A区用来种菜,B区用来种粮食。如果不分区,菜和粮食随便混合搞在一起,得多糟心啊。

很多技术其实都是为了人们更简单和更方便应用而生的。

文件系统。就是在A区里面,菜不是随便种的,这种一个,那种一个,看起来乱糟糟的,这样的地话,管理起来会很困难麻烦。如果把A区分为2个列。第一个列种萝卜,每隔0.2米种一个,第二个列种白菜,每隔0.2米种一个,这样看起来就会非常整齐规律,管理起来也方便简单。

作者:驴肉火烧 发布于:2017-1-17 20:56 分类:文件系统

Linux发展到现今,在fs目录下我们可以看到形形色色的文件系统,眼花缭乱的同时首先需要回答的问题是,为什么会有文件系统这个东西呢?我想如果能搞清楚这个问题,会帮助大家更好的理解文件系统,那么我就尝试着来模拟一次文件系统的演进过程,于是,我们来到了那一天,那天之前,人们还没有文件系统的概念。

友情提示 : 下面将在荒诞的场景下演进人类合理的诉求

神说,要有光,于是,光照大地

神说,要有风,于是,风动四方

神说,人类要记住神,于是,有了传说

神说,怕你们忘了,得记下来,于是,有了文字,信息被存储在石板上,竹片上,纸张上,硬盘里,flash中

当信息能存在硬盘中的时候,人类如获至宝,如此大的存储量,我们能装下全世界图书馆的馆藏,于是,我们想先放一套盗墓笔记进去。

好嘞,于是,我一个字一个字的将精彩的内容顺序存储在硬盘中,终于,全套的盗墓笔记被存储在硬盘中了,还没来得及高兴,就傻眼了,我不想看秦岭神树,怎么办,这并难不倒我,略加思索,就能想到解决方案,因为是顺序存储的,从开始的地方一直读下去,当恰好跳过秦岭神树章节内容的时候,就做一个标记,记录已经跳过的字节数,下次再看的时候,就直接读到硬盘对应的位置即可,经过一番努力,我找到了并把这个字节数写在了一张纸条上,以便下次可以直接读取,避免一次次的遍历。

后来,我开始有点不耐烦了,因为这张纸条里面的内容越来越多,比如最后一章的位置,终极第一次出现的位置等等,有时我甚至记不住我需要寻找的标记是否在纸条中了,终于有一天,这张纸条丢了,我只能呵呵并且从心底认为,仅仅是顺序存储无法满足我的需求,我需要管理这些内容。

我想,最起码我需要能把全套的盗墓笔记分为8本书吧,只要根据书名,比如邛楼石影,我就立刻能找到对应的内容,我立刻想到了最简单的解决方案,仍然使用顺序存储,只不过在内容录入的时候,给每本书分100MB的存储空间,这样我如果想看第7本,那么直接从600MB偏移开始即可,那么一套盗墓笔记只需要800MB就可以存储,但是,我很快又有了一个更优的方案,在每本书的100MB可用空间内,再进行细分,给每章节进行划分,假设每本书有50章,那么每章节就是2MB空间,这样每章节按照2MB对齐,我要找第6本书的第30章节,就是(500 + 29 * 2)MB 偏移,我甚至都有点洋洋自得了,简单的设计一下就可以再也不用依赖那张小纸条(已遗失)了。

但是,很快我又遇到了新的挑战,因为这块硬盘不是我的,开始说好的800MB没有了,我被要求只能使用8MB来存储全套的盗墓笔记,原先的设计继续使用,每章只能分到20KB,这样有些内容多的章节会越界,而有些内容少的章节又不够饱满,那些没有被利用起来的空间此时显得的是那么的珍贵,于是我开始了小心翼翼字斟句酌的重新设计。

看起来,顺序存储是最节约空间的,那么只有将小纸条(已遗失)的内容也存储在硬盘中了。于是,喝下一罐可乐后,我发觉将章节抽象成一个章节类是一个不错的注意,每个章节是该类的一个对象实例,类成员包括章节名称,章节起始位置,章节字数,每个对象都64字节对齐,这样400章的索引信息只需要25KB即可完成存储,我大大方方的将全部的章节类对象存储在8MB的前32KB区域,后面剩余的全部顺序存储内容,就这样,随着需求的不断增加,我的设计也渐渐开始有文件系统的影子了,尽管我并不知道,但是一切就这样发生了,是那么的自然。

我将全套盗墓笔记成功保存在8MB空间里已经过去了19天58分钟32秒,我渐渐发觉更高、更快、更强的绝不限于奥运精神,也充分体现了人类贪婪的本质,无尽的需求催生出这光怪陆离的大千世界。

就在今天下午,我得到一个通知,要么继续使用连续的存储空间,但是只能有4MB,要么去使用不连续的存储空间,总量可以仍然是8MB,那一刻,我的内心反而是平静的,因为我知道,这就是现实,一个不够优秀的系统是无法满足各种刁钻的需求的,并且我并不想丢掉一半的盗墓笔记,所以我必须使用不连续的存储空间,一个不算坏的消息是,就算是不连续,但是每块最小也有2048字节,并且连续的存储空间是2048字节对齐的,还有什么好说的,撸起袖子加油干,这很2017。

当时我的脑海中,浮现出了星空的图像,天顶中每颗闪烁的星代表的就是一段文字,我要怎么将它们串在一起呢?我想,首先要解决的是识别问题,即眼前的这颗星属于哪本书?是的,我需要星的索引信息,每条索引信息对应着一段可存储的空间,记录空间在硬盘中的偏移,长度,内容是属于哪本书,对应内容在书内的偏移,这样通过索引信息就可以在硬盘中找到存储着的盗墓笔记的片段了,于是有了如下的设计,

book_name用来存储书名,hd_ofs存储这段存储空间在硬盘中的偏移,file_ofs存储这段存储空间存储的内容在书中的偏移,chunk_len存储这段存储空间的长度,看起来是能工作的,那么这样的设计够不够好呢,答案显然是需要拿出工匠精神再来打磨一下了。

book_name,这里看起来很糟糕,如果书名很长则无法存储完整,如果书名很短则浪费了存储空间,这里真的需要存储一个书名吗?按照我的需求,盗墓笔记全套是8本书,那么第一本书,我这里记录1即可,依次则是2,3,4,...,我只需要数字就可以进行区分,于是新的设计出现了

但是,新的问题又出现了,我能够通过一个个的index对象找到数据块,但是我该如何找到这些index对象呢?由于每个index对象占用12字节,那么将index搓堆存在一个只存储index的数据块内,那么一个块能存170个index,就像下面这样

很好,现在有了一个index块,那么170个index最多只能映射(170 * 2048)字节(340KB)的内容,可我要存储的盗墓笔记不止这么点内容,所以还需要更多的index块

很好,现在有了更多的index块,我能通过index找到想要看的内容,但是index块也是不连续的,我要如何找到index块在哪里呢?其实,我对之前每个数据块填充170个index对象已经感觉难受了,因为170个index对象只使用了2040字节,这样一个数据块就有8字节的浪费,如果这8字节用来存储另一个index块在硬盘中的偏移位置,那么index块之间就能串联在一起,而我要做的就是找到那个入口

经过了两顿烧烤的谈判,我终于赢得了硬盘第1024个数据块的永久使用权,于是第1024数据块就成为了串起整部盗墓笔记的那个入口

http://www.wowotech.net/filesystem/370.html

扇区?块?

扇区与块的区别,这里简单说一下。

●先来说说硬盘吧
最终文件总还是要储存在硬盘上的嘛。

# fdisk -l
Disk /dev/cciss/c0d0: 146.7 GB, 146778685440 bytes
255 heads, 63 sectors/track, 17844 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

可以看到几个名词:heads/sectors/cylinders,分别就是磁头/扇区/柱面,每个扇区512byte(现在新的硬盘每个扇区有4K)了
硬盘容量就是heads*sectors*cylinders*512=255*63*17844*512=146771896320b=146.7G
注意:硬盘的最小存储单位就是扇区了,而且硬盘本身并没有block的概念。

●操作系统的文件系统
文件系统不是一个扇区一个扇区的来读数据,太慢了,所以有了block(块)的概念,它是一个块一个块的读取的,block才是文件存取的最小单位。
先来知道是哪种文件系统

# df -T
/dev/cciss/c0d0p5    ext3   112738028  81733116  25185772  77% /

OK,ext3文件系统 。

#  tune2fs -l /dev/cciss/c0d0p5 | grep "Block size"
Block size:               4096

一个block是4K,也就是说我所使用的文件系统中1个块是由连续的8个扇区组成。

简单的说扇区是对硬盘而言,块是对文件系统而言。

https://blog.csdn.net/my_bai/article/details/73331360

文件系统有哪些分类?为什么会有这么多类型?

不同的操作系统,不同的存储设备支持不同的文件系统类型。

那怎么查看linux系统下支持哪些文件系统?

ls -l /lib/modules/$(uname -r)/kernel/fs

正在使用的文件系统类型,前面没有nodev表示正在使用

$ cat /proc/filesystems
nodev	sysfs
nodev	rootfs
nodev	ramfs
nodev	bdev
nodev	proc
nodev	cgroup
nodev	cpuset
nodev	tmpfs
nodev	devtmpfs
nodev	debugfs
nodev	securityfs
nodev	sockfs
nodev	dax
nodev	pipefs
nodev	anon_inodefs
nodev	configfs
nodev	devpts
nodev	hugetlbfs
nodev	autofs
nodev	pstore
nodev	mqueue
	ext3
	ext2
	ext4
	xfs
nodev	binfmt_misc

 

ext2、ext3、ext4这些常见的类型,它们有什么区别?在什么场景下使用它们?

Ext家族是Linux支持度最广、最完整的文件系统,当我们格式化磁盘后,就已经为我们规划好了所有的inode/block/metadate等数据,这样系统可以直接使用,不需要再进行动态的配置,这也是它最优秀的特点,不过这也是它最显著的缺点,磁盘容量越大,格式化越慢,centos7.x已经选用xfs作为默认文件系统,xfs是一种适合大容量磁盘和处理巨型文件的文件系统。

Ext2与Ext3的比较

ext3和ext2的主要区别在于,ext3引入Journal(日志)机制,Linux内核从2.4.15开始支持ext3,它是从文件系统过渡到日志式文件系统最为简单的一种选择,ext3提供了数据完整性和可用性保证

  • ext2和ext3的格式完全相同,只是在ext3硬盘最后面有一部分空间用来存放Journal的记录;
  • 在ext2中,写文件到硬盘中时,先将文件写入缓存中,当缓存写满时才会写入硬盘中;
  • 在ext3中,写文件到硬盘中时,先将文件写入缓存中,待缓存写满时系统先通知Journal,再将文件写入硬盘,完成后再通知Journal,资料已完成写入工作;
  • 在ext3中,也就是有Journal机制里,系统开机时检查Journal的内容,来查看是否有错误产生,这样就加快了开机速度;


Ext3与Ext4的比较

Linux内核从2.6.28开始支持ext4文件系统,相比于ext3提供了更佳的性能和可靠性。下面先简单罗列出二者的差异,后续文章再来深入探索。
1. 与 Ext3 兼容。 执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。 
2. 更大的文件系统和更大的文件。 较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB的文件系统,以及 最大16TB 的文件。 
3. 无限数量的子目录。 Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。 
4. Extents。 Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。 
5. 多块分配。 当写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。 
6. 延迟分配。 Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。 
7. 快速 fsck。 以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。 
8. 日志校验。 日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。 
9. “无日志”(No Journaling)模式。 日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。 
10. 在线碎片整理。 尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。 
11. inode 相关特性。 Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。 
12. 持久预分配(Persistent preallocation)。 P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。 Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。 
13. 默认启用 barrier。 磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。

怎么查看当前磁盘用的什么文件系统类型

df -T 或者 sudo parted ------->print list 

$ sudo parted
GNU Parted 3.1
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print list                                                       
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  107GB  107GB  primary  ext3         boot


Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags: 

Number  Start  End    Size   File system  Flags
 1      0.00B  107GB  107GB  xfs

猜你喜欢

转载自blog.csdn.net/fanren224/article/details/88124911