硬盘存储术语

CHS三维存储结构

采用24bit位寻址:其中前10位表示cylinder,中间8位表示head,后面6位表示sector,最大寻址空间8GB。

head:磁头 磁头数与盘面数相同,一个盘片两个面;由8个二进制位表示磁头数,所以最多有2^8-1=255个逻辑磁头。
track:磁道 从外向内编号,最外层0磁道;由10个二进制位表示磁道数,所以最多有2^10-1=1023个磁道。
cylinder:柱面 ,磁盘随主轴旋转多个盘面上的同一磁道构一个柱面,最外层则为0柱面,柱面数与磁道数相同。
sector:扇区,磁道上的物理存储单元,一个存储单容量为512bytes ;由6个二进制位表示扇区数,所以最多有2^6-1=63个扇区
容量计算:
传统硬盘计算方法:CHS=cylinder*head*sector*512bytes,所以早期硬盘理论最大8GB
一个柱面的容量:1cylinder=扇区数*磁头数*512B=63*255*512B=8MB
一个磁盘的容量:柱面容量*柱面数=63*255*512B*1023

LBA(logical block addressing)逻辑块地址

区位记录磁盘扇区结构 :ZBR(Zoned Bit Recording)所有磁道物理存储单元面积相同,如此导致一个现象外圈磁道的扇区多于内圈的扇区数,磁盘转一圈读取的容量肯定比内圈多,所以外圈的读取效率高于内圈,柱面由外向内编号,基于这个理论在系统性能优化方面,可以考虑将频繁读写的数据存储在磁盘的外层柱面,分区号较小的的分区内。

LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址,即:不再局限于CHS三维寻址方式,而是将整个磁盘规定有多少个扇区,每个扇区容量为512Byte.ATA-1规范中定义了28位寻址模式,以每扇区512位组来计算,ATA-1所定 义的28位LBA上限达到128 GiB。2002年ATA-6规范采用48位LBA,同样以 每扇区512位组计算容量上限可达128 Petabytes

CHS以柱面为单位划分分区,LBA则以扇区为单位划分分区 由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB 时,可以使用CHS寻址方式或是LBA寻址方式;在磁盘容量大于大概8GB时,则 只能使用LBA寻址方式

磁盘初始化过程

一块磁盘从被系统扫描正常识别到能够被系统用来存储数据共分三步:分区、格式化、挂载,本文将以这三个步骤来梳理Linux系统中磁盘管理相关的命令。

一、磁盘分区

磁盘分区有MBR和GPT两种,在实际生产中要做好磁盘存储分区,一定要理解这两种分区的存储原理,及各自的功能特性。

1.MBR分区

MBR全称Master Boot Record主引导记录,主要用于加载操作系统、定义磁盘如何分区,存储在在磁盘的0柱面1扇区(以前是0道、0面、1扇区),对于机械硬盘而言,每次断电停止工作磁头都会回到磁盘最外圈的停泊坞,磁盘加电后机械手会引导磁头到第1号扇区读取主引导记录。

MBR由主引导程序、出错信息数据区、分区表、结束标记四部分组成:

主引导程序: 用于引导计算机找到操作系统引导文件所在的分区。与出错信息数据区共占446个字节,出错信息数据区:不知道是做什么的。

分区表: 记录整个磁盘的分区结构,共占64字节,每个分区表项占16字节,所以MBR磁盘最多只能有4个主分区。如果想用更多分区则需要采用扩展分区,就变为3主+1扩展。

结束标记: 如果该值为55AA,则表示该磁盘有分区,否则系统无法识别磁盘的分区。

MBR的主要特点: 最多只有支持4个主分区 最大支持2TB磁盘

GPT分区特点: 1.UEFI引导方式支持GPT分区引导,具说引导速度更快。 2.最多支持128个分区 3.支持更大容量的磁盘 GPT分区表:

2.分区工具:

fdisk:用于mbr磁盘分区,也支持gpt磁盘但还处于实验阶段,分区后需并未同步到内存,所以需要同步分区信息到内存

gdisk:用于gpt磁盘分区,分区后需并未同步到内存,所以需要同步分区信息到内存

gdisk、fdisk分区工具操作流程:
1.fdisk /dev/sda 指定要分区的磁盘进入分区交互界面
2.进入界面后可以按m或help查看帮助
3.分区流程:
    n创建分区
    p/e指定分区类型
    1-4指定分区编号
    指定分区起始位置
    指定分区大小
4.查看分区按p键查看分区表
5.删除分区按d键,输入分区号
6.分区操作完成后按w键保存即出

parted:两种磁盘都可以,支持命令行和菜单两种模式,但操作后实时生效没有后悔的机会,所有要小心慎用!

parted语法: parted 设备号 操作命令 操作参数
例1:设置磁盘类型标识
	parted /dev/sdb mklable {gtp|msdos} //msdos就是mbr磁盘
例2:创建一个10G的分区,分区编号为1
	parted /dev/sdb mkpart 1 10G //1是分区编号,10G是分区大小
例3:查看分区信息
	parted /dev/sdb print
例4:删除分区
	parted /dev/sdb rm 1 // 1为分区编号
例5:查看分区信息
	parted -l

3.分区表同步:

查看内核是否已经识别新的分区 cat /proc/partations或lsblk查看

centos6通知内核重新读取硬盘分区表

新增分区用partx -a /dev/DEVICE 或kpartx -a /dev/DEVICE -f: force  
删除分区用partx -d --nr M-N /dev/DEVICE

CentOS 5,7: 使用partprobe

partprobe [/dev/DEVICE] 

二、分区格式化

对分区格式化就是创建文件系统,规定数据如何存储,文件管理具备什么功能属性都是由文件系统决定的。例如:ext2文件系统没有日志功能,如果启用日志功能就是ext3。 文件系统都具有哪些详细的功能和特性可以参考: https://en.wikipedia.org/wiki/Comparison_of_file_systems

也可以使用man 5 fs查看Linux系统自带的手册。

查看系统支持的文件系统:ls /lib/modules/uname -r/kernel/fs

mkfs命令:

Linux中想创建哪种类型的文件系统就在哪种类型前加mkfs,可以输出mkfs后,快速连击两个TAB键这样就可以看文件系统创建命令的了。还可以利用mkfs的-t选项指定要创建的文件系统类型

例1:创建ext4文件系统 mkfs.ext4 /dev/sdb1

例2:mkfs -t指定文件系统类型 mkfs -t ext4 /dev/sdb1

ext系列文件系统专用工具

mke2fs:ext系列文件系统专用管理工具

-t {ext2|ext3|ext4} 指定文件系统类型

-b {1024|2048|4096} 指定块大小

-L ‘LABEL’ 设置卷标

-j 相当于 -t ext3 : mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3

-i # 为数据空间中每多少个字节创建一个inode;不应该小于block大小

-N # 指定分区中创建多少个inode

-I 一个inode记录占用的磁盘空间大小,128---4096

-m # 默认5%,为管理人员预留空间占总空间的百分比

-O FEATURE[,...] 启用指定特性

-O ^FEATURE 关闭指定特性 例: mke2fs -t ext4 -b 1024 -L "webs" /dev/nvme0n5p1

tune2fs:重新设定ext系列文件系统可调整参数的值

-l 查看指定文件系统超级块信息;super block
-L 'LABEL’ 修改卷标 
-m # 修预留给管理员的空间百分比 
-j 将ext2升级为ext3 
-O 文件系统属性启用或禁用, –O ^has_journal
-o 调整文件系统的默认挂载选项,–o ^acl 
-U UUID 修改UUID号 

dumpe2fs:显示ext文件系统信息,将磁盘块分组管理

-h:查看超级块信息,不显示分组信息

xfs_info:显示已挂载的 xfs 文件系统信息

文件系统检测和修复

服务器非正常关机,业务进程挂死非正常结束、集群磁盘挂载方式不对都有导致文件系统异常,挂载为文件系统标记为“no clean”,文件无法正常访问此时就需要修复文件系统。

文件系统修复工具:

fsck 该工具会自动识别分区的文件系统类型,如果ext系列就会调用e2fsck,如果xfs文件系统则会调用xfs_repair。与mkfs一样fsck也提供两种同样风格的命令行:使用文件修复工具一定要用正确认的文件系统修复工具

fsck.文件系统类型 设备标识

fsck -t 文件系统类型 设备标识

命令选项:

-a 自动修复 
-r 交互式修复错误

e2fsck:ext系列文件专用的检测修复工具

-y 自动回答为yes
-f 强制修复 
-p 自动进行安全的修复文件系统问题

xfs_repair:xfs文件系统专用检测修复工具

-f 修复文件,而设备
-n 只检查 
-d 允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot

谨记:

1.文件系统修复操作一定不要在分区挂载状态下进行,否则会造成二次伤害。
2.使用文件修复工具一定要用正确认的文件系统修复工具

三、分区挂载

磁盘经过分区、格式化后,只需要指定一个访问入口就可以啦,这个过程就是系统挂载分区。Linux系统提供了分区挂载管理工具mount命令,mount命令选项不少,只需要记住几个常用的功能选项即可,其它的选项用的时候查一下手册就可以了,没必要浪费无意义的时间,所以这一小节也只是记录常用的选项。

mount命令语法:

mount 设备标识 挂载点

挂载常用选项

mount -l 查看已挂载设备列表,可以结合 grep过滤查看指定设备的挂载点。与mount -v效果一样没什么区别
mount -a 加载/etc/fstab文件,没有挂载的条目会自动挂载。
mount -o 指定挂载功能选项,各功能选项之间用逗号分隔。
mount -r 以只读方式挂载,相当于mount -o ro
mount -r 以读写方式挂载,相当于mount-o rw
mount -t 指定待挂载设备的文件系统类型,如果不知道目标设备是什么文件系统就别用这个选项
mount -L 以卷标为设备标识挂载
mount -U 以UUID为设备标识挂载
mount -B 目录挂载目录,也就是将一个目录绑定到另一个目录,便于统一管理。

实例技巧1: 新增加一块磁盘共分三个区,分别以UUID和LABLE方式挂载分区,以下是挂载流程 1.lsblk -f 查看磁盘分区情况

-U 使用UUID挂载分区 mount -U 06e1ba7d-6b6f-4c07-9375-5864019bf2bd /mnt/mysql/ -L 使用分区label挂载 mount -L /dbs/oracle /mnt/oracle/ -B 将目录挂载到目录。 mount -B /mnt/mysql/ /data/dbs/

实例技巧2: 查询系统已挂载的设备的方法

1.lsblk -f查询指定磁盘所有分区的挂载情况
例:lsblk -f /dev/nvme0n2
2.查看/etc/mtab Centos6是一个单独的文件,Centos7以后mtab是一个软链接指向/proc/self/mounts
例:cat /etc/mtab /proc/self/mounts /proc/self/mountstats
3.mount -l 与grep结合过滤
例:mount -l |grep mysql
4.findmnt 指定设备文件或挂载点
	findmnt /dev/nvme0n2p1 指定设备可以查找到所有的挂载点
	findmnt /mnt/mysql 基于挂载点查询设备

实例技巧3: 卸载已挂载的设备,查看正在访问指定文件系统的进程,找到后视情况结束进程。

1.lsof指定挂载点
例:lsof /mnt/mysql
2.fuser -v 指定挂载点
例:fuser -v /mnt/mysql
3.fuser -km 指定挂载点
例:fuser -km /mnt/mysql
4.umount 提定设备或挂载点即可卸载
例:umount /mnt/mysql

挂载常用功能选项

mount -o 后可以跟很多功能选项,如果需要同时启用多个功能则用逗号分割即可。

async  异步模式  sync 同步模式,内存更改时,同时写磁盘.
atime/noatime  包含目录和文件
diratime/nodiratime 目录的访问时间戳
auto/noauto  是否支持自动挂载,是否支持-a选项
exec/noexec  是否支持将文件系统上运行应用程序
dev/nodev  是否支持在此文件系统上使用设备文件
suid/nosuid  是否支持suid和sgid权限
remount  重新挂载
ro 只读
rw 读写
user/nouser  是否允许普通用户挂载此设备,	/etc/fstab使用  
acl   启用此文件系统上的acl功能
loop  使用loop设备
defaults:相当于rw, suid, dev, exec, auto, nouser, async

fstab文件解析

mount命令可以管理当前系统下的设备挂载,但不能保存,系统重启后会消失,如果想永久保存挂载则需要写到配置文件中,/etc/fstab文件就是系统设备挂载的配置文件,该文件共有6个字段组成,6个字段缺一不可,配置错了更不行系统重启会罢工的!

1、要挂载的设备或伪文件系统
	设备文件:LABEL:LABEL=""  或UUID:UUID=""
	伪文件系统名称:proc, sysfs
2、挂载点 swap类型设备挂载点就是swap,其它类型基本上都有目录。
3、文件系统类型:ext4,xfs,iso9660,nfs,none
4、挂载选项:defaults ,acl,bind
5、转储频率:0:不做备份 1:每天备份 2:每隔一天备份
6、fsck检查的文件系统的顺序:允许的数字是0 1 2   
	0:不自检 
	1:首先自检;一般只有rootfs才用   
	2:非rootfs使用 

swap分区管理

Linux中的swap分区就是虚似内存,与Windows下的虚似内存原理差不多,只不过Windows下虚似内存被映射成了文件pagefile.sys,Linux系统同样提供了swap管理工具。

swap是为临时性的补充内存不足,当然是性能越快越好,建议将磁盘中分区号较小(即:磁盘最外圈)的分区作为swap分区,如果没有独立分区可用也可以用swap格式的文件来代替。

swapon 激活Linux中swap分区

语法:swapon [选项][设备标识]
swapon什么参数都不加,则显示所有swap设备列表简要信息
swapon /dev/dev/nvme0n2p1 开启指定设备
swapon -a 激活/etc/fstab文件中定义的所有swap设备
swapon -s 显示交换分区的使用情况,实际就是cat /proc/swaps的信息
swapon -p 激活swap类型设备前可以用-p指定优先级
技巧:输入swapon 按两下tab键会列表系统中所有可用的swap类型分区。

swapoff 关闭swa分区

swapoff什么参数都不加,则卸载所有swap设备
swapoff -a卸载所有swap分区
swapoff /dev/dev/nvme0n2p1 关闭指定swap设备

SWAP的优先级

1.可以指定swap分区0到32767的优先级,值越大优先级越高
2.如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从 -1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一
3.先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户 指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数) 
4.优化性能:分布存放,高性能磁盘存放

SWAP设备如果想永久升效同样需要写入/etc/fstab文件中

在/etc/fstab文件中建议用UUID挂载,但文件扩展的不要使用UUID

技巧:查询swap设备标签,然后写入到fstab文件中
swaplabel /dev/nvme0n2p1

案例一:以独立分区扩展swap

1.修改分区类型为Linux swap分区
使用fdisk工具 t键设备分区类型
2.将分区格式化成swap分区
mkswap /dev/nvme0n2p1
3.激活swap分区,可以用-p选项指定优先级,值越大优先级越高
swapon -p 10 /dev/nvme0n2p1
4.查看新扩展的swap是否生效
swapon -s 或cat /proc/swaps

案例二:以文件扩展swap 1.生成文件 dd if=/dev/zero of=/data/swap.img bs=1M count=100 2.在文件之上建立swap文件系统系统 mkswap /data/swap.img 3.激活swap文件 swapon -p 5 /data/swap1.img 4.查看新扩展的swap是否生效 swapon -s 或cat /proc/swaps

五、实工具

1.制作光盘映像

创建ISO文件

cp /dev/cdrom  /root/centos.iso  
mkisofs  -r  -o  /root/etc.iso /etc

刻录光盘

wodim –v –eject centos.iso 

2.工具dd

语法:dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=# if=file 从所命名文件读取而不是从标准输入
of=file 写到所命名的文件而不是到标准输出 ibs=size 一次读size个byte obs=size 一次写size个byte bs=size block size, 指定块大小(既是是ibs也是obs) cbs=size 一次转化size个byte skip=blocks 从开头忽略blocks个ibs大小的块 seek=blocks 从开头忽略blocks个obs大小的块 count=n 复制n个bs

conv=conversion[,conversion...] 用指定的参数转换文件 转换参数: ascii 转换 EBCDIC 为 ASCII ebcdic 转换 ASCII 为 EBCDIC lcase 把大写字符转换为小写字符 ucase 把小写字符转换为大写字符 nocreat 不创建输出文件 noerror 出错时不停止 notrunc 不截短输出文件 sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐 fdatasync 写完成前,物理写入输出文件

3.dd工具实例

dd操作MBR

1.备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1 
2.破坏MBR中的bootloader
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446 

dd备份与还原操作

1.磁盘克隆
dd if=/dev/sda of=/dev/sdb
2.磁盘克隆到镜像文件
dd if=/dev/sda of=/path/to/img
3.从镜像文件还原到磁盘
dd if=/path/to/img of=/dev/sdx
4.dd读取磁盘管道输出给gzip,并重定向到img文件,实现磁盘克隆并压缩
dd if=/dev/sdx | gzip >/path/to/img.gz
5.将压缩的备份文件恢复到指定盘 
gzip -dc /path/to/img.gz | dd of=/dev/sdx

dd信息安全相关

1.读取内存资料到硬盘 用于安全响应取证 必要时远程dd克隆磁盘防止数据污染
dd if=/dev/mem of=/root/mem.bin bs=1024
2.从光盘拷贝iso镜像
dd if=/dev/cdrom of=/root/cdrom.iso
3.销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1