磁盘管理
设备分类
Linux操作系统中有两种常用的设备文件,称为字符特殊文件和块特殊文件。它们之间的区别在于操作系统和硬件读取和写入的数据量。
字符设备
字符特殊文件或字符设备提供无缓冲,直接访问硬件设备。 它们不一定允许程序一次读取或写入单个字符; 这取决于所讨论的设备。 例如,硬盘的字符设备通常会要求所有读写操作都对齐到块边界,并且绝对不允许读取单个字节。字符设备有时被称为原始设备,以避免围绕一个基于块的硬件的字符设备通常需要程序读取和写入对齐的块的事实混淆。
块设备
块特殊文件或块设备提供对硬件设备的缓冲存取,并提供一些抽象的细节。 与字符设备不同,块设备将始终允许程序员读取或写入任何大小的块(包括单个字符/字节)和任何对齐。缺点是由于块设备被缓冲,编程人员不知道在写入数据从内核的缓冲区传递到实际设备之前需要多长时间,或者实际上两个单独的写入将以什么顺序到达物理设备? 此外,如果相同的硬件暴露字符和块设备,则由于客户端使用字符设备不知道块设备的缓冲区中所做的更改而导致数据损坏的风险。
硬盘分类
硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据;从结构上可分为机械硬盘和固态硬盘。
机械硬盘
机械硬盘(HDD):Hard Disk Drive,即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。磁头可沿盘片的半径方向运动,加上盘片每分钟几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上,也可以通过相反方式读取。硬盘为精密设备,进入硬盘的空气必须过滤。
盘片结构
盘片结构
固态硬盘
固态硬盘(SSD):Solid State Drive,用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也与普通硬盘一致。
区别
相较于HDD,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优势,SSD传输速率性能是HDD的2倍。
相较于SSD,HDD在价格、容量、使用寿命上占有绝对优势硬盘有价,数据无价,目前SSD不能完全取代HHD。
磁盘分区
硬盘分区是指将硬盘的整体存储空间划分成多个独立的区域,分别用来安装操作系统、安装应用程序以及存储数据文件等。但在分区之前,应该做一些准备及计划工作,包括一块硬盘要划分为几个分区,每个分区应该有多大的容量,以及每个分区准备使用什么文件系统等。对于某些操作系统而言,硬盘必须分区后才能使用,否则不能被识别。通常,从文件存放和管理的方便、容易、快捷性出发,建议将硬盘划分多个分区,用以存放不同类型的文件,如存放操作系统、应用程序、数据文件等
原因
- 优化I/O性能
- 实现磁盘空间配额限制
- 提高修复速度
- 隔离系统和程序
- 安装多个OS
- 采用不同文件系统
分区方式
linux中有两种分区方式:MBR和GPT
MBR分区
传统的分区机制,应用于绝大多数使用BIOS的PC设备,使用32位表示扇区数。
特点:
MBR支持32位和64位系统
MBR支持分区数量有限
MBR只支持不超过2T的硬盘,超过2T的硬盘将只能用2T空间(有第三方解决方法)
MBR引导扇区结构
结构 | 功能 |
---|---|
0磁道0扇区 | 第一个扇区512bytes MBR引导扇区 |
主引导程序 | 大小为446bytes, 可以安装引导加载程序 |
主分区表 | 大小为64bytes,记录整块硬盘分区的状态 |
16bytes | 标识一个分区,一共只能分4个分区(主+扩展) |
结束标识 | 大小为2 bytes,MBR区域的有效性标识(55AA为有效) |
主分区表所在的64个bytes容量中,每16个bytes分为一个项,总共分为四组记录区,每组记录区记录了该区段的起始与结束的柱面号码,等信息
扩展分区
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘
结构:扩展引导记录(EBR)+ 逻辑分区
结构 | 功能 |
---|---|
扩展引导扇区(EBR) | 类似于MBR的扩展引导记录,扩展引导记录包括一个扩展分区表和该扇区的标签 |
EBR结构 | 逻辑分区前扇区,如扩展分区0号扇区(512bytes)前446bytes:未使用,全为0 |
扩展分区表(64bytes) | 记录分区状态,每16bytes分为一个项,共四个项。第一项:指向它自身的引导扇区;第二项:指向下一个逻辑驱动器的EBR第三项:未使用;第四项:未使用 |
结束标识(2bytes) | 55AA ,有效性标识;55AA为有效 |
示例
分区创建
利用lsblk命令查看硬件磁盘,现在只有一个磁盘需要加一个
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 45G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 44.5G 0 part
├─centos-root 253:0 0 40.6G 0 lvm /
└─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
[root@localhost ~]#
添加之后再利用lsblk命令查看,现在多了磁盘sdb
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 45G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 44.5G 0 part
├─centos-root 253:0 0 40.6G 0 lvm /
└─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sr0 11:0 1 4G 0 rom
利用fdisk命令进入sdb磁盘查看分区情况,利用m命令查看操作方式
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
。。。。。。
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
命令 | 功能 |
---|---|
m | 显示菜单和帮助信息 |
a | 活动分区标记/引导分区 |
d | 删除分区 |
l | 显示分区类型 |
n | 新建分区 |
p | 显示分区信息 |
q | 退出不保存 |
t | 设置分区号 |
v | 进行分区检查 |
w | 保存修改 |
x | 扩展应用,高级功能 |
首先按照图示先创建主分区1,2,3
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set
利用p命令查看分区
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: dos
Disk identifier: 0x73ee5ebf
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
/dev/sdb2 4196352 8390655 2097152 83 Linux
/dev/sdb3 8390656 12584959 2097152 83 Linux
接下来继续用n命令创建扩展分区
Command (m for help): n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): e
Selected partition 4
First sector (12584960-41943039, default 12584960):
Using default value 12584960
Last sector, +sectors or +size{K,M,G} (12584960-41943039, default 41943039): +12G
Partition 4 of type Extended and of size 12 GiB is set
在扩展分区下继续创建逻辑分区1,2
Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (12587008-37750783, default 12587008):
Using default value 12587008
Last sector, +sectors or +size{K,M,G} (12587008-37750783, default 37750783): +2G
Partition 5 of type Linux and of size 2 GiB is set
。。。。。。
最后通过p命令查看,并用w命令保存退出
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: dos
Disk identifier: 0x73ee5ebf
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]#
利用lsblk命令查看分区情况,但此时的分区并不能正常使用,分区里并没有安装文件系统,需要对分区进行格式化,挂载操作
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 45G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 44.5G 0 part
├─centos-root 253:0 0 40.6G 0 lvm /
└─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 2G 0 part
├─sdb2 8:18 0 2G 0 part
├─sdb3 8:19 0 2G 0 part
├─sdb4 8:20 0 1K 0 part
├─sdb5 8:21 0 2G 0 part
└─sdb6 8:22 0 2G 0 part
格式化
[root@localhost ~]# mkfs.ext /dev/sdb1
-bash: mkfs.ext: command not found
[root@localhost ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
。。。。。。
按照此方法分别将sdb2–sdb6除sdb4外的全部格式化安装文件系统(sdb4为扩展分区相当于扩分区里所有 逻辑分区的总称,不可格式化)
分区挂载
完成分区格式化后就需要对分区进行挂载,首先创建各个文件作为挂载 目录
命令 | 功能 |
---|---|
-V | 显示程序版本 |
-h | 显示辅助讯息 |
-v | 显示较讯息,通常和 -f 用来除错 |
-a | 将 /etc/fstab 中定义的所有档案系统挂上 |
-F | 这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作 |
-f | 通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用 |
-n | 一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作 |
-s-r | 等于 -o ro |
-w | 等于 -o rw |
-L | 将含有特定标签的硬盘分割挂上 |
-U | 将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义 |
-t | 指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态 |
-o async | 打开非同步模式,所有的档案读写动作都会用非同步模式执行 |
-o sync | 在同步模式下执行 |
-o atime、-o noatime | 当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数 |
-o auto、-o noauto | 打开/关闭自动挂上模式 |
-o defaults | 使用预设的选项 rw, suid, dev, exec, auto, nouser, and async |
-o suid、-o nosuid | 允许执行档在 root 权限下执行 |
-o remount | 将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上 |
-o ro | 用唯读模式挂上 |
-o rw | 用可读写模式挂上 |
-o loop= | 使用 loop 模式用来将一个档案当成硬盘分割挂上系统 |
[root@localhost ~]# ls
anaconda-ks.cfg mydisk1 mydisk2 mydisk3 mydisk5 mydisk6
利用mount命令进行文件挂载
[root@localhost ~]# mount /dev/sdb1 ./mydisk1
[root@localhost ~]# mount /dev/sdb2 ./mydisk2
[root@localhost ~]# mount /dev/sdb3 ./mydisk3
[root@localhost ~]# mount /dev/sdb5 ./mydisk5
[root@localhost ~]# mount /dev/sdb6 ./mydisk6
[root@localhost ~]# ls
挂载完成进入相关目录查看即可
[root@localhost ~]# cd mydisk1
[root@localhost mydisk1]# ls
lost+found
[root@localhost mydisk1]# cd ../mydisk2
[root@localhost mydisk2]# ls
lost+found
[root@localhost mydisk2]#
GPT分区
使用128位UUID 表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位
支持超过2T的磁盘(64位寻址空间),使用64位,支持128个分区,支持8Z(512Byte/block )64Z(4096Byte/block)。fdisk最大只能建立2TB大小的分区,创建一个大于2TB的分区使用parted,gdisk分区工具。
特点:
向后兼容MBR
必须在支持UEFI的硬件上才能使用(Intel提出,用于取代BIOS)
必须使用64位系统
Mac、Linux系统都能支持GPT分区格式
Windows 7/8 64bit、Windows Server 2008 64bit支持GPT
在GPT分区表的最开头,处于兼容性考虑仍然存储了一份传统的MBR,这个MBR叫做保护性MBR(Protective MBR)。其中包含有磁盘签名,MBR分区表,结束标志。这里没有引导代码,分区表中只有一个分区表项,GPT不会用到,这个分区项只是为了让系统认为磁盘是合法的。
结构 | 功能 |
---|---|
LBA1:主要GPT头部 | 主要GPT头部位于1号扇区,会定义分区表的起始位置,结束位置,分区表项个数 |
LBA2-33:分区表项 | 分区表位于GPT磁盘的2-33号扇区,一共占用32个扇区,能够容纳128个分区表项。每个分区表项大小为128字节。因为每个分区表项管理一个分区,所以GPT磁盘可以创建128个分区 |
LBA34:分区区域 | GPT分区区域就是用户使用的分区,也是用户进行数据存储的区域。分区区域的起始地址和结束地址由GPT头定义 |
LBA -33~-2:分区表备份 | 分区区域结束后就是分区表备份,其地址在GPT头备份扇区中有描述。分区表备份是对分区表32个扇区的完整备份。如果分区表被破坏,系统会自动读取分区表备份,也能够保证正常识别分区 |
LBA -1:GPT头备份 | GPT头有一个备份,放在GPT磁盘的最后一个扇区,但这个GPT头备份并非完全GPT头备份,某些参数有些不一样。复制的时候根据实际情况更改一下即可。 |
GPT分区优点:
与目前普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。它具有如下优点:
1、支持2TB以上的大硬盘。
2、每个磁盘的分区个数几乎没有限制(Windows系统最多只允许划分128个分区)。
3、分区大小几乎没有限制。
4、分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表,其中一份被破坏后,可以通过
另一份恢复;
5、循环冗余检验值针对关键数据结构而计算,提高了数据崩溃的检测几率;
6、虽然MBR提供1字节分区类型代码,但GPT使用一个16字节的全局唯一标识符(GUID)值来标识分区
类型,这使分区类型更不容易冲突;
7、每个分区可以有一个名称(不同于卷标)。
BIOS+MBR与UEFI+GPT
BIOS+MBR开机
- 系统开机,上电自检
- POST过后初始化用于启动的硬件
- BIOS会运行BIOS磁盘启动顺序中第一个磁盘的首440byte内的代码
- 启动引导代码从BIOS获得控制权,然后引导,启动下一阶段的代码
- 再次被启动的代码会查阅支持和配置文件
- 根据配置文件中的信息,启动引导程序会将内核和initramfs文件载入到系统的RAM中,然后开始启动内核
UEFI+GPT开机
- 系统开机,上电自检
- UEFI固件被加载,并由它初始化启动要用的硬件
- 固件读取其引导管理器以确定从何处加载哪个UEFI应用
- 固件按照引导管理器中的启动项目,加载UEFI应用
- 已启动的UEFI应用还可以启动其他应用,这取决于UEFI应用的配置
文件系统
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统,核心管理:元数据+block数据。
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等
文件系统分类
文件系统 | 类别 |
---|---|
Linux文件系统 | ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap |
光盘 | iso9660 |
Windows | FAT32, exFAT,NTFS |
Unix | FFS(fast), UFS(unix), JFS2 |
网络文件系统 | NFS, CIFS |
集群文件系统 | GFS2, OCFS2(oracle) |
分布式文件系统 | fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre |
RAW | 未经处理或者未经格式化产生的文件系统 |
mkfs命令
Linux mkfs命令用于在特定的分区上建立 linux 文件系统
命令 | 功能 |
---|---|
device | 预备检查的硬盘分区,例如:/dev/sda1 |
-V | 详细显示模式 |
-t | 给定档案系统的型式,Linux 的预设值为 ext2 |
-c | 在制做档案系统前,检查该partition 是否有坏轨 |
-l bad_blocks_file | 将有坏轨的block资料加到 bad_blocks_file 里面 |
block | 给定 block 的大小 |
inode
- inode即为index node,就是索引节点
- inode表中包含文件系统所有文件列表
- 一个节点是在一个表项,包含了有关文件的信息(元数据)。
- 一个文件有且只有一个inode
- inode中包含12个直接指针,1个间接指针,1个双间接指针,1个三间接指针
- 元数据(medata)即文件的属性信息,包括文件的类型、权限、owner、group、链接数、三个时间戳,文件大小、扩展属性,block指针,-文件的字节数 -文件拥有者的User ID -文件的Group ID文件的读、写、执行权限 -文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。-链接数,即有多少文件名指向这个inode - 文件数据block的位置
inode和block
1.磁盘被分区格式化分区之后,会分为元数据和block两部分
2.inode存放文件的属性以及指向文件实体的指针(block的位置)
3.superblock用来存储inode和block等等整个文件系统的全部信息,包括inode和block的大小,数量,以及block的使用情况。
4.创建了一个文件时会同时创建inode和block,inode用来存储元数据和block指针,block用来存储数据内容。
5.一个block只能被一个文件使用,所以一个block并不是越大越好,当服务器存储的小文件居多,那么block设置的小一点比较好,不会浪费空间。当服务器存储的大数据居多,block设置的大一点比较好。
超级块
超级块结构表示一个文件系统。它包含管理文件系统所需的信息,包括文件系统名称(比如 ext2)、文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)。超级块通常存储在存储媒体上,但是如果超级块不存在,也可以实时创建它
常见可利用dumpe2fs + 磁盘名来查询超级块信息
inode表
存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述)。例如:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。
group表
每个文件系统里下分多个组,而下分的组又分超级块,inode等信息。文件系统的group表就是描述文件系统的group和超级块信息的。