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、硬盘为什要分区

  1. 优化I/O性能
  2. 实现磁盘空间配额限
  3. 提高修复速度
  4. 隔离系统和程序
  5. 安装多个OS
  6. 采用不同文件系统

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, ext4xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap
光盘:iso9660
Windows:FAT32, exFAT,NTFS
Unix: FFS(fast), UFS(unix), JFS2
网络文件系统:NFSCIFS
集群文件系统: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的速度是最快的。但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失,危险程度与JBOD相当。

RAID 1

RAID 1

  两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID 0相同。另外写入速度有微小的降低。只要一个磁盘正常即可维持运作,可靠性最高。其原理为在主硬盘上存放数据的同时也在镜像硬盘上写一样的数据。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以RAID 1的数据安全性在所有的RAID级别上来说是最好的。但无论用多少磁盘做RAID 1,仅算一个磁盘的容量,是所有RAID中磁盘利用率最低的一个级别。

如果用两个不同大小的磁盘建RAID 1,可用空间为较小的那个磁盘,较大的磁盘多出来的空间也可以分区成一个区来使用,不会造成浪费。

RAID 5

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 6

  与RAID 5相比,RAID 6增加第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,任意两块磁盘同时失效时不会影响数据完整性。RAID 6需要分配给奇偶校验信息更大的磁盘空间和额外的校验计算,相对于RAID 5有更大的IO操作量和计算量,其“写性能”强烈取决于具体的实现方案,因此RAID6通常不会通过软件方式来实现,而更可能通过硬件/固件方式实现。

同一数组中最多容许两个磁盘损坏。更换新磁盘后,数据将会重新算出并写入新的磁盘中。依照设计理论,RAID 6必须具备四个以上的磁盘才能生效。

RAID 6在硬件磁盘阵列卡的功能中,也是最常见的磁盘阵列档次。

2、混合RAID

JBOD

JBOD

JBOD( Just a Bunch Of Disks)在分类上,JBOD并不是RAID的档次。

RAID 10/01

RAID 1+0
RAID 0+1

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  删除快照

posted @ 2018-04-26 10:17  Gmiao  阅读(707)  评论(0编辑  收藏  举报