存储的介绍

  • 硬盘是计算机中主要的存储设备
  • 传统磁盘分区与逻辑卷管理
  • 事前合理规划很重要
  • 对磁盘的所有操作都要小心小心再小心

磁盘空间用量相关命令

1
2
3
4
5
6
7
8
df -h

# 各列的信息
- 文件系统
- 使用量
- 可用量
- 使用率
- 挂载点

1
df -i     # 可以查看inode

1
2
3
sudo du -h        # 可以查看目录下所有文件的大小

sudo du -hcs # s:摘要,c:汇总

1
2
sudo apt install ncdu        # 可以查看磁盘空间使用情况
ncdu

磁盘分区格式

添加硬盘

步骤

磁盘设备名称

1
/dev/sda/

硬盘分区

1
2
sudo fdisk -l      # 查看硬盘分区情况
lsblk

Linux文件系统格式

  • ext4
  • xfs
1
# Linux下ext4格式使用最多, XFS格式适用于大空间、多文件、数据库

挂载

1
/etc/fstab        # 自动挂载

 分区

1
2
3
sudo fdisk /dev/sdb

- m # 帮助菜单
  • MBR分区,传统分区格式,最大四个主分区,2T容量限制
  • GPT分区, 现在主流分区标准,128个主分区,无容量限制

格式化分区

1
sudo mkfs.ext4 /dev/sdb1      # mkfs.格式

挂载分区

1
2
3
4
5
6
# 两个挂载目录:/mnt ,一般挂载硬盘      /media  , 一般挂载光盘

sudo mount /dev/sdb1 /mnt/db # 挂载
sudo mount /dev/sdb1 -t ext4 /mnt/db

sudo umount /mnt/db # 卸载

注意:这种方式挂载重启就消失了

自动挂载

编辑配置文件使得重启之后自动挂载

1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/fstab

# 配置文件的说明
- 第一列:设备ID 分区UUID,设备名也可,推荐选择唯一的ID
- 第二列:挂载点 swap无需挂载(none)
- 第三列:文件系统 ext4、swap
- 第四列:options defaults:rw(可读可写)、exec(可执行)、auto(自动)、nouser(只有root用户可挂载分区)、asynchronous(异步存储)
- 第五列:dump 用于备份工具识别,1备份、0不备份
- 第六列:pass FS错误是fsck是否检查错误,0不查、1优先、2后查

UUID=37e52a99-ca9b-4d05-b92a-e662d51c9127 /mnt ext4 defaults 0 0

查看UUID:

1
2
blkid
lsblk -fP

swap管理

什么是swap

我们都知道,一台计算机在运行程序的时候,需要把程序加载到内存供CPU调用和执行,但是每一台计算机的物理内存都是有限的。当内存不够时,CPU处理数据的时候会变慢。当物理内存不够,而需要加载和计算的数据越来越大时,可能还造成计算机的死机。

虽然在今天来说,内存越来越便宜,但是从性价比上,内存的成本还是要高于硬盘的。

当你的计算机内存在程序运行过程中被耗尽时,我们可以使用swap来临时在硬盘存储上开辟一块空间,临时的当内存来使用。这样就可以使得内存不足的情况得以缓解。当然硬盘的速度还是比不上内存的,即使这样,硬盘的价格还是要比内存便宜许多的。我们在硬盘上临时开辟一些空间,在物理内存不够时,临时充当一下内存的角色,存储一些在内存中相对不活跃的数据,转储到swap分区里面去,在内存里面保持这一些热点的数据,使得CPU更快的计算调用。

swap分区适用于配置较低的主机。

swap介绍

关于swap的争论

  • 现如今主机的配置都比较高,swap分区到底需不需要?
  • 需要的话,分配多少才合理?(2-16g)
  • 早期的ubuntu是生成一个单独的swap分区(用来存储内存的交换文件),现在将swap分区转变为一个swap文件。类似于windows下的页面交换文件

理想状态下的swap应该无事可做

  • 大量的swap空间使用意味着服务器已疲于奔命
  • 查看内存以及swap使用 :free -h

image.png

某些云主机默认没有swap

swap文件

想要扩大swap文件,思路就是先创建新的swap文件,然后使用新swap文件,删除旧的swap文件

1
2
3
4
5
6
7
8
9
10
11
12
sudo fallocate -l 4G /swaptest     # 创建4G大小的swap文件
xxd /swaptest # 查看swap文件,新创建的swap文件都是0000来填充的

sudo mkswap /swaptest # 将创建的文件格式化成真正的swap,记下UUID
UUID=a3133e35-dcb8-4b00-813a-67920b45319e

sudo chmod 0600 /swaptest # 更改权限

sudo vim /etc/fstab # 修改自动挂载编辑文件

sudo swapoff -a # 删除原有的swap
sudo swappon -a # 新增

image.png

修改成功!

swap分区

1
2
3
4
5
6
7
8
sudo fdisk /dev/sdb

# 新建主分区,t修改分区表类型为82,w保存退出

sudo vim /etc/fstab

sudo swapoff -a
sudo swapon -a

LVM管理

Logical Volume Manager(逻辑卷管理)

LVM管理介绍

无需重启计算机,可以灵活调整硬盘空间大小

  • 硬盘分区太大浪费,太小无法满足业务发展需要
  • 将传统的硬盘分区逻辑的组合为资源池,按需分配

一些概念介绍

  • Physical Volumes (PV),物理卷
  • Volume Groups (VG),逻辑的、虚拟的概念。卷组,池化,由一个或者多个PV组成,可扩展和收缩,可进而被分割成Logical Volume。
  • Logical Volumes (LV) 逻辑卷(基本分区、RAID),类似于普通硬盘对应的分区概念,LV可格式化为具体的文件系统
  • Physical Extent (PE),
    • PV被划分成 PE的基本单元,且具有唯一的编号
    • 是可以被LVM寻址的最小单元
    • PE的大小是可以配置的,默认是4MB
  • Logical Extent (LE)
    • 逻辑卷被划分为被称为LE(Logical Extents)的可被寻址的基本单位
    • 在同一个卷组中,LE的大小和PE是相同的,并且是一一对应的

分区的原则

  • 为/boot、swap、/ 创建标准分区,不需要使用LVM管理
  • LVM管理的一般是文件存储。

LVM使用

安装包:

1
sudo apt install lvm2

创建物理卷

1
2
3
4
sudo pvcreate /dev/sdb       # 创建物理卷
sudo pvdisplay # 查看物理卷
sudo pvs # 查看摘要信息
sudo pvscan # 查看摘要信息

创建卷组

1
2
3
4
sudo vgcreate vg01 /dev/sdb /dev/sdc /dev/sdd   # 创建卷组,指定硬盘
sudo vgdisplay # 查看卷组信息
sudo vgs
sudo vgscan

创建逻辑卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo lvcreate -n lv01 -L 1G vg01     # 创建逻辑卷lv01,从卷组vg01先分配1G空间
sudo lvdisplay
sudo lvscan
sudo lvs

sudo mkfs.ext4 /dev/vg01/lv01 # 格式化硬盘

sudo mount /dev/vg01/lv01 /mnt/lv01 # 挂载
df -h

sudo lvextend /dev/vg01/lv01 -l +256 # 增加256个PE,没有+表示最终值
sudo lvextend /dev/vg01/lv01 -L +1G
sudo lvextend /dev/vg01/lv01 -l +10%FREE # 增加剩余空间的10%

sudo resize2fs /dev/vg01/lv01 # 告诉文件系统使用增加的空间

逻辑卷缩小

不使用LV扩展时,可以回收空间。

1
2
3
4
5
6
7
8
9
sudo umount /dev/vg01/lv01       # 必须下线

sudo e2fsck -f /dev/vg01/lv01 # 检查文件系统

sudo resize2fs /dev/vg01/lv01 1G # 回收空间之后剩余1G

sudo lvresize /dev/vg01/lv01 -L 1G # 缩小逻辑卷

sudo mount /dev/vg01/lv01 /mnt/lv01/ # 重新挂载

快照使用

可以对lv逻辑卷做一个快照,与虚拟机的快照类似,但做不到虚拟机快照的程度。

  • 故障时可退回
  • 临时机制,不可视为备份
    • 本地保存,安全性无法保证
  • 系统根目录使用快照可用于测试不定更新
    • 测试完成合并,并删除快照
  • 创建快照等同于创建一个新的LV
    • 初始不占空间,但文件发生修改时原来的块数据被拷贝到快照LV中
    • 回退时,将快照中原始数据覆盖当前快照已被修改的块
1
2
3
4
5
sudo lvcreate -s -n s01 -L 500M vg01/lv01     # 创建快照
# 快照LV可被直接挂载,用于恢复单个文件

# 删除lv01下所有文件,测试能否恢复

恢复快照

1
2
3
4
5
6
7
sudo lvconvert --merge vg01/s01      # merge就是合并

sudo umount /mnt/lv01 # 下线
sudo lvchange -an vg01/lv01
sudo lvchange -ay vg01/lv01 # 重新active

sudo mount /dev/vg01/lv01 /mnt/lv01 # 重新挂载

移动物理卷数据

当磁盘性能不足或者老旧等因素需要更换硬盘,提前迁移到其他硬盘

1
2
3
sudo pvmove -n lv01 /dev/sdb /dev/sdc -i 1     # 每隔1小时显示迁移进度

# 可以手动指定迁移到哪,也可以不指定,系统自动选择迁移地方

RAID高级管理

RAID(Redundant Array of Independent Disks)

带有冗余机制的磁盘阵列

RAID技术分类

硬RAID

  • 特殊的控制器管理硬盘,在操作系统看来只有一个驱动器
  • 直接插卡,不占用操作系统资源,它自己有CPU、内存等硬件。

软硬盘

  • 操作系统知道每一个硬盘,并且直接管理和使用它们
  • 基于mdadm驱动,性能超过某些“硬RAID”

FakeRAID

  • 低端服务器工作站结合BIOS设置、多通道控制器、软件驱动实现RAID的方法
  • 操作系统管理RAID,适用于多系统,性能弱于软RAID

软RAID类型

RAID 0 (条带卷)

  • 数据一块一块的写入n个硬盘,没有容错机制。
  • 当有一个大的数据要写入硬盘,可以同时向n个硬盘写入,读取数据也是这样。读写效率比较高。

RAID 1(镜像卷)

  • 只能由两块硬盘组成,两块硬盘的容量相同,存放的数据也是相同的。
  • 写入数据,把相同的数据写入两块硬盘。读取数据,只需要读取一块硬盘
  • 如果有一个硬盘坏掉了,另一个有完整的数据备份
  • 磁盘利用率 50%

RAID 5(带奇偶校验的条带卷)

至少要有三块硬盘上,假设有4块硬盘。数据一条条写入,第一条写到第一块硬盘上,第二条写到第二块硬盘上,第三条写到第三块硬盘上,第四块硬盘不会写数据,而会写奇偶校验值。当第二块硬盘数据损坏,可以通过第一和第三块硬盘同一条带位置上的数据和第四块硬盘的奇偶校验值,把第二块硬盘的数据算出来。

第四条写到第一块硬盘上,第5条写到第2块硬盘,第6条写到第4块硬盘,奇偶校验值写到第3块硬盘。

磁盘利用率:n-1 /n,容错只能坏一块硬盘

RAID 6(双奇偶校验的条带卷)

  • 与RAID5类似,可以拿出2块硬盘来存储奇偶校验值。
  • 磁盘利用率:n-2 / n,可以有两块硬盘的损坏

RAID 10 / 01 (0 + 1 / 1 + 0)

将RAID0和RAID1的结合,RAID10是先做RAID1再做RAID0

磁盘利用率是50%,容错的硬盘数量是n/2

Degraded

软RAID中有磁盘损坏时,置为降级状态

Spare盘

也叫备份盘,平时空闲的,不存放数据,只是一直在帧听着RAID阵列,如果有一个硬盘坏了,spare盘立刻顶上去

RAID管理

软RAID基于mdadm驱动实现

1
2
3
4
5
6
7
8
9
10
11
sudo apt install mdadm

sudo mdadm -C -v /dev/md0 -l5 -n2 /dev/sdb /dev/sdc -z 1G -x1 /dev/sdd

# 一些参数
-C 创建,
-v 详细信息
-l RAID类型(0、1、5、6、10)
-n RAID盘数量
-z 从每个硬盘占用多少空间创建RAID
-x 指定spare盘,平时不工作,当有一块硬盘坏了,space盘会顶上来,需要数据同步完成,如果数据还没有同步完成,硬盘坏了,数据也会丢失。

常用的管理命令

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mdstat          # 查看RAID盘信息

sudo mdadm -D /dev/md0 # 查看raid设备信息

sudo mdadm -E /dev/sda # 查看物理盘状态
sudo mdadm -r /dev/md0 /dev/sda # 删除物理硬盘
sudo mdadm -a /dev/md0 /dev/sda # 增加物理硬盘

sudo mdadm -A /dev/md0 # 手动触发数据同步过程

sudo mdadm -f /dev/md0 /dev/sdb # 将磁盘置为失效
sudo mdadm --re-add /dev/md0 /dev/sdc # 恢复磁盘内阵列

替换硬盘后安装Grub

1
sudo grub-install /dev/md0

格式化和加载

1
sudo mkfs.ext4 /dev/md0

链接

符号链接(软连接)和硬链接

  • 存放在计算机哪怕再小的数据,都会占用一个最小的数据存储单元 inode值
  • inode:存放文件元数据的数据对象,表现为

创建硬链接

1
ln fileA fileB      # 创建硬链接
  • inode值相同
  • 目录不能创建硬链接
  • 不能移动硬链接到不同分区,不能跨设备

创建软链接

  • 相当于windows上的快捷方式
  • 不共用inode值
  • 可以跨设备创建
1
ln -s file1 file2      # 创建软链接,注意相对路径和绝对路径

磁盘加密

LUKS:Linux Unified Key Setup

  • 不依赖于操作系统的磁盘分区加密规范,磁盘级别的加密
  • 后端加密方法dm-crypt(Linux系统中的内核驱动)

加密算法

  • aes
  • serpent
  • blowfish
  • twofish

注意:/boot 分区不能加密,/boot分区里面存储的是引导记录,如果加密,操作系统就起不来了。加密会对性能有影响。

数据保密

清除所有数据

1
2
3
4
ls /dev/zero         # 零生成器,不停地生成0


sudo dd if=/dev/zero of=/dev/sdb # 将sdb硬盘的数据完全清除,不可修复

磁盘加密

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt install cryptsetup          # 安装软件包

sudo cryptsetup luksFormat /dev/sdc1 # 加密分区,需要提前分区

sudo cryptsetup luksOpen /dev/sdc1 crypt1 # 打开加密分区(随意命名)

sudo mkfs.ext4 /dev/mapper/crypt1 # 格式化加密分区

sudo mount /dev/mapper/crypt1 /mnt/crypt1 # 挂载加密分区

sudo chown cwz:cwz /mnt/crypt1 # 更改所有者

sudo cryptsetup luksClose crypt1 # 关闭加密分区,需要先卸载(umount)