设备文件
在 Linux 中一切皆文件,磁盘在 Linux 系统中的表现形式就是一个设备文件。
设备文件大致可分为两类:
- 块设备:Block,存取单位为“块”,如硬盘;
- 字符设备:char,存取单位为“字符”,如键盘;
设备文件的作用是用来关联至一个设备的驱动程序,进而能跟与之对应的硬件设备进行通信。
每一个设备在内核级别都是靠一个设备号码来标识的,而设备号码又可分为如下两类:
- 主设备号:major number,标识设备类型;
- 次设备号:minor number,表示同一类型下的不同设备;
在 Linux 系统中,几乎所有的硬件装置文件都在 /dev
这个目录内,查看该目录非普通文件:
可以看到,在文件为设备文件时,对于普通文件的大小列位置表现为 num1,num2
,而这里的 num1
其实就是描述的是该设备文件对应的主设备号,num2
则是次设备号。主设备号相同次设备号不同则表示是同一类设备下不同的设备。
任何一个设备文件都只有元数据,没有数据。。。
磁盘设备文件的命名
对于不同接口的硬盘设备在 Linux 系统中对应的设备文件的命名规则是不同的,如下:
- IDE:以
/dev/hd
开头,在 CentOS 6 及以后也改为/dev/sd[a-p]
开头; - SCSI、SATA、SAS、USB:以
/dev/sd[a-p]
开头;
以 CentOS 7 为例,对于多个不同硬盘设备的命名规则为 /dev/sd[a-p]
,如 sda
、sdb
、sdc
;而对于相同硬盘下的不同分区的命名规则为 /dev/sd[a-p]/[1-n]
,如 /dev/sda
下有三个分区,分别名为 sda1
、sda2
、sda3
。
磁盘的分区
首先我们要知道磁盘主要由磁碟盘、机械手臂、磁碟读取头与主轴马达所组成, 而数据的写入其实是在磁碟盘上面。
- 磁道:以主轴为中心多个磁碟盘上可划分出多个同心圆,由外而内磁碟盘上的同心圆到同心圆之间的圆环叫做磁道,磁道就是存储数据的地方;
- 扇区:磁道上的一个扇形区域就叫做磁区,也叫扇区;
- 磁柱:多个磁碟盘在相同区域的圆环组成磁柱,也叫柱面;
磁盘分区的最小单位为磁柱(cylinder),也叫柱面。
磁盘通常预留了第一个扇区,这个扇区通常是 512 bytes 的大小,开机管理程序记录区和分区表就存在于这个扇区:
- 主要启动记录区(Master Boot Record,MBR):可以安装开机管理程序的地方,这个程序也通常叫做引导加载器(boot loader),有 446 bytes。
- 分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes。
在这个大小为 64 bytes 的分区表中,其中每 16 bytes 可用来标识一个分区,所以默认情况下一个磁盘最多只能出现 4 个分区。
那么如果想要有 4 个以上的分区该怎么实现呢?
由于分区表就只有 64 bytes 而已,最多只能容纳 4 笔分区的记录,这 4 个分区的记录可分为主要(Primary)和扩展(Extended)分区槽:
- 主要分区槽:用来存放真正的分区信息,比如一个分区从硬盘中何处开始、到何处结束;
- 扩展分区槽:该分区槽不用来存放分区信息,而是用来指向另一存放分区信息的地址,从而可以实现 4 个以上的分区;
由扩展分区槽所引导的每个分区叫做逻辑分区,而扩展分区槽自己占的 16 bytes 的分区就叫做扩展分区,一个扩展分区可引导多个逻辑分区。
- 主要分区和扩展分区的编号范围为
1-4
,如/dev/sda1
、/dev/sda2
、/dev/sda3
、/dev/sda4
; - 而扩展分区所指向的逻辑分区的编号从
5
起始,如/dev/sda5
、/dev/sda6
、...、/dev/sdan
;
常用分区管理工具
fdisk
对单块硬盘来讲,fdisk 最多只能管理 15 个分区。
使用 fdisk -l
可查看当前系统所有的分区信息:
也可也可指定硬盘设备文件来查看指定硬盘的分区信息:
如果要对某硬盘进行分区管理,则可直接使用 fdisk <硬盘设备文件>
进入 fdisk 交互式命令行状态,如:
子命令
p
:显示已有分区;n
:创建新分区;d
:删除分区;w
:写入磁盘并退出;q
:放弃更新并退出;m
:获取帮助;l
:列出所有分区类型 id 信息;t
:调整分区类型;
parted
parted 可以用来管理容量大小在 2T 以上的磁盘,常用分区表格式为 GPT,最多支持 128 个主分区。
parted 也可以通过 print
子命令来查看指定磁盘设备的分区信息:
如果要对某硬盘进行分区管理,则可直接使用 parted <硬盘设备文件>
进入 parted 交互式命令行状态,如:
子命令 h
可查看帮助:
例:现有 20G 大小的 /dev/sdc
磁盘设备,修改其分区表类型为 GPT,将其分为两个 5G 和一个 10G 容量的主分区。
注意:parted 命令行下的操作都是直接同步到磁盘,谨慎操作。
查看内核是否已识别新的分区
可使用 cat /proc/partitions
来查看内核是否识别新的分区:
[root@localhost ~]# cat /proc/partitions
major minor #blocks name
8 0 20971520 sda
8 1 1048576 sda1
8 2 19921920 sda2
11 0 1048575 sr0
253 0 17821696 dm-0
253 1 2097152 dm-1
如果新加的分区未出现在该文件中,则可使用 partx -a
来让内核重新扫描硬盘的分区,也可以使用 partx -a /dev/DEVICE
来读取指定硬盘的分区。
除此之外,还可使用 -n
选项指定内核重新加载指定硬盘中指定编号的分区,如加载 /dev/sda
中分区编号为 4-6
的分区则使用 partx -a -n 4:6 /dev/sda
。
还有一个 kpartx
命令,它的作用与 partx
大致相同都是添加分区映射,只是它有一个额外的选项 -f
可以用来指定强制添加。
在 CentOS 5 中直接使用
partprobe [dev/DEVICE]
来添加磁盘分区映射,不指定设备时表示扫描所有硬盘。
评论区