一、磁盘内部的相关知识
1、前言: 一些关于磁盘的英文
disk #磁盘 head #磁头 sector #扇区 track #磁道 cylinder #柱面 units #单元快 block #数据块 iNode #索引节点
2、磁盘内部的相关知识
一般来说,一块磁盘有1个到数个盘片不等,其中每个盘片的有效盘面对应一个读写磁头,从上到下从0开始依次编号,不同的磁盘面上在逻辑上被化分为track、cylinder、sector。
磁盘的一个盘面一般有有300-1024磁道(看不到),新式大容量的磁盘可能有更多,信息以脉冲串的形式记录在这些轨迹中,这些同心圆不是连续记录数据;扇区是从1开始计数,所有的盘面上同一个磁道的原型轨迹从上向下依次形成一个圆柱体,就称作柱面,从上到下,从0开始。
2.1 磁盘的扇区
操作系统是以扇区为单位将信息存储在磁盘上,一般情况下,每个扇区的大小是512字节,一个扇区有两个内容:存储数据地点的标识符和存储数据的数据段。
2.2 磁盘容量的计算方法
1》存储容量=磁头数*磁道数(或柱面数)*每磁道的扇区数*每扇区的字节数
2》存储容量=柱面大小(每磁道的扇区数*每扇区的字节数*磁头数)*柱面数(磁道数)
注意:一块磁盘的磁道数和柱面数的数量是永远相等的;每个扇区的大小一样的大小
2.3磁盘的数据读写流程
磁盘的读写一般是按柱面进行的,及磁头读写数据是首先在同一柱面内从“0”磁头开始进行操作,依次向下在同一个柱面的不同的不同磁头上进行操作,只在同一个柱面所有的磁头全部读写完毕后,磁头才转移到下一柱面。磁头是电子切换,磁道是步进电机切换。
二、磁盘分区的相关知识
1、硬盘的存储结构
一个硬盘的存储结构有主引导记录、分区表、分区结束标志及其他分区的引导信息及数据区信息,主引导扇区在整个硬盘是唯一的,也就是一个硬盘只有一个。
2、DPT(磁盘分区表)
地址偏移 | 所占字节 | |
00H | 1Bytes | State:分区状态,0=未激活,0x80=激活 |
01H | 1Bytes | StateHead:分区起始磁头号 |
02H | 2Bytes | StateSC分区起始扇区和柱面号,低字节的6位为扇区号:低字节高2位和高字节的8位为柱面号; |
04H | 1Bytes | 分区文系统类型,如0x0b=FAT32,0x83=linux等,00表示此项未用 |
05H | 1Bytes | EendHead分区结束磁头号 |
06H | 2Bytes | EndSC:分区结束扇区和柱面号 |
08H | 4Bytes | Relative:线性寻址方式下分区相对扇区地址(对于基本分区即为绝对地址) |
0CH | 4Bytes | Sectors:分区大小(总扇区数) |
3、主引导记录MBR
硬盘的0磁头0磁道1扇区,是硬盘上的非常重要的位置。在这个扇区中,存放有硬盘的主引导记录MBR(Master Boot Record和硬盘的分区表DPT(Disk Partition table)),通过下面命令:
dd if=/dev/sda of=mbr.bin bs=512 count=1 查看硬盘的前512字节。
4、磁盘分区的理论知识
1》磁盘分区的是指就是针对上述0磁道0扇区64bytes的分区表进行分区。
2》一块硬盘的分区表仅有64bytes,仅支持4个分区表的信息(主分区+扩展分区)。
3》磁盘分区的最小单位为柱面(cylinder)。
4》扩展分区不能直接使用,还需要在扩展分区的基础上创建逻辑分区才行。
5》扩展分区有自己的分区表,因此扩展分区下面的逻辑分区可以有多个。一块硬盘只能有一块扩展分区,这个扩展分区可以划分为多个逻辑分区,IDE硬盘支持的逻辑分区最大编号63(编号为5-63),而SATA硬盘最大编号为15(5-15)。
4.1 主分区Primary
磁盘上必须存在的分区,一般为第一个分区,我们可以在这个主分区上安装操作系统,一个磁盘最多只能有四个主分区。主分区会在主引导扇区中生成DPT,每个分区表需要占用16bytes,硬盘在设计时只给分区表留下64bytes的存储空间
4.2 扩展分区Extended
严格来说,扩展分区不能算一个正常的分区,而是一个连接,起到一个指向的作用。我们可以在扩展分区内建立逻辑分区(logocal),一块硬盘只能有一块扩展分区。
4.3逻辑分区logical
不能在硬盘中单独直接划分逻辑分区,逻辑分区必须存在于扩展分区内,在扩展分区内可以划分多个逻辑分区,逻辑分区的编号从5开始。
4.4磁盘分区的注意事项
1》任意多个主分区,但要求是(1-4)
2》扩展分区和主分区组合。但要求(主分区和扩展分区之和为2-4)
3》如果要分成4个磁盘分区的话PPPP或P(primart)PPPE(extended)
4》通过fdisk分区就是再改16字节的分区表,与分区上的数据没有关系,调整分区大小,不会删除分区内的数据
4.5 硬盘分区的设备名
在Linux,是通过设备名来访问设备的,设备名存放在/dev目录中,设备明的定义规则如下:
系统的第一块IDE接口的硬盘名称为/dev/hda
系统的第二块IDE接口的硬盘名称为/dev/hdb
系统的第一块SCSI接口的硬盘名称为/dev/sda
系统的第一块SCSI接口的硬盘名称为/dev/sdb
4.6 磁盘分区应当注意的
1》linux环境下没有盘符的概念,需要对磁盘设备进行操作,需要使用磁盘的设备名;读取磁盘的内容需要把创建在分区或逻辑卷上的文件系统挂载在指定目录上
2》在Linux系统划分了分区之后还要在分区上建立文件系统
3》最少有swap及/两个分区
4》swap(交换分区)的作用:虚拟内存,swap分区的大小=1.5*物理内存。如果内打于8-16G。则就用8-16G。
5》建议设置独立的/boot分区,Linux引导分区,存放系统引导文件,如Linux内核等,所有文件的大小一般只有几十m,因此该分区设置为100-200m,常见的生产线上一般服务器分区方式/boot,swap,/三个分区。
三、磁盘分区
1、磁盘查看命令
fdisk -l ##系统中的所有磁盘设备 df -T ##系统正在挂载的磁盘设备 blkid ##系统可以挂载的磁盘设备id
2、磁盘分区命令fdisk
fdisk -d | 删除分区 |
fdisk -l | 列出系统可用分区 |
fdisk -n | 新建一个分区 |
fdisk -p | 打印分区 |
fdisk -q | 退出,不保存 |
fdisk -t | 修改分区功能的ID |
fdisk -w | 保存更改到分区表中 |
3、磁盘分区
1》使用fdisk分区
[root@loveyu ~]# fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended #扩展分区 p primary partition (1-4) #主分区 p Partition number (1-4): 1 #直接回车也可以默认是1 First cylinder (1-130, default 1): 1 #直接回车也可以,默认是从开始 Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): +100M Command (m for help): p Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 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: 0x1663accd Device Boot Start End Blocks Id System /dev/sdb1 1 14 112423+ 83 Linux Command (m for help): wq The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. 接下来就是更新你分区表,格式化格式化你的硬盘,加上操作文件类型。 partprobe ##同步分区表 mkfs.xfs /dev/sdb1 ##格式化 mount /dev/sdb /mnt ##临时挂载
注意一定要wq保存退出,如果没有保存退出相当于你什么都没做。
我们也可以永久挂载在文件/etc/fstab下
vim /etc/fstab ##永久挂载 编写格式: device mountpoint ftype defaults(mountpoint) 0 0 /dev/sdb1 /mnt xfs defaults 0 0 mount -a ##使/etc/fastab中记录的挂载生效
2》分区删除
当我们不能用umount卸掉挂载目录时使用fuser -kvm结束使用的进程,然后进行解除挂载,使用fdisk /dev/sdb 删除分区。
3》使用parted分区
更改之前需要把正在使用的分区关闭,才可以进行更改
partoff /sev/sdb1
parted /dev/sdb #修改分区方式将mkdos改为gpt
退出parted之后,使用fdisk进行分区,一模一样,但是它支持的最大分区为2T。
4》添加一个swap分区
A使用磁盘添加一个swap分区
[root@localhost ~]# fdisk /dev/sdb WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion. Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n Partition number (2-128, default 2): #回车之后默认是2 First sector (34-20971486, default 2099200): #回车之后默认是34 Last sector, +sectors or +size{K,M,G,T,P} (2099200-20971486, default 20971486): +4G Created partition 2 Command (m for help): p Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: gpt tart End Size Type Name 1 2048 2099199 1G Linux filesyste 2 2099200 10487807 4G Linux filesyste Command (m for help): t Partition number (1,2, default 2): 2 Partition type (type L to list all types): l #列出分区类型的ID,太多了这里就不列出了,只列出swap ............. 14 Linux swap 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F ............. Partition type (type L to list all types): 14 Changed type of partition 'Linux filesystem' to 'Linux swap' Command (m for help): p Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: gpt Start End Size Type Name 1 2048 2099199 1G Linux filesyste 2 2099200 10487807 4G Linux swap Command (m for help): wq The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks. [root@localhost ~]# partprobe ##同步分区表 [root@localhost ~]# mkswap /dev/sdb1 ##格式化成swap类型 Setting up swapspace version 1, size = 4194300 KiB no label, UUID=b933737a-1409-48b5-8f92-d663d388134b [root@localhost ~]# swapon -a /dev/sdb1 ##加入swap [root@localhost ~]# swapon -s Filename Type Size Used Priority /dev/sdb1 partition 4194300 0 -1
B使用文件添加一个分区
dd if=/dev/zero of=/swapfile bs=1M count=1000 ##创建一个1G大小的文件 mkswap /swapfile ##格式化为swap类型 swapon -a -p 1 /swapfile ##临时添加到swap里 swapon-p + 数字 ##更改优先级 vim /etc/fstab ##永久添加swap分区 /swapfile swap swap defaults,pri=1 0 0 #pri优先级
5》删除swap分区
vim /etc/fstab ##删除此文件中添加的swap行 swapoff /swapfile ##断开swap文件链接 swapoff /dev/sdb1 ##断开swap磁盘链接 rm -rf /swapfile ##删除文件 fdisk /dev/sdb ##删除磁盘分区 partprobe ##同步分区表