Linux磁盘管理
硬盘种类及物理结构
硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等;
- 任何一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;
- SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的 Ultral-160就是基于SCSI-3标准的;
- IDE 遵循的是ATA标准,而目前流行的SATA,是ATA标准的升级版本;IDE是并口设备,而SATA是串口,SATA的发展目的是替换IDE;
硬盘的物理几何结构是由盘、磁盘表面、柱面、扇区组成,一个硬盘内部是由几张碟片叠加在一起,形成一个柱体面;每个碟片都有上下表面;磁头和磁盘表面接触从而能读取数据;
原理
盘片以恒定的速度旋转,它们通过很小的滑动磁头进行读取和写入,这些小磁头就像唱针在唱片机上一样前后移动。磁头漂浮在距离盘片表面非常近的位置,但并没有实际接触盘片。磁头和旋转盘片之间的距离可以和F-16喷气式战斗机以全速在距离地面10英尺(~3M)的高度处飞行相提并论。如果磁头接触到了盘片,那么这就称作磁头碰撞,这种情况是非常具有破坏性的。
每个表面至少需要一个磁头。将磁头移动到正确位置读取特定的一段数据,这称作寻道。当硬盘在磁头下面旋转时磁头所能达到的每个位置称为磁道。磁道还可以进一步划分为扇区,通常情况下它为512字节。
在不同的盘片距离旋转轴相同距离的一系列磁道称为一个柱面。如果所有磁头都一起移动,那么不需要任何额外的移动,就能够读取存储在一个单独柱面上的数据。
尽管磁头的移动相当快,但它们仍然比硬盘的旋转速度要慢得多。因此,任何不需要移动磁头寻找新位置的硬盘访问都会更快一些。
硬盘容量及分区大小
我们通过 fdsik -l 可以发现如下的信息:
Disk /dev/hda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 765 6144831 7 HPFS/NTFS /dev/hda2 766 2805 16386300 c W95 FAT32 (LBA) /dev/hda3 2806 9729 55617030 5 Extended /dev/hda5 2806 3825 8193118+ 83 Linux /dev/hda6 3826 5100 10241406 83 Linux /dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris /dev/hda8 5199 6657 11719386 83 Linux /dev/hda9 6658 7751 8787523+ 83 Linux /dev/hda10 7752 9729 15888253+ 83 Linux
其中 heads 是磁盘面;sectors 是扇区;cylinders 是柱面;每个扇区大小是 512byte,也就是0.5K;
通过上面的例子,我们发现此硬盘有 255个磁盘面,有63个扇区,有9729个柱面;所以整个硬盘体积换算公式应该是:
磁面个数 x 扇区个数 x 每个扇区的大小512 x 柱面个数 = 硬盘体积 (单位bytes)
所以在本例中磁盘的大小应该计算如下: 255 x 63 x 512 x 9729 = 80023749120 bytes
上面例子中,硬盘厂家算法 和 操作系统算数比较:
硬盘厂家: 80023749120 bytes = 80023749.120 K = 80023.749120 M (向大单位换算,每次除以1000) 操作系统: 80023749120 bytes = 78148192.5 K = 76316.594238281 M (向大单位换算,每次除以1024)
我们在查看分区大小的时候,可以用生产厂家提供的算法来简单推算分区的大小;把小数点向前移动六位就是以G表示的大小;比如 hda1 的大小约为 6.144831G ;
硬盘分区划分标准
硬盘的分区由主分区、扩展分区和逻辑分区组成;所以我们在对硬盘分区时要遵循这个标准;
主分区(包括扩展分区)的最大个数是四个
主分区(包含扩展分区)的个数是由硬盘的主引导记录MBR(Master Boot Recorder)决定的,MBR存放启动管理程序(GRUB,LILO,NTLOARDER等)和分区表记录
其中扩展分区也算一个主分区;扩展分区下可以包含更多的逻辑分区;
所以主分区(包括扩展分区)范围是从1-4,逻辑分区是从5开始的;
比如下面的例子:
Device Boot Start End Blocks Id System /dev/hda1 * 1 765 6144831 7 HPFS/NTFS /dev/hda2 766 2805 16386300 c W95 FAT32 (LBA) /dev/hda3 806 9729 55617030 5 Extended /dev/hda5 2806 3825 8193118+ 83 Linux /dev/hda6 3826 5100 10241406 83 Linux /dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris /dev/hda8 5199 6657 11719386 83 Linux /dev/hda9 6658 7751 8787523+ 83 Linux /dev/hda10 7752 9729 15888253+ 83 Linux
通过这个例子,我们可以看到主分区有3个,从 hda1-hda3 ,扩展分区由 hda5-hda10 ;
此硬盘没有主分区4,所以也没有显示主分区hda4 ;但逻辑分区不可能从4开始,因为那是主分区的位置,明白了吧
最合理的的分区方式
最合理的分区结构:
主分区在前,扩展分区在后,然后在扩展分区中划分逻辑分区; 主分区的个数+扩展分区个数要控制在四个之内。
Linux硬盘命名
Linux磁盘命名的概念和我们平常使用的Windows系统有些“感冒”。
Linux中,每个硬件设备都有一个称为设备名称的特别名字
例如,接在IDE1的第一个硬盘(master主硬盘),其设备名称为/dev/hda(Hard Disk),也就是说我们可以用“/dev/hda”来代表此硬盘,SCSI 和SATA 硬盘在Linux通常也是表示为 sd* ,比如 sda 、sdb … …
我们可以通过 fdisk -l 来准确查看
下面的信息相信大家看了以后会有“一目了然”的感觉,当然也需要一段时间的适应:
| 磁盘 | 设备名称 |
|---|---|
| IDE1的第1个硬盘(master) | /dev/hda |
| IDE1的第2个硬盘(slave) | /dev/hdb |
| IDE2的第1个硬盘(master) | /dev/hdc |
| IDE2的第2个硬盘(slave) | /dev/hdd |
| SCSI的第1个硬盘 | /dev/sda |
| SCSI的第2个硬盘 | /dev/sdb |
Linux分区命名
分区的目的,是为了让数据能够分类存放。每一个分割出来的区域,就称为一个“分区”(partition),在Solaris/BSD中,也常常用“slice”(片)的概念,在Linux中,分区的概念和Windows得更加接近,硬盘分区按照功能的不同,可以分为以下几类:
1. 主分区 (primary) 2. 扩展分区(extended) 3. 逻辑分区(logical)
主分区(primary)
通常在划分硬盘的第1个分区时,会指定为主分区。但是和Windows不同的是,windows中一个硬盘最多只允许有1个主分区,而Linux最多可以让用户创建4个主分区。
扩展分区(extended)
由于Linux中一个硬盘最多只允许有4个主分区,如果想要创建更多的分区,怎么办?
于是就有了扩展分区的概念。用户可以创建一个扩展分区,然后在扩展分区上创建多个逻辑分区。
从理论上来说,逻辑分区没有数量上的限制。
这个概念,和Windows可说是一模一样。
逻辑分区(logical)
逻辑分区不能够直接创建,它必须依附在扩展分区下,容量受到扩展分区大小的限制。通常逻辑分区是存放文件和数据的地方。
有了磁盘命名和分区命名的概念,理解诸如/dev/hda1之类的分区名称,应该就不是难事了。
具体的,可以看下面的表示:
| 分区 | 分区名称 |
|---|---|
| IDE1的第1个硬盘(master)的第1个主分区 | /dev/hda1 |
| IDE1的第1个硬盘(master)的第2个主分区 | /dev/hda2 |
| IDE1的第1个硬盘(master)的第3个主分区 | /dev/hda3 |
| IDE1的第1个硬盘(master)的第4个主分区 | /dev/hda4 |
| IDE1的第1个硬盘(master)的第1个逻辑分区 | /dev/hda5 |
| IDE1的第1个硬盘(master)的第2个逻辑分区 | /dev/hda6 |
| IDE1的第2个硬盘(slave)的第1个主分区 | /dev/hdb1 |
| IDE1的第2个硬盘(slave)的第2个主分区 | /dev/hdb2 |
| SCSI的第1个硬盘的第1个主分区 | /dev/sda1 |
| SCSI的第1个硬盘的第2个主分区 | /dev/sda2 |
备注:
旧的linux要支持大硬盘(>320G),升级内核当然是必须的啦,同时需要更新这个软件包到最新 e2fsprogs-1.35.tar.gzft 才能正常使用fsck等相关命令
hdparm设置IDE接口参数
hdparm这个程序通过和Linux的IDE驱动程序打交道来获得和改变硬盘的参数。其中hdparm能够设置硬盘的供电模式,启用和禁用DMA,设置只读标志,以及打印详细的硬盘信息。
hdparm命令的一些常用的其他参数功能
-a <快取分区> 设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定。 -A <0或1> 启动或关闭读取文件时的快取功能。 -c <I/O模式> 设定IDE32位I/O模式。 -C 检测IDE硬盘的电源管理模式。 -d <0或1> 设定磁盘的DMA模式。 -f 将内存缓冲区的数据写入硬盘,并清楚缓冲区。 -g 显示硬盘的磁轨,磁头,磁区等参数。 -h 显示帮助。 -i 显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供。 -I 直接读取硬盘所提供的硬件规格信息。 -k <0或1> 重设硬盘时,保留-dmu参数的设定。 -K <0或1> 重设硬盘时,保留-APSWXZ参数的设定。 -m <磁区数> 设定硬盘多重分区存取的分区数。 -n <0或1> 忽略硬盘写入时所发生的错误。 -p <PIO模式> 设定硬盘的PIO模式。 -P <磁区数> 设定硬盘内部快取的分区数。 -q 在执行后续的参数时,不在屏幕上显示任何信息。 -r <0或1> 设定硬盘的读写模式。 -S <时间> 设定硬盘进入省电模式前的等待时间。 -t 评估硬盘的读取效率。 -T 平谷硬盘快取的读取效率。 -u <0或1> 在硬盘存取时,允许其他中断要求同时执行。 -v 显示硬盘的相关设定。 -W <0或1> 设定硬盘的写入快取。 -X <传输模式> 设定硬盘的传输模式。 -y 使IDE硬盘进入省电模式。 -Y 使IDE硬盘进入睡眠模式。 -Z 关闭某些Seagate硬盘的自动省电功能。
使用hdparm改善Linux系统性能
如果你的Linux系统运行于IDE硬盘,可以使用hdparm工具来提高磁盘I/O的性能。不过使用hdparm要小心,因为可能破坏硬盘上的数据。所以在使用hdparm之前,仔细阅读你的硬盘手册。根据你具体的硬盘规格来使用相应的hdparm开关参数。
对一块UltraATA/66 EIDE 硬盘,其控制芯片支持多PIO模式和DMA,我们使用以下命令来调谐磁盘性能:
# /sbin/hdparm -x66 -d1 -u1 -m16 -c3 /dev/hda
选项说明
① c3 :就是把硬盘的16位格式转换为32位模式(32-bit mode w/sync)。控制数据如何从pci总线传递到控制器。
② m16 :改变硬盘的多路扇区的读功能,-m16可以使得硬盘在一次i/o中断中读入16个扇区的数据(据具体硬盘而定)。
③ d1:打开DMA模式。
④ x66 :在支持UDMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。
⑤ u1 :Linux在处理磁盘中断时,可以unmask其他的中断或者响应其他中断相关的任务。
查看以上的更改情况可以使用命令:
# /sbin/hdparm /dev/hda
测试磁盘I/O性能可以使用命令:
# /sbin/hdparm -tT /dev/hda
如果磁盘的性能有改进的话,使用命令来保存设置:
# /sbin/hdparm -k1 /dev/hda

