硬盘的大致结构:
由盘片、机械臂、磁头、主轴马达组成。各盘片的中心在主轴,马达带动各盘片转动,盘片的两面均有磁头读写数据。
磁头在盘片上的各磁道读写数据,盘片的正反两面均有磁头读写。磁道是盘片上以主轴为圆心的各同心圆。显然由于各圆的半径不一样,存储容量也不相同。
磁道上每一个单位弧段称为一个扇区,可存储数据512bytes。同一磁盘内每个盘片相同位置的磁道构成一个柱面,显然一个盘片上有多少磁道,磁盘就有多少柱面。柱面是磁盘划分分区的单位。
在0磁道0扇区不会存储数据,该扇区存储的是MBR(Master Boot Record),共512bytes;前446bytes存储的是bootloader;之后64bytes存储磁盘分区表,每16bytes对应一个分区,故最多划分四个主分区,如需使用更多分区,则使用扩展分区,每块硬盘最多有一个扩展分区;最后两个字节称为“魔数”,表示该分区是否可引导(可启动)。
扩展分区实质是指向一个二级分区表,在二级分区表上又可以建立若干新分区,称为逻辑分区。扩展分区不能被格式化。
Linux上IDE接口与SATA接口磁盘对应的设备文件:
Linux系统中,IDE接口磁盘的设备文件为/dev/h[a-d],一般主机提供两个IDE接口,每个接口有主(master),从(slave)分别。每个接口对应的设备文件如下:
/dev/ha |
IDE1(主) |
/dev/hb |
IDE1(从) |
/dev/hc |
IDE2(主) |
/dev/hd |
IDE2(从) |
如某磁盘设备接在IDE2的主设备上,则其对应的设备文件为/DEV/hc。
SATA接口的磁盘设备中,SATA/USB/SCSI等设备的磁盘接口都是由SCSI模块来驱动的,它们的设备文件为/dev/sd[a-p]。SATA设备的磁盘接口与设备文件并非一一对应的关系,而是根据系统检测到设备的先后次序决定对应的设备文件。如某磁盘A接在SATA1上,磁盘B接在SATA2上,某U盘也接在此主机上,则它们的设备文件依次为/dev/sda、/dev/sdb、/dev/sdc(U盘开机后才可检测到)。
创建一个可供用户使用的分区分为三个步骤:
1、划分磁盘分区,并让内核读取识别之。
2、在磁盘分区上建立文件系统(即格式化)。
3、挂载至某目录下。此目录即成为访问该磁盘分区的入口。
所有分区都与根分区相关联,即根分区下的目录是所有分区直接或间接的访问入口;但在物理层面上根分区与其他分区是各自独立、平行的。
划分磁盘分区
使用命令fdisk。
它是一个交互式的命令。使用其选项“-l”并指定设备则显示该设备的所有分区信息,若无指定,则显示/proc/partitions(即内核可识别的设备)中所有设备的分区信息。
使用“fdisk 设备文件”即可进入交互模式进行分区了(以/dev/sdb为例):
在/dev/sdb上建立分区使用选项n
e表示扩展分区,p表示主分区。本例创建两个主分区和一个扩展分区:
创建过程中须指定分区大小,可用柱面数,也可使用K,M,G等单位,使用默认则直接敲回车。磁盘的开始柱面使用默认,否则会造成空间浪费。
创建扩展分区大小一般使用默认,否则会造成磁盘空间的浪费。扩展分区创建好之后就可以在其上创建逻辑分区了。逻辑分区号默认从5开始,1-4默认是留给主分区的。
上图为创建两个主分区,一个扩展分区,在扩展分区上创建了两个逻辑分区。可以看到扩展分区的Id System为5 Extended.
创建完毕后使用w保存退出该命令。
创建分区完毕后要使用partx或partprobe命令通知内核,是内核识别各分区。如此两命令出现异常,则重启系统也可使内核识别新建的各分区。
在/proc/partitions文件中显示的是内核已经识别了的各分区。上图表示内核已经识别了新建的sdb设备上的各分区。
创建文件系统(格式化)
为什么要在分区上创建文件系统?如果没有文件系统,数据的存储将杂乱无章且没有安全性,有了文件系统就可以有效保护数据,按名存取文件内的数据。
使用命令mkfs和mke2fs(针对ext系列文件系统)。若分区上已有数据,则重新创建文件系统,原数据将不复存在。
对指定分区创建文件系统的命令非常灵活,“.”后表示目前系统所支持的文件系统。例如其中的“mkfs.ext4 设备文件”表示在某分区上创建ext4文件系统。
仍以mkfs为例,选项“-t”表示指定文件系统。上图表示在sdb2分区上建立ext4文件系统,等同于命令“mkfs.ext4 设备文件”。
命令mke2fs只针对ext系列文件系统,但功能非常强大。如“-b”指定块大小,“-L”指定卷标,“-m”指定预留块的百分比。其中块大小为1K,2K,或4K(块大小取决于当前CPU对内存页框大小的支持,X86系统默认页框大小为4k,所以块大小应为4k以内的2的乘方,即1k、2k、4k);预留块表示硬盘预留给管理员管理磁盘使用的块占整个磁盘空间的百分比。
设置卷标也可使用专门的命令,e2label。
表示sdb6设备建立ext4文件系统,卷标为MyDisk,块大小为4096,预留块比例为5%等。mke2fs其他选项详见man手册。
ext文件系统的默认设置在配置文件/etc/mke2fs.conf中。
使用blkid命令可查看块设备的UUID,卷标等相关信息;不加参数则查看所有块设备。
命令tune2fs可修改分区上文件系统的许多属性,其与mkfs的关系类似于useradd和usermod的关系。
如“tune2fs-L 设备文件”可修改卷标,“tune2fs-m 设备文件”可修改保留块比例等(详见man手册)。但若要更换文件系统类型与块大小必须重新格式化。
“tune2fs-l 设备文件”为显示超级块信息(后续有关文件系统文章详述)。
挂载
分区格式化之后就可以挂载至某目录下了,挂载至哪个目录,哪个目录即成为该磁盘分区的入口。
使用命令mount。如果不加任何参数,则显示当前系统中所有分区挂载的情况。
挂载至某目录一般格式:“mount 设备文件 目录”。其中设备文件即格式化的分区,也可使用UUID,卷标来标识,如“mount label=MyDisk 目录”。其中目录即所谓的挂载点。
如果挂载点本来有数据,则挂载之后,原数据会被隐藏,卸载之后恢复。
上述使用指令挂载的结果在重启主机之后即失效,若需永远有效,可把挂载信息写入配置文件/etc/fstab中(写入此文件中会永久有效但不会立即生效)。
“mount-a”表示挂载/etc/fstab中所有支持挂载选项auto(默认有auto)的文件系统。
/etc/fstab文件中的内容每行以空格分隔,分为6段:
1、挂载分区的设备文件;也可用UUID或卷标指定
2、挂载点
3、挂载分区使用的文件系统
4、挂载选项:众多挂载选项使分区挂载更灵活,使用命令mount的“-o”选项即可调整挂载选项,如defaults、ro、auto、remount等选项(详见man手册);若需永久有效写入/etc/fstab中的第四字段即可。
5、转储频率:即备份的频率,0表示从不备份,1表示每天备份,2表示隔天备份等;dump命令也可修改转储频率。
6、自检次序(后续文件系统文章详述)。
卸载
使用命令umount,用法格式为“umount 挂载点”或“umount 分区设备文件”。
如果某进程正在使用挂载点目录,则无法卸载。可使用“fuser 挂载点”查看哪个进程正在访问;如有必要,可使用“fuser-km 挂载点”强行杀死正在访问指定挂载点的进程。
交换分区及其挂载与卸载
一个进程在运行时要占用内存空间。Linux操作系统支持多进程。如果多个进程同时使用内存空间,很有能相互影响。为了保护内存引入内存管理单元(MMU)的概念。把内存分成一个个页框;各进程使用虚拟的线性地址空间作为其内存,该线性地址空间的大小取决于CPU的字长(即寻址能力),如32位的CPU可寻址2^32字节,即4G。由线性地址空间映射到物理内存而不是直接使用,即可有效保护内存。
但线性地址空间往往比真实的物理内存大,当真正的物理内存不够用时,就要使用交换分区暂时存放内存当前不需要处理的数据。
交换分区实际就是磁盘上的分区,速度相比内存要慢很多,所以对于要求实时响应的服务器,主要靠内存,交换分区很小。
创建交换分区同样遵循三个步骤:划分磁盘分区,创建文件系统,挂载:
划分磁盘分区如前所述,但要将Id System改为swap,使用t改变分区的Id System,使用l可列出所有分区类型,选择其前面的编号即可。交换分区类型为82。
在sdb6分区类型变为swap后就可以在其上创建swap文件系统了。
创建swap文件系统,使用命令mkswap,格式为“mkswap 分区设备文件”,创建时可使用“-L”选项设定其卷标等。
启用swap分区相当于普通分区的挂载。使用命令swapon,格式为“swapon 设备文件”表示启用指定交换分区,无需指明挂载点。使用“-a”选项表示启用当前系统上所有交换分区。
禁用swap分区相当于普通文件的卸载。使用命令swapoff,格式为“swapoff 设备文件”。
若需要开机即启动交换分区,则普通分区一样写入配置文件/etc/fstab即可。其文件系统和挂载点均为swap。
使用命令free可查看当前内存与交换分区的使用与空闲情况,选项“-m”指定显示单位为“兆”。