Linux磁盘管理

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

由于硬盘生产商和操作系统换算不太一样,硬盘厂家以10进位的办法来换算,而操作系统是以2进位制来换算,所以在换算成M或者G时,不同的算法结果却不一样;所以我们的硬盘有时标出的是80G,在操作系统下看却少几M;

上面例子中,硬盘厂家算法 和 操作系统算数比较:

硬盘厂家: 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个主分区,如果想要创建更多的分区,怎么办?
于是就有了扩展分区的概念。用户可以创建一个扩展分区,然后在扩展分区上创建多个逻辑分区。

从理论上来说,逻辑分区没有数量上的限制。

创建扩展分区的时候,会占用一个主分区的位置,因此,如果创建了扩展分区,一个硬盘上便最多只能创建3个主分区和一个扩展分区。而且,扩展分区不是用来存放数据的,它的主要功能是为了创建逻辑分区。

这个概念,和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 
wiki/public/linux/linux磁盘管理.txt · 最后更改: 2025/11/27 04:36