zoukankan      html  css  js  c++  java
  • 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  删除快照

  • 相关阅读:
    对于.net config文件中加密使用
    删除windows不想要的服务
    ora12514: tns: 监听程序当前无法识别连接描述符中请求的服务
    读《.NET设计规范》笔记
    创建服务总结
    加载XML文档
    XMLHttpRequest对象的使用
    ReportView控件的使用
    C#代码的编译过程
    Qt vs设置可执行程序图标
  • 原文地址:https://www.cnblogs.com/Gmiaomiao/p/8922499.html
Copyright © 2011-2022 走看看