首页 > 代码库 > 磁盘相关的知识

磁盘相关的知识

每一块硬盘都由一个或多个盘片组成,每一个盘片都有两个可以读写的盘面组成。

硬盘的逻辑组成:

磁道(Track):盘片的同心圆就称为磁道。

柱面(Cylinder):所有盘片的同一个磁道就组成了柱面。柱面是分区的最小单位。

扇区(Sector):存储数据的最小单位。每一个扇区为512字节。扇区包含用户数据、以及该扇区的一些标识信息,如所位于的磁头、磁道等编号信息。


MBR:Master Boot Record

MBR位于0盘片,0磁道,0扇区的512字节。MBR属于磁盘,不属于任何分区。



MBR有512字节

446字节:Boot Loader(程序代码),通过Boot Loader加载操作系统的内核。

64字节:分区表,16字节标识一个分区信息,最多可以标识4个分区。即主分区+扩展分区<=4。扩展分区最多只有一个,扩展分区不能直接使用,必须要将其化为逻辑分区才可以使用。对于SCSI磁盘来说,逻辑分区最多只有11个,其中1-4为主分区和扩展分区,因此对于scsi磁盘来说,分区范围是1-16.对于IDE接口的硬盘来说,最多有59个逻辑分区,范围是1-63.

2字节:Magic Number,标识MBR是否有效。


文件系统是管理软件,将分区里面的数据分为两块,一块称为元数据(Metadata,类似于索引,存储的非数据本身),另一块是数据存储区(才是存放真正的数据的)。数据存储区又分为一个个的逻辑存储单元,称为磁盘块(Block),每一个块都有编号。



inode bitmap

block bitmap

inode 

block


superblock


block group



设备文件:major、minor

设备文件是访问一个设备的入口。


创建一个设备文件:mknod

格式:
mknod [options] name type [major minor]

示例:

[root@Server3 tmp]# mknod -m 644 frame b 100 1
[root@Server3 tmp]# ls -l
total 1256
-rw-r--r-- 1 root root 641020 Jul 13 22:41 aa
-rw-r--r-- 1 root root 641020 Jul 13 22:30 cc
brw-r--r-- 1 root root 100, 1 jul 13 23:09 frame
[root@Server3 tmp]#



Master IDE:主盘hda,从盘hdb

Slave IDE:主盘hdc,从盘hdd


SCSI/SATA/USB磁盘:sd

先识别的称为sda、接着是sdb、sdc……


主分区和扩展分区:1-4

逻辑分区:从5开始。


当前系统有几块硬盘:fdisk -l 

[root@Server3 tmp]# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00047648
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1332    10485760   83  Linux
[root@Server3 tmp]#


查看指定磁盘的信息:fdisk -l disk

示例:

[root@Server3 tmp]# fdisk -l /dev/sda
Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00047648
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1332    10485760   83  Linux
[root@Server3 tmp]#



查看内核已经识别到的磁盘:cat /proc/pratitions

示例:

[root@Server3 ~]# cat /proc/partitions 
major minor  #blocks  name
   8        0   41943040 sda
   8        1     204800 sda1
   8        2   10485760 sda2
[root@Server3 ~]#


重新让内核识别一下分区表:partprobe(RHEL5上用)

RHEL6上使用的是:partx -a /dev/sda

[root@Server3 ~]# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
[root@Server3 ~]# cat /proc/partitions 
major minor  #blocks  name
   8        0   41943040 sda
   8        1     204800 sda1
   8        2   10485760 sda2
   8        4         31 sda4
   8        5    1059932 sda5
[root@Server3 ~]#


一个inode为128字节,在文件系统进行格式化时,metadata所占的磁盘空间就已经分配好了。

block size:1024字节(1K)、2048字节(2K)、4096字节(4K)

mkfs -t ext2 = mkfs.ext2
mkfs -t ext3 = mkfs.ext3
mke2fs:专门用于创建ext文件系统的指令。有很多的参数可供选择。
-n:并不是真正的创建文件系统,只是查找出备份的superblock的位置。
-L:设置文件系统的LABEL
-b:指定文件系统的block的大小。有效值是1024、2048、4096
-t:指定文件系统类型,如ext2、ext3、ext4,默认为ext2
-c:检查文件系统是否有bad block。
-c -c:以读写的方式检查文件系统。
-E:扩展选项。
-j:创建一个具有日志功能的ext2文件系统,也就是ext3.
-F:强制创建文件系统,即使该文件系统已经挂载。
-i:指定一个inode对应多少个字节。
-g:指定一个block group中的block的数量。
-G:指定block group的个数。
-I:指定inode的大小。
-m #:保留block的百分比,默认为5%,如果要保留为3%,则为-m 3。
-M:指定最近一次的挂载目录。
-N:inode的数量。
-U:指定文件系统的UUID。UUID可以用blkid来查看到。生成UUID用uuidgen指令。
-V:查看mke2fs的版本。
blkid:查看文件系统的UUID、文件系统类型以及LABEL
示例:
[root@Server3 ~]# blkid 
/dev/sda1: UUID="4d6d0163-a389-4bbc-ac23-ec99adcf511c" TYPE="ext4" 
/dev/sda2: UUID="7fdde686-2694-4400-8093-8e2458391446" TYPE="ext4" 
/dev/sda5: UUID="2cbaad52-8080-4bd2-ad53-010b9dfadbbb" TYPE="ext2" LABEL="MYDATA" 
[root@Server3 ~]#
e2label:查看或定义label
语法格式:e2label device [ new-label ]
示例:
[root@Server3 ~]# e2label /dev/sda5
MYDATA
[root@Server3 ~]# e2label /dev/sda5 mydata
[root@Server3 ~]# e2label /dev/sda5
mydata
[root@Server3 ~]#
tune2fs:调整文件系统的属性信息。
-j:无损将ext2升级为ext3文件系统。
-c:最大挂载次数。如果为0或-1,则不会被e2fsck或kernel检测。
-C:挂载多少次在下次启动的时候就会被e2fsck进行文件系统检查。
-i #d|m|w:检查间隔。d为天,m为月,w为周。0或-1关闭此功能。
-l:列出文件系统的superblock信息。等同于dumpe2fs -h device
-L:设置label。
-m:设置保留块的百分比。
-M:修改最近一次挂载的目录。
-o:挂载选项。常用的有acl。
-r:设置保留block的数量。
-T:设置最近一次使用e2fsck进行文件系统的检查时间。时间格式为:YYYYMMDD[HH[MM[SS]]],如果是now,则为当前时间。
-u:设置可以使用保留块空间的用户的username或uid
-U:修改UUID。
说明:-c或-i对于数据库所在的磁盘来说,可能需要关闭该文件系统的自检功能。
示例:
[root@Server3 ~]# tune2fs -c 0 /dev/sda5
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
[root@Server3 ~]# tune2fs -i -1 /dev/sda5
tune2fs 1.41.12 (17-May-2010)
Setting interval between checks to 18446744073709465216 seconds
[root@Server3 ~]#
设置LABEL:
[root@Server3 ~]# blkid /dev/sda5
/dev/sda5: UUID="2cbaad52-8080-4bd2-ad53-010b9dfadbbb" TYPE="ext2" LABEL="mydata" 
[root@Server3 ~]# e2label /dev/sda5
mydata
[root@Server3 ~]# tune2fs -L MYDATA /dev/sda5
tune2fs 1.41.12 (17-May-2010)
[root@Server3 ~]# e2label /dev/sda5
MYDATA
[root@Server3 ~]#


查看ext2、ext3、ext4文件系统的信息:dumpe2fs
-h:查看superblock的信息。等同于tune2fs -l
如果block的信息比较离散,就说明产生了碎片。
fsck:检查并修复文件系统。
-t fstype:指定文件系统的类型。
-a:自动修复。不需要重复的按y。
-y:等同于-a,在一些文件系统中,需要用-y。
e2fsck:专门用于检查并修复ext文件系统的。
-a:自动修复。不需要重复的按y。
-f:强制检查,即使文件系统是clean的。
-b backup-superblock:使用备份的superblock修复已经损坏的superblock。查看备份的superblock可以用mke2fs -n device即可。
说明:在对文件系统进行e2fsck或fsck检查时,需要将文件系统卸载。
示例:
[root@Server3 ~]# e2fsck -f /dev/sda5
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
MYDATA: 11/66384 files (0.0% non-contiguous), 4503/264983 blocks
[root@Server3 ~]#
挂载:将新的文件系统与当前根文件系统建立关联关系。
卸载:将新的文件系统与当前根文件系统解除关联关系。
mount:挂载。
语法格式:mount 设备  挂载点
设备:
设备文件:如/dev/sda5
卷标:LABEL="xxx"
UUID:UUID="xxxx"
挂载点:为目录。
要求:
1. 此目录要事先存在。
2. 目录没有被其他进程使用。
3. 目录中如果有文件,则原文件会被暂时隐藏。
如果直接使用mount,则可以查看系统中所有已经挂在的设备。
示例:
[root@Server3 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sda5 on /backup type ext4 (rw)
[root@Server3 ~]# 
示例:
[root@Server3 ~]# blkid /dev/sda5
/dev/sda5: LABEL="MYDATA" UUID="f2871de8-1e3d-4540-a3a8-30565c82fbec" TYPE="ext4" 
[root@Server3 ~]# tune2fs -c -1 -i -1 /dev/sda5
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
Setting interval between checks to 18446744073709465216 seconds
[root@Server3 ~]# mkdir /backup
[root@Server3 ~]# mount /dev/sda5 /backup
[root@Server3 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             9.9G  7.3G  2.1G  78% /
tmpfs                 245M     0  245M   0% /dev/shm
/dev/sda1             194M   28M  156M  16% /boot
/dev/sda5            1019M   34M  934M   4% /backup
[root@Server3 ~]# 
卸载:umount
格式:
umount 设备
umount 挂载点
说明:卸载是,没有进程使用该文件系统。
示例:
[root@Server3 backup]# umount /dev/sda5
umount: /backup: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@Server3 backup]# umount /backup
umount: /backup: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@Server3 backup]#
mount语法格式:
mount [options] [-o options] device mount-point
options:
-a:表示挂载在/etc/fstab文件中定义的所有文件系统。
-n:默认情况下,mount命令每挂载一次设备,都会将信息写入到/etc/mtab文件中。使用-n选项是不讲挂载信息写入到/etc/mtab文件中。
-t fstype:指定要挂载的设备上的文件系统的类型。如果没有指定该选项,则mount会调用blkid获取文件系统的类型。
-r:以只读的方式挂载。
-w:以读写的方式挂载。
-o:指定额外的挂载选项,也就是指定文件系统启用的属性。
async:数据时以异步的方式写入到硬盘。先保存到内存,然后在保存到硬盘。
sync:数据同步写入到硬盘。
atime:每一次写入都更新atime。每一次atime都会产生一次IO。
noatime:不更新atime。
auto:可以被-a选项自动的挂载。
noauto:不可自动的挂载。
defaults:使用默认的挂载选项。rw,  suid,  dev,  exec,  auto,  nouser, async, and relatime.
dev:允许文件系统中存在设备文件。
nodev:不允许文件系统中存在设备文件。
exec:允许执行二进制程序
noexec:不允许执行二进制程序。
_netdev:指定挂载的设备为网络上的设备,如果网络上的设备不可用,不会一直尝试挂载。
suid:允许文件系统上存在suid或sgid的文件并产生影响。
remount:尝试重新挂载一个已经挂载的文件系统。如mount -o remount,rw
rw:以读写的方式挂载。
ro:以只读的方式挂载。
quota:启动quota功能。
--bind:额外的挂载到另外的一个目录。
sync和async性能对比:
说明:默认挂载选项为async。
[root@Server3 backup]# time cp -r /etc/* .
real0m19.830s
user0m0.029s
sys0m5.395s
[root@Server3 backup]# rm -rf *
[root@Server3 backup]# mount -o remount,sync /dev/sda5
[root@Server3 backup]# time cp -r /etc/* .
real2m34.755s
user0m0.048s
sys0m4.754s
[root@Server3 backup]#



本文出自 “HeZhang” 博客,请务必保留此出处http://hezhang.blog.51cto.com/1347601/1438219