Linux篇 | 磁盘存储和文件系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux篇 | 磁盘存储和文件系统相关的知识,希望对你有一定的参考价值。

磁盘存储和文件系统
  • 分区
  • 文件系统
  • 挂载设备
  • 管理虚拟内存
  • RAID管理
  • LVM管理

我们从一个新硬盘安装到Linux系统,期间的配置,一直到正常使用的角度,来学习磁盘存储和文件系统,过程如下:
选择分区类型(MBR或GPT)-->创建分区-->同步分区-->创建文件系统-->文件系统检测和修复-->挂载-->虚拟内存的使用-->RAID的使用-->LVM的管理

一。分区

1.为什么分区

  • 优化I/O性能
  • 实现磁盘空间配额限制
  • 提高修复速度
  • 隔离系统和程序
  • 安装多个OS
  • 采用不同文件系统

2.分区类型

分区的类型有两种:MBR和GPT

(1)MBR分区

  • MBR: Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T
  • 如何分区:按柱面
  • 0磁道0扇区:512bytes
    • 446bytes: boot loader
    • 64bytes:分区表,其中每16bytes标识一个分区
    • 2bytes: 55AA
  • MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)

MBR分区结构

技术图片

(2)GPT分区

  • GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)
  • 使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表自动备份在头和尾两份,并有CRC校验位
  • UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动

GPT分区结构

技术图片

(3)MBR和GPT开机过程

技术图片

3.新建分区

  1. 我们首先选择分区的类型是MBR和GPT,根据命令fdisk(新建、管理MBR分区)、gdisk(新建、管理GPT分区)、parted(新建、管理MBR和GPT分区)创建分区。
  2. parted在硬盘上新建分区,实时(马上)生效;fdisk和gdisk在内存中新建分区,不会实时生效,确定保存后才会生效,常用这两个命令。

(1)fdisk和gdisk

两个命令的选项参数一样,就是命令的书写不一样

1)查看分区
  • fdisk -l 设备名<-->gdisk -l 设备名
2)管理分区(新建、删除、修改)

fdisk 设备名<-->gdisk 设备名

3)分区子命令(使用fdisk进入管理界面的命令)
  • p 分区列表
  • t 更改分区类型
  • n 创建新分区
  • d 删除分区
  • v 校验分区
  • u 转换单位
  • w 保存并退出
  • q 不保存并退出

(2)parted

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

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

1)指定设备/dev/sdb分区类型是gpt或msdos(MBR)
parted /dev/sdb mklabel gpt|msdos-->"mklabel"
2)显示分区表
parted /dev/sdb print-->"print"
3)新建(mkpart)主分区(primary),分区编号1,大小200M
parted /dev/sdb mkpart primary 1 200 (默认M)
4)删除分区编号是1的分区
parted /dev/sdb rm 1
5)列出分区信息
parted –l

4.同步分区表

真正有效的分区在内存上,但是分区表存放在磁盘上,所以需要两者同步一致

(1)查看分区表

查看内存中的分区表:

lsblk  
ll /dev/sd*  
cat /proc/partitions

(2)同步分区表

1)适用CentOS5,7
partprobe
2)适用CentOS6
创建分区后同步命令:partx -a 设备名  
删除分区后同名命令:partx -d --nr N-M(删除的分区编号) 设备名

二。创建文件系统

新建分区后我们需要格式化,就是创建文件系统。

  • 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统
  • 从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等

1.文件系统的类型

  • Linux文件系统:
    • ext2(Extended file system) :适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区
    • ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复。它通常被用作通用的文件系统
    • ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
    • xfs:SGI,支持最大8EB的文件系统
    • btrfs(Oracle), reiserfs, jfs(AIX), swap
  • 光盘:iso9660
  • Windows:FAT32, exFAT,NTFS
  • Unix: FFS(fast), UFS(unix), JFS2
  • 网络文件系统:NFS, CIFS
  • 集群文件系统:GFS2, OCFS2(oracle)
  • 分布式文件系统: fastdfs,ceph, moosefs, mogilefs, glusterfs,Lustre
  • RAW:未经处理或者未经格式化产生的文件系统

2.文件系统的分类

  • 根据其是否支持"journal"功能:
    • 日志型文件系统: ext3, ext4, xfs, ...
    • 非日志型文件系统: ext2, vfat
  • 文件系统的组成部分:
    • 内核中的模块:ext4, xfs, vfat
    • 用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
  • Linux的虚拟文件系统:VFS
  • 查前支持的文件系统:cat /proc/filesystems

3.查看内核支持的文件系统

ls /lib/modules/`uname –r`/kernel/fs

4.Linux虚拟文件系统:VFS

用户输入的命令,在文件系统上执行,并不是直接作用在文件系统,而是执行在Linux的虚拟文件系统VFS(图中:Virutal file system),VFS通过真正的文件系统执行命令,这里只是简单介绍。

技术图片

3.新建文件系统

CentOS6常用ext4文件系统;CentOS7常用xfs文件系统。

创建文件系统有两种方法:

方法一(常用):
mkfs.文件系统类型 设备名

方法二(很少用):
mkfs -t 文件系统类型 设备名
mkfs -L 卷标名 设备名--&gt;卷标名最好和挂载点的名称一样

检测文件系统是否创建成功
后面有命令会说到,但这里记录一个,使用二进制命令查看文件系统是否创建成功。
hexdump -C 设备名-->查看分区是否有数据(全是0表示没数据,里面都是二进制数。)

(1)ext文件系统

因为ext系列的文件系统是老牌的文件系统,所以它有很丰富的命令支持各种功能,所以它有自己的命令工具,就是mke2fs。

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大小(inode可以理解成文件节点编号,它不应该小于block块设备的数量。因为节点编号如果大于文件存放量(块设备数量),就算在创建文件,没有地方存放,inode将变得毫无意义。)
  • -N # 指定分区中创建多少个inode
  • -I 一个inode记录占用的磁盘空间大小,128---4096
  • -m # 默认5%,为管理人员预留空间占总空间的百分比(-m可以设置预留空间(其实是预留块设备数量)的大小占磁盘总大小的百分比。需要注意的是,预留空间是预留给管理员使用的,普通用户使用不了,如果百分比太大,占有磁盘太多空间,普通用户又用不了,造成空间浪费的现象,所以有时候要修改百分比。(比如1T磁盘的5%就是50G,这么多空间放着不是浪费吗))
  • -O FEATURE[,...] 启用指定特性
  • -O ^FEATURE 关闭指定特性(后面关于acl会说到这个命令)

(2)文件系统的ACL功能

我们新装的系统,每个分区都能给文件或目录设置ACL,但是在已有的系统中,CentOS6新建的分区默认没有ACL功能,CentOS7默认有。那么给CentOS6新建的分区添加ACL功能如下:

1.在CentOS6新建分区,创建文件系统后,查看文件系统的属性:  
tune2fs -l 设备名  
会看到:“Default mount options: 为空”  
2.空表示该分区的文件系统没有开启acl功能,开启命令如下:  
tune2fs -o acl 设备名    
3.接着卸载该分区挂载点,在重新挂载,然后使用查看命令查看,就会看到:“Default mount options:  acl”  
4.有时候会删除一个分区的acl功能,删除命令如下:  
tune2fs -o ^acl 设备名  

(3)ext4文件系统默认就存在的目录

新建ext4文件系统后,把分区进行挂载,进入到挂载目录会看到名为“lost+found”的文件夹,这个文件夹里存放分区之前的文件,或是被覆盖的文件。因为Centos7是xfs文件系统,所以没有此文件夹。

(4)查看ext系列文件系统的状态

tune2fs -l 设备名查看文件系统,其中“Filesystem state: clean”反应了分区是否干净,即文件系统是否有故障或错误。“clean”表示干净。

  1. 如果因为一些错误操作导致文件系统无法正常访问,可以修复文件系统,但注意里面的数据未必能恢复。因为修复的只是文件系统的源文件(超级块、节点表等)
    2.首先卸载文件系统分区的挂载点,接着用命令“fsck -y 设备名”修复。然后查看文件系统就知道是否恢复成功。

4.文件系统检测和修复

不能再挂载状态下修复

(1).修复命令:
fsck -y 设备名
或fsck.补全 设备名
或fsck -t(文件系统) -p(自动修复) -r(交互修复) 设备名

(2).ext系列的文件系统有自己的修复工具:
ezfsck -y(自动回答yes) -f(强制修复)

练习题
查找设备列表/etc/fstab中分区名对应的设备名
思路:blkid -U "UUID"
命令:blkid -U sed -rn ‘/\/data/s#^.*=(.*) /data.*$#\/#p‘ /etc/fstab

三。挂载

  • 可远程挂载,可本地挂载
  • 一个设备可以挂载多个目录(挂载点)
  • 多个设备不能同时挂载一个目录(挂载点)
  • 挂载点必须是空目录

1.临时挂载

(1)挂载:mount 设备名或UUID 挂载点

(2)取消挂载:umount 挂载点

(3)强制取消挂载:有时候我们要取消挂载,但因为用户正在挂载目录,所以要用到强制取消挂载。
方法一:杀进程。查看进程(lsof 挂载点),杀掉。
方法二:
查看挂载点:fuser -v 挂载点
强杀挂载点:fuser -km 挂载点

(4)挂载选项

  • defaults:相当于rw, suid, dev, exec, auto, nouser, async
  • -o options:(挂载文件系统的选项),多个选项使用逗号分隔
    • async 异步模式 sync 同步模式,内存更改时,同时写磁盘
    • atime/noatime 包含目录和文件
    • diratime/nodiratime 目录的访问时间戳
    • auto/noauto 是否支持自动挂载,是否支持-a选项
    • exec/noexec 是否支持将文件系统上运行应用程序
    • dev/nodev 是否支持在此文件系统上使用设备文件
    • suid/nosuid 是否支持suid和sgid权限
    • remount 重新挂载
    • ro 只读
    • rw 读写
    • user/nouser 是否允许普通用户挂载此设备,/etc/fstab使用
    • acl 启用此文件系统上的acl功能
    • oop 使用loop设备

2.永久挂载

想要永久挂载,就要修改/etc/fstab文件。

(1)/etc/fstab文件格式

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

技术图片

1)要挂载的设备或伪文件系统

  • UUID:UUID=""(强烈建议使用UUID)
  • 设备文件
  • LABEL:LABEL=""
  • 伪文件系统名称(卷标):proc, sysfs

2)挂载点
挂载点最好是空目录

3)文件系统类型
ext4,xfs,iso9660,nfs,none

4)挂载选项
常用的挂载选项:
defaults , acl , bind

其它挂载选项:(这些选项也能用作临时挂载,就是添加“-o 选项”)

  • defaults:相当于rw, suid, dev, exec, auto, nouser, async
  • -o options:(挂载文件系统的选项),多个选项使用逗号分隔
    • async 异步模式 sync 同步模式,内存更改时,同时写磁盘
    • atime/noatime 包含目录和文件
    • diratime/nodiratime 目录的访问时间戳
    • auto/noauto 是否支持自动挂载,是否支持-a选项
    • exec/noexec 是否支持将文件系统上运行应用程序
    • dev/nodev 是否支持在此文件系统上使用设备文件
    • suid/nosuid 是否支持suid和sgid权限
    • remount 重新挂载
    • ro 只读
    • rw 读写
    • user/nouser 是否允许普通用户挂载此设备,/etc/fstab使用
    • acl 启用此文件系统上的acl功能
    • oop 使用loop设备

(5)转储频率
0:不做备份 1:每天转储 2:每隔一天转储

(6)fsck检查的文件系统的顺序:允许的数字是0 1 2
0:不自检
1:首先自检;一般只有rootfs才用
2:非rootfs使用

3.针对不同的设备进行挂载

有时候挂载分区"mount -a(挂载新分区)"没用,试试"mount -o remount 挂载点(从新挂载)"

示例1:挂载选项defaults的使用(适用特殊文件的挂载,设备的挂载)

创建好挂载点后,打开/etc/fstab文件进行挂载,格式如下:  
UUID   挂载点   文件系统类型   defaults 0 0  
之后退出文件,使用“mount -a”挂载,之后查看挂载(df)

示例2:挂载选项acl的使用

创建好挂载点后,打开/etc/fstab文件进行挂载,格式如下:  
UUID   挂载点   文件系统类型   acl 0 0  
之后退出文件,使用“mount -a”或“mount -o remount 挂载点”挂载,之后查看挂载(df)

示例3:挂载选项none的使用(适用目录挂载目录)

创建好挂载点后,打开/etc/fstab文件进行挂载,格式如下:  
目录   挂载点   none(表示没有文件系统类型)   bind 0 0  
(临时挂载命令是:mount 目录 挂载点 -B --bind)
之后退出文件,使用“mount -a”挂载,  
之后查看挂载(df或mount),注意显示的是分区,但确实挂载成功,可以查看挂载点和目录的内容,如果一致表示目录挂载目录成功。

示例4:文件挂载目录

查看文件类型:file 文件绝对路径
把光盘文件挂载到目录,首先创建挂载点(即目录),在/etc/fstab文件里写入一行:
文件绝对路径 挂载点 iso9660 loop 0 0

(CentOS6临时挂载:mount -o loop /data/centos6.iso 挂载点)
(CentOS7临时挂载:mount /data/centos7.iso 挂载点)
查看:"losetup"和“df”

3.查看挂载

方法一:findmnt 挂载点(例如:findmnt /mnt/sda1)
有时候挂载设备太多不容易看到,可以用方法二。
方法二:
findmnt 挂载点的上一目录(例如:findmnt /mnt)
echo $?
“0”表示成功,“非0”表示失败

4.挂载选项

  • -t vsftype 指定要挂载的设备上的文件系统类型
  • -r readonly,只读挂载
  • -w read and write, 读写挂载
  • -a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
  • -L ‘LABEL‘ 以卷标指定挂载设备
  • -U ‘UUID‘ 以UUID指定要挂载的设备
  • -B, --bind 绑定目录到另一个目录上
  • -n 不更新/etc/mtab,mount不可见--->适用于ext系列的文件系统(隐藏挂载信息。一般挂载其实是将挂载信息写入到/etc/mtab文件里,df等命令就可以看到挂载信息,加了“-n”,就不更新/etc/mtab文件,所以看不到挂载信息。如果加了“-n”后还像看挂载信息,就查看“/proc/mounts”文件,此文件记录了所有的挂载信息。)

虚拟化技术基础:loop设备文件和稀疏文件

5.文件和loop设备的关联

示例:我们把CentOS7的一个文件当U盘用。首先在这个文件里创建很多文件,然后把这个文件放到CentOS6系统里,挂载这个文件,然后查看挂载目录,是否有那些文件。
(1).创建文件data.img
dd if=/dev/zero of=/data/data.img bs=1M count=100
(2).给文件创建文件系统
mkfs.ext4 /data/data.img
(3).查看文件的文件系统
blkid /data/data.img
(4).创建挂载点
mkdir /mnt/disk
(5).挂载
1)CentOS7挂载:mount /data/data.img /mnt/disk
2)CentOS6挂载:mount -o loop /data/data.img /mnt/disk
注释:当一个文件f1挂载到另一个文件f2,系统会分配一个loop设备名关联此文件(f1),然后利用loop名进行挂载。
(6).复制文件data.img到CentOS6系统
(7).创建挂载点:mkdir /mnt/disk6
(8).在CentOS6挂载
挂载:mount -o loop /data/data.img /mnt/disk6
查看:ls /mnt/disk6
卸载挂载点:umount /mnt/disk6
(9)删除设备关联(CentOS6,7都删):
losetup -d /dev/loopx(“loopx”中x是什么需要查看命令"losetup -a"去获取)

6.稀疏文件

稀疏文件的特点是,查看文件大小和查看文件占空间的大小不一样,像VM虚拟机一样,实际创建的系统大小是1G,但你可以当8G的用。稀疏文件用作虚拟化技术。

(1).查看稀疏文件

查看稀疏文件实际大小:ll -h 文件名
查看稀疏文件占空间的大小:df -sh 文件名或df 文件所在目录

(2).创建稀疏文件

dd if=dev/zero of=bigfile bs=1M count=1024 seek=2048
注释:创建稀疏文件bigfile,大小是3072M,其中2048M为空内容(可留在以后添加内容)

7挂载文件写错导致系统无法启动的解决办法

CentOS6:

第一步:模拟错误的挂载文件
UUID(故意写错一位) 挂载点 ext4 defaults 0 3
第二步:重启系统会看到系统错误,进不了系统,让输入root用户的密码
第三步:输入密码后,查看/etc/fstab挂载文件发现UUID写错一位,这时修改发现无法保存,用“mount”查看分区有“rw”权限,但文件就是无法保存,其实当前是只读模式
第四步:修改根目录“/”只读模式为读写模式"mount -o remount,rw /"
第五步:修改/etc/fstab挂载配置文件,保存成功(修改错误有两种方式可以让系统重新启动,第一种就是把UUID写对;第二种是把“3”改为“0”,这项是检查系统错误的,如果改为“0”表示不检查)
第六步:重启,系统成功启动(如果是改数字的方式,也会成功启动,但在字符界面会看到红色的错误,记得最后把UUID改回)

CentOS7:
第一步:模拟错误的挂载文件
UUID(故意写错一位) 挂载点 ext4 defaults 0 0
第二步:重启系统会看到系统错误,进不了系统,让你等1分钟左右检查错误
第三步:检查完后让输入管理员密码,就能进入字符系统,直接进入/etc/fstab文件修改错误,保存后重启,会看到系统成功启动。
第四步:注意这里和Centos6有区别,Centos7直接就有修改文件的权限。

四。虚拟内存的使用(交换分区SWAP)

SWAP分区的作用:暂时缓解内存不够用

1.概述

当我们执行程序时,如果内存资源耗尽,在执行程序时会提示内存不足,这时可以借助SWAP空间当做暂时的内存空间使用,所以:“系统内存最大容量=内存容量+SWAP容量”。其实SWAP容量是磁盘的容量,我们在装系统,划分分区时会创建SWAP分区,分区容量最好是当前内存(当前内存不超过4G)的1.5-2倍,最大(当前内存超过4G)不超过8G或16G,SWAP分区的读写速度并没有内存那么快,查看SWAP分区和内存的容量使用“free -h”命令。

2.优化SWAP分区的读写速度:

(1)把SWAP分区放到高速硬盘上,例如固态硬盘(强烈推荐)
(2)因为机械硬盘同一时间指针的角速度不变,而机械硬盘同一磁道外侧扇区比内侧扇区存放数据多,划分分区是从外侧开始划分,所以把SWAP分区在新硬盘上划分为第一个分区,读写性能在这个硬盘上是最快的。附两张机械硬盘图,如下:

技术图片

技术图片

3.在Linux系统中新建SWAP分区

SWAP分区可以有多个,创建SWAP分区如下:分两种格式

(1)GPT分区

(2)MBR分区

4.修改其他分区为SWAP分区

分区之间的修改其实是ID的修改,ID在fdisk(或gdisk)--->m--->t-->L 可看到

示例1:把GPT分区的sdc1分区修改为SWAP分区

1)卸载挂载点:  umount 挂载点  
2)使用GPT分区工具:  gdisk /dev/sdc  
3)查看分区:  p
4)查看指定ID的子命令:  m  
5)指定分区的ID:  t  
6)选择分区编号:  1  
7)显示ID类型:   L  
8)输入ID:       8200  
9)查看分区:      p  
10)保存退出:    w  
11)创建SWAP分区的文件系统: mkswap /dev/sdc1   
12)查看:       blkid  
13)在/etc/fstab挂载:  
UUID swap swap  defaults 0 0  
14)使挂载生效:   swapon -a  
15)查看swap容量: free -h  
16)详细查看swap分区: cat /proc/swaps或者swapon -s  
注意,Prionity是优先级的意思,数字越大,优先级越高。从性能的角度,应该先使用读写速度快的swap分区,所以要把那个分区的优先级调高。  
17)调整swap分区的优先级:修改/etc/fstab  
UUID swap swap pri=6(范围是0-32767,数越大优先级越高) 0 0  
18)禁用修改的swap分区:swapoff /dev/sdc1  
19)查看是否禁用swap分区:cat /proc/swaps或者swapon -s  
20)启用修改的swap分区:swapon -a  
21)查看swap分区优先级是否生效:cat /proc/swaps或者swapon -s  
22)删除swap分区:  先禁用swapoff /dev/sdc1然后把/etc/fstab文件里/dev/sdc1对应的那行删掉,最后删除分区。

示例2:把MBR分区的sdd1分区修改为SWAP分区

1)卸载挂载点:  umount 挂载点  
2)使用GPT分区工具:  fdisk /dev/sdd  
3)查看分区:  p
4)查看指定ID的子命令:  m  
5)指定分区的ID:  t  
6)选择分区编号:  1  
7)显示ID类型:   L  
8)输入ID:       82  
9)查看分区:      p  
10)保存退出:    w  
11)创建SWAP分区的文件系统:   mkswap /dev/sdd1  
12)查看:       blkid  
13)在/etc/fstab挂载:  
UUID swap swap  defaults 0 0
14)使挂载生效:   swapon -a  
15)查看swap容量: free -h  
16)详细查看swap分区: cat /proc/swaps  
注意,Prionity是优先级的意思,数字越大,优先级越高。从性能的角度,应该先使用读写速度快的swap分区,所以要把那个分区的优先级调高。  
17)调整swap分区的优先级:修改/etc/fstab  
UUID swap swap pri=6(范围是0-32767,数越大优先级越高) 0 0  
18)禁用修改的swap分区:swapoff /dev/sdd1  
19)查看是否禁用swap分区:cat /proc/swaps  
20)启用修改的swap分区:swapon -a  
21)查看swap分区优先级是否生效:cat /proc/swaps  
22)删除swap分区:  先禁用swapoff /dev/sdd1然后把/etc/fstab文件里/dev/sdd1对应的那行删掉,最后删除分区。

示例3:使用文件当做SWAP分区

有时候电脑不能创建新分区,并且现有的分区不能更改为swap分区,但我们又需要swap为内存做缓存,这时可以用一个文件当做swap分区,Windows系统类似swap功能的就是一个文件。步骤如下:

1)创建fileswap文件大小2G
dd if=/dev/zero of=/fileswap(文件名) bs=1M count=2048  
2)格式化为swap文件系统  
mkswap /fileswap  
3)挂载  
UUID swap swap defaults 0 0  
4)使挂载生效  
swapon -a  
生效的同时会提醒权限警告,如果都有看的权限,普通用户通过二进制查看方式(hexdump -C /fileswap)可以看到文件里的内容,所以下一步要修改文件的权限  
5)修改文件权限  
chmod 600 /fileswap  
6)查看swap: cat /proc/swaps或者swapon -s

5.调整使用swap分区的优先级(看上面的示例1,2的“17-22”)

  • 可以指定swap分区0到32767的优先级,值越大优先级越高
  • 如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一
  • 先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)
  • 优化性能:分布存放,高性能磁盘存放

    6.挂载USB介质

注意:U盘格式必须是NTFS32文件系统格式。如果是NTFS文件系统,Linux不支持。

  • (1)查看USB设备是否识别
    • lsusb
  • (2)被内核探测为SCSI设备
    • /dev/sdaX、/dev/sdbX或类似的设备文件
  • (3)在图形环境中自动挂载
    • 图标在[计算机]窗口中创建
    • 挂载在/run/media/&lt;user&gt;/&lt;label&gt;
  • (4)手动挂载
    mount /dev/sdb1 /mnt

7.总结

  • swap交换分区是系统RAM的补充,Swap 分区支持虚拟内存。当没有足够的RAM 保存系统处理的数据时会将数据写入 swap 分区
  • 当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过多swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露
  • 推荐系统 swap 空间

    技术图片

  • 基本设置包括:
    • 创建交换分区或者文件
    • 使用mkswap写入特殊签名
    • 在/etc/fstab文件中添加适当的条目
    • 使用swapon -a 激活交换空间
  • 启用:swapon
    swapon [OPTION]... [DEVICE]
    • -a:激活所有的交换分区
    • -p PRIORITY:指定优先级
    • /etc/fstab 在第4列中:pri=value
  • 禁用:swapoff [OPTION]... [DEVICE]

五。文件系统工具

1.文件系统空间占用等信息的查看工具

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

  • -H 以10为单位
  • -T 文件系统类型
  • -h human-readable
  • -i inodes instead of blocks
  • -P 以Posix兼容的格式输出(如果设备名太长,如光盘,df查看会不清楚,加“-P”会整理格式)

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

du [OPTION]... DIR

  • -h human-readable
  • -s summary
  • --max-depth=# 指定最大目录层级

3.dd工具

dd作用:转换和复制文件

(1)用法

dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#

  • if=file 从所命名文件读取而不是从标准输入
  • of=file 写到所命名的文件而不是到标准输出
  • ibs=size 一次读size个byte
  • obs=size 一次写size个byte
  • bs=size block size, 指定块大小(既是是ibs也是obs)
  • cbs=size 一次转化size个byte
  • skip=blocks 从开头忽略blocks个ibs大小的块
  • seek=blocks 从开头忽略blocks个obs大小的块
  • count=n 复制n个bs

    (2)转换参数

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

  • ascii 转换 EBCDIC 为 ASCII
  • ebcdic 转换 ASCII 为 EBCDIC
  • lcase 把大写字符转换为小写字符
  • ucase 把小写字符转换为大写字符
  • nocreat 不创建输出文件
  • noerror 出错时不停止
  • notrunc 不截短输出文件
  • sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
  • fdatasync 写完成前,物理写入输出文件

示例1:把/etc/fstab文件里的小写字母转换为大写,生成为文件/data/daxie
dd if=/etc/fstab of=/data/daxie conv=ucase

示例2:用dd创建的的文件写到磁盘上,而不是内存里

dd创建一个很大的文件一下就创建完了,其实她在创建在内存里,而不是磁盘上,所以断电后这个文件如果后台没有真正创建完,就会损坏。那么如何让dd命令创建的文件直接保存在磁盘上呢,而不是默认的内存里呢?其实加“fdatasync”就行。如下:
dd if=/dev/zero of=/data/f1 bs=1M count=100 conv=fdatasync

(3)备份MBR

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

(4)读取、替换二进制文件

有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,实现如下:
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

(5)备份

将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/dev/sdy
将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx of=/path/to/image
备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
dd if=/dev/sdx | gzip &gt;/path/to/image.gz

(6)恢复

将备份文件恢复到指定盘
dd if=/path/to/image of=/dev/sdx

将压缩的备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx

(7)示例

1)拷贝内存资料到硬盘
将内存里的数据拷贝到root目录下的mem.bin文件
dd if=/dev/mem of=/root/mem.bin bs=1024

2)从光盘拷贝iso镜像
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
dd if=/dev/cdrom of=/root/cd.iso

3)销毁磁盘数据
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行
dd if=/dev/urandom of=/dev/sda1

4)得到最恰当的block size(块设备大小)
通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size(块设备)大小
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000

(8)测试硬盘读、写速度

测试硬盘写速度:
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

测试硬盘读速度:
dd if=/root/1Gb.file bs=64k | dd of=/dev/null

说明:用dd创建的的文件写到磁盘上,而不是内存里  

dd创建一个很大的文件一下就创建完了,其实她在创建在内存里,而不是磁盘上,所以断电后这个文件如果后台没有真正创建完,就会损坏。那么如何让dd命令创建的文件直接保存在磁盘上呢,而不是默认的内存里呢?其实加“fdatasync”就行。如下:  
dd if=/dev/zero of=/data/f1 bs=1M count=100 conv=fdatasync

六。RAID的使用

  • RAID:Redundant Arrays of Inexpensive(Independent) Disks
  • 1988年由加利福尼亚大学伯克利分校(University of California-Berkeley) “A Case for Redundant Arrays of Inexpensive Disks”
  • 多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供
  • 提高IO能力: 磁盘并行读写
  • 提高耐用性:磁盘冗余来实现
  • 级别:多块磁盘组织在一起的工作方式有所不同
  • RAID实现的方式:
    • 外接式磁盘阵列:通过扩展卡提供适配能力
    • 内接式RAID:主板集成RAID控制器,安装OS前在Bios里配置
    • 软件RAID:通过OS实现

1.RAID级别

RAID-0:条带卷,strip
RAID-1:镜像卷,mirror
RAID-2
省略
RAID-5
RAID-6
RAID-10
RAID-01

常用的RAID有RAID-1、RAID-5、RAID-10
企业常用硬件RAID,软RAID用于测试环境

2.RAID-1

  • 读性能提升、写性能略有下降
  • 可用空间:1*min(S1,S2,...)
  • 有冗余能力
  • 最少磁盘数:2, 2N

3.RAID-5

  • 读、写性能提升
  • 可用空间:(N-1)*min(S1,S2,...)
  • 有容错能力:允许最多1块磁盘损坏
  • 最少磁盘数:3, 3+

4.RAID-10

  • 读、写性能提升
  • 可用空间:N*min(S1,S2,...)/2
  • 有容错能力:每组镜像最多只能坏一块
  • 最少磁盘数:4, 4+

七。LVM的管理

1.概述

  • 允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小
  • 允许在多个物理设备间重新组织文件系统:
    • 将设备指定为物理卷
    • 用一个或者多个物理卷来创建一个卷组
    • 物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的
    • 在物理卷上创建的逻辑卷
      物理卷是由物理区域(PE)组成
    • 可以在逻辑卷上创建文件系统
  • LVM可以弹性的更改LVM的容量:
    通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中的PE加到LV中以加大容量
    技术图片
  • LVM: Logical Volume Manager, Version 2
  • dm: device mapper(设备映射器),将一个或多个底层块设备组织成一个逻辑设备的模块
  • 设备名:/dev/dm-#
  • 软链接

2.管理工具

将一个分区或硬盘变成逻辑卷,过程是:
第一步:将分区和硬盘变成物理卷
第二步:将物理卷变成卷组
第三步:卷组从卷组划分出若干逻辑卷
第四步:将逻辑卷创建文件系统(格式化)
第五步:创建挂载点,挂载(即修改/etc/fstab文件)

(1)pv(物理卷)

  • 显示pv信息:
    • pvs:简要pv信息显示
    • pvdisplay
  • 创建pv:
    • pvcreate /dev/DEVICE
  • 删除pv:
    • pvremove /dev/DEVICE

使用帮助:pvcreate --help

(2)vg(卷组)

  • 显示卷组
    • vgs
    • vgdisplay
  • 创建卷组
    • vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
  • 管理卷组
    • 给已有卷组添加物理卷:vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
    • vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
  • 删除卷组
    • 先做pvmove,再做vgremove(即先删除逻辑卷,在删除卷组)

使用帮助:vgcreate --help

(3)lv(逻辑卷)

  • 显示逻辑卷
    • lvs
    • lvdisplay
  • 创建逻辑卷
    • lvcreate -L #[mMgGtT] -n NAME VolumeGroup
    • lvcreate -l 60%VG -n mylv testvg
    • lvcreate -l +100%FREE -n yourlv testvg
      (“-l +100%free”表示:在分区现在容量的基础上,把卷组的所有空间都用上)
  • 删除逻辑卷
    • lvremove /dev/VG_NAME/LV_NAME
  • 重设文件系统大小
    • fsadm [options] resize device [new_size[BKMGTEP]]
    • resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
    • xfs_growfs /mountpoint

使用帮助:lvcreate --help

示例:使用分区/dev/sdc1和硬盘/dev/sdd创建一个逻辑卷,名为mysql

1)分区要变成逻辑卷,首先卸载挂载,其次把分区ID变为逻辑卷的ID;硬盘不用。  
2)把分区和硬盘加入物理卷,可一次指定多个分区加入物理卷  
  pvcreate 设备名(分区名)  
  pvcreate /dev/sdc1 /dev/sdd  
  pvs(查看物理卷)  
3)创建卷组  
  vgcrte 卷组名 要加入的物理卷 
  vgcreate vg0 /dev/sdc1 /dev/sdd  
  vgs(查看卷组)  
4)创建逻辑卷  
  lvcreate -n 逻辑卷名 -L 逻辑卷大小 卷组  
  lvcreate -n mysql -L 4G vg0  
  lvs(查看逻辑卷)  
  注意你看到的逻辑卷名/dev/vg0/mysql其实是一个软连接,可通过“ll /dev/vg0/mysql”查看到真名是“dm-数字”,但其实这个真名还有一个软连接“/dev/mapper/vg0-mysql”。所以当你格式化分区后在"/etc/fstab"查看设备会有两种情况,要不逻辑卷叫“/dev/vg0/mysql”,或者叫“/dev/mapper/vg0-mysql”。  
5)给逻辑卷创建文件系统  
  mkfs.xfs /dev/vg0/mysql  
6) 创建挂载点,在/etc/fstab文件里进行挂载  
  UUID 挂载点 xfs defaults 0 0  
  (分享一个复制UUID的办法,在"vim /etc/fstab"后,输入“:r!blkid空格/dev/vg0/mysql(逻辑卷的绝对路径)”后回车就看到UUID出现在此文件里了)  
7) 重新加载分区:mount -a  
8) 查看逻辑卷是否挂载成功:df  

3.扩展(lvextend)和缩减逻辑卷

扩展:先扩展,在格式化(创建文件系统)逻辑卷
缩减:先格式化,在缩减逻辑卷

(1)扩展逻辑卷

先扩展逻辑卷,在格式化(创建文件系统)逻辑卷

在线扩展:用户在使用该逻辑卷的时候,可以扩展逻辑卷,不用卸载挂载在扩展,扩展的过程对用户使用没有影响,也不会损坏文件

示例:在线扩展逻辑卷mysql,增加3个G

1)扩展:lvextend -L +3G /dev/vg0/mysql
2)查看:df -hT
这时你会看到逻辑卷mysql并没有扩大,是因为df命令查看的是"分区的文件系统"的大小,想看扩展后逻辑卷的大小需要在重新格式化逻辑卷
3)格式化逻辑卷:(注意不同的文件系统格式化所用的命令不一样)

  • xfs文件系统的格式化:xfs_growfs 挂载点
  • ext系列文件系统的格式化:resize2fs 逻辑卷名(本例是:/dev/vg0/mysql)

4)查看逻辑卷是否扩展成功
df -hT

5)一条命令实现扩展逻辑卷并格式化文件系统(-r表示格式化,支持各种文件系统)
lvextend -r -L +100M /dev/vg0/mysql

(2)缩减逻辑卷

先格式化,在缩减逻辑卷(前提:逻辑卷处于离线状态,即卸载挂载点)

缩减前一定要备份
缩减会导致空间变小,所以会丢失数据

xfs文件系统支持扩展,不支持缩减;
ext系列文件系统支持扩展和缩减文件系统,但只能离线缩减,不支持在线缩减。

示例:卸载逻辑卷/dev/vg0/binlog(文件系统是ext4)
1)查看:df -hT
2)卸载挂载点:umount /mnt/binlog
3)检查文件系统错误
e2fsck -f /dev/vg0/binlog
注释:如果你不执行检查文件系统错误的命令,直接格式化逻辑卷,会提示你先检查错误,并标明命令。
4)格式化逻辑卷
resize2fs /dev/vg0/binlog 1G
注释:resize2fs默认是扩展的意思,加了大小就是缩减的意思了。
5)缩减逻辑卷为1G大小
lvreduce -L 1G /dev/vg0/binlog
6)重新挂载
mount -a
7)查看:df -hT

4.跨主机迁移卷组(不常用 )

因为逻辑卷是由卷组分配出来的逻辑空间,而卷组的空间是无数个PE组成的(查看PE的大小及数量用“vgdisplay”或“pvdisplay”)。PE的空间又是普通的分区或硬盘给予的,所以在移动(迁移)逻辑卷的时候,把逻辑卷占用的所有的PE迁移到新电脑上就成功迁移了。

(1)源计算机

  • 1.在旧系统中,umount所有卷组上的逻辑卷
  • 2.禁用卷组
    • vgchange –a n vg0(-a n 是禁用的意思)
    • lvdisplay(查看逻辑卷)
  • 3.导出卷组
    • vgexport vg0(导出)
    • pvscan
    • vgdisplay(查看卷组)
  • 4.找到逻辑卷对应的分区或硬盘,插下

(2)目标计算机

  • 在新系统中安装旧硬盘,并导入卷组:vgimport vg0
  • 启用:vgchange –ay vg0
  • mount所有卷组上的逻辑卷

5.迁移一个目录到一个逻辑卷

相当于对之前的命令做一个总结

示例:把家目录/home迁移到逻辑卷  

1.查看分区,找出能创建逻辑卷的空间
[[email protected] ~]#  lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0  200G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
├─sda2           8:2    0  100G  0 part /
├─sda3           8:3    0   50G  0 part /data
├─sda4           8:4    0    1K  0 part 
└─sda5           8:5    0    3G  0 part [SWAP]
sdb              8:16   0   20G  0 disk 
├─sdb1           8:17   0    1G  0 part /mnt/sdb1
└─sdb2           8:18   0    2G  0 part 
  └─vg0-binlog 253:1    0    1G  0 lvm  /mnt/binlog
sdc              8:32   0   10G  0 disk 
└─sdc1           8:33   0    3G  0 part 
  └─vg0-mysql  253:0    0   23G  0 lvm  /mnt/mysql
sdd              8:48   0   20G  0 disk 
└─vg0-mysql    253:0    0   23G  0 lvm  /mnt/mysql
sr0             11:0    1   10G  0 rom  
[[email protected] ~]#
从上面看到sdb和sdc还有空间,所以决定创建sdb3和sdc2,供逻辑卷使用 
2.fdisk -l
查看sdb和sdc的分区类型,使用对应的分区工具划分sdb3和sdc2
3.同步分区,查看是否创建出新分区
CentOS7上同步:partprobe
查看:lsblk
[[email protected] ~]# lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0  200G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
├─sda2           8:2    0  100G  0 part /
├─sda3           8:3    0   50G  0 part /data
├─sda4           8:4    0    1K  0 part 
└─sda5           8:5    0    3G  0 part [SWAP]
sdb              8:16   0   20G  0 disk 
├─sdb1           8:17   0    1G  0 part /mnt/sdb1
├─sdb2           8:18   0    2G  0 part 
│ └─vg0-binlog 253:1    0    1G  0 lvm  /mnt/binlog
└─sdb3           8:19   0   17G  0 part 
sdc              8:32   0   10G  0 disk 
├─sdc1           8:33   0    3G  0 part 
│ └─vg0-mysql  253:0    0   23G  0 lvm  /mnt/mysql
└─sdc2           8:34   0    7G  0 part 
sdd              8:48   0   20G  0 disk 
└─vg0-mysql    253:0    0   23G  0 lvm  /mnt/mysql
sr0             11:0    1   10G  0 rom
4.把/dev/sdb3和/dev/sdc2加入物理卷  
[[email protected] ~]# pvcreate /dev/sdb3 /dev/sdc2
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdc2" successfully created.
5.查看物理卷
[[email protected] ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree   
  /dev/sdb2  vg0 lvm2 a--   <2.00g 1020.00m
  /dev/sdb3      lvm2 ---  <17.00g  <17.00g
  /dev/sdc1  vg0 lvm2 a--   <3.00g       0 
  /dev/sdc2      lvm2 ---   <7.00g   <7.00g
  /dev/sdd   vg0 lvm2 a--  <20.00g       0 
6.创建卷组vg1,并指定每个PE大小是16M,把sdb3加入卷组
[[email protected] ~]# vgcreate -s 16M vg1 /dev/sdb3
  Volume group "vg1" successfully created
7.把sdc2加入卷组vg1
[[email protected] ~]# vgextend vg1 /dev/sdc2
  Volume group "vg1" successfully extended
8.查看物理卷(vgs或者pvdisplay)
[[email protected] ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree   
  /dev/sdb2  vg0 lvm2 a--   <2.00g 1020.00m
  /dev/sdb3  vg1 lvm2 a--   16.98g   16.98g
  /dev/sdc1  vg0 lvm2 a--   <3.00g       0 
  /dev/sdc2  vg1 lvm2 a--    6.98g    6.98g
  /dev/sdd   vg0 lvm2 a--  <20.00g       0 
[[email protected] ~]# 
9.查看卷组(vgs或者vgdisplay)
[[email protected] ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree   
  vg0   3   2   0 wz--n- <24.99g 1020.00m
  vg1   2   0   0 wz--n- <23.97g  <23.97g
[[email protected] ~]#
[[email protected] ~]# vgdisplay 

    --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <23.97 GiB
  PE Size               16.00 MiB
  Total PE              1534
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1534 / <23.97 GiB
  VG UUID               rQ4H68-jtLb-1WPf-GhOU-xdax-TO7p-eiF6AZ

[[email protected] ~]#
10.创建逻辑卷home,分配卷组vg1的所有空间给逻辑卷home
[[email protected] ~]# lvcreate -n home -l 100%free vg1
  Logical volume "home" created.
11.查看逻辑卷(注意查看逻辑卷的空间单位不再是PE,而是LE)
[[email protected] ~]# lvdisplay /dev/vg1/home 
  --- Logical volume ---
  LV Path                /dev/vg1/home
  LV Name                home
  VG Name                vg1
  LV UUID                ufnLxD-1UqE-j0Uy-1QVH-pyAh-ZJt8-qvdRdi
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-30 17:17:03 +0800
  LV Status              available
  # open                 0
  LV Size                <23.97 GiB
  Current LE             1534
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

[[email protected] ~]#
12.给逻辑卷/dev/vg1/home创建文件系统
[[email protected] ~]# mkfs.xfs /dev/vg1/home 
meta-data=/dev/vg1/home          isize=512    agcount=4, agsize=1570816 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=6283264, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=3068, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
13.查看逻辑卷/dev/vg1/home设备名和UUID 
[[email protected] ~]# blkid /dev/vg1/home
/dev/vg1/home: UUID="7bfd7b30-f670-4b04-9f0e-6df3cb364f3b" TYPE="xfs" 
14.因为挂载需要空目录去挂载,如果目录里有文件,挂载就会看不到原有的文件。想要把家目录迁移到逻辑卷,就是把逻辑卷的挂载点设置为家目录,可家目录里有很多文件该怎么办呢?需要把逻辑卷临时挂载,然后把家目录的文件复制过去,注意保留属性。之后清空家目录,在永久挂载逻辑卷,即编辑/etc/fstab。注意的是,因为一个设备(这里是逻辑卷)可以挂载多个目录,所以不用把临时挂载的挂载点卸载。挂载成功后使用普通用户登录,看是不是自己的家目录,如果是就表示成功迁移。
[[email protected] ~]#mkdir /mnt/home
15.临时挂载
[[email protected] ~]# mount /dev/vg1/home /mnt/home
16.查看家目录
[[email protected] ~]# ls /home
niu  niubin
[[email protected] ~]# ls /mnt/home
17.复制家目录内容并保留文件原来的属性和设置
[[email protected] ~]# cp -a /home/. /mnt/home
18.查看复制到挂载点的文件的属性是否一致,还有家目录和挂载点的大小是否一致
[[email protected] ~]# ls /mnt/home/
niu  niubin
[[email protected] ~]# ll -a /home
total 0
drwxr-xr-x.  4 root root  31 Mar 17 03:45 .
dr-xr-xr-x. 19 root root 251 Mar 12 11:49 ..
drwx------.  5 niu  niu  159 Mar 17 03:47 niu
drwxr-xr-x.  2 root root  39 Mar 12 15:21 niubin
[[email protected] ~]# ll -a /mnt/home/
total 0
drwxr-xr-x.  4 root root  31 Mar 17 03:45 .
drwxr-xr-x. 10 root root 102 Mar 30 17:27 ..
drwx------.  5 niu  niu  159 Mar 17 03:47 niu
drwxr-xr-x.  2 root root  39 Mar 12 15:21 niubin
[[email protected] ~]# du -sh /home
36K /home
[[email protected] ~]# du -sh /mnt/home
36K /mnt/home
[[email protected] ~]#
19.删除家目录内的文件
[[email protected] ~]# rm -rf /home/*
20.永久挂载,修改配置文件/etc/fstab
[[email protected] ~]# blkid /dev/vg1/home
/dev/vg1/home: UUID="7bfd7b30-f670-4b04-9f0e-6df3cb364f3b" TYPE="xfs" 
[[email protected] ~]# echo "UUID=7bfd7b30-f670-4b04-9f0e-6df3cb364f3b /mnt/home xfs defaults 0 0" >> /etc/fstab 
[[email protected] ~]# mount -a
21.查看挂载
[[email protected] ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/sda2               100G  3.6G   97G   4% /
devtmpfs                705M     0  705M   0% /dev
tmpfs                   721M     0  721M   0% /dev/shm
tmpfs                   721M   11M  711M   2% /run
tmpfs                   721M     0  721M   0% /sys/fs/cgroup
/dev/sdb1              1014M   33M  982M   4% /mnt/sdb1
/dev/sda3                50G   33M   50G   1% /data
/dev/sda1              1014M  164M  851M  17% /boot
/dev/mapper/vg0-mysql    23G   33M   23G   1% /mnt/mysql
/dev/mapper/vg0-binlog  976M  2.6M  911M   1% /mnt/binlog
tmpfs                   145M   12K  145M   1% /run/user/42
tmpfs                   145M     0  145M   0% /run/user/0
/dev/mapper/vg1-home     24G   33M   24G   1% /home
22.使用普通用户登录,查看刚进系统是不是自己的家目录  
[[email protected] ~]# su - niu
Last login: Sun Mar 17 03:48:13 CST 2019 on pts/2
[[email protected] ~]$ pwd
/home/niu
[[email protected] ~]$
23.迁移成功

6.删除逻辑卷

  • 删除前一定要卸载挂载点
  • 如果该逻辑卷有快照,要先删除快照在删除逻辑卷
    1)卸载挂载点
    umount 挂载点
    2)删除逻辑卷
    lvremove 逻辑卷名

7.逻辑卷管理器快照

  • 快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝
  • 对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适的选择
  • 快照只有在它们和原来的逻辑卷不同时才会消耗空间
    • 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
    • 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
    • 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
    • 建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照
  • 快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享
  • 由于快照区与原本的LV(逻辑卷)共用很多PE的区块,因此快照与被快照的LV(逻辑卷)必须在同一个VG(卷组)中.系统恢复的时候的文件数量不能高于快照区的实际容量

(1)命令

1)为现有逻辑卷创建快照
lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data

2)挂载快照
mkdir -p /mnt/snap
mount -o ro /dev/vg0/data-snapshot /mnt/snap

3)恢复快照
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot

4)删除快照
umount /mnt/databackup
lvremove /dev/vg0/databackup

(2)示例

创建快照

1.查看逻辑卷/dev/vg0/mysql
[[email protected] ~]# lvdisplay /dev/vg0/mysql 
  --- Logical volume ---
  LV Path                /dev/vg0/mysql
  LV Name                mysql
  VG Name                vg0
  LV UUID                IGpiUg-OgXh-QFXA-ZwsV-WkvC-7ehq-nUNEVC
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-29 05:12:23 +0800
  LV Status              available
  # open                 1
  LV Size                22.99 GiB
  Current LE             5886
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

[[email protected] ~]#
2.给逻辑卷/dev/vg0/mysql创建快照,前提逻辑卷的卷组要有足够的空间,快照名为“mysql_kuaizhao”,并指定大小100M。(“-s”表示创建快照;还可以加“-p r”,表示创建只读的快照,这样快照被挂载后,访问挂载点,里面的内容就不怕被改。)
[[email protected] ~]# lvcreate -n mysql_kuaizhao -s -L 100M /dev/vg0/mysql
  Logical volume "mysql_kuaizhao" created.
3.使用lvdisplay查看/dev/vg0/mysql会看到,该逻辑卷有一个快照
[[email protected] ~]# lvdisplay /dev/vg0/mysql
  --- Logical volume ---
  LV Path                /dev/vg0/mysql
  LV Name                mysql
  VG Name                vg0
  LV UUID                IGpiUg-OgXh-QFXA-ZwsV-WkvC-7ehq-nUNEVC
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-29 05:12:23 +0800
  ---------------------------------------------------------
  - LV snapshot status     source of                      -
  -                       mysql_kuaizhao [active]         -
  ---------------------------------------------------------
  LV Status              available
  # open                 1
  LV Size                22.99 GiB
  Current LE             5886
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

[[email protected] ~]#
4.或者用lvs可以看到多出一个逻辑卷,并且“Attr”的第一个字符是s,表示快照
[[email protected] ~]# lvs
  LV             VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  binlog         vg0 -wi-ao----   1.00g                                                    
  mysql          vg0 owi-aos---  22.99g                                                    
  mysql_kuaizhao vg0 swi-a-s--- 100.00m      mysql  0.02                                   
  home           vg1 -wi-ao---- <23.97g                                                    
[[email protected] ~]#
5.查看设备blkid会看到逻辑卷/dev/vg0/mysql和它的快照的UUID相同
6.挂载快照
因为快照UUID与原逻辑卷的UUID一样,所以正常挂载会报错,xfs文件系统挂载需要加“-o nouuid”,意思是不检查UUID进行挂载,ext系列的文件系统不用加。建议在加“ro”,让快照的挂载目录无法被修改
[[email protected] ~]# mkdir /mnt/mysql_kuaizhao 
[[email protected] ~]# mount -o nouuid,ro /dev/vg0/mysql_kuaizhao /mnt/mysql_kuaizhao
7.查看挂载
[[email protected] ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/sda2                       100G  3.6G   97G   4% /
···············
···············
/dev/mapper/vg0-mysql            23G   33M   23G   1% /mnt/mysql
/dev/mapper/vg1-home             24G   33M   24G   1% /home
/dev/mapper/vg0-binlog          976M  2.6M  911M   1% /mnt/binlog
···············
/dev/mapper/vg0-mysql_kuaizhao   23G   33M   23G   1% /mnt/mysql_kuaizhao
8.查看原逻辑卷和逻辑卷快照的挂载点内容
[[email protected] ~]# ls /mnt/mysql
f1  f2
[[email protected] ~]# ls /mnt/mysql_kuaizhao/
f1  f2
注意:虽然在快照的挂载点看到了逻辑卷的数据,但这些数据并不在快照里,而是在原来的逻辑卷里,只是显示一下。

恢复快照

以上面的逻辑卷及其快照为例,删除逻辑卷的f1文件,在查看快照的挂载点里f1依然存在,证明了快照的作用。现在要使用快照恢复逻辑卷f1文件。
1.使用快照恢复逻辑卷内容,先卸载该逻辑卷和快照的挂载点
umount /mnt/mysql
umount /mnt/mysql_kuaizhao
2.合并
lvconvert --merge /dev/vg0/mysql_kuaizhao
合并后,快照恢复数据后会自动删除
3.查看逻辑卷是否有快照(lvdisplay /dev/vg0/mysql),可以看到原来的快照信息消失了。
4.重新挂载,查看挂载,发现快照消失了
[[email protected] ~]# mount -a
[[email protected] ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/sda2               100G  3.6G   97G   4% /
devtmpfs                705M     0  705M   0% /dev
tmpfs                   721M     0  721M   0% /dev/shm
tmpfs                   721M   11M  711M   2% /run
tmpfs                   721M     0  721M   0% /sys/fs/cgroup
/dev/sdb1              1014M   33M  982M   4% /mnt/sdb1
/dev/sda3                50G   33M   50G   1% /data
/dev/sda1              1014M  164M  851M  17% /boot
/dev/mapper/vg1-home     24G   33M   24G   1% /home
/dev/mapper/vg0-binlog  976M  2.6M  911M   1% /mnt/binlog
tmpfs                   145M   12K  145M   1% /run/user/42
tmpfs                   145M     0  145M   0% /run/user/0
/dev/mapper/vg0-mysql    23G   33M   23G   1% /mnt/mysql
5.查看逻辑卷的挂载目录里,f1恢复成功
[[email protected] ~]# ls /mnt/mysql
f1  f2

8.同一卷组中PE的移动及删除PE

如果有一块磁盘闪烁黄灯,表示磁盘快坏了。但是该磁盘加入了物理卷,给逻辑卷提供了空间(即PE),把它拔出代表卷组和逻辑卷的一部分空间没了,如果有数据就会丢失。解决的办法是,把该磁盘的提供给卷组的PE复制到正常的磁盘即可。如果情况坏点,当时没有多余的空间,那么在添加一个硬盘加入物理卷,给卷组增加空间(PE)即可。在如果没有多余的插槽添加硬盘,可通过缩减逻辑卷(xfs文件系统不支持缩减,ext系列文件系统支持),在增加卷组空间。
1)添加新硬盘后,使用lsblk看不到硬盘,需要刷新,命令如下
echo "---" &gt; /sys/class/scsi_host/host2/scan
2)把新硬盘添加到物理卷,并添加到卷组
3)移动坏掉的PE(假设硬盘空间都要移动)
"pvmove"命令可以指定,把卷组中的某一空间(PE)移动到同一卷组的其他空间中去。
pvmove 要移动的磁盘分区
4)删除卷组中快要坏的磁盘分区
vgreduce 卷组 磁盘分区
5)删除物理卷中快要坏的磁盘分区(其实是删除PE)
pvremove 磁盘分区

以上是关于Linux篇 | 磁盘存储和文件系统的主要内容,如果未能解决你的问题,请参考以下文章

Linux 磁盘管理详解--企业实战篇

Linux系统安装与使用基础之第四篇掌握Linux下存储设备的挂载与卸载的方法

Linux性能优化从入门到实战:16 文件系统篇:磁盘 I/O 指标/工具总结问题定位和调优

Linux磁盘和文件系统简介

Linux磁盘存储和文件系统

Linux 磁盘管理 高级篇 -- quota,RAID,LVM