概述:本章介绍磁盘分区和文件系统,深度了解linux存储数据所依赖到各个部分模块。

设备文件

I/O Ports: I/O设备地址

一切皆文件:

Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct file_operations。这个数据结构中包括许多操作函数的指针,如open()、close()、read()和write()等,但由于外设 的种类较多,操作方式各不相同。Struct file_operations结构体中的成员为一系列的接口函数,如用于读/写的read/write函数和用于控制的ioctl等。 打开一个文件就是调用这个文件file_operations中的open操作。不同类型的文件有不同的file_operations成员函数,如普通的磁盘数据文件, 接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。这样,应用程序根本不必考虑操作的是设 备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。


设备类型:

    块设备(block):随机访问,数据交换存取单位“块”,磁盘

    字符设备(character):线性访问,数据交换存取单位“字符”,键盘

设备号码:

    主设备号: major number, 标识设备类型:区分设备类型;用于标明设备所需要的驱动程序;

    次设备号: minor number, 标识同一类型下的不同设备:区分同种类型下的不同的设备;是特定设备的访问入口;

硬盘种类:

        机械硬盘

        固态硬盘

硬盘接口类型

并行:

     IDE(ata):并口 133MB/s

     SCSI(IDE时代服务器上使用):并口 Ultrascsi320,320MB/s;Ultrascsi640,640MB/s

并口:同一线缆可以接多块设备

      IDE:两个,主盘,从盘

      SCSI:

           宽带16-1(必用一个)

           窄带8-1(必用一个)

    

串口:同一线缆只可以接一个设备

    SATA: 6Gbps

    SAS: 6Gbps

    USB: 480MB/s


平均寻道时间:

rpm: rotations每分钟转速

     例如:5400rpm,7200rpm,10000rpm,scsi:15000rpm

lops:io per minute 每分钟IO次数机械硬盘一般在100-200之间


硬盘存储术语

head:磁头  (早期最多可有256个)

track:磁道 (早期最多可有1024个)  =512*63

cylinder: 柱面(不同磁盘的相同磁道组成;并且分区是以柱面为)   柱面容量=track(磁道)63*head(磁头)256*512bytes=8M

secotr: 扇区, 512bytes(早期有63个)


CHS寻址模式

1、CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector)。

 磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁头就可以表示数据在哪个磁面。

 柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面",意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面数=磁道数。

 扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。

2、知道了磁头数、柱面数、扇区数,就可以很容易地确定数据保存在硬盘的哪个位置。也很容易确定硬盘的容量,其计算公式是:

硬盘容量=磁头数×柱面数×扇区数×512字节

3、LARGE寻址模式把柱面数除以整数倍、磁头数乘以整数倍而得到的逻辑磁头/柱面/扇区参数进行寻址,所以表示的已不是硬盘中的物理位置,而是逻辑位置。LBA寻址模式是直接以扇区为单位进行寻址的,不再用磁头/柱面/扇区三种单位来进行寻址。但为了保持与CHS模式的兼容,通过逻辑变换算法,可以转换为磁头/柱面/扇区三种参数来表示,但表示的也和LARGE寻址模式一样,已不是硬盘中的物理位置,而是逻辑位置了。


LBA(Logical Block Address),中文名称:逻辑区块地址;LBA可以意指某个数据区块的地址或是某个地址所指向的数据区块。


CHS地址可用以下公式转成LBA,

#lba=(#c*H+#h)*S+#s-1

其中,

#c、#h、#s分别是磁柱、磁头、扇区的编号

#lba是逻辑区块编号

H=heads per cylinder,每个磁柱的磁头数

S=sectors per track,每磁道的扇区数

LBA可用以下公式对应到CHS:

#c=#lba/(S*H)

#h=(#lba/S)%H

#s=(#lba%S)+1

其中,

/ 是整数除法

% 是取整数除法中的余数

请注意,当今的磁盘使用ZBR(Zone Bit Recording, 等密度记录)方式,实际的每轨扇区数得根据它是哪一轨。不过磁盘还是会提供这个参数来符合公式,内部再自动调整。

其它公式:

#lba/S=q 余 r

#s=1+r

q/H=#c 余 #h


Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。

设备文件:关联至设备驱动程序,设备的访问入口,进而能够跟与之对应硬件设备进行通信

磁盘设备的设备文件命名: /dev/DEV_FILE

IDE: /dev/hd

SCSI, SATA, SAS, USB: /dev/sd[a-z]

不同设备: a-z

          /dev/sda, /dev/sdb, ...

同一设备上的不同分区/dev/sd[a-z]#: 1,2, ...

                     /dev/sda1, /dev/sda5

注意:CentOS6与7统统将硬盘设备文件标识为/dev/sd[a-z]#


创建设备文件命令:

mknod:创建块或字符设备特殊文件

用法:

      mknod [OPTION]... NAME TYPE [MAJOR MINOR]

      mknod [选项]... 名称 类型 [主设备号 次设备号]

选项:

      -m:设置设备文件权限位,类似于chmod,不似a=rw,umask

      -Z:设置SELinux安全环境默认类型

      --context[=CTX]:将对应名称文件的SELinux 安全环境设置为CTX

类型:

      b:创建一个(有缓冲)块设备特殊文件

      c, u:创建一个(无缓冲)字符设备特殊文件

      p:创建一个先进先出管道


注意:

当类型为"p"时可不指定主设备号和次设备号,否则它们是必须指定的。

如果主设备号和次设备号以"0x"或"0X"开头,它们会被视作十六进制数来解析;如果以"0"开头,则被视作八进制数;其余情况下被视作十进制数。


引用设备的方式:

               设备文件名

               卷标

               UUID


生成UUID

[root@localhost ~]# uuidgen

e3a6116a-87f9-485d-8348-5e89dd7999d0     


磁盘分区

 两种分区方式: MBR, GPT


MBR: Master Boot Record(主引导记录),使用32位表示扇区数, 分区不超过2T

如何分区:按柱面分区

0磁道0扇区:512bytes

            446bytes: boot loader:用于启动硬盘的一些引导指令(即主引导程序,MBR)

            64bytes:磁盘分区表(DPT),每16bytes标识一个分区,一共只能有4个分区(4个主分区或 3主分区+1扩展(N个逻辑分区))

            2bytes: MBR区域的有效标识;55AA为有效;否则认为未分区无法使用

注意:

扩展分区(Extended)必须分区成若干个逻辑分区才能使用。扩展分区也存在类似MBR的EBR(扩展分区引导记录)

主分区和扩展分区的标识:1-4

逻辑分区:5以上整数

一般一个数据块(Block)=2^n个扇区



GPT分区

GPT:GUID patition table 支持128个分区,使用64位,支

持8Z(512Byte/block ) 64Z (4096Byte/block)

使用128位UUID 表示磁盘和分区 GPT分区表自动备份在头

和尾两份,并有CRC校验位

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

   EFI部分又可以分为4个区域: EFI信息区(GPT头)、分区表、 GPT分区、备份区域

管理分区

列出块设备

lsblk

创建分区使用:

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

gdisk 创建GPT分区 推荐使用此工具管理GPT分区

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

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


分区工具fdisk和gdisk

注意:因为可以进行分区所以慎用

      fdisk /dev/sd*

      gdisk /dev/sd* 类fdisk 的GPT分区工具

1、查看磁盘分区信息

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

示例:

[root@localhost ~]# fdisk -l /dev/sda

磁盘 /dev/sda:214.7 GB, 214748364800 字节,419430400 个扇区

Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0x000af0bf


   设备   Boot      Start         End      Blocks   Id  System

/dev/sda1   *        2048      411647      204800   83  Linux

/dev/sda2          411648   210126847   104857600   83  Linux

/dev/sda3       210126848   218515455     4194304   82  Linux swap / Solaris

/dev/sda4       218515456   419430399   100457472    5  Extended

/dev/sda5       218517504   260460543    20971520   83  Linux


注意:

Boot列*号所在分区代表引导分区(操作系统所在)

Start与End(分区开始与结束):CentOS6为从那个柱面开始到那个柱面结束

                              CentOS7为从那个扇区开始到那个扇区结束 

Blocks:数据库数量

Id(类型):正常分区用83(十六进制数字)表示;交换分区(有些场景可以理解为虚拟内存)用82表示;扩展分区用5表示


2、管理分区

fdisk [-uc] [-b sectorsize] [-C cyls] [-H heads] [-S sects] device

fdisk提供了一个交互式接口来管理分区,他有许多子命令,分别用于不同的管理功能;所有的操作均在内存中完成,没有直接同步到磁盘;直到使用w命令保存至磁盘上

示例:

[root@localhost ~]# fdisk /dev/sdd

欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。

使用写入命令前请三思。

Device does not contain a recognized partition table

使用磁盘标识符 0x51e40e4e 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):m

命令操作

    a 切换可引导标志

    b 编辑 bsd 磁盘

    c 切换 dos 兼容性标志

    d 删除一个分区

    l 列出已知的分区类型(Id)

    m 打印此菜单

    n 添加新的分区

    o 创建一个新的空 DOS 分区表

    p 显示分区表

    q 退出而不保存更改

    s 创建新的空动作

    t 改变分区的系统类型 id

    u 更改显示/输入单位验证分区表

    w 写入磁盘并退出

    x 额外功能 (仅限于专家)


命令(输入 m 获取帮助):l


 0  空             24  NEC DOS          81  Minix / 旧 Linu    bf  Solaris        

 1  FAT12           27  隐藏的 NTFS Win     82  Linux 交换 / So    c1  DRDOS/sec (FAT-

 2  XENIX root        39  Plan 9          83  Linux          c4  DRDOS/sec (FAT-

 3  XENIX usr        3c  PartitionMagic      84  OS/2 隐藏的 C:   c6  DRDOS/sec (FAT-

 4  FAT16 <32M        40  Venix 80286       85  Linux 扩展      c7  Syrinx         

 5  扩展            41  PPC PReP Boot      86  NTFS 卷集      da  非文件系统数据 

 6  FAT16           42  SFS             87  NTFS 卷集       db  CP/M / CTOS / .

 7  HPFS/NTFS/exFAT    4d  QNX4.x           88  Linux 纯文本     de  Dell 工具      

 8  AIX            4e  QNX4.x 第2部分      8e  Linux LVM      df  BootIt         

 9  AIX 可启动        4f  QNX4.x 第3部分     93  Amoeba         e1  DOS 访问       

 a  OS/2 启动管理器    50  OnTrack DM        94  Amoeba BBT      e3  DOS R/O        

 b  W95 FAT32        51  OnTrack DM6 Aux     9f  BSD/OS         e4  SpeedStor      

 c  W95 FAT32 (LBA)    52  CP/M            a0  IBM Thinkpad 休   eb  BeOS fs        

 e  W95 FAT16 (LBA)    53  OnTrack DM6 Aux     a5  FreeBSD        ee  GPT            

 f  W95 扩展 (LBA)     54  OnTrackDM6        a6  OpenBSD        ef  EFI (FAT-12/16/

 10  OPUS           55  EZ-Drive          a7  NeXTSTEP       f0  Linux/PA-RISC  

 11  隐藏的 FAT12      56  Golden Bow        a8  Darwin UFS      f1  SpeedStor      

 12  Compaq 诊断       5c  Priam Edisk       a9  NetBSD         f4  SpeedStor      

 14  隐藏的 FAT16 <3    61  SpeedStor        ab  Darwin 启动      f2  DOS 次要       

 16  隐藏的 FAT16      63  GNU HURD or Sys    af  HFS / HFS+      fb  VMware VMFS    

 17  隐藏的 HPFS/NTF    64  Novell Netware     b7  BSDI fs        fc  VMware VMKCORE 

 18  AST 智能睡眠      65  Novell Netware     b8  BSDI swap       fd  Linux raid 自动

 1b  隐藏的 W95 FAT3    70  DiskSecure 多启    bb  Boot Wizard 隐    fe  LANstep        

 1c  隐藏的 W95 FAT3    75  PC/IX           be  Solaris 启动     ff  BBT            

 1e  隐藏的 W95 FAT1    80  旧 Minix 


注意:在已经分区并且已经挂载其中某个分区的磁盘设备上的创建的新分区,内核可能在创建完成后无法直接识别


同步分区表

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

 # cat /proc/partations


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

CentOS 5,7:partprobe [/dev/DEVICE]

CentOS 6,7:partx,kpartx


partx [-a|-d|-s|-u] [-t TYPE] [-n M:N] [-] disk

partx [-a|-d|-s|-u] [-t TYPE] partition [disk]

       -a:添加制定的分区或读磁盘新增的分区

       -d:删除制定或所有的分区

       -n:指定分区范围(例如M:N输入为2:-1表示最后两个分区)

新增分区用

partx -a -n M:N /dev/DEVICE

kpartx -a /dev/DEVICE -f: force


删除分区用

partx -d -n M:N /dev/DEVICE

centos6: –nr N-M


分区创建工具:parted,sfdisk;

parted命令

parted的操作都是实时生效的,小心使用

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

       parted /dev/sdb mklabel gpt|msdos

       parted /dev/sdb print

       parted /dev/sdb mkpart primary 1 200 (默认M)

       parted /dev/sdb rm 1

       parted -l


创建文件系统:

格式化:

        低级格式化(分区之前进行,低级格式化就是将磁盘内容重新清空,恢复出厂时的状态,划分出的柱面和磁道,再将磁道划分为若干个扇区,每个扇区又划分出标识部分ID、间隔区GAP和数据区DATA等。而且低级格式化只能针对一块硬盘而不能支持单独的某一个分区。每块硬盘在出厂时,已由硬盘生产商进行低级格式化,因此通常使用者无需再进行低级格式化操作。注意的是低级格式化一种损耗性操作)

        高级格式化(分区之后对分区进行,高级格式化又称逻辑格式化,它是指根据用户选定的文件系统(如FAT12、FAT16、FAT32、NTFS、EXT2、EXT3等),在磁盘的特定区域写入特定数据,以达到初始化磁盘或磁盘分区、清除原磁盘或磁盘分区中所有文件的一个操作。高级格式化包括对主引导记录中分区表相应区域的重写、根据用户选定的文件系统,在分区中划出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间,以便用户使用该分区管理文件。即创建文件系统并清除所有数据以实现初始化)


元数据区、数据区

元数据区:

    文件元数据:inode(index node)

        大小、权限、属主属组、时间戳、数据块指针  (但是不包括文件名,文件名保存在目录数据块中)

        注意:最大单个文件大小由inode(数据块指针)多少决定

    特殊文件:

            链接文件:存储数据指针的空间当中存储的是真实文件的访问路径(本身不占据磁盘块);

            设备文件:存储数据指针的空间当中存储的是设备号(major,minor)(本身不占据磁盘块);

文件系统

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

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


文件系统类型

Linux文件系统: : ext2(Extended file system), ext3,

ext4, xfs(企业级64位SGI) , btrfs(Oracle) , reiserfs(反删除功能很好,但是开发受阻), jfs(

AIX) , swap

光盘: iso9660

Windows: fat32, ntfs

Unix: FFS(fast快速文件系统) , UFS(unix) , JFS2(日志文件系统)

网络文件系统: NFS, CIFS

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

   内核级分布式文件系统:ceph

用户空间分布式文件系统: moosefs, mogilefs, glusterfs,Lustre

   伪文件系统:proc,sysyfs,tmpfs,hugepagefs

   交换文件系统:swap

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


文件系统分类

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

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

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

文件系统的组成部分:

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

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

Linux的虚拟文件系统: VFS(用户与文件系统之间的接口)

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


创建文件系统

mkfs命令:

  (1) # mkfs.FS_TYPE /dev/DEVICE

              ext4

              xfs

              btrfs

              vfat

              mkfs.vfat device

              mkfs -t ext2 = mkfs.ext2

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

    -L 'LABEL': 设定卷标


创建ext文件系统

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

   mke2fs [OPTION] device

          -t {ext2|ext3|ext4}:指明要创建的文件系统类型;

              mkfs.ext4 = mkfs -t ext4 = mke2fs -t ext4

          -b {1024|2048|4096}:指明文件系统的块大小;

          -L 'LABEL' 创建文件系统并设定卷标

          -j: 相当于 -t ext3

              mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3

          -i #: 指明inode与字节的比率;即每多少字节创建一个Indode;此大小不应该小于block的大小

          -N #:直接指明要为此文件系统创建的inode的数量

          -I 一个inode记录大小128---4096

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

          -O FEATURE[,...]:启用指定特性创建目标文件系统

          -O ^FEATURE:关闭指定目标文件系统特性

 

对已创建文件系统管理卷标 

  e2label命令:卷标的查看与设定

        查看:e2lable device

        设定:e2label device LABEL


dumpe2fs:现实ext系列文件系统的属性信息

    dumpe2fs [-h] device

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


tune2fs:查看或重新设定ext系列文件系统可调整参数的值(不用重新格式化)

            -l:查看指定文件系统的超级块信息; super block

            -L 'LABEL':修改卷标

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

            -j: 将ext2升级为ext3

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

            -o[^]: 调整文件系统的默认挂载选项(mount_options),例如:–o ^acl关闭访问控制列表

            -U UUID: 修改UUID号

注意:块大小创建后不可修改


因进程意外终止或系统崩溃等原因导致操作非正常终止时,可能会造成文件损坏;此时,应该检测并修复文件系统;建议,离线进行(非挂载状态,无人操作);

文件系统检测和修复

常发生于死机或者非正常关机之后

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

fsck: 文件系统检测修复

        fsck.FS_TYPE

        fsck -t FS_TYPE 指明文件系统类型;

            fsck.ext4 = fsck -t ext4

        -a: 无须交互而自动修复所有错误;(不推荐使用)

        -r: 交互式修复错误

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

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

        -y:对所有问题自动回答为yes

        -f:即使文件系统处于clean状态,也要强制检测修复


文件系统标签

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

blkid:块设备属性信息查看

  blkid [OPTION]... [DEVICE]

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

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

 

findfs :查找分区

  findfs [options] LABEL=<label>

  findfs [options] UUID=<uuid>


    


 

文件系统要想使用必须要挂载

挂载mount

  在linux操作系统中,挂载是一个非常重要的功能,使用非常频繁。它指将一个设备(通常是存储设备)挂接到一个已存在的目录上。(这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。)需要理解的是,linux操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个大的文件目录。

  我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。

挂载:将额外文件系统与根文件系统某现存的目录建立起关联

关系,进而使得此目录做为其它文件访问入口的行为

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

把设备关联挂载点: mount Point

    mount

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

    umount

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

挂载点目录一般为空


用mount命令挂载文件系统

挂载方法: mount DEVICE MOUNT_POINT

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

mount [-fnrsvw] [-t vfstype] [-o options] device dir

device:指明要挂载的设备;

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

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

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

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

dir:挂载点

事先存在;建议使用空目录

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


mount常用命令选项

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

-r: readonly,只读挂载

-w: read and write, 读写挂载

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

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

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

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

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


目录也可以挂在至另一个目录上作为其临时访问入口;

    mount --bind 源目录 目标目录

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

            async:异步模式

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

            atime/noatime:目录或文件在被访问时是否更新其访问时间戳

            diratime/nodiratime:目录在被访问时是否更新其访问时间戳

            auto/noauto:是否支持自动挂载,是否支持-a选项(一般写在/etc/fstab中)

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

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

            suid/nosuid:是否支持程序文件上的suid和sgid特殊权限生效

            remount:重新挂载;

            ro:只读

            rw: 读写

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

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

                 #mount -o acl device dir

                 #tune2fs -o acl device

            Defaults:相当于rw, suid, dev, exec, auto, nouser, async

         

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

    #mount

    #cat /etc/mtab

    #cat /proc/mounts   


卸载命令

查看挂载情况:

  #findmnt MOUNT_POINT

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

  #lsof MOUNT_POINT

  #fuser -v MOUNT_POINT

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

  # fuser -km MOUNT_POINT

卸载:

  # umount DEVICE

  # umount MOUNT_POINT


设定除根文件系统以外的其它文件系统能够开机时自动挂载:/etc/fstab文件 

文件挂载配置文件

/etc/fstab 每行定义一个要挂载的文件系统;

         第一列字段:要挂载的设备或伪文件系统(设备文件或LABEL=""卷标或UUID="")

                       伪文件系统:如sysfs,proc,tmpfs等  

         第二列字段:挂载点

                       swap类型的设备的挂载点为swap;

         第三列字段:文件系统类型

         第四列字段:挂载选项

                       defaults:使用默认挂在选项;

                       如果要同时指明多个挂载选项,彼此间以逗号分隔;

         第五列字段:转储频率(备份)

                       0:不做备份

                       1:每天转储

                       2:每隔一天转储 

         第六列字段:自检次序

                       0:不自检

                       1:首先自检;一般只有rootfs才用1

                       2:次级自检

自动挂载定义在/etc/fstab中的所有支持自动挂载的文件系统设备

#mount -a 


swap文件系统:

    Linux上的交换分区必须使用独立的文件系统;且文件系统的System ID必须为82;

    创建swap设备:mkswap命令

    mkswap [OPTIONS] device

              -L LABEL:指明卷标

              -f:强制创建

windows无法识别Linux的文件系统;因此,存储设备需要两种系统之间交叉使用时,应该使用windows和Linux同时支持的文件系统;fat32(vfat);



处理交换文件和分区

交换分区是系统RAM的补充

基本设置包括:

        创建交换分区或者文件

        使用mkswap写入特殊签名

        在/etc/fstab文件中添加适当的条目

        使用swapon -a 激活交换空间


挂载交换分区

启用: swapon

       swapon [OPTION]... [DEVICE]

                -a:激活所有的交换分区(定义在/etc/fstab文件中的所有swap设备);

                -p PRIORITY:指定优先级

                             /etc/fstab:pri=value

禁用: swapoff [OPTION]... [DEVICE]


SWAP的优先级

用户可以给某个swap指定一个0到32767的优先级

如果用户没有指定,那么核心会自动给swap指定一个优

先级,这个优先级从-1开始,每加入一个新的没有用户

指定优先级的swap,会给这个优先级减一。

先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心

缺省指定的优先级(是负数)。

优化性能:分布存放,高性能磁盘存放


移动介质

挂载意味着使外来的文件系统看起来如同是主目录树的一部分

访问前、介质必须被挂载

摘除时,介质必须被卸载

按照默认设置,非根用户只能挂载某些设备(光盘、 DVD、软盘、 USB等等)

挂载点通常在/media 或/mnt下


使用光盘

在图形环境下自动启动挂载/run/media/<user>/<label>

否则就必须被手工挂载

         mount /dev/cdrom /mnt/

eject命令卸载或弹出磁盘

          #eject

          #eject -t 弹入

创建ISO文件

        cp /dev/cdrom /root/centos7.iso

        mkisofs -r -o /root/etc.iso /etc

刻录光盘

        wodim –v –eject centos.iso


挂载本地的回环设备:

       回环设备:一般为使用镜像文件(镜像文件中也有文件系统)虚拟块设备存在于实际的另一个文件系统中

       #mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT


挂载USB介质

被内核探测为SCSI设备

  /dev/sdaX、 /dev/sdbX、或类似的设备文件

   在图形环境中自动挂载

  图标在[计算机]窗口中创建

  挂载在/run/media/<user>/<label>

手动挂载

  mount /dev/sdb1 /mnt


常见工具

内存空间使用状态:

  free [OPTION]

    -m: 以MB为单位

    -g: 以GB为单位

    -h:human-readable;以人类易读的单位显示

文件系统空间占用信息的查看工具:

  df [OPTION]... [FILE]...

    -H 以1000为单位

    -T 文件系统类型

    -h: human-readable;以人类易读的单位显示

    -i: inodes instead of blocks;显示inode的使用状态而非blocks

    -P: 以Posix兼容的格式输出

    -:仅显示本地文件的相关信息(不包括网络中的);

查看某目录总体空间占用状态:

  du [OPTION]... DIR

    -h: human-readable;以人类易读的单位显示

    -s: summary;共计


工具dd

dd命令: convert and copy a file

用法:

  dd if=/PATH/FROM/SRC of=/PATH/TO/DEST

  bs=#: block size, 复制单元大小

  count=#:复制多少个bs

of=file 写到所命名的文件而不是到标准输出

  if=file 从所命名文件读取而不是从标准输入

  bs=size 指定块大小(既是是ibs也是obs)

  ibs=size 一次读size个byte

  obs=size 一次写size个byte

  cbs=size 一次转化size个byte

  skip=blocks 从开头忽略blocks个ibs大小的块

  seek=blocks 从开头忽略blocks个obs大小的块

  count=n 只拷贝n个记录

  conv=conversion[,conversion...] 用指定的参数转换文件。

转换参数:

ascii 转换 EBCDIC 为 ASCII

ebcdic 转换 ASCII 为 EBCDIC

block 转换为长度为 cbs 的记录,不足部分用空格填充。

unblock 替代cbs长度的每一行尾的空格为新行

lcase 把大写字符转换为小写字符

ucase 把小写字符转换为大写字符

swab 交换输入的每对字节

noerror 出错时不停止

notrunc 不截短输出文件


sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐

磁盘拷贝:

  dd if=/dev/sda of=/dev/sdb

备份MBR:

  dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

破坏MBR中的bootloader:

  dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

有一个大与2K的二进制文件fileA。 现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,请问如何实现?

#dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc


备份:

dd if=/dev/sdx of=/dev/sdy

将本地的/dev/sdx整盘备份到/dev/sdy

dd if=/dev/sdx of=/path/to/p_w_picpath

将/dev/sdx全盘数据备份到指定路径的p_w_picpath文件

dd if=/dev/sdx | gzip >/path/to/p_w_picpath.gz

备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径

恢复:

dd if=/path/to/p_w_picpath of=/dev/sdx

将备份文件恢复到指定盘

gzip -dc /path/to/p_w_picpath.gz | dd of=/dev/sdx

将压缩的备份文件恢复到指定盘


拷贝内存资料到硬盘

    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将无法挂载,创建和拷贝操作无法执行。

得到最恰当的block size

dd if=/dev/zero bs=1024 count=1000000

of=/root/1Gb.file

dd if=/dev/zero bs=2048 count=500000

of=/root/1Gb.file

dd if=/dev/zero bs=4096 count=250000

of=/root/1Gb.file

dd if=/dev/zero bs=8192 count=125000

of=/root/1Gb.file

通过比较dd指令输出中所显示的命令执行时间,即可确定系统

最佳的block size大小


测试硬盘读写速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null

dd if=/dev/zero of=/root/1Gb.file bs=1024

count=1000000

通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度


修复硬盘

dd if=/dev/sda of=/dev/sda

当硬盘较长时间(比如1, 2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。


du -s 当前目录下所有文件大小和

du -sh

du -sh /

du -sh /*

1、创建一个2G的文件系统,块大小为2048byte, 预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自

动挂载至/testdir目录,且默认有acl挂载选项

2、写一个脚本,完成如下功能:

(1) 列出当前系统识别到的所有磁盘设备

(2) 如磁盘数量为1,则显示其空间使用信息

否则,则显示最后一个磁盘上的空间使用信息



二、总结练习:

1、分区(mbr,gpt)区别和结构

MBR,全称为Master Boot Record,即硬盘的主引导记录。

   硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和分区有效标志。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic number,占2个字节,固定为0xAA55或0x55AA,这取决于处理器类型,如果是小端模式处理器(如Intel系列),则该值为0xAA55;如果是大端模式处理器(如Motorola6800),则该值为0x55AA。

wKiom1fG0Iaxs2-GAAA3STtFdaY381.png

注意

MBR是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它,但可以通过命令来修改和重写

MBR组成

   一个扇区的硬盘主引导记录MBR由4个部分组成。

主引导程序(偏移地址0000H--0088H):它负责从活动分区中装载,并运行系统引导程序。

出错信息数据区:偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。

分区表(DPT,Disk Partition Table)含4个分区项:偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。

结束标志字:偏移地址01FE--01FF的2个字节值为结束标志0xAA55或0x55AA,称为“魔数”(magic number)。如果该标志错误系统就不能启动。

MBR使用磁盘的最开始的512Byte,结构图如下。可以看到只有中间的64Byte是用来描述分区表的,每16Byte描述一个分区,所以最多只能同时划分4个主分区。

wKioL1fG0X-SOTURAAAfE_JuHB0722.png

具体含义如下:

(1)0x00~0x1BD:446个字节,包含一段指令,用以通知计算机如何访问分区表并定位操作系统的位置

这部分的代码会因为操作系统不同而不同,利用引导代码可以实现多重系统引导。多系统引导有两种方法可以实现:一种方法是用操作系统在引导分区中设置一段代码,先加载进入用户选择系统的界面,允许用户选择要进入的系统,再进入指定的系统;第二种方法是改变MBR中的引导代码,该代码直接呈现给用户一个选择系统的界面。

(2)0x1BE~0x1FD:64个字节,4个分区表项,每个表项占用16个字节,描述一个分区,最多可以描述4个分区(这就是为什么MBR分区体系只能分成4个区【我们平时看到的分区一般可以从26个字母中选取任意多个当做分区标识(多于4个),这是因为那些分区是逻辑分区,这里的4个分区指的是主分区和扩展分区的数目,而逻辑分区是在扩展分区中划分出来的,也叫做二级、三级扩展分区。】)。

分区表项并没有顺序要求,即不要求第一个分区表项在第二个分区表项前。

分区表也不要求从第一个分区表项开始

(3)0x1FE~0x1FF:2个字节,有效结束标志0xAA55或0x55AA。如果没有这个标志,操作系统会认为磁盘没有初始化,无法正确加载磁盘的分区。

  而描述硬盘分区结构信息的这16Byte是如下这样的结构。可以发现只有最后4Byte是用来描述分区总的扇区数的,4Byte是32位,也就是分区最大只能是2^32*512Byte,大概是2.2TB。

wKiom1fG7cDQ8sMHAAE7gfvywG0845.png

分区表参数含义(字节)

0 活动(80)或非活动分区(00)

1 2 3 起始的磁头 01 柱面 01 扇区00值

4 分区类型符 NTFS(07)FAT32(0B)扩展(0F)

5 6 7 结束的磁头 FE 柱面 FF 扇区FF值

8 9 A B 本分区之前已用扇区数

C D E F 本分区大小

虚拟MBR

即 EBR (extent boot record)扩展引导记录,其记录表项 与MBR相同 ,用于管理扩展分区上的逻辑驱动器。


GUID磁碟分割表(GUID Partition Table,缩写:GPT)

  其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主开机纪录(MBR)分区表。

1、支持2TB以上的大硬盘。

2、每个磁盘的分区个数几乎没有限制。“几乎”是因为Windows系统最多只允许每个划分128个分区。不过也完全够用了。

3、分区大小几乎没有限制。“几乎”。因为它用64位的整数表示扇区号,即2^64=18,446,744,073,709,551,616。夸张一点说,一个64位整数能代表的分区大小已经是个“天文数字”了,若干年内你都无法见到这样大小的硬盘,更不用说分区了。

4、分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表。其中一份被破坏后,可以通过另一份恢复。

5、每个分区可以有一个名称(不同于卷标)。

wKiom1fG9gegIP-9AACYfPAkXP0883.jpgwKioL1fG9gigQYdMAACrMpctEKY000.png

  逻辑块(LBA)大小是512Byte。出于兼容性考虑,LBA 0(即硬盘的第一个扇区)仍然用作MBR,之后LBA 1是分区表头。LBA 2-33都用来描述分区表项,每个LBA可描述4个分区,即每个分区使用128Byte来描述。另外,GPT分区将在磁盘最后的33个扇区作为主分区表的备份,称为备份分区表。

  GPT 为了兼容 MBR,LBA 0 依旧保留了MBR的结构。在GPT工作时,会优先读取 GPT (LBA1) 内容。如果没有 GPT 内容,则认为这是一块MBR磁盘。再从LBA 0 读取MBR。  在硬盘末尾,GPT 备份了一份,这样当GPT出错时,可以快速的从硬盘末尾恢复。LBA -1 (负1) 表示倒数第一块 LBA。  从LBA 2 到 LBA 33 ,一共预留了 128 个分区表空间。 GPT 支持在一块硬盘上创建 128 个分区。所以每一个分区可以使用 128 bytes 的空间。


wKiom1fG9gugvZTLAADZkn_OCNA459.jpg

而每个分区表项是如下这样的结构,可以看到它使用8Byte描述分区起始位置和结束位置,那么就是(2^64-1)*512Byte=9.4ZB(9.4×10^21字节)。

wKiom1fG9gyiKi3KAACRAUap9pU792.png

GPT磁盘与MBR磁盘      

GPT(Globally Unique Identifier Partition Table Format)一种由基于 Itanium 计算机中的可扩展固件接口 (EFI) 使用的磁盘分区架构。与主启动记录 (MBR) 分区方法相比,GPT 具有更多的优点,因为它允许每个磁盘有多达 128 个分区,支持高达 18 千兆兆字节的卷大小,允许将主磁盘分区表和备份磁盘分区表用于冗余,还支持唯一的磁盘和分区 ID (GUID)。      与支持最大卷为 2 TB (terabytes) 并且与每个磁盘最多有 4 个主分区(或 3 个主分区,1 个扩展分区和无限制的逻辑驱动器)的主启动记录 (MBR) 磁盘分区的样式相比,GUID 分区表 (GPT) 磁盘分区样式支持最大卷为 18 EB (exabytes) 并且每磁盘最多有 128 个分区。与 MBR 分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT 分区磁盘有多余的主要及备份分区表来提高分区数


2、作业:分区(mbr,gpt),创建文件系统(ext系列,xfs等),mount挂载各种选项

MBR分区:

wKiom1fHBLKz47YCAAC_29IBaRo292.png

wKiom1fHBLSiqFMtAAExdJPHwFU232.png

wKioL1fHBLjy7Ry3AAENESvVwOk362.png

wKiom1fHBLuTaL2jAAD9bMDNOZo111.png

wKioL1fHBL6R67ECAADIPRfDI94106.png

wKiom1fHBMCC8cUJAAD-boxZ8qA471.png

GPT分区:

wKioL1fHBUSg0-dkAAHi_bHWOO4162.png

wKiom1fHBUmzsyuHAAHiamMXcE0552.png


注意:文件系统是针对分区来使用的,如如下图操作,则是将整个磁盘当成一个分区,格式化创建文件系统

创建ext系列文件系统

wKioL1fHBp-RGhvsAADhR23owIs176.png

创建ext系列文件系统工具还有以下工具

wKiom1fHBxLDssTgAAAK1bckFz8238.png

mke2fs

创建xfs文件系统

wKioL1fHBrahW2C0AABd8lo-vfI304.png

wKioL1fHBz7zQx7GAACToYq5jy4859.png

注意:

对已经分区的硬盘新添加或删除分区,需要执行以下命令,使内核能够识别硬盘变动情况;而非分区过的硬盘不需要

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

CentOS 5,7:partprobe [/dev/DEVICE]

CentOS 6,7:partx,kpartx


partx [-a|-d|-s|-u] [-t TYPE] [-n M:N] [-] disk

partx [-a|-d|-s|-u] [-t TYPE] partition [disk]

       -a:添加制定的分区或读磁盘新增的分区

       -d:删除制定或所有的分区

       -n:指定分区范围(例如M:N输入为2:-1表示最后两个分区)

新增分区用

partx -a -n M:N /dev/DEVICE

kpartx -a /dev/DEVICE -f: force


删除分区用

partx -d -n M:N /dev/DEVICE

centos6: –nr N-M


例如

在已经分过区的磁盘上添加新分区

wKiom1fHDCrDQc0AAAD36JCPKgs829.png

wKioL1fHDC3BkjZVAAD8SOXtuPQ960.png

wKiom1fHDC6CN2foAABZaVPRwK4945.png

wKioL1fHDDHh1UdUAADeN31f8Kk730.png

在已经分过区的磁盘上删除分区

wKiom1fHDXSTkT__AAFKHAk1aOY236.png

wKioL1fHDYqBRDoKAAGpuhMwF8A252.pngwKiom1fHDZPw5k92AAGX-tZ3pRk267.png


mount挂载各种选项

分区挂载

wKiom1fHDxKT5wLLAAHYVBRDeww723.png

光盘挂载

wKioL1fHEaaADvkyAAENw6Tlyww608.png

挂载USB

#mount /dev/sdf /mnt/usb

挂载回环设备

#mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT

挂载swap

wKiom1fHFoLi-N3WAAGvpGnrMro288.png

wKioL1fHFobDIgbdAAIhi9d5qVc466.png

wKioL1fHFonxmFaEAADb0gniMRM819.png

wKiom1fHFouwfI8kAABf5ui8GXo131.png

wKiom1fHFouQ2mdtAAAq-ACIVUM769.png

挂载目录

mount --bind 源目录 目标目录


开机自动挂载

编辑/etc/fstab文件

wKioL1fHGb7S789nAAF6qbrRtuY784.png

自动挂载定义在/etc/fstab中的所有支持自动挂载的文件系统设备

#mount -a 

激活所有的交换分区(定义在/etc/fstab文件中的所有swap设备);

#swapon -a