磁盘,计算机最常见的存储硬件设备。对Linux而言,其哲学思想之一就是一切皆文件,因此linux之上所有设备的操作都是通过文件接口来实现的,也就是说在访问设备的时候就如同访问一个文件一样,因为他们使用的都是文件系统接口。


向磁盘中写入数据的操作过程

  首先硬件设备在系统上会映射成一个一个文件,我们在对硬件中写入数据就相当于在打开一个文件中去执行读写操作,对于程序而言会先open()一个文件,然后执行read()或者write()操作,最后关闭文件close()。


设备类型

块设备:block,存取单位“块”,如磁盘/dev/sda

字符设备:char,存取单位“字符”,如/dev/null(linux里面的黑洞设备,放什么进去都会消失)

wKioL1e_8_PhXUguAAAnQnvJKoc644.png

设备文件

每一个设备都有一个文件作为它的访问入口,此文件我们称之为设备文件;该文件关联至一个设备驱动,进而能够跟与之对应的硬件设备进行通信。


设备号码

用来标识设备,不同类别的设备有不同的设备号,同一类别的设备有不同的设备或多个设备,因此就有主设备号和次设备号。

主设备号:major number,标识设备类型

次设备号:minor numbei,标识同以类型下的不同设备


wKioL1e_-B_yh4m0AADXwqQj_5Y662.png

磁盘的接口类型:每一种的接口传输速率都是不同的

并口:数据传输有n根线并行传输的

    IDE:133MB/S

    SCSI:640MB/S

串口:数据传输有一根线按照顺序传输

    SATA:6Gbps(第三代sata传输速度)

    SAS:6Gbps

    USB:480MB/s


磁盘设备的设备文件命令:

    IDE:/dev/hd

    SCSI、SATA、SAS、USB:/dev/sd


不同设备表示方法:在设备文件名后面追加一些字母a-z来表示

    /dev/sda,/dev/sdb,/dev/sdc


同一设备上的不同分区,采用数字递增的方式

    /dev/sda1,/dev/sda2...


硬盘结构

wKioL1e___zBj__mAAT2nIjY2vY504.png

head:磁头

track:磁道,是由厂商划分好的

secotr: 扇区,每一个512bytes,固定角速度的设备,任意磁盘上的任意扇区,读取的平均时间称为平均寻道时间

cylinder: 柱面chs


磁盘分区


为什么要分区?

  优化I/O性能

  实现磁盘空间配额限制

  提高修复速度

  隔离系统和程序

  安装多个OS

  采用不同文件系统


两种分区方式:MBR,GPT


MBR: Master Boot Record,1982年创建,使用32位表示扇区数,分区不超过2T

MBR使用legacy的引导方式启动


如何分区?:按柱面

0磁道0扇区:512bytes

    446bytes: boot loader 系统引导

    64bytes:分区表,其中每16bytes:标识一个分区,可以有4个主分区,或者3个主分区1个扩展分区

     2bytes: 55AA,判断有无分区

4个主分区;3主分区+1扩展(N个逻辑分区)

wKiom1fADnyxqkcRAAEmGDGByD8129.png

wKioL1fAEnWjZaEtAAFpNqcP5ac513.png


GPT:GUID(Globals Unique Identifiers)partition table

支持128个分区,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block)

使用128位UUID 表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位

支持2TB以上的硬盘分区

GPT引导需要UEFI (统一扩展固件接口)硬件支持,使操作系统启动


wKiom1fAGQHBNLmMAAE0BXGzOGM593.jpg


分区管理

列出块设备

lsblk

wKiom1fAGcbBCcmkAABhOEsmFfg229.png

创建分区使用:

    fdisk创建MBR分区,也支持GPT,对于一块硬盘,最多只能管理15分区

    gdisk创建GPT分区

    GNU parted高级分区操作(创建、复制、调整大小等等)

partprobe-重新设置内存中的内核分区表版本


分区工具fdisk和gdisk

fdisk /dev/sd*

gfisk /dev/sd* 类fdisk 的GPT分区工具(gdisk命令参考fdisk,大体是一样的)

# fdisk -l [-u] [device...]

fdisk子命令:

    p 分区列表

    t 更改分区类型

    n 创建新分区

    d 删除分区

    w 保存并退出

    q 不保存并退出


示例:创建一个分区

输入fdisk /dev/sdb对sdb磁盘进行分区,按m表示查看帮助信息

wKioL1fAKN3Djz0AAACfpt_m53Y596.png

分区前按p查看一下磁盘信息

wKioL1fAKN3BvxuvAABHskQTbIU795.png

按n,创建一个新的分区,按p,创建一个主分区,1表示主分区编号 ,+10G表示该分区为10G

wKiom1fAKN6w7lImAACIU1rk4ak220.png

创建然查看一下确认一下创建的磁盘信息

wKiom1fAKN6jkhMLAABQr1jgLzA143.png

最后按w,保存退出,如果不店保存退出的话,上面的操作是不会生效的,然后再输入lsblk再确认

wKiom1fAKYnT2xktAABtce0hkqA312.png


同步分区表

查看内核是否已经识别新的分区:

   # cat /proc/partations

wKioL1fAKtHgJa_wAABKB_vHuss951.png

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

CentOS 6使用:

新增分区用

     partx -a /dev/DEVICE 

    kpartx -a /dev/DEVICE -f: force

CentOS 6新增分区同步示例:

wKioL1fALp-CmRdFAAC2EI4tHD4344.png

wKioL1fAM7PA1qFbAAB-vxJlLL4663.png

删除分区用(CentOS 6用)

  partx-d --nr N-M /dev/DEVICE (N-M指分区的minor,如果要删1-5的话就输入1-5)

wKioL1fAMkbiDbiWAACq2zKIU7c129.png

CentOS 5,7: (CentOS5和7新增和删除都一条命令即可,CentOS 6此命令有bug不能用)

使用partprobe 示例 partprobe [/dev/DEVICE]

此处因为上面分区已经同步完成,所以这里没什么用,一般来说,只有旧硬盘同步的时候会报错,新的硬盘一般报错的机率比较少,所以旧的硬盘可能要同步多次才会显示出来

wKiom1fALKCAH3LMAAAzpmRlxpA706.png


parted命令

parted的操作都是实时生效的,小心使用,建议不要使用,大家了解即可

用法:parted [选项]... [设备[命令[参数]...]...]

    parted /dev/sdb mklabel gpt|msdos 此命令用于创建gpt或者msdos的分区

    parted /dev/sdb print 显示/dev/sdb磁盘信息

    parted /dev/sdb mkpart primary 1 200 (默认M) 创建一个200M的分区

    parted /dev/sdb rm 1 删除/dev/sdb序列号为1的分区

    parted -l 显示所有分区


此命令不建议使用,所以这里就不做示例说明了,需要使用的话大家参考以上命令格式即可


文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。

从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。


文件系统类型

Linux文件系统: :ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle)              reiserfs, jfs(AIX), swap(虚拟内存),VFS(虚拟化文件系统)

光盘:iso9660

Windows:fat32, ntfs

Unix: FFS(fast), UFS(unix), JFS2

网络文件系统:NFS, CIFS

集群文件系统:GFS2, OCFS2(oracle)

分布式文件系统:ceph, moosefs, mogilefs, glusterfs, Lustre

RAW:未经处理或者未经格式化产生的文件系统


文件系统分类

根据其是否支持"journal"功能:

    日志型文件系统: ext3, ext4, xfs, ...

    非日志型文件系统: ext2, vfat

文件系统的组成部分:

    内核中的模块:ext4, xfs, vfat

    用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat

Linux的虚拟文件系统:VFS

    查前支持的文件系统:cat /proc/filesystems


VFS作用:

  VFS的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。在古老的DOS操作系统中,要访问本地文件系统之外的文件系统需要使用特殊的工具才能进行。而在Linux下,通过VFS,一个抽象的通用访问接口屏蔽了底层文件系统和物理介质的差异性。

  每一种类型的文件系统代码都隐藏了实现的细节。因此,对于VFS层和内核的其它部分而言,每一种类型的文件系统看起来都是一样的。


创建文件系统

mkfs命令:(make file system)

 (1) # mkfs.FS_TYPE /dev/DEVICE  =mkfs -t FS_TYPE (FS-TYPE ext4、xfs、btrfs 等)

     示例:msfs.ext4 /dev/sda

 (2) # mkfs -t FS_TYPE /dev/DEVICE

    -L 'LABEL': 设定卷标


示例:将/dev/sda1的文件系统创建为ext4

wKioL1fCdsbg70izAACfac3_AkU935.png

注意:CentOS 7默认的文件系统是xfs,如果转成ext4,有可能会造成文件系统破坏导致开不了机


创建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 -O ^has_journal /dev/sdb1


示例:常用选项说明

wKiom1fCfUCzw90pAADuiqr_L5w579.png


文件系统标签

指向设备的另一种方法,与设备无关

blkid:块设备属性信息查看

blkid [OPTION]... [DEVICE]

 -U UUID: 根据指定的UUID来查找对应的设备

 -L LABEL:根据指定的LABEL来查找对应的设备

示例:

wKiom1fCg1ShD59wAACketusFP8696.png


e2label:管理ext系列文件系统的LABEL

# e2label DEVICE [LABEL] 

示例:

wKiom1fCg7KQpOOZAAAhn9xhOns279.png


findfs:查找分区

findfs[options] LABEL=<label>

findfs[options] UUID=<uuid>

wKiom1fChDexsF-IAAAdnAdM844900.png


tune2fs

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

-l:查看指定文件系统超级块(superblock)信息

-L 'LABEL':修改卷标

-m #:修预留给管理员的空间百分比

-j: 将ext2升级为ext3

-O: 文件系统属性启用或禁用,–O ^has_journal

-o: 调整文件系统的默认挂载选项,–o ^acl

-U UUID: 修改UUID号,可以使用uuidgen命令获取一个随机的UUID

wKiom1fCh0PDtkeFAAEQvW2ae_Y736.pngwKiom1fCh2-AnoTcAABa2UL6P2o115.png

dumpe2fs [option] DEVICE:此命令相当于 tune2fs -l DEVICE

-h:查看超级块信息(分组信息),分区用分组管理


超级块


什么是超级块?

  超级块(superblock)的作用是存储文件系统的大小、有多少是空的和已经填满的占多少,以及它们各自的总数和其他诸如此类的信息。要使用一个分区来进行数据访问,那么第一个要访问的就是超级块。所以,如果超级块坏了,那磁盘基本就没救了。

  超级块占用第一号物理块,是文件系统的控制块,超级块包括:文件系统大小、空闲块数目、空闲块索引表、空闲inode节点数目、空闲inode节点索引表、封锁标记等。超级块是系统为文件分配存储空间、回收存储空间的依据。

  所以为了防止超级块数据损坏,就需要对超级块数据进行备份,以便于损坏时可以恢复。


超级快和inode_table关系图

wKioL1fCiJXgfnTFAAI5RffCXPc959.png

什么是超级块?

  超级块(superblock)的作用是存储文件系统的大小、有多少是空的和已经填满的占多少,以及它们各自的总数和其他诸如此类的信息。要使用一个分区来进行数据访问,那么第一个要访问的就是超级块。所以,如果超级块坏了,那磁盘基本就没救了。

  超级块占用第一号物理块,是文件系统的控制块,超级块包括:文件系统大小、空闲块数目、空闲块索引表、空闲inode节点数目、空闲inode节点索引表、封锁标记等。超级块是系统为文件分配存储空间、回收存储空间的依据。

  所以为了防止超级块数据损坏,就需要对超级块数据进行备份,以便于损坏时可以恢复。


文件系统检测和修复

常发生于死机或者非正常关机之后(windows操作系统崩溃后系统也会开机自检原理一样)

挂载为文件系统标记为“dirty”

fsck: File System Check

  fsck.FS_TYPE [option] DEVICE

    -t FS_TYPE

    -a: 自动修复错误

    -r: 交互式修复错误

注意: FS_TYPE一定要与分区上已经文件类型相同;

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

  -y:自动回答为yes

  -f:强制修复


示例:修复损坏的磁盘

wKiom1fClGLjx5e4AABHdSHxM3E088.png

wKiom1fClGOzqnXdAABtCsy31M0054.png


挂载mount

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为

卸载:为解除此关联关系的过程

把设备关联挂载点:mount DEVICE MOUNT_POINT

卸载时:可使用设备,也可以使用挂载点 umount DEVICE

挂载点下原有文件在挂载完成后会被临时隐藏

挂载点目录一般为空


查看挂载情况:

  findmntMOUNT_POINT

查看正在访问指定文件系统的进程:

  lsofMOUNT_POINT

  fuser -v MOUNT_POINT

终止所有在正访问指定的文件系统的进程:

  fuser -km MOUNT_POINT

卸载:

  umountDEVICE

  umountMOUNT_POINT


用mount命令挂载文件系统

挂载方法:mount DEVICE MOUNT_POINT

mount:通过查看/etc/mtab文件显示当前已挂载的所有设备

    查看内核追踪到的已挂载的所有设备:

      cat /proc/mounts

mount [option]...[-t FSTYPE] [-o option] DEVICE MOUNT_POINT

  DEVICE:指明要挂载的设备;

   (1) 设备文件:例如/dev/sda5

   (2) 卷标:-L 'LABEL',例如-L 'MYDATA'

   (3) UUID, -U 'UUID':例如-U '0c50523c-43f1-45e7-85c0-a126711d406e'

   (4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs

固定挂载点MOUNT_POINT:/mnt /media

  挂载点需要具备以下两点

    1.挂载点事先存在,并且使用空目录

   2.进程正在使用中的设备无法被卸载

mount常用命令选项

  -t FSTYPE:指定要挂载的设备上的文件系统类型

  -r: readonly,只读挂载

  -w: read and write, 读写挂载

  -n: 不更新/etc/mtab,相当于#mount

  -a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)

  -L LABEL: 以卷标指定挂载设备

  -U UUID='UUID': 以UUID指定要挂载的设备

  -B, --bind: 绑定目录到另一个目录上

  -o options:(挂载文件系统的选项),多个选项使用逗号分隔

    async:异步模式,内存更改时,不会马上写入磁盘,以节省IO资源

    sync:同步模式,内存更改时,同时写磁盘

    atime/noatime:包含目录和文件

    diratime/nodiratime:目录的访问时间戳

    auto/noauto:是否支持自动挂载,是否支持-a选项

    exec/noexec:是否支持将文件系统上运行应用程序

    dev/nodev:是否支持在此文件系统上使用设备文件

    suid/nosuid:不否支持suid和sgid权限

    remount:重新挂载

    ro:只读

    rw:读写

    user/nouser:是否允许普通用户挂载此设备,默认管理员才能挂载

    acl:启用此文件系统上的acl功能


     注意:1、上述选项可多个同时使用,彼此之间使用逗号分隔。

       2、默认挂载选项:rw, dev, exec, auto, nouser, async


示例1:挂载/dev/sdb1到/mnt/sdb1目录下面

wKiom1fCpEyCx08YAABNtNgQmvw618.png

示例2:取消/dev/sdb1的挂载

wKioL1fCpE2hkhinAABMpJZesoM798.png

示例3:重新挂载设备/dev/sdb1且为只读

wKioL1fCpaig1XAhAAAhl-6Ufm8550.png

示例4:挂载目录具有suid权限的目录(此操作过于危险,请谨慎使用)

当挂载具有suid的目录后,假如目录下面有某些系统命令在该目录下面,使用这些命令,可以直接查看到或修改到系统的文件,所以需要我们谨慎操作此命令。

wKioL1fCpxDjGtcBAABwZX7K1f8985.png


查看内核追踪到的已挂载的所有设备:

    cat /proc/mounts

wKioL1fCr06xTBajAAAaBCHIvqU276.png