内容:
硬盘结构
文件系统结构
硬链接和软链接
ext4和ext3性能对比
加密磁盘
实验环境:(Red Hat 6.5)
要想了解文件系统的结构,还要从文件储存说起。文件存储顾名思义是放在我们的硬盘上的,所以我们先从硬盘的结构、文件系统的结构介绍。
硬盘结构
先来了解一下硬盘是个什么东西啦!下面,我们就看一看硬盘的物理组成,了解了物理组成之后,再来看一下怎么样进行硬盘的分割的。
1.1 硬盘概述
对许多用户来讲,硬盘是计算机系统最重要,也是最神秘的一部分。它是一个密封的部件,用于计算机的数据存储。因为硬盘在用户有意擦除数据前能够一直保留所存储的数据,计算机一般用它来存储最关键的程序和数据,因此当硬盘发生故障时,产生的后果一般都是非常严重的。为了正确地维护、服务以及扩展计算机系统,必须清楚硬盘是如何工作的。
硬盘包括一组刚性的、圆盘状的盘片,与软盘不同的是,这些盘片不能弯曲或折叠――因此被称为硬盘。在大多数硬盘里是无法拆卸盘片的,因此有时也把它们叫做固定磁盘存储器。
(注意 : 硬盘驱动器曾经被称做温彻斯特(Wincheseer)驱动器。这个名词起源于1973年,IBM研制出了一种高速硬盘驱动器Model 3340,它有30MB的固定盘片容量和30MB的可换盘片容量。该驱动器不久就被昵称为温彻斯特,以著名的温彻斯特30-30来福枪命名。在那以后的一段时间里,所有的使用带浮动头的高速旋转盘片的驱动器在一般说法中都被叫做温彻斯特驱动器)
1.2硬盘的结构
就硬盘的物理组件来说,硬盘其实是由许许多多的圆形硬盘盘所组成的,依据硬盘盘能够容纳的数据量,而有所谓的单碟 (一块硬盘里面只有一个硬盘盘) 或者是多碟 (一块硬盘里面含有多个硬盘盘)的硬盘。在这里我们以单一个硬盘盘来说明,硬盘盘可由底下的图形来示意
硬盘盘的示意图
在两个硬盘盘上面的同一个磁道就是一个磁柱啦!这个磁柱也是磁盘分割( partition )时的最小单位了; 另外,由圆心向外划直线,则可将磁道再细分为一个一个的扇区( Sector ),这个扇区就是硬盘盘上面的最小储存物理量了! 通常一个 sector 的大小约为 512 Bytes,每个扇区储存512字节(相当于0.5KB)。
簇是文件的大小其实就是文件内容实际具有的字节数,它以Byte为衡量单位,只要文件内容和格式不发生变化,文件大小就不会发生变化。但文件在磁盘上的所占空间却不是以Byte为衡量单位的,它最小的计量单位是“簇(Cluster)”。
文件系统是操作系统与驱动器之间的接口,当操作系统请求从硬盘里读取一个文件时,会请求相应的文件系统(FAT 16/32/NTFS)打开文件。扇区是磁盘最小的物理存储单元,但由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理。每个簇可以包括2、4、8、16、32或64个扇区。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性。为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个簇中只能放置一个文件的内容,因此文件所占用的空间,只能是簇的整数倍;而如果文件实际大小小于一簇,它也要占一簇的空间。所以,一般情况下文件所占空间要略大于文件的实际大小,只有在少数情况下,即文件的实际大小恰好是簇的整数倍时,文件的实际大小才会与所占空间完全一致。
super block的中文名称是超级块,它是硬盘分区开头――开头的第一个byte是byte 0,从 byte 1024开始往后的一部分数据。由于 block size最小是 1024 bytes,所以super block可能是在block 1中(此时block 的大小正好是 1024 bytes),也可能是在block 0中。超级块中的数据其实就是文件卷的控制信息部分,也可以说它是卷资源表,有关文件卷的大部分信息都保存在这里。例如:硬盘分区中每个block的大小、硬盘分区上一共有多少个block group、以及每个block group中有多少个inode。
(注,簇类似于Linux系统中的block)
1.3现在硬盘的区位记录
Zoned-bit recording(ZBR 区位记录)是一种物理优化硬盘存储空间的方法,此方法通过将更多的扇区放到磁盘的外部磁道而获取更多存储空间,也称为zone-bin recording,zone recording,zone-density recording或者multiple-zone recording。 所有的硬盘驱动器都是由一些磁盘片组成。在每个磁盘片中,数据存放的物理位置呈同心圆状,这些同心圆称为磁道。每 个磁道上包含若干扇区。每个扇区存储的数据容量是一致的。磁道的周长与同心圆的直径成正比。在早期的硬盘驱动器中,所有的磁道包含的扇区数目都是一样的,按照固定的圆心角辐射出去,就可以简单的将各磁道的扇区数进行统一。这样,在磁道边缘的扇区弧长就要大于内部的扇区弧长,其存储数据的密度也要比内部磁道 的密度要小。最终,导致外部磁道的空间浪费。为了有效利用外部磁道空间,让所有的磁道扇区存储数据密度一致,就需要保证所有扇区的弧长一致。这样就要根据磁道的半径来重新分配扇区数目。Zoned0bit recording 方法通过将磁道分组(这种磁道组称为zone)实现了这一目标。内部磁道的扇区数目较少,外部磁道的扇区数目较多。这样,外部磁道和内部磁道的存储空间利 用率都相等,充分利用了整个硬盘的空间。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是1KB,即连2个 sector组成一个 block。 (4K =8扇区)
硬盘读取特点:读外圈的数据快,读内圈的数据慢
1.4在Linux下查看块的大小
查看系统块大小: [root@xuegod63 Desktop]# tune2fs -l /dev/sda1 | grep --color size
例:
[root@xuegod63 Desktop]# ll -dh /boot/test/ /test/ drwxr-xr-x 2 root root 1.0K Jan 30 21:07 /boot/test/ drwxr-xr-x 2 root root 4.0K Jan 30 21:07 /test/
文件系统结构
大家想知道什么是文件系统吗,让我来给大家说一说。Linux文件系统由三部分组成文件名,inode,block(真正存数据),为了方便下面的讲述,我先来说一下文件名、inode、block、硬盘之间的关系。比如说文件名就是一件事那么我想记录下来,我们记录的事我可以叫它日记,inode也就相当于是日记。我们要把这个日记写到什么上面去呢,肯定是日记本吧,那么block就等于是我们的日记本。我们写完了会把日记本放到哪里呢?多数人会选择自己的书架或书桌,那么最后的硬盘则就和我们的书架或书桌一个的原理用来存放的地方。
下面就来讲解下inode、block。有人说为什么不讲下文件名,顾名思义文件名可以理解为一个故事的名字。
2.1.inode:
inode:文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
2.1.1.inode的内容
inode包含文件的元信息,具体来说有以下内容:
文件的字节数
文件拥有者的User ID
文件的Group ID
文件的读、写、执行权限
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
链接数,即有多少文件名指向这个inode
文件数据block的位置
可以用stat命令,查看某个文件的inode信息:
#stat example.txt
总之,除了文件名以外的所有文件信息,都存在inode之中。
语法:stat 文件
例:
[root@xuegod163 ~]# touch xubin #创建xubin文件 [root@xuegod163 ~]# stat xubin #查看xubin文件的inode信息 File: "xubin" Size: 0 Blocks: 0 IO Block: 4096 普通空文件 Device: 802h/2050d Inode: 129796 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-09-09 21:42:19.840021012 +0800 Modify: 2015-09-09 21:42:19.840021012 +0800 Change: 2015-09-09 21:42:19.840021012 +0800 [root@xuegod163 ~]# ll xubin #ll查看xubin文件 -rw-r--r-- 1 root root 0 9月 9 21:42 xubin
2.1.2.inode的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每 个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。
例:
[root@xuegod163 ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda2 640848 145497 495351 23% / tmpfs 505110 5 505105 1% /dev/shm /dev/sda1 51200 40 51160 1% /boot /dev/sr0 0 0 0 - /mnt
2.1.3.使用ls -i命令,可以看到文件名对应的inode号码:
语法:ls -i 文件名
例:
[root@xuegod163 ~]# ll -i xubin #查看xubin文件对应的inode号码 129796 -rw-r--r-- 1 root root 0 9月 9 21:42 xubin
1)查看目录的inode号
例:
[root@xuegod163 ~]# ls -di /etc/ #查看/etc/目录对应的inode号码 12 /etc/
2.1.4.硬链接:(hard link)
文件名和inode号码是对应关系,每个inode号码对应一个文件名。但是, Linux系统允许,多个文件名指向同一个 inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"。
ln命令可以创建硬链接:
语法: ln 源文件 目标文件[root@xuegod163 ~]# ln xubin xubin1 #创建xubin、xubin1这两个硬链接例:[root@xuegod163 ~]# ll -id xubin xubin1 #查看xubin、xubin1这两个硬链接129796 -rw-r--r-- 2 root root 22 9月 9 21:55 xubin129796 -rw-r--r-- 2 root root 22 9月 9 21:55 xubin1
总结:( 硬链接特点,创建时,不能跨分区,不能给文件夹)
2.1.5.软链接:(soft link)
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"。
语法:ln -s命令可以创建软链接。
ln -s 源文文件或目录 目标文件或目录
例:
[root@xuegod163 ~]# ln -s xubin xubin1 #创建xubin这个软连接 [root@xuegod163 ~]# ll xubin xubin1 #查看xubin这个软连接 -rw-r--r-- 2 root root 22 9月 9 21:55 xubin lrwxrwxrwx 1 root root 6 9月 9 22:01 xubin1 -> xubin
跨分区创建
[root@xuegod163 ~]# ln -s /boot/grub/grub.conf ./xnm #跨分区创建软连接 目录: ln -sd /etc/ etc1 #给目录创建软连接 系统自带的软链接 [root@xuegod163 ~]# ll /etc/grub.conf #查看系统自带的软链接 lrwxrwxrwx. 1 root root 22 4月 8 02:44 /etc/grub.conf -> ../boot/grub/grub.conf [root@xuegod163 ~]# ll /boot/grub/menu.lst #查看系统自带的软链接 lrwxrwxrwx. 1 root root 11 4月 8 02:44 /boot/grub/menu.lst -> ./grub.conf
例:查看目录的链接数
[root@xuegod163 ~]# mkdir xubin #创建xubin目录 [root@xuegod163 ~]# ll -d xubin/ #查看目录 drwxr-xr-x 2 root root 4096 9月 9 22:10 xubin/ [root@xuegod163 ~]# cd xubin/ #切换到xubin目录 [root@xuegod163xubin]# ll -a #查看目录链接数 总用量 8 drwxr-xr-x 2 root root 4096 9月 9 22:10 . dr-xr-x---. 26 root root 4096 9月 9 22:10
2.1.6.实际工作中的问题:
在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
2.2. block:
自从开始Linux 软件平台开发,经常遇到“Block Size”。但经常发现此block size非彼block size。意义不一样,大小值也不一样。Open Source的东东有时候也挺烦的。下面是自己的总结。通常Linux的“block size”指的是1024 bytes,Linux用1024-byte blocks 作为buffer cache的基本单位。但linux的文件系统的block确不一样。例如ext3系统,block size是4096。使用tune2fs可以查看带文件系统的磁盘分区的相关信息,包括block size。
fdisk显示的不同的信息,理解一下这几个概念:
Disk /dev/hda: 250.0 GB, 250059350016 bytes 255 heads, 63 sectors/track, 30401 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 1305 10482381 83 Linux /dev/hda2 1306 1566 2096482+ 82 Linux swap /dev/hda3 1567 30401 231617137+ 83 Linux
8225280就是cylinder size。一共有30401个cylinder。Start和End分别标记的是各个分区的起始cylinder。第4列显示的就是以1024为单位的block。为什么“2096482+”有个“+”号呢?因为啊,总size除1024除不尽,是个约数,表示2096482。
较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。
Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。
日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
l磁盘加密
LUKS(Linux Unified Key Setup)为Linux硬盘加密提供了一种标准
cryptsetup是linux下得一个分区加密工具,是在经过加密的块设备上再创建文件系统,然后再进行挂载使用,可以达到最底层的加密。
fdisk /dev/sdb fdisk #分出一个sdb1 fdisk �Cl
(1)安装包: [root@xuegod63 Desktop]# rpm -qf `which cryptsetup ` cryptsetup-luks-1.2.0-6.el6.x86_64 下面开始对分区进行加密 (2)cryptsetup luksFormat /dev/sdb1 #设置为加密分区 出现要输入yes的地方一定要输入YES (3)cryptsetup luksOpen /dev/sdb1 disk1 # 将分区映射成disk1,则这个设置就在/dev/mapper中 (4) mkfs.ext4 /dev/mapper/disk1 #格式化加密分区 (5)mount /dev/mapper/disk1 /opt #挂载加密分区 (6) df 查看分区挂载情况
(1)umount /dev/mapper/disk1 #卸载分区 cryptsetup luksClose /dev/mapper/disk1 #关闭加密分区
(2)生成加密分区的密码文件,实现开机自动挂载加密分区(最好不要生成加密文件)
vi /etc/crypttab 写入: disk1 /dev/sdb1 /root/key #(如果这里写none的话,当系统启动时在读取分区时候,会一直停在那,等待输入密码) echo -n "123" > /root/key 生成密码文件 chmod 700 /root/key 修改权限 cryptsetup luksAddKey /dev/sdb1 /root/key 添加口令到/dev/sdb1中 cat /etc/crypttab disk1 /dev/sdb1 /root/key
4设置开机自动挂载
vi /etc/fstab 自动挂载文件 /dev/mapper/disk1 /opt ext4 defaults 0 0
学神-IT-教育51cto技术交流群:468845589 快来上我们公开课吧!
学神MK老师:1273815479
学神ZY老师:3054384936
学神教育1508班VIP学员旭斌编译提供