天天看点

180天Linux小白到大神-Linux磁盘管理

11.Linux磁盘管理

1.磁盘概述

1.1 什么是磁盘

1.2 磁盘物理结构

1.2.1 什么是盘片

1.2.2 什么是磁道

1.2.3 什么是扇区

1.2.4 什么是柱面

1.2.5 什么是磁头

1.3 磁盘的接口类型

1.3.1 IDE-SCSI

1.3.2 SATA-SAS

1.3.3 MSATA-M2

2.磁盘命名

2.1 物理服务器

2.2 虚拟服务器

3.分区管理

3.1 为什么要分区

3.2 fdisk分区工具

3.3 gdisk分区工具

3.4 mkfs格式化系统

4.挂载管理

4.1 临时挂载mount

4.2 临时卸载umount

4.3 永久挂载fstab

4.3.1 永久挂载配置抒写

4.3.2 配置文件/etc/fstab

5.虚拟磁盘SWAP

5.1 什么是SWAP

5.2 为什么需要SWAP

5.3 SWAP基本应用

5.3.1 扩展swap分区

5.3.2 缩小swap分区

6.文件系统

6.1 文件系统的作用

6.2 文件系统的类型

6.3 文件系统结构

6.4 文件系统故障修复

  1. 磁盘满了、Inode满了

大多数人对硬盘都不陌生,一块小小的硬盘里,就可以存储海量的照片音乐和电影,尤其是我们喜爱的各类动作片。但如此小的空间,是如何储存那么多信息的呢?

每个硬盘中心都是一摞高速运转的圆盘,在圆盘上附着的一圈金属颗粒,每个金属颗粒都有自己的磁化程度,主要用于储存0和1。

在数据写入时,硬盘的磁头开始通电,周围会产生磁场,数据在磁场的作用下转变成电流,使磁盘的金属颗粒磁化,从而将信息记录在圆盘上。

由海量颗粒组成的信息,就是我们存在硬盘里的数据。

磁盘物理结构-1点击此按钮 磁盘物理结构-2点击此按钮

硬盘一般有一个或多个盘片,每个盘片可以有两面,即第一个盘片的正面为0面,反面为1面然后依次类推。

每个盘片的盘面在出厂的时候被划分出了多个同心圆环,数据就存储在这样的同心圆环上面,我们将这样的圆环称为磁道 Track ,每个盘面可以划分多个磁道。但肉业不可见。

在硬盘出厂时会对磁盘进行一次低格,其实就是再每个磁道划分为若干个弧段,每个弧段就是一个扇区 Sector 。扇区是硬盘上存储的物理单位,现在每个扇区可存储512字节数据已经成了业界的约定。

柱面实际上就是我们抽象出来的一个逻辑概念,简单来说就是处于同一个垂直区域的磁道称为 柱面 ,即各盘面上面相同位置磁道的集合。这样数据如果存储到相同半径磁道上的同一扇区,这样可以实现并行读取,主要是减少磁头寻道时间。

读取磁盘磁道上面金属块,主要负责读或写入数据。

IDE,Scsi (已经被淘汰)

SATA III 与 SAS

接口类型 接口速率 盘片 写入速度 用

转速 场

SATA III

(1T 6Gbps/s 7.5k/s 300MB/s 个

300- 人

400)

SAS 企

(300Gb 8Gbps/s~12Gbps/s 15k/s 300MB/s~600MB/s

3000)

百度云盘:

1.SATA盘;

阿里云:

服务器,虚拟机–>高效云盘(300MB/s)-- >SSD(300-400/MB)

数据库SAS(300-400MB/s)–> 阿里云 ( 100MB/s 配置一样;)

MSATA 与 M.2

MSATA 接口是专门为超级笔记本而设计的,m.2接口

参考文档

m.2 接口是 inter 推出的一种替代 MSATA 新的接口

规范;

m.2 接口相比 MSATA 接口有两方面的优势

1.速度优势

2.体积优势

M.2接 支持接 兼容性 读取速度 写入速度

口类型 口类型

Socket SATA、 几乎主

板都支 700MB/s 550MB/s

2 PCI-E X2

需要检			
           

Socket PCI-E ×4 查主板 4GB/s

3 Nvme 是否支

真实物理服务器

设备名称 分区信息 设备类型

/dev/sda /dev/sda1 第一块物理磁盘第一分区

/dev/sdb /dev/sdb2 第二块物理磁盘第二个分区

/dev/sdd /dev/sdd4 第四块物理磁盘的第四个分

阿里云主机或者KVM虚拟化主机的磁盘命名格式;

/dev/vda /dev/vda1 第一块虚拟磁盘的第一个分

/dev/vdb /dev/vdb2 第二块虚拟磁盘的第二个分

/dev/vdc /dev/vdc3 第三块虚拟磁盘的第三个分

分区是为了便于数据分门别类的存储;分区有 MBR、 GPT 两种方式;

分区表:(记录分区的编号、每个编号从哪个扇区开始,到哪个扇区结束)

MBR :主引导记录,用来找到磁盘上的操作系统,并且引导启动(0磁道,1扇区,512字节)

446字节:boot loader

64字节:存储分区表,每16字节表示一个分区,

最多四个“主分区”(主分区+扩展分区)

2字节:结束位;

GPT :新型的分区表 GPT 支持分配128个主分区。

MBR 与GPT 的区别,传送门

注意 MBR 与 GPT 之间不能互转,会导致数据丢失。

fdisk 仅支持分配小于 2TB 的磁盘(MBR)

查看当前设备 fdisk -l

对设备进行分区 fdisk /dev/sdb

分区命令

m:显示帮助

n:创建新分区

d:删除分区

p:查看分区

w:保存分区

q:退出

分区案例:

案例1:分配4个分区(4P)

案例2:分配5个分区(1P+1E+4L)

案例3:分配6个分区(3P+1E+3L)

gdisk 支持分配大于 2TB 的磁盘

查看当前设备 gdisk [-l] device 对设备进行分区 gdisk /dev/sdb

?:显示帮助

p:打印分区

案例1:分配4个主分区(4P)

案例2:分配5个主分区(5P)

案例3:分配6个主分区(6P)

mkfs 命令用于格式化硬盘,类似于将房子装修成3室一厅,还是2室一厅;

-b :设定数据区块占用空间大小,目前支持 1024、2048、4096 bytes 每个块;

-t :用来指定什么类型的文件系统,可以是 ext4、 xfs ;

提示:

1.分区工具,可以针对整块磁盘,或者单个分区进

行格式化操作

2.一般情况下建议,不要直接格式化使用整磁盘,要分区后再格式化,头部有预留空间;

1.使用 mkfs 命令,格式化整个硬盘

ex2 ext3 ext4

[root@oldxu ~]# mkfs.ext4 /dev/sdb

2.使用 mkfs 命令,格式化磁盘的某个分区

[root@oldxu ~]# mkfs.xfs /dev/sdb1

3.使用 mkfs 命令指定一个数据块的大小 4096字节=4k

[root@dns-master ~]# mkfs.xfs -b size=1024 /dev/sdb2

当需要使用磁盘空间的时,需要准备一个目录作为挂载点,然后使用 mount 命令与该设备进行关联;

通过mount进行挂载,但重启将会失效。我们称为临时生效。

-t :指定文件系统挂载分区;

-a :检查并且挂载 /etc/fstab 配置文件中未挂载的设备;

-o :指定挂载参数,ro、rw ;

1.挂载磁盘设备;

[root@oldxu ~]# mkdir /db1

[root@oldxu ~]# mount -t xfs /dev/sdb1 /db1

2.挂载磁盘设备,设置参数为仅可读;

[root@oldxu ~]# mkdir /db2 [root@dns-master ~]# mount -t xfs -o ro /dev/sdb2 /db2

[root@dns-master ~]# touch /db2/new_file touch: cannot touch ‘/db2/new_file’: Read-only file system

如果不想使用可以使用 umount

[device|directory] 进行临时卸载。

-l :强制卸载;

1.卸载入口目录示例;

[root@oldxu ~]# umount /db1

2.卸载设备方式示例;

[root@oldxu ~]# umount /dev/sdb1

3.如碰到无法正常卸载情况处理;

[root@xuliangwei db1]# umount /db1 umount: /db1: device is busy.

(In some cases useful info about processes that use

the device is found by lsof(8) or

fuser(1)

#如上情况解决办法有两种,1.切换至其他目录 2.强制卸载

[root@student db1]# umount -l /db1

如果需要实现永久挂载,则需要将挂载相关信息写入 /etc/fstab 配置文件中实现。

配置文件规范: 设备名称|挂载的入口目录|文件系统类型|挂载参数|是否备份|是否检查

1.获取设备名称,或者获取设备 UUID

2.手动临时挂载测试;

3.写入 /etc/fstab 配置文件;

4.使用 mount -a 检查是否存在错误;

1.获取设备名称,或设备的UUID

[root@oldxu ~]# blkid |grep “sdb1” /dev/sdb1: UUID=“e271b5b2-b1ba-4b18-bde5-66e394fb02d9” TYPE=“xfs”

2.手动挂载测试

[root@oldxu ~]# mount UUID=“e271b5b2-b1ba-4b18-bde5-66e394fb02d9” /db1

3.写入 /etc/fstab 测试

手动编写

[root@oldxu ~]# tail -1 /etc/fstab

UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0

自动实现

[root@oldxu ~]# blkid |grep /dev/sda1 | awk -F ‘[: ]+’ ‘{print $2}’ | \

sed -r ‘s#(.*)#\1 /db1 xfs defaults 0 0#g’ >> /etc/fstab

4.加载 /etc/fstab 配置文件, 同时检测是否存在语法错误

[root@oldxu ~]# mount –a

/etc/fstab 配置文件格式

第一列:指定需要挂载的设备

设备名称:/dev/sdb1

设备ID:UUID

第二列:挂载的入口目录

第三列:文件系统类型

xfs 类型

ext4 类型

第四列:挂载参数

async/sync :使用同步或异步方式存储数据;

默认 async

user/nouser :是否允许普通用户使用mount

命令挂载。默认nouser

exec/noexe :是否允许可执行文件执行。默认

exec

suid/nosuid :是否允许存在suid 属性的文

件。默认suid

auto/noauto :执行 mount -a 命令时,此文件

系统是否被主动挂载。默认auto

rw/ro :是否以只读或者读写模式进行挂载。默

认rw

defaults :具有

rw,suid,dev,exec,auto,nouser,async 等参

数;

第五列:是否要备份磁盘

0:不做备份

1:每天进行备份操作

2:不定日期的进行备份操作

第六列: 开机是否检验扇区

0:不要检验磁盘是否有坏道

1:检验

2:校验 (当1级别检验完成之后进行2级别检验)

Swap 分区在系统的物理内存不够时,将硬盘中的一部分空间供当前运行的程序使用。

当物理内存不够时会随机 kill 占用内存的进程,从而产生oom ,临时使用 swap 可以解决。

案例:模拟服务器OOM ;

[root@oldxu ~]# dd if=/dev/zero of=/dev/null bs=800M

#故障日志

[root@oldxu ~]# tail -f /var/log/messages Out of memory: Kill process 2227 (dd) score 778 or sacrifice child

Killed process 2227 (dd) total-vm:906724kB, anon-rss:798820kB, file-rss:0kB

1.创建分区,并格式化为 swap 分区。

[root@oldxu ~]# fdisk /dev/sdb

格式化为swap

[root@oldxu ~]# mkswap /dev/sdb1

2.查看当前 swap 分区大小

[root@oldxu ~]# free -m

total used free

shared buff/cache available

Mem: 1980 1475 80

10 424 242

Swap: 2047 4 2043

扩展swap 分区,使用 swapon 命令

swapon device :将某个磁盘大小添加到 swap 分

区中

swapon -a :添加所有 swap 分区

[root@oldxu ~]# swapon /dev/sdb1

[root@oldxu ~]# free -m

Swap: 3047 4 2043

缩小 swap 分区,使用 swapoff 命令

swapoff device :关闭某个磁盘的 swap 分区 swapoff -a :关闭所有 swap 分区

[root@oldxu ~]# swapoff /dev/sdb1

用户无法直接与硬件进行交互,那如果需要申请100G磁盘空间,怎么办?

为了简化磁盘使用的过程,操作系统提供了一个辅助系统FS (文件系统)

Windows :FAT32、NTFS

Linux :EXT2、EXT3、EXT4、XFS、VFAT、NTFS-3g

磁盘被划分为两大存储区域,一类是存储元数据 inode ,一类是存储真实数据data block

inode 划分了很多inode block ,每个block 块为

128B

data 划分了很多data block ,每个block 块为4k

如下图所示:磁盘在存储文件时,至少占用一个 inode 、与一个block

目前有个1T的磁盘设备,那么它被格式化后会被划分几千万个4k 的block 块,那如何从这么多block 块中定位到哪个是可用的,哪个是不可用的呢;

如果进行全盘扫描,一次要扫描几千万个block 块,需要花费很长的时间,有什么办法可以解决?

inode bitmap :inde 位图

block bitmap :block 位图

文件删除原理

首先删除目录下的文件名称,然后将 inode、 block 的bitmap 状态修改为可用状态,但文件并没

有真正的被删除,还有恢复的可能性,而一旦有新的数据写入,将其覆盖,数据才算真正的删除

文件移动原理

仅仅将文件名称从一个目录移动到另一个目录下面,并不会修改其inode 和block ;

在 Linux 系统中,为了增加系统性能,通常系统会将

一些数据先写入内存中,然后在刷新至磁盘中;

万一公司服务器突然断电或者其他未知原因,再次启

动后,会造成文件系统错误;

1.添加磁盘,给磁盘分配1G 空间;

[root@oldxu ~]# fdisk /dev/sdc # 分配1G分区 [root@oldxu ~]# mkfs.xfs /dev/sdc1 [root@oldxu ~]# mount /dev/sdc1 /mnt [root@oldxu ~]# echo “Hello” > /mnt/new.txt

2.使用 dd 模拟磁盘断电损坏,然后取消挂载,会发现无法正常重新挂载;

[root@oldxu ~]# dd if=/dev/zero of=/dev/sdc bs=300M count=1

[root@oldxu ~]# umount /mnt

[root@oldxu ~]# mount /dev/sdb1 /mnt #无法挂载

3.使用 xfs_repair 修复文件系统;

[root@oldxu ~]# xfs_repair /dev/sdc1

4.如出现修复失败,可采用强制修复,但可能会造成部分数据丢失;

[root@oldxu ~]# xfs_repair -L /dev/sdc1

磁盘满了;会提示错误;无法写入数据;

磁盘没有满,但还是提示磁盘空间不足—> Inode满了造成的问题:

一个文件,至少占用1个inode、1个block块;1TB;

存储大量的小文件; 500G

创建一个虚拟设备文件,大约100M,格式化为xfs

dd if=/dev/zero of=/opt/big bs=100M count=1

mkfs.xfs /opt/big

创建目录,挂载

mkdir /new

mount /opt/big /new/

查看目录的空间、Inode的空间 df -h |grep new

df -i |grep new

进入目录。,创建10w个文件; cd /new/

在查看磁盘空间,和Inode 的空间; df -i |grep new