Linux 磁盘、文件系统管理

==============================================================================

概述:

  • 磁盘结构

  • 分区类型

  • 管理分区

  • 管理文件系统

  • 挂载设备

  • 管理虚拟内存

==============================================================================

第一篇:Linux磁盘管理

 1.概述:

计算机的组成

  • 计算机的五大组成部件:输入设备、输出设备、存储器、运算器、控制器,其中,输入、输出设备称之为I/O设备,运算器和控制器称之为CPU ,存储器如内存、硬盘等。计算机只有CPU和内存其实就可以独立完成计算任务了,只是其输入输出都在内存中实现,但是,内存属于随机存储单元,断点就会导致数据丢失,因此,我们就通过其他辅助设备来弥补内存的不足,这些辅助设备称之为外存,如:磁盘,光驱等。

 2.硬盘:

接口类型:



硬盘分类:

  • 固态硬盘

  • 机械硬盘

硬盘存储术语(CHS):

  • head:磁头  256个 ;

  • track:磁道  1024个磁道;

  • 平均寻道时间:5400rpm(转/分),7200rpm,10000rpm,15000rpm;

  • cylinder:柱面 (分区划分基于柱面);

  • secotr:扇区,512bytes  63个;

  • cylinder=512*63track*256head=8M

附图:



 3.设备文件:

设备文件

  • 对Linux而言,其哲学思想之一就是“一切皆文件”,因此 linux 之上所有设备的操作都是通过文件接口来实现的,也就是说在访问设备的时候就如同访问一个文件一样,因此他们使用的都是文件系统接口。

一切皆文件

  • open(), read(), write(), close()

设备类型:

  • 块设备(block):随机访问,数据交换单位是“块”;

  • 字符设备(character):线性访问,数据交换单位是“字符”;

设备文件:FHS  

     /dev

  • 关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信;

设备号:

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

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

附图:

1.Linux 磁盘、文件系统管理---磁盘管理及分区_第1张图片


mknod命令:创建设备文件

  • 作用:make block or character speclal files

  • 语法:mknod [OPTION]... NAME TYPE [MAJOR MINOR]

  • 选项:-m MODE:创建后的设备文件的访问权限;


 4.设备文件名:

设备文件名:(ICANN:互联网名称地址分配机构定义)

磁盘:

  • IDE:/dev/hd[a-z]  例如:/dev/hda,/dev/hdb;

  • SCSI,SATA,USB,SAS不同设备:/dev/sd[a-z]

分区:

  • 同一设备上的不同分区:1,2...

  •  /dev/sda#:  如:/dev/sda1...

  • CentOS 6和7统统将硬盘设备文件表示为:/dev/sd[a-z]#

引用设备的方式:

  • 设备文件名;

  • 卷标(label);

  • UUID(全局唯一标识符,uuidgen 命令可以生成uuid);

wKioL1fEHSHShaa2AAAMhSYCIDA877.png


注意:

  • 引用设备的时候,最好用UUID,因为设备文件名可能会改变。

磁盘分区:MBR、GPT

 1.MBR分区:

MBR:0 sector (0磁道0扇区)

  • 在磁盘上有一个叫做0磁道0扇区是被预留出来的,他不属于任何分区,这个扇区称之为MBR,严格意义上讲应该叫做用来存储MBR的一段空间;

  • MBR:即 Master Boot Record 主引导记录,MBR又分为三部分

如何分区

  • 按柱面

0磁道0扇区:扇区大小为512bytes,分为三部分:

446bytes:bootloader,程序,引用启动操作系统程序;

64bytes:分区表,每16bytes标识一个分区,一共只能有4个分区;

  • 一块磁盘要么最多划分4个分区,要么划分成3个主分区+1个扩展分区(N个逻辑分区)

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

2bytes:MBR区域的有效标识;一般55AA为有效;

1.Linux 磁盘、文件系统管理---磁盘管理及分区_第2张图片


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

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

  • 逻辑分区只能从5开始(5+)

附图:

1.Linux 磁盘、文件系统管理---磁盘管理及分区_第3张图片


命令:echo "- - -" > /sys/class/scsi_host/host2/scan 

  • 新增添磁盘,还不能直接显示出来,要想出现要对磁盘进行扫描(实际生产环境中不需要,都是热插拔技术):

  • 假如 fdisk -l 还是未发现新硬盘,则将上面命令中的host0,替换为host1,host2,....看看;

  • 我们再查看系统日志/var/log/messages,发现对SCSI设备进行了一次重新扫描,用fdisk -l也看到了新增加的磁盘了。上面的命令主要的目的就是scan the SCSI bus

 2.GBT分区:

GPT分区

  • UID(Globals Unique Identifiers)partition table ;

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

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

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

磁盘管理

 1.工具:

管理磁盘

列出块设备:lsblk

创建分区使用:

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

  • gdisk:创建GPT分区;

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

partprobe

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

 2.fdisk命令:

fdisk:

查看磁盘的分区信息:

  • fdisk -l [-u] [device...];列出指定磁盘上的分区情况

1.Linux 磁盘、文件系统管理---磁盘管理及分区_第4张图片


管理分区:fdisk device

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

1.Linux 磁盘、文件系统管理---磁盘管理及分区_第5张图片


常用命令:

  • n:创建新分区;;

  • d:删除已有分区;(如果删除扩展分区sda4 逻辑分区都会消失);

  • t:修改分区类型

  • l:查看所有支持的已知ID;

  • w:保存并退出

  • q:不保存并退出

  • m:查看帮助信息;

  • p:显示现有分区表

注意:

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

1.Linux 磁盘、文件系统管理---磁盘管理及分区_第6张图片

 3.同步分区表:

同步分区表:partxpartprobe

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

  • # cat /proc/partations

  • lsblk

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

新增分区用:

  • partx -a /dev/device;

  • kpartx -af /dev/device 

删除分区用:

  • partx -d --nr N /dev/DEVICE (N:表示删除的哪个分区就写几,N-M表示范围)

  • centos6:--nr N-M(表示范围)

partprobe命令:

  • centos5,7使用。一条命令搞定,增减删除都可以!

  • 用法:partprobe [/dev/DEVICE]

演示:

 1.fdisk -l [device] 列出所有的磁盘分区

# 列出所有设备的磁盘分区
[root@centos7 ~]#  fdisk -l

磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0007c37e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1001471      499712   83  Linux
/dev/sda2         1001472    84887551    41943040   83  Linux
/dev/sda3        84887552   126830591    20971520   83  Linux
/dev/sda4       126830592   167772159    20470784    5  Extended
/dev/sda5       126834688   131031039     2098176   82  Linux swap / Solaris

# 列出指定设备的磁盘分区
[root@centos7 ~]#  fdisk -l /dev/sda

磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0007c37e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1001471      499712   83  Linux
/dev/sda2         1001472    84887551    41943040   83  Linux
/dev/sda3        84887552   126830591    20971520   83  Linux
/dev/sda4       126830592   167772159    20470784    5  Extended
/dev/sda5       126834688   131031039     2098176   82  Linux swap / Solaris

2.查看所有以支持分区的ID类型

1.Linux 磁盘、文件系统管理---磁盘管理及分区_第7张图片


3.创建磁盘分区:

[root@centos7 ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


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

磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0007c37e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1001471      499712   83  Linux
/dev/sda2         1001472    84887551    41943040   83  Linux
/dev/sda3        84887552   126830591    20971520   83  Linux
/dev/sda4       126830592   167772159    20470784    5  Extended
/dev/sda5       126834688   131031039     2098176   82  Linux swap / Solaris

命令(输入 m 获取帮助):n # 创建新分区
All primary partitions are in use
添加逻辑分区 6

起始 扇区 (126832640-167772159,默认为 126832640):
将使用默认值 126832640
Last 扇区, +扇区 or +size{K,M,G} (126832640-126834687,默认为 126834687):+2G
值超出范围。
Last 扇区, +扇区 or +size{K,M,G} (126832640-126834687,默认为 126834687):
将使用默认值 126834687
分区 6 已设置为 Linux 类型,大小设为 1 MiB  # 使用默认值

命令(输入 m 获取帮助):p  # 打印当前磁盘分区

磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0007c37e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1001471      499712   83  Linux
/dev/sda2         1001472    84887551    41943040   83  Linux
/dev/sda3        84887552   126830591    20971520   83  Linux
/dev/sda4       126830592   167772159    20470784    5  Extended
/dev/sda5       126834688   131031039     2098176   82  Linux swap / Solaris
/dev/sda6       126832640   126834687        1024   83  Linux

Partition table entries are not in disk order

命令(输入 m 获取帮助):d   # 删除指定分区
分区号 (1-6,默认 6):6
分区 6 已删除

命令(输入 m 获取帮助):n   # 创建新分区
All primary partitions are in use
添加逻辑分区 6
起始 扇区 (126832640-167772159,默认为 126832640):131031042
Sector 131031042 is already allocated
起始 扇区 (131033088-167772159,默认为 131033088):131031400
值超出范围。
起始 扇区 (131033088-167772159,默认为 131033088):131032000
值超出范围。
起始 扇区 (131033088-167772159,默认为 131033088):132000000   # 上面总是提示超出范围,这里可以选择一个离前一个结束扇区大的值
Last 扇区, +扇区 or +size{K,M,G} (132000000-167772159,默认为 167772159):+5G  # 创建新分区为+5G
分区 6 已设置为 Linux 类型,大小设为 5 GiB

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

磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0007c37e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1001471      499712   83  Linux
/dev/sda2         1001472    84887551    41943040   83  Linux
/dev/sda3        84887552   126830591    20971520   83  Linux
/dev/sda4       126830592   167772159    20470784    5  Extended
/dev/sda5       126834688   131031039     2098176   82  Linux swap / Solaris
/dev/sda6       132000000   142485503     5242752   83  Linux  # 新创建的分区


命令(输入 m 获取帮助):w   # 保存分区,但是有报警,这里说明内核并没有真正识别分区
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。

4.同步分区表

# 在fdisk 命令下可以显示出新创建的分区,但有没有真正识别要看内核
[root@centos7 ~]# fdisk -l

磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0007c37e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1001471      499712   83  Linux
/dev/sda2         1001472    84887551    41943040   83  Linux
/dev/sda3        84887552   126830591    20971520   83  Linux
/dev/sda4       126830592   167772159    20470784    5  Extended
/dev/sda5       126834688   131031039     2098176   82  Linux swap / Solaris
/dev/sda6       132000000   142485503     5242752   83  Linux

# 保存了内核所识别的所有分区,可以看出新创建的分区 sda6 并没有真正被内核识别
[root@centos7 ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   83886080 sda
   8        1     499712 sda1
   8        2   41943040 sda2
   8        3   20971520 sda3
   8        4          1 sda4
   8        5    2098176 sda5
  11        0    7587840 sr0

# lsblk 命令显示块设备,也可以查看   
[root@centos7 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   80G  0 disk 
├─sda1   8:1    0  488M  0 part /boot
├─sda2   8:2    0   40G  0 part /
├─sda3   8:3    0   20G  0 part /usr
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    2G  0 part [SWAP]
sr0     11:0    1  7.2G  0 rom  

#------------------------------------------------------------------------------
# 使用 partx 命令通知内核重读分区表,有的时候一次不行,再通知第二次
[root@centos7 ~]# partx -a /dev/sda
partx: /dev/sda: error adding partitions 1-5
[root@centos7 ~]# partx -a /dev/sda
partx: /dev/sda: error adding partitions 1-6   # centos7 使用 partprobe /dev/sda 一条命令搞定

[root@centos7 ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   83886080 sda
   8        1     499712 sda1
   8        2   41943040 sda2
   8        3   20971520 sda3
   8        4          1 sda4
   8        5    2098176 sda5
   8        6    5242752 sda6   # 确定新分区出现,才可以做后续的操作,如创建文件系统
  11        0    7587840 sr0
[root@centos7 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   80G  0 disk 
├─sda1   8:1    0  488M  0 part /boot
├─sda2   8:2    0   40G  0 part /
├─sda3   8:3    0   20G  0 part /usr
├─sda4   8:4    0    1K  0 part 
├─sda5   8:5    0    2G  0 part [SWAP]
└─sda6   8:6    0    5G  0 part 
sr0     11:0    1  7.2G  0 rom  


# 删除分区,通知内核重读分区表
[root@centos7 ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   83886080 sda
   8        1     499712 sda1
   8        2   41943040 sda2
   8        3   20971520 sda3
   8        4          1 sda4
   8        5    2098176 sda5
   8        6    5242752 sda6
  11        0    7587840 sr0
[root@centos7 ~]# partprobe /dev/sda   # 或者使用  partx -d --nr 6 /dev/sda
[root@centos7 ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   83886080 sda
   8        1     499712 sda1
   8        2   41943040 sda2
   8        3   20971520 sda3
   8        4          1 sda4
   8        5    2098176 sda5
  11        0    7587840 sr0
[root@centos7 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   80G  0 disk 
├─sda1   8:1    0  488M  0 part /boot
├─sda2   8:2    0   40G  0 part /
├─sda3   8:3    0   20G  0 part /usr
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    2G  0 part [SWAP]
sr0     11:0    1  7.2G  0 rom