LinuxDay12——磁盘存储和文件系统
一、硬盘简介
机械硬盘(HDD):Hard Disk Drive,即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。机械硬盘中所有的盘片都装在一个旋转轴上,每张盘片之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距离比头发丝的直径还小,所有的磁头联在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向运动,加上盘片每分钟几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上,也可以通过相反方式读取。硬盘为精密设备,进入硬盘的空气必须过滤
固态硬盘(SSD):Solid State Drive,用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也与普通硬盘一致
相较于HDD,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优势,SSD传输速率性能是HDD的2倍
相较于SSD,HDD在价格、容量、使用寿命上占有绝对优势
1、硬盘存储术语
sector 扇区:在硬盘上每个磁道上的扇区用6bit标识,每个磁道最多标识64个扇区,每个扇区512byte
track 磁道:磁道数等于磁头数,理论上256个
head 磁头 :在硬盘上磁头用8bit标识,最多标识256个磁头
cylinder 柱面 :在硬盘柱面用10bit标识,最多标识1024个柱面
磁盘容量计算方式:扇区大小*64*256*1024=8589934592=8G
因此早期的硬盘无法突破8G容量
以上这种方式会浪费很多磁盘空间 (与软盘一样). 为了解决这一问题, 进一步提高硬盘容量, 人们改用等密度结构生产硬盘.也就是说,外圈磁道的扇区比内圈磁道多. 采用这种结构后, 硬盘不再具有实际的3D参数, 寻址方式也改为线性寻址,即以扇区为单位进行寻址。
二、硬盘分区
磁盘分区是使用分区编辑器(partition editor)在磁盘上划分几个逻辑部分,盘片一旦划分成数个分区,不同类的目录与文件可以存储进不同的分区。越多分区,也就有更多不同的地方,可以将文件的性质区分得更细,按照更为细分的性质,存储在不同的地方以管理文件;但太多分区就成了麻烦。空间管理、访问许可与目录搜索的方式,依属于安装在分区上的文件系统。当改变大小的能力依属于安装在分区上的文件系统时,需要谨慎地考虑分区的大小。
1、硬盘为什要分区
- 优化I/O性能
- 实现磁盘空间配额限
- 提高修复速度
- 隔离系统和程序
- 安装多个OS
- 采用不同文件系统
2、分区表类型(MBR和GPT)
MBR: Master Boot Record 主引导记录
又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。
mbr分区用4个字节存储分区的总扇区数,最大能表示2的32次方的扇区个数,按每扇区512字节计算(2^32*512byte=2199023255552byte=2T),所以mbr无法识别大于2T以后的空间
0磁道0扇区:512bytes
446bytes:boot loader
64bytes:分区表,16bytes标识一个分区,支持4个分区,或者3个主分区和一个扩展分区
2bytes:分区标示位 55AA
MBR分区结构:
GPT: Globals Unique Identifiers
是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB(2.2×1012字节)[1]的分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到这个局限性,并且将他们的容量较大的磁盘升级到4KB的扇区,这意味着MBR的有效容量上限提升到16 TiB。 这个看似“正确的”解决方案,在临时地降低人们对改进磁盘分配表的需求的同时,也给市场带来关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在264-1个扇区成为可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4×1021字节)或8 ZiB个512字节(9,444,732,965,739,290,426,880字节或18,446,744,073,709,551,615(264-1)个扇区×512(29)字节每扇区)
GPT支持128个分区,使用64位表示扇区,如果每个扇区是512Byte,理论上则支持8Z的磁盘。
使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表
自动备份在头和尾两份,并有CRC校验位
UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动
gpt分区结构:
3、LINUX中的分区管理
LINUX中硬盘及分区工具的标识
在早期系统中硬盘的标识区分接口,比如IED接口的硬盘在/dev/以hd[a-z]标识,新系统中都以sd[a-z]来标识,不区分接口了
分区由数字来标识,比如硬盘是sda,那此硬盘的第一个分区为sda1,第二个为sda2,依次类推
在LINUX中一切皆文件,设备是以文件的方式标识,设备有主设备号和次设备号,主设备号表示不同类型的设备,次设备号表示同类设备的不同设备
LINUX中管理分区的工具
fdisk /dev/DISK
-l:列出分区信息
-c:使用非柱面模式
交互式:
p:打印当前分区表
m:帮助
n:添加新分区
d:删除分区
w:保存退出
l:列出分区类型
t:修改分区类型
q 不保存并退出
gdisk:用来管理gpt分区,用法和fdisk相似
parted /dev/DISK
mklabel {gpt|msdos} 设置硬盘的分区表类型,也可以进入交互式模式
-l:列出分区信息
交互式
partprobe 同步分区表,但在红帽系列6.x上有bug
partx
-a /dev/sda 同步分区表(6.x),在增加分区出现不同步时使用
-d --nr m-n /dev/sda 同步分区表(6.x),在删除分区出现不同步时使用
lsblk 查看内存现在生效的分区表
三、文件系统
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
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:未经处理或者未经格式化产生的文件系统
Linux的虚拟文件系统:VFS
由于底层文件系统类型太多,从而导致程序调用复杂,从而有VFS来作为一个统一接口,充当中间人的角色
super block 和 inode table 的关系
1、文件系统管理工具
mkfs.{ext4|ext3|xfs|...} 格式化指定设备分区
-t FSTYPE:格式化指定设备分区
-L:设定卷标
-b:块大小
-t:分区类型
-m #:预留%
-i:为多少个字节创建一个节点号
-N:指定节点号
findfs LABEL=<label>|UUID=<uuid>:查找分区
blkid:查看分区属性信息
-U UUID
-L LABEL
fsck: 文件系统检查,FS_TYPE一定要与分区上已经文件类型相同,修复时分区一定要在非挂载状态
fsck.FS_TYPE
fsck -t FS_TYPE
-p: 自动修复错误
-r: 交互式修复错误
-y:自动回答为yes
-f:强制修复
xfs_info:查看xfs文件系统的信息
2、创建ext文件系统
mke2fs:ext系列文件系统专用管理工具
-t{ext2|ext3}
-b{1024|2048|4096}
-L LABEL
-j相当于-t
-i为数据空间创建一个inode
-N指定分区中的inode号
-l一个inode急速占用的裁判空间大小
-m
-O feature启用特性
blkid:块设备属性信息查看
blkid[OPTION]... [DEVICE]
-U UUID: 根据指定的UUID来查找对应的设备
-L LABEL:根据指定的LABEL来查找对应的设备
e2label:管理ext系列文件系统的LABEL
e2label DEVICE [LABEL]
findfs:查找分区
findfs[options] LABEL=<label>
findfs[options] UUID=<uuid>
tune2fs:重新设定ext系列文件系统可调整参数的值
-l:查看指定文件系统超级块信息;super block
-L 'LABEL':修改卷标
-m #:修预留给管理员的空间百分比
-j: 将ext2升级为ext3
-O: 文件系统属性启用或禁用,–O ^has_journal
-o: 调整文件系统的默认挂载选项,–o ^acl
-U UUID: 修改UUID号
dumpe2fs:
块分组管理,32768块
-h:查看超级块信息,不显示分组信息
挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下修复
fsck: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
-p: 自动修复错误
-r: 交互式修复错误
FS_TYPE一定要与分区上已经文件类型相同
e2fsck:ext系列文件专用的检测修复工具
-y:自动回答为yes
-f:强制修复
一个文件夹只能挂载一个设备(只生效一个)
一个设备可以挂载多个文件夹
空文件夹充当挂载点
fedre ubanti
3、设备挂载工具
mount
用法:mount 设备 挂载点
LABEL=卷标名 挂载点
UUID=‘xxxxxx’ 挂载点
-r 只读方式挂载
-w 读写挂载,默认
-n 不更新/etc/mtab
-t 指定文件系统,一般不用,系统可以自动识别
-a 自动挂载/etc/fstab中的设备
-B | --bind 目录挂载到目录
-o:选项
acl:启用acl
noacl:关闭acl
remount:重新挂载
ro:只读
async:异步模式
sync:同步模式
loop:可以挂载文件,loop设备
atime/noatime:包含目录和文件
diratime/nodiratime:目录的访问时间戳
auto/noauto:是否支持自动挂载,是否支持-a选项
exec/noexec:是否支持将文件系统上运行应用程序
dev/nodev:是否支持在此文件系统上使用设备文件
suid/nosuid:是否支持suid和sgid权限
user/nouser:是否允许普通用户挂载此设备,/etc/fstab使用
defaults:相当于rw, suid, dev, exec, auto, nouser, async
umount {设备名|挂载点} 卸载设备
fuser
-v /dev/sda1 查看设备谁在用
-km /dev/sda1杀掉使用设备的进程
lsof /dev/sda1 查看设备那个进程在用
findmnt 查找某个文件夹是否处于挂载状态
losetup -a 查看当前挂载的loop设备
losetup /dev/loop# loopfile 绑定文件到loop设备
4、内存及swap管理工具
free 查看内存和swap的信息
-m 以M为单位显示
-g 以G为单位显示
-h 以人类可以看懂的方式显示
mkswap /dev/sdb1 -L swap_sdb1 格式化
swapon DEV|LOOPFILE 激活swap分区
-s 查看当前的swap信息
-a 激活fstab表中配置的swap
swapoff 禁用swap分区
5、其他块设备操作工具
eject 弹出光驱
-t 弹入光驱
cp /dev/sr0 /data/centos7.iso 将光盘制作成iso文件
dd if=/dev/sr0 of=/data/centos7.iso 将光盘制作成iso文件
mkisofs -r -o etc.iso /etc/ 将目录打包成iso文件,但不能引导
mkdvdiso.sh source /destination/DVD.iso 制作引导光盘
wodim –v –eject centos.iso 刻录光盘
lsusb 查看UBS
6、df、du和dd
df 显示以挂载的设备信息
-h:以人类可以看懂的方式显示
-H:以1000为单位显示分区大小
-T:显示文件系统
-i:显示节点号
-P:以标准格式显示
du 显示目录大小
-h 以人类可以看懂的方式显示
-s 只查看目录
--max-depth # 查看子目录深度
dd 转换和复制文件
of=file 输出
if=file 读入
bs=size 每次字节大小
ibs=size 每次读入大小
obs=size 每次读出大小
cbs=size
skip=blocks 源跳过
seek=blocks 目标跳过
count=#
conv 用以下指定的参数转换文件
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截短输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
拷贝内存资料到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件
从光盘拷贝iso镜像
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行
测试硬盘写速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
测试硬盘读速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
修复硬盘
dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生,且这个过程是安全高效的
四、raid磁盘列阵
独立硬盘冗余阵列(RAID,Redundant Array of Independent Disks),简称磁盘列阵。其基本思想就是把相对多个相对便宜的硬盘组合起来,成为一个硬盘在阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。根据选择的版本不同,RAID比单颗硬盘有以下一个或多个方面的好处:增强数据集成度,增强容错功能,增加处理量或容量。另外,磁盘阵列对于电脑来说,看起来就像一个单独的硬盘或逻辑存储单元。分为RAID-0,RAID-1,RAID-1E,RAID-5,RAID-6,RAID-7,RAID-10,RAID-50,RAID-60。
1、标准RAID
RAID 0
RAID 0亦称为带区集。它将两个以上的磁盘并联起来,成为一个大容量的磁盘。在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失,危险程度与JBOD相当。
RAID 1
两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID 0相同。另外写入速度有微小的降低。只要一个磁盘正常即可维持运作,可靠性最高。其原理为在主硬盘上存放数据的同时也在镜像硬盘上写一样的数据。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以RAID 1的数据安全性在所有的RAID级别上来说是最好的。但无论用多少磁盘做RAID 1,仅算一个磁盘的容量,是所有RAID中磁盘利用率最低的一个级别。
如果用两个不同大小的磁盘建RAID 1,可用空间为较小的那个磁盘,较大的磁盘多出来的空间也可以分区成一个区来使用,不会造成浪费。
RAID 5
RAID Level 5是一种储存性能、数据安全和存储成本兼顾的存储解决方案。它使用的是Disk Striping(硬盘分区)技术。RAID 5至少需要三块硬盘,RAID 5不是对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,可以利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。RAID 5可以理解为是RAID 0和RAID 1的折衷方案。RAID 5可以为系统提供数据安全保障,但保障程度要比镜像低而磁盘空间利用率要比镜像高。RAID 5具有和RAID 0相近似的数据读取速度,只是因为多了一个奇偶校验信息,写入数据的速度相对单独写入一块硬盘的速度略慢,若使用“回写缓存”可以让性能改善不少。同时由于多个数据对应一个奇偶校验信息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较便宜。
RAID 6
与RAID 5相比,RAID 6增加第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,任意两块磁盘同时失效时不会影响数据完整性。RAID 6需要分配给奇偶校验信息更大的磁盘空间和额外的校验计算,相对于RAID 5有更大的IO操作量和计算量,其“写性能”强烈取决于具体的实现方案,因此RAID6通常不会通过软件方式来实现,而更可能通过硬件/固件方式实现。
同一数组中最多容许两个磁盘损坏。更换新磁盘后,数据将会重新算出并写入新的磁盘中。依照设计理论,RAID 6必须具备四个以上的磁盘才能生效。
RAID 6在硬件磁盘阵列卡的功能中,也是最常见的磁盘阵列档次。
2、混合RAID
JBOD
JBOD( Just a Bunch Of Disks)在分类上,JBOD并不是RAID的档次。
RAID 10/01
RAID 10是先镜射再分区数据,再将所有硬盘分为两组,视为是RAID 0的最低组合,然后将这两组各自视为RAID 1运作。
RAID 01则是跟RAID 10的程序相反,是先分区再将数据镜射到两组硬盘。它将所有的硬盘分为两组,变成RAID 1的最低组合,而将两组硬盘各自视为RAID 0运作。
当RAID 10有一个硬盘受损,其余硬盘会继续运作。RAID 01只要有一个硬盘受损,同组RAID 0的所有硬盘都会停止运作,只剩下其他组的硬盘运作,可靠性较低。如果以六个硬盘建RAID 01,镜射再用三个建RAID 0,那么坏一个硬盘便会有三个硬盘离线。因此,RAID 10远较RAID 01常用。
3、模式化的工具
mdadm[mode] <raiddevice> [options] <component-devices>
支持的RAID级别:LINEAR, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10
Llinux中分区类型:fd
示例:mdadm -C /dev/md# -a yes -l 5 -c 32 -n 3 -x1 /dev/sd# 利用软件创建一个软raid5
-C:创建
-a:检查
-l:raid级别
-c:thunk大小,默认512K
-n:硬盘成员
-x:备用硬盘
mdadm -D /dev/md# 查看raid状态
mdadm -Ds /dev/md# > /etc/mdadm.conf 生成配置文件,下次开机自动生效
mdadm -S /dev/md# 停用raid设备
mdadm -A /dev/md# 激活raid设备
mdadm /dev/md# -f /dev/sd# 模拟硬盘损坏
mdadm /dev/md# -r /dev/sd# 手动移除硬盘
mdadm /dev/md# -a /dev/sd# 手动添新硬盘
-D:查看,cat /proc/mdstat 也可查看raid信息
-Ds:生成配置文件,保存到/etc/mdadm.conf
-S:停用
-A:激活
-f:标记硬盘损坏
-r:移除硬盘
-a:添加硬盘
mdadm -G /dev/md# -n4 -a /dev/sd# 扩展raid
-G:扩展raid
mdadm --zero-superblock /dev/sd# 删除已移除硬盘的superblock,避免再次使用的影响
五、逻辑卷管理器LVM
1、LVM
逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器、逻辑扇区管理器、逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume management)功能。它在硬盘的硬盘分区之上,又创建一个逻辑层,以方便系统管理硬盘分区系统。
Linux中的分区类型:8e
PV(Physical Volume) 物理卷
VG(Volume Group) 卷组
LV(Logical Volume) 逻辑分区
PE(Physical Extent) 物理范围。VG中的最小单元,类似于RAID的chunk大小。
Linux中的设备路径:
/dev/mapper/vg0-lv0
/dev/vg0/lv0
/dev/dm-0
2、lvm管理工具:
pvs:查看pv信息
pvscan:查看pv信息
pvdisplay:查看pv信息
pvcreate:创建pv
vgs:查看vg信息
vgscan:查看vg信息
vgdisplay:查看vg信息
vgcreate -s 16M vgname /dev/sd# 创建vg
-s:指定PE大小
lvs:查看lv信息
lvscan:查看lv信息
lvdisplay:查看lv信息
lvcreate -n lvname {-L #G|-l #|} vgname 创建lv
-n:指定lv的名字
-L #(G|M):指定lv大小
-l #%FREE | -l #(PE):指定lv大小
vgrename OLDvgname NEWvgname 重命名vg
lvrename /dev/vgname/OLDlvname /dev/vgname/NEWlvname 重命名lv
3、LVM的快照:
lvcreate -n lvname-snapshot -s -L 1G -p r /dev/vgname/lvname 创建快照
-s:快照功能
-p r:快照只读属性
lvconvert --merge /dev/vgname/lvname-snapshot 恢复快照
lvremove /dev/lvname-snapshot 删除快照