文件介绍
linux 中一切皆为文件,主要的工作如下
open() 打开文件
read() 读取文件
write() 写入文件
close() 关闭文件
主要文件类型
f 普通文件
l 链接文件
s 套接字文件
p 管道文件
b 块设备文件
c 字符设备文件
d 目录文件
块设备文件
作用:
关联一个设备驱动程序,进而就可以跟硬件设备进行通信。
特点:
- 随机访问,当文件系统中有 100 个文件,那么可以直接访问最后一个,这种非顺序访问的方式就称之为随机访问。
- 不同的设备会有不同的块,在存储数据或者划分区域时是以块为单位来存储数据。主要设备为硬盘。
设备文件号码:
# 使用 find 命令定义类型为块设备文件并使用 -ls 参数来查看块设备文件的主设备号和次设备号
$find / -type b -ls
335947 0 brw-rw---- 1 root disk 8, 32 Aug 14 07:50 /dev/sdc
# 结果中的 8 就为主设备号而逗号后的 32 就为次设备号
# 主设备号:标识系统读取这个设备的内核驱动类型
# 次设备号:标识设备文件在系统中的物理位置
...
块设备文件的命名
磁盘设备的命名:
/dev/sdX
/dev/nvme0n # nvme 协议磁盘,读取速率的代言人!
虚拟磁盘:
/dev/vd
/dev/xvd
当不同设备使用 a-z 命名
例:/dev/sda /dev/sdb /dev/sdc
当相同设备不同分区使用 1,2... 命名
例:/dev/sda1 /dev/sda2 /dev/sda3
字符设备
作用
与块设备同理,就是在 linux 有一个可以绑定设备驱动程序的文件,这样就可以与硬件沟通了。
特点
- 与块设备不同,字符设备文件是一个顺序读取的设备文件,并且一直在运行。
创建设备文件
# 使用 mknod 工具可以直接创建设备文件,根据自己定义的类型和主设备号以及次设备号生成一个设备文件
# 如果定义一个与 /dev/zero 相同的主设备号和次设备号那么功能也会相同
# 因为系统是通过主设备号来为定义设备文件的驱动,通过次设备号来寻找文件的位置
1. 查看设备的主设备号与次设备号
$ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5 Aug 13 20:20 /dev/zero
2. 创建号相同的设备文件
$mknod /test/user_protion b 1 5
3. 测试功能是否相同
$dd if=/test/user_protion of=/test/test1.txt
$dd if=/dev/zero of=/test/test1.txt bs=1M count=1
4. 使用 hexdump 工具查看文件是否相同
$hexdump /test/test1.txt
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0100000
$hexdump /test/test.txt
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0100000
第二种创建系统设备文件方法
# 使用 cp -a 保留属性复制
$cp -a /dev/zero /test/user_protion
$ls -l /dev/zero /test/user_protion
crw-rw-rw- 1 root root 1, 5 Aug 13 20:20 /dev/zero
crw-rw-rw- 1 root root 1, 5 Aug 13 20:20 /test/user_protion
操控硬盘的魔法
硬盘接口类型
并行接口:IDE SCSI SATA SAS
IDE 家用电脑替代为 SATA
SCSI 早期服务器替代为 SAS
M.2 速度较快,新一代硬盘
支持 Nvme 协议的硬盘最快
串行接口与并行接口
串行接口
- 传输效率高
- 节省数据线
- 传输稳定,支持校验码
- 因为是单向传输并且一次只支持一个比特所以不存在串扰问题
- 不支持多行传输
并行接口
- 可以同时收发多个比特位的数据
- 使用的数据线多
- 同时发送时为了保证数据的完整性,要协调数据时统一到达,这样就造成了传输数据缓慢,所有的数据通道都要同步传输
- 对外露出的针脚容易损坏
- 串扰问题,传输数据时因为是多线传输彼此存在电磁干扰现象,所以数据容易失真,线路越多,传输越快干扰越严重
服务器硬盘大小
- LEF:3.5寸,一般见到的那种台式机硬盘大小
- SEF:2.5寸,不同于笔记本2.5寸硬盘
目前服务器主流的都是 SEF 规格的硬盘主要是考虑增加盘片密度,增大容量,增强散热,减少功耗
机械硬盘组成及原理
磁道:由一个同心圆上的扇区组成的一个同心圆称之为磁道
扇区:一个同心圆的一小块区域称之为扇区,一个扇区一般厂商生产为 512 字节
转轴:通过转心马达来转动转轴从而带动盘片来进行读写运动的
柱面:不同盘片的相同的一个同心圆称之为柱面,centos 6 使用柱面来划分分区,但是centos 6 之后都是使用扇区来划分分区
盘面:在之前的机械硬盘都只是一个盘面而现在都是一个镜片有两个盘面都可以存储数据
读写头:由磁头组成,通过电磁来修改盘片上的电磁从而达到写入读取数据的作用,当磁头划过盘面时如果磁头的电磁较强那么将会在盘片上写入数据如果电磁较弱将会是读取数据,写入数据时会先从最外圈写一直到里,然后再从里慢慢往外写,这是默认方式
磁头臂:控制单个磁头做运动,内置永磁铁通过磁度大小控制磁头的走向
磁头臂组:包含多个磁头臂来做读取写入动作
缓存:由于内存在读取写入数据时的速率相较于磁盘来说会快一点,所以需要一个缓冲区来对写入的磁盘进行暂时性存放或者在读取时提前提交
工作流程:当需要写入数据时硬盘主板首先硬盘主板控制无刷电机,无刷电机转动碟片,然后机械手臂控制磁头改变碟片上的磁,当磁头的磁大于碟片上时是写入数据,当磁头上的磁小于碟片则是读取数据,写入数据首先从外圈写,然后慢慢往内圈写,这是默认方式。
# 识别机械硬盘类型
# 1 表示机械,0 表示 SSD
[root@DNS ~]# lsblk -d -o name,rota
NAME ROTA
sda 1
sdb 1
sdc 1
sr0 1
[root@DNS ~]# cat /sys/block/sda/queue/rotational
机械硬盘存储术语 CHS
CHS 即是 cylinder head sector 的组成
- head:磁头 磁头数=盘面数
- track:磁道 磁道=柱面数
- soctor:扇区,512 bytes
- cylinder:柱面
分区类型
centos 5 采用的是 linux 以柱面(CHS)的整数来划分分区,centos 6 以后可以支持扇区划分分区。(上图是早期划分区域时的方法,下图为现代划分区域方法)
CHS
- CHS 采用 24 bit 寻址
- 前 10 位标识 cylinder 中间 8 位表示 head 后面 6 位表示 sector
- 最大寻址空间 8 G
# centos 6 查看结果会显示 heads sectors sylinders 数量以及单位算法
# 可以看到划分区域的单位是以柱面为单位进行划分
[root@localhost ~]# fdisk -l /dev/sda88800
Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0006581f
LBA
-
LBA 为一个整数,通过转换成 CHS 格式完成磁盘具体寻址
当系统接收到 LBA 的整数时,那么将会通过特殊的算法将 LBA 的整数转换为 CHS(cylinder head soctor) 格式来进行寻址前提是小于 8G 时会通过 CHS 进行寻址
-
由于 CHS 寻址方式的寻址空间在大概 8G 以内,所以在磁盘容量小于 8G 时可以使用 CHS 寻址方式,但是在磁盘容量大于 8G 时就只能使用 LBA 寻址方式
# centos 8 查看结果直接显示单位是由每个单位,就是 521 bytes 组成,也就是一个扇区
[root@DNS ~]# fdisk -l /dev/sda
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00ee4b60
磁盘分区
分区的必要性
- 优化 I/O 性能
- 实现磁盘空间配额
- 实现程序和系统的隔离
- 可以安装多个操作系统
- 可以使用格式化的方式将分区格式化为文件系统
MBR 与 GPT
MBR
使用 32 位代表扇区数,这样就限制了分区数不能超过 2T
0磁道0字节前512字节格式
446bytes 引导程序,当系统启动时这个引导系统将会寻找磁盘中操作系统的存储位置,然后启动操作系统并加载到内存中。
64bytes 分区表,其中每 16 bytes 标识一个分区,存储磁盘的分区信息,如果分区表丢失那么系统将不会识别到分区信息
2bytes 结束标识,标识前 512 字节已经结束,如果该字节缺少,那么系统启动同样也会失败,因为系统只识别到了开始,但是没有结束,寻找不到分区表的具体位置
例:备份分区表
# 查看磁盘分区
[root@DNS ~]# lsblk
sdc 8:32 0 20G 0 disk
├─sdc1 8:33 0 5G 0 part
├─sdc2 8:34 0 10G 0 part
└─sdc3 8:35 0 5G 0 part
# 使用 dd 命令进行备份
# skip 表示跳过源设备的前 446 字节
[root@DNS /]# dd if=/dev/sdc of=/test/sdc.img bs=1 count=64 skip=446
# 破坏 sdc 设备的分区表
# seek 表示跳过目标设备的 446 字节
[root@DNS /]# dd if=/dev/zero of=/dev/sdc bs=1 count=64 seek=446
# 破坏后使用 lsblk 依然出现分区信息,但是我们已经把分区表给清空了
# 从 lsblk 读取的只是内存中的信息,当分区信息被删除后并没有实时同步
[root@DNS /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 15G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 14G 0 part
├─cl-root 253:0 0 12.5G 0 lvm /
└─cl-swap 253:1 0 1.5G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
sdc 8:32 0 20G 0 disk
├─sdc1 8:33 0 5G 0 part /data
├─sdc2 8:34 0 10G 0 part
└─sdc3 8:35 0 5G 0 part
sr0 11:0 1 7.7G 0 rom
# 使用 fdisk 加上 -l 选项可以查看硬盘本身分区信息,所以就不会显示分区信息
[root@DNS /]# fdisk -l /dev/sdc
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
# 将分区表还原,使用 seek 跳过目标前 446 字节
[root@DNS /]# dd if=/test/sdc.img of=/dev/sdc bs=1 seek=446
# 再次使用 fdisk -l 命令查看分区信息,果不其然,哈哈哈又回来了
[root@DNS /]# fdisk -l /dev/sdc
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 4840A3C6-F4F8-409A-B0A3-276299636CE1
Device Start End Sectors Size Type
/dev/sdc1 2048 10487807 10485760 5G Linux filesystem
/dev/sdc2 10487808 31459327 20971520 10G Linux filesystem
/dev/sdc3 31459328 41943006 10483679 5G Linux filesystem
例:破坏前 512 字节中的 2 个结束字符,并恢复
[root@DNS /]# dd if=/dev/sdc of=/test/end.img bs=1 count=2 skip=510
[root@DNS /]# dd if=/test/end.img of=/dev/sdc bs=1 count=2 seek=510
MBR 缺点
- 分区数量有限制
- 存储容量有限制
- 没有备份,当磁盘分区表损坏或者前512字节损坏,那么数据将会丢失
GPT 分区
-
GUID 支持 128 个分区,使用 64 位
-
使用 128 位表示磁盘和分区 GPT 分区表自动备份在头和尾两份,都有 CRC 校验位
-
UEFI 统一扩展固态接口硬件支持 GPT
分区头部格式
- 第一段为 MBR 引导分区
- 第二段为 GPT 主分区表头部,记录着后面每个的 LBA 分区表的地址,用来寻找 LBA 分区表
- 第三段是对磁盘进行分区的 LBA 分区表
- 第四段可以继续充当分区表
- 最后一段是备份的 GPT 主分区表头部
- 倒数第二段是前面第三段的备份
- 后者亦然
逻辑分区与主分区
一块硬盘最多有 4 个主分区,但是也可以使用 3 主分区 + 1 扩展分区(N+逻辑分区)
- 逻辑分区只能从卷标 5 开始
- 主分区最多只能有 4 个
- 扩展分区只能有一个
- 扩展分区中可以创建多个逻辑分区
- 扩展分区不可以存储数据,但是逻辑分区可以
- 扩展分区可以创建在1,2,3,4
BIOS和UEFI
BIOS 与 COMS
COMS 是主板上的一个固件,用来存储硬件信息,和出厂设置的硬件参数等,BIOS 则是一个开机系统自检和引导操作系统,主要完成硬件自检和引导操作系统的工作,工作步骤如下:
当用户开机后,首先启动 BIOS 然后从 COMS 读取硬件参数,按照用户定义参数进行启动,并根据 COMS 的硬件参数寻找系统磁盘,并启动引导分区。
搭配 MBR 分区格式。
UEFI
可以说是一个增强版的 BIOS 软件,UEFI 最大的好处就是用户可以通过图形化界面定制自己的系统设置,但是 UEFI 必须搭配 GPT 分区格式才可以,UEFI 中有一定的安全机制,但是 UEFI 的性能会差,因为使用的是轮询机制,而不是 IRQ 断电协议。最好有 BIOS boot 支持,而且还要单独格式化出 512MB 或者 1G 的空间给 UEFI 使用。
IRQ 中断请求管理:当周边程序需要让 CPU 处理数据时,就向 CPU 发送 IRQ 让它暂停手上的工作,先处理周边程序的。
分区管理
查看分区命令
lsblk # 列出块设备
[root@DNS /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 15G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 14G 0 part
├─cl-root 253:0 0 12.5G 0 lvm /
└─cl-swap 253:1 0 1.5G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
sdc 8:32 0 20G 0 disk
├─sdc1 8:33 0 5G 0 part /data
├─sdc2 8:34 0 10G 0 part
└─sdc3 8:35 0 5G 0 part
sr0 11:0 1 7.7G 0 rom
[root@DNS /]# df -h # 显示挂载点以及磁盘存储空间剩余情况
Filesystem Size Used Avail Use% Mounted on
devtmpfs 369M 0 369M 0% /dev
tmpfs 396M 0 396M 0% /dev/shm
tmpfs 396M 41M 356M 11% /run
tmpfs 396M 0 396M 0% /sys/fs/cgroup
/dev/mapper/cl-root 13G 9.9G 2.6G 80% /
/dev/sda1 976M 353M 557M 39% /boot
tmpfs 80M 1.2M 79M 2% /run/user/42
tmpfs 80M 4.0K 80M 1% /run/user/0
/dev/sdc1 4.9G 20M 4.6G 1% /data
管理分区命令
fdisk # 管理 MBR 命令
gdisk # 管理 GPT 命令
parted # 高级分区操作,可以是交互或非交互式方式
parted 命令
# 即时生效
parted [device_name] print # 显示设备的详细信息
parted [device_name] mklabel [msdos/gpt] # 更改分区类型
parted [device_name] mkpart [type--primary] [start_num] [end_num] # 创建分区,单位为 MB
parted [device_name] rm 1 # 删除分区 1
parted -l # 查看所有设备分区信息
[root@DNS /]# parted /dev/sdc print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB # 存储空间大小
Sector size (logical/physical): 512B/512B # 扇区大小
Partition Table: gpt # mbr/gpt
Disk Flags: # 磁盘标识
Number Start End Size File system Name Flags
4 1048kB 1049kB 512B primary
1 1049kB 5370MB 5369MB ext4 Linux filesystem
2 5370MB 16.1GB 10.7GB Linux filesystem
3 16.1GB 21.5GB 5368MB Linux filesystem
# 显示每个分区的空间大小及格式
[root@DNS /]# parted /dev/sdc print free
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
17.4kB 1049kB 1031kB Free Space
1 1049kB 1000MB 999MB ext4 primary
1000MB 21.5GB 20.5GB Free Space
# 会询问是否真的要更换为 MBR ,如果该磁盘已经分区,那么更换为 MBR 时将会清空所有数据并删除分区表
[root@DNS /]# parted /dev/sdc mklabel msdos
# 分出主分区,大小为 1G
[root@DNS /]# parted /dev/sdc mkpart primary 1 1000
Information: You may need to update /etc/fstab.
[root@DNS /]# parted /dev/sdc print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1000MB 999MB primary ext4
# 创建分区并删除分区
[root@DNS /]# parted /dev/sdc mkpart primary 1 100
Information: You may need to update /etc/fstab.
[root@DNS /]# parted /dev/sdc print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 99.6MB 98.6MB ext4 primary
[root@DNS /]# parted /dev/sdc rm 1
[root@DNS /]# parted /dev/sdc print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
fdisk 与 gdisk 命令
gdisk [device] # 操作方式与 fdisk 相同
fdisk -l [device] # 查看设备的详细信息
[fdisk/gdisk] [device] # 管理 MBR 分区
p # 分区列表
t # 更改分区类型
n # 创建新分区
d # 删除分区
F # 显示未分区空间
v # 校验分区表
i # 当前分区信息
g # 清空分区并切换为 GPT 格式
o # 清空分区表并转换为 DOS MBR 格式
w # 保存退出
q # 不保存退出
# 分区同步方法
[root@DNS ~]# cat /proc/partitions # 查看内核是否已经识别到新的分区
# 如果没有同步,解决方法
[root@DNS ~]# partprobe # 同步分区表
[root@DNS ~]# partx /dev/sdc1
-a, --add add specified partitions or all of them
[root@DNS ~]# kpartx -a /dev/sdc1
[root@DNS ~]# partx -d --nr 1-3 /dev/sdc
# 非交互式对磁盘进行分区
[root@DNS ~]# echo -e "n\n\n\n+2G\n\nw\nY"|gdisk /dev/sdc
同步分区表内容命令
partprobe # 同步两块磁盘的分区表内容
文件系统概念
文件系统概念,是用于明确存储设备或分区的文件的方法和数据结构,即在存储设备上组织数据的方法,不同的文件系统有不同组织文件的方法和数据结构。负责为用户建立文件,删除修改读入文件。
文件系统介绍:https://en.wikipedia.org/wiki/Comparison_of_file_systems
各系统使用文件类型
windows 常用文件系统
- FAT32 最大单个数据 4G,不可以超过
- NTFS 传输数据没有上限
- exFAT 新一代 FAT 格式文件系统,为了解决 FAT32 最大支持上限而诞生
UNIX
- FFS
- UFS
linux
- ext2
- ext3
- ext4 支持创建使用 16TB、最大1EB 的文件系统,支持无限的子目录
- ntfs
- xfs SGI,最大支持8EB的文件系统,接近裸设备的 I/O 的性能存储数据
- swap 交换分区
- iso9660
- btrfs
- reiserfs
网络文件系统
- NFS 异构平台共享的文件系统
- CIFS windows 之间互相通信,微软私有协议
集群文件系统
- GFS2
- OCF32(oracle)
分布式文件系统
- fastdfs
- ceph
- moosefs
- mogilefs
- glusterfs
- lustre
# 查看支持的文件系统
[root@DNS ~]# cat /etc/filesystems
文件系统的组成
- 内核中的模块 ext4 xfs vfat
- linux的虚拟文件系统
- 用户空间管理工具 mkfs
Virtual file system 组成
Virtual 是通过 dentry 和 inode 来识别并处理文件,虽然每个文件系统的组成或者处理方式并不一样,但是通过一个统一标准来识别并定位到文件位置并调用。这个方式就是通过唯一的 dentry 和 inode 节点号来识别。dentry 来提供文件系统在目录树中的位置,inode 则是提供文件系统的元数据信息。需要调用文件系统时就调用文件系统导出的一组接口。
inode cache 缓存
存放的是系统调用文件时的缓存信息(inode)
directory cache 缓存
存放的时系统调用目录时的缓存信息(dentry)
当用户空间发起处理文件请求后,会调用 C 中的函数库,然后通过系统的 API 函数接口将请求发送给 VFS 虚拟文件系统,虚拟文件系统会首先查看缓存中的内容,然后再根据缓存或者文件名来处理文件。
ext文件系统
第三层中,ext 文件系统是将空间分成多个组
第四层中,每个组中的 Super Block 存储着 GPT、Block Bitmap、Inode Bitmap、Inode table 等数据,Data Blocks 是存储数据的块
GPT:组块描述符,记录组块的信息和属性描述内容,并不是每个组中都会有这个 GPT
Block Bitmap:块使用记录表,可以形象的把这个理解为一张表格里面记录着哪个块可以使用,哪个块正在使用
Inode Bitmap:节点使用记录表,形象的理解为一张表格里面记录着哪个节点被占用,哪个节点可以被使用
Inode table:记录着每个文件对应的 inode 号
创建文件系统管理工具
创建文件系统及默认设置(mkfs mke2fs)
mkfs [options] [-t <type>] [fs-options] <device> [<size>] # 文件系统管理工具
[type]
mkfs.cramfs
mkfs.ext3
mkfs.fat
mkfs.msdos
mkfs.xfs
mkfs.ext2
mkfs.ext4
mkfs.minix
mkfs.vfat
mke2fs # ext系列文件系统专用管理工具
-t {ext2,3,4 xfs} # 指定文件系统
-b block-size # 指定数据块大小
-L ‘LABEL’ # 设置卷标
-j 相当于 -t ext3
-i # # 指定数据空间每多少字节创建一个 inode,不应该小于 block 大小
-N # # 指定分区中创建多少 inode 号
-I # 一个 inode 节点占用磁盘空间的大小 128 --- 4096
-m # 默认为 5%,为管理人员预留空间占总空间的百分比
查看查找分区信息(blkid e2label finds tune2fs dumpe2fs)
blkid # 查看块设备属性信息
blkid [OPTION] ... [DEVICE]
-U # 根据指定的 UUID 来查找对应的设备
-L # 根据指定的 LABEL 来查找对应的设备
e2lablel DEVICE [LABEL]
finds 查找分区
finds LABEL=[label]
finds UUID=[uuid]
例:[root@DNS ~]# findfs `sed -En "/boot/s/^([^ ]+).*/\1/p" /etc/fstab`
例:[root@DNS ~]# findfs UUID=YgN8KU-H3yt-PBy2-fR7V-R2ce-Lp5V-UmvdRO
/dev/sda2
ext 文件专用工具
tune2fs 重新你设定 ext 系列文件系统可调整参数的值
-l # 查看指定文件系统超级块信息:super block
-L # ‘LABEL’ 修改卷标
-m # # 修改留给管理员的空间百分比
-j # 将 ext2 升级为 ext3
-O # 文件系统属性启用或者禁用 -O ^has_journal
-o # 调整文件系统的默认挂载选项 -o ^acl
-U UUID # 修改 UUID 号
dumpe2fs 显示 ext 文件系统信息,将从磁盘块分组管理
-h # 查看超级块信息,不显示分组信息
e2klabel # 管理并设置设备卷标
e2klabel device [LABEL_name]
xfs 文件专用工具
xfs_info mountpoint(挂载点)|devname
例:[root@DNS ~]# xfs_info /dev/sdc1
挂载
挂载:将额外的文件系统与现有的文件系统以及目录树建立起关系的行为,称之为挂载
卸载:解除这种关系的行为称之为卸载
挂载方式
- 指定设备文件 /dev/sdb1 等
- 指定 UUID 进行挂载
- 指定卷标 LABEL 进行挂载
- 伪文件系统名称 proc sysfs 等
挂载点必须事先存在,且最好为空目录,因为挂载时会覆盖该目录下的文件内容
mount 命令
-t fstype # 指定要挂载的设备上的文件系统类型
-r # readonly 只读挂载
-w # read and write 读写挂载
-n # 不更新 /etc/mtab mount 不可见
-a # 自动挂载所有支持自动挂载的设备文件
-L ‘LABEL’ # 以卷标指定挂载设备
-U ‘UUID’ # 以 UUID 指定要挂载的设备
-B,--bind # 绑定目录到另一个目录上
-o options 挂载文件系统的选项,多个选项使用都好隔开
async 异步模式,内存更改时写入到缓冲区,速度快
sync 同步模式,内存更改时同时写入磁盘,安全但是速度慢
atime/noatime 包含目录和文件
diratime/nodiratime 目录的访问时间戳
auto/noauto 是否支持将文件系统上运行应用程序
dev/nodev 是否支持在此文件系统上使用设备文件
suid/nosuid 是否支持suid和sgid权限
remount 重新挂载
ro/rw 只读,读写
user/nouser 是否允许普通用户挂载此设备 /etc/fstab 使用
acl/noacl 启用文件系统上的 acl 功能
loop 使用 loop 设备
# loop 设备介绍,使用 dd 命令创建一个虚拟磁盘,然后使用 mkfs 格式化为一个虚拟的文件系统,挂载到其他目录这样的设备文件称之为 loop 设备
_netdev 当网络可用时才对网络资源进行挂载,如:NFS 文件系统
defaults 相当于 rw, suid, dev, exec, auto, nouser, and async
# 如果 nfs 远程挂载没有成功,那么就使用 systemctl enable remote-fs.target 来进行挂载
umount 卸载命令
-f # 强制卸载
查看挂载
mount # 直接输入可查看挂载状态
[root@localhost ~]# cat /proc/mounts # 查看全部挂载设备
制作 loop 设备文件
# 最多只能创建 8 个环回设备,从 0 开始计数,一直到 7
Centos 6 制作 loop 设备
# 创建文件
[root@localhost ~]# dd if=/dev/zero of=virtual bs=4096 count=1000
# 查看文件大小
[root@localhost ~]# ll virtual
# 使用 mkfs.ext4 将其文件格式化为 ext4 文件系统,因为文件没有 superblock 块,所以会出现提示,强制转换即可
[root@localhost ~]# mkfs.ext4 virtual
# 查看文件系统详细信息
[root@localhost ~]# dumpe2fs virtual
# 使用 mount -o loop 选项挂载该环回设备
[root@localhost ~]# mount -o loop virtual /mnt/
# 使用 losetup -a 查看所有已经使用的环回设备
[root@localhost ~]# losetup -a
/dev/loop0: [0802]:280382 (/root/virtual)
Centos 8 制作 loop 设备
[root@DNS media]# dd if=/dev/zero of=loopbackfile.img bs=100M count=10
[root@DNS media]# losetup -fP loopbackfile.img
# -P 选项表示创建一个环回设备
# -f 选项表示寻找第一个没有使用的环回设备
[root@DNS media]# losetup -a
[root@DNS media]# mkfs.ext4 /root/loopbackfile.img
解决用户正在使用无法挂载的方法:lsof fuser命令介绍
# 如果卸载时有用户在使用可以使用以下操作找出用户并踢出用户
[root@localhost ~]# lsof /mnt/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2934 root cwd DIR 7,0 1024 2 /mnt
[root@localhost ~]# fuser -v /mnt/
# -v 以长格式显示
USER PID ACCESS COMMAND
/mnt/: root 2934 ..c.. bash
# 使用重定向通知对方
[root@localhost ~]# echo hello > /dev/pts/1
[root@localhost ~]# fuser -km /mnt/
# -k 杀死用户进程
# -m 查看用户其他访问文件
持久挂载
/etc/fstab 文件配置,在 /etc/fstab 文件中配置挂在后,那么当下次开机时系统会自动读取该文件并挂载该文件中定义的磁盘以及 mountpoint
fstab 文件内容详解
<file system> <dir> <type> <options> <dump> <pass>
<file system> # 挂载设备文件
# 挂载设备文件可以通过 UUID 或者 LABEL 或者设备路径来定义
<dir> # 挂载点
# 挂载点必须存在,在 centos 6-7 是这样定义的,但是在 centos 8 上启动时将会新创建一个目录提供挂载
<type> # 挂载的文件系统名称
# 定义文件系统类型 ext4 xfs 或者 nfs
<options> # 包括 defaults 或者 sync rw ro 等挂载状态
<dump> # 定义是否 dump 备份,0 为不备份 1 为备份,开启后将会对系统开机拖慢速度
<pass> # 磁盘检查设备,也可说是检查顺序定义,0 表示不检查 1 的优先级最高,2 为后续检查,数字相同则是同时检查
修复文件系统
2.2.4.3 文件系统检测和修复 文件系统夹故障常发生于死机或者非正常关机之后,挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下执行下面命令修复 fsck: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
注意:FS_TYPE 一定要与分区上已经文件类型相同
常用选项:
-a 自动修复 -r 交互式修复错误
e2fsck:ext系列文件专用的检测修复工具
-y 自动回答为yes
-f 强制修复
-p 自动进行安全的修复文件系统问题
xfs_repair:xfs文件系统专用检测修复工具
常用选项:
-f 修复文件,而设备
-n 只检查
-d 允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot
Swap分区
swap 分区介绍
swap 是内存的补充,当内存空间不足时就可以使用 swap 来补充内存空间缺少的那一部分。可以定义多个 swap 分区,这样可以更加的增加 swap 分区的容量。创建 swap 分区时需要考虑机械磁盘分区时是在内圈然后分到外圈,又因为磁盘外圈的读取速率比较高,因为相对于内圈外围的扇区较多,所以指针转一圈比在内圈所经过处理的数据多很多。最好不要使用文件挂载,如果直接使用分区来创建 swap 分区这样速度相对于在磁盘中创建一个文件并经过文件系统重新创建一个 swap 文件速度要快。
swap 的优先级
0-32767 数字之内的优先级,数字越大优先级越高
缺省的优先级会比前一个挂载的优先级 -1
swap 分区创建
swapon [option] ... [device]
-a : 激活所有的交换分区
-p : priority 指定优先级,也可在 /etc/fstab 第四列指定 pri=value
# 创建 swap 类型的磁盘,大小为 2G
[root@DNS ~]# echo -e "n\n\n\n+2G\n8200\n8200\nw\nY\n"|gdisk /dev/sdb
# 为该分区打上标签
[root@DNS ~]# mkswap /dev/sdb1
# 开启该 swap 分区
[root@DNS ~]# swapon /dev/sdb1
# 查看 swap 分区
[root@DNS ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1572860 0 -2
/dev/sdb1 partition 2097148 155904 -3
# 关闭分区并修改其挂载优先级
[root@DNS ~]# swapoff /dev/sdb1
[root@DNS ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1572860 39760 -2
[root@DNS ~]# swapon -p 50 /dev/sdb1
[root@DNS ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1572860 41228 -2
/dev/sdb1 partition 2097148 1036 50
持久挂载 swap 分区
# 修改 /etc/fstab 文件内容,并形成持久挂载
# 重定向追加设备 UUID 号
[root@DNS ~]# blkid /dev/sdb1 >> /etc/fstab
[root@DNS ~]# vim /etc/fstab
[root@DNS ~]# cat /etc/fstab
……
UUID=043a21a2-49b6-4fb0-8c02-1cd792548ada swap swap pri=100 0 0
文件挂载 swap 功能
[root@DNS ~]# dd if=/dev/zero of=/swapfile bs=1M count=2048
[root@DNS ~]# mkswap /swapfile
[root@DNS ~]# swapon /swapfile
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
[root@DNS ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1572860 34608 -2
/dev/sdb1 partition 2097148 206300 50
/swapfile file 2097148 0 -3
# 是先吃就挂在
[root@DNS ~]# vim /etc/fstab
[root@DNS ~]# blkid /swapfile
/swapfile: UUID="8d892eff-abb6-4988-a2bb-bdfbc089e79c" TYPE="swap"
[root@DNS ~]# blkid /swapfile >> /etc/fstab
[root@DNS ~]# vim /etc/fstab
[root@DNS ~]# swapoff /swapfile
[root@DNS ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1572860 34480 -2
/dev/sdb1 partition 2097148 206348 50
[root@DNS ~]# swapon -a
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
[root@DNS ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1572860 34480 -2
/dev/sdb1 partition 2097148 206348 50
/swapfile file 2097148 0 -3
swap 的使用策略
# 内存剩余量到达百分之 30 时就开始使用 swap 分区
[root@DNS ~]# cat /proc/sys/vm/swappiness
30
磁盘常用工具
文件系统空间实际真正占用等信息的查看工具
df [option] ... [file] ...
-H 以 10 为单位
-T 文件系统类型
-h 人性化显示
-i 显示 inode 号
-P 以 posix 兼容的格式输出
lsblk -f # 显示 UUID
[root@DNS ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 0647764e-3ad2-4e20-914f-5410790baa8e /boot
└─sda2 LVM2_member YgN8KU-H3yt-PBy2-fR7V-R2ce-Lp5V-UmvdRO
├─cl-root xfs 1b5032d1-3ad6-404e-8bb9-25a152bc5009 /
└─cl-swap swap 1fcfe582-cda7-4e06-ae69-7c54bd3f2066 [SWAP]
sdb
sr0
# du 命令,查看每个文件显示占用磁盘的大小
du [option] [path]
-s sum 显示目录下文件和
-h 人性化显示
-x 不显示不同文件系统的
--max-depth=1 只查询等级为 1 的文件大小
[root@DNS ~]# du -h -x --max-depth=1
dd 命令
dd if=/PATH of=/PATH [option]
if # 读文件名
of # 写文件名
ibs # 读取文件的块 size
obs # 写入文件的块 size
seek # 跳过 obs 的大小
skip # 跳过 Ibs 的大小
bs # 定义块的大小
count # 执行次数
conv=coversion # 用指定的参数转换文件
conversion 转换参数:
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截短输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
fdatasync 写完成前,物理写入输出文件
例:备份磁盘 /dev/sdb 将该磁盘打包并备份到 sdb.image
[root@DNS ~]# dd if=/dev/sdb | gzip > sdb.image
例:将备份的文件解压并恢复到磁盘中
[root@DNS ~]# gzip -dc sdb.image | dd of=/dev/sdxx
例:seek 与 skip 的不同
[root@DNS /]# echo 123456 > 1.txt
[root@DNS /]#
[root@DNS /]#
[root@DNS /]# dd if=1.txt of=2.txt bs=1 count=2 skip ^C
[root@DNS /]# echo abcdefg > 2.txt
[root@DNS /]# dd if=1.txt of=2.txt bs=1 count=3 skip=3 seek=3
3+0 records in
3+0 records out
3 bytes copied, 6.8869e-05 s, 43.6 kB/s
[root@DNS /]# cat 2.txt
abc456
例:使用 notrunc 之后
[root@DNS /]# cat 1.txt
123456
[root@DNS /]# echo abcdefg > 2.txt
[root@DNS /]# dd if=1.txt of=2.txt bs=1 count=3 skip=3 seek=3 conv=notrunc
3+0 records in
3+0 records out
3 bytes copied, 4.4281e-05 s, 67.7 kB/s
[root@DNS /]# cat 2.txt
abc456g
RAID
利用虚拟化技术,将多个硬盘组装起来,在其内部实现冗余。在物理上提高读写性能。
RAID 0
简介 | 优点 | 缺点 |
---|---|---|
带区卷:将两块磁盘绑定到一起的方式读写数据 | 提高了读写速率 | 无冗余 |
RAID 1
简介 | 优点 | 缺点 |
---|---|---|
镜像卷:有一块磁盘是作为备份使用的,不存储任何数据,同步一块磁盘 | 有冗余,允许一块磁盘损坏 | 读写速率降低 |
RAID 4
简介 | 优点 | 缺点 |
---|---|---|
通过异或取出磁盘内数据的异或校验值 | 有冗余能力,允许一块磁盘坏掉 | 冗余磁盘经常坏 |
RAID 5
简介 | 优点 | 缺点 |
---|---|---|
将异或值存储到不同的磁盘,当一块磁盘损坏后会通过异或值立马恢复数据 | 读写速度增加,允许一块磁盘损坏 | |
RAID 6
简介 | 优点 | 缺点 |
---|---|---|
一个 RAID 6 卷中有两个校验码,形成双备份。 | 读写性能提升,允许两块磁盘损坏 | |
RAID 10
简介 | 优点 | 缺点 |
---|---|---|
将 RAID 1 与 0 组合起来,在 1 镜像卷之上组成一个 0 | 不仅有了带区卷的速度,又有了镜像卷的备份 | 容错率三分之一 |
RAID 01
简介 | 优点 | 缺点 |
---|---|---|
将 RAID 0 与 1 组合起来,在 0 带区卷之上组成一个 1 | 不仅有了带区卷的速度,又有了镜像卷的备份 | 容错率三分之二 |
RAID 50
在 RAID 5 的基础之上建立 RAID 0 提升读写速度,并且使用 RAID 5 增加冗余,允许每个 RAID 坏一块磁盘
RAID 60
在 RAID 6 的基础上建立 RAID 0 提升读写速度,每个 RAID 卷可以坏两块磁盘
JBOD
将所有磁盘的空间存储整合成一个连续的存储空间
RAID 7
RAID 7并非公开的RAID标准,而是Storage Computer Corporation的专利硬件产品名称,RAID 7是以RAID 3及RAID 4为基础所发展,但是经过强化以解决原来的一些限制。另外,在实现中使用大量的缓冲存储器以及用以实现异步数组管理的专用即时处理器,使得RAID 7可以同时处理大量的IO要求,所以性能甚至超越了许多其他RAID标准的实做产品。但也因为如此,在价格方面非常的高昂。
实现软 RAID
mdadm:模式化工具
mdadm [mode] <raiddevice> [options] <component-devices>
常用选项说明
模式:
创建:-C
装配:-A
监控:-F
管理:-f, -r, -a
<raiddevice>: /dev/md#
<component-devices>: 任意块设备
-C: 创建模式
-n #: 使用#个块设备来创建此RAID
-l #:指明要创建的RAID的级别
-a {yes|no}:自动创建目标RAID设备的设备文件
-c CHUNK_SIZE: 指明块大小,单位k
-x #: 指明空闲盘的个数
-D:显示raid的详细信息
mdadm -D /dev/md#
管理模式:
-f: 标记指定磁盘为损坏
-a: 添加磁盘
-r: 移除磁盘
观察 md 的状态:cat /proc/mdstat
#使用mdadm创建并定义RAID设备
mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}1
#用文件系统对每个RAID设备进行格式化
mkfs.xfs /dev/md0
#使用mdadm检查RAID设备的状况
mdadm --detail|D /dev/md0
#增加新的成员
mdadm –G /dev/md0 –n4 -a /dev/sdf1
#模拟磁盘故障
mdadm /dev/md0 -f /dev/sda1
#移除磁盘
mdadm /dev/md0 –r /dev/sda1
#在备用驱动器上重建分区
mdadm /dev/md0 -a /dev/sda1
#系统日志信息
cat /proc/mdstat
生成配置文件: mdadm –D –s >> /etc/mdadm.conf
停止设备: mdadm –S /dev/md0
激活设备: mdadm –A –s /dev/md0
强制启动: mdadm –R /dev/md0
删除raid信息:mdadm --zero-superblock /dev/sdb1
逻辑卷管理器(LVM)
简介
在逻辑上将所有磁盘的容量整合到一起,然后在逻辑上分出对应的设备名。
软连接
- /dev/mapper/VG_NAME-LV_NAME
- /dev/VG_NAME/LV_NAME
术语解释
- 物理卷:将磁盘转换为带有 PE 单位的物理卷
- PE 单位:类似于磁盘中的 block 块大小,缺省为 4M 大小
- 卷组:将物理卷整合为一个卷组
- 逻辑卷:卷组中划分出的区域,称之为逻辑卷
创建逻辑卷步骤
逻辑卷依赖包 lvm2(yum install lvm2)
1. 将磁盘创建为物理卷
2. 将物理卷整合成为卷组
3. 从卷组中提取逻辑卷
创建物理卷
pvcreate [devuce_name] # 创建物理卷
pvscan # 查看系统物理卷
pvdisplay # 查看物理卷详细信息
pvs # 查看物理卷
pvremove # 将磁盘的 pv 属性删除,使其不再具有 pv 属性
pvmove # 移动物理卷 PE
vgcreate [vg_name] [device_name] ... # 创建卷组
-s # 指定 PE 容量
vgchange -a y/n vg_name # 关闭或开启卷组
vgreduce [vg_name] [device_name] # 从指定卷组中删除指定物理卷
vgextend [vg_name] [device_name] # 将指定的物理卷添加到指定卷组中
vgremove [vg_name] # 删除指定卷组
vgscan # 查看卷组
vgdisplay # 查看卷组详细信息
例:[root@DNS ~]# vgcreate -s 16M vg0 /dev/sdc1 /dev/sdc2
lvcreate -L|--size Size[m|UNIT] VG # 创建逻辑卷
# 在线扩展逻辑卷
lvextend -L [+][mMgGtT] /dev/[vg_name]/[device_name]
lvreduce -L [-][mMgGtT] mountpoint
resize2fs /dev/mapper/vg0-data # 扩展 ext 类型的文件系统
xfs_growfs /dev/mapper/vg0-data # 扩展 xfs 文件系统
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
缩减逻辑卷
# 建议先备份后缩减,xfs
[root@DNS /]# df -Th
……
/dev/mapper/vg0-data ext4 2.7G 3.8M 2.6G 1% /mnt
# 第一步:缩小文件系统
# 因为是 ext 文件系统送一使用 resize2fs
# resize2fs 命令,如果在最后加上 - 号则是减去多少,如果没有任何符号那么将是缩减后的容量
[root@DNS /]# resize2fs /dev/mapper/vg0-data 1G
resize2fs 1.45.4 (23-Sep-2019)
Please run 'e2fsck -f /dev/mapper/vg0-data' first.
# 第二步:使用 fsck 检查文件系统
[root@DNS /]# e2fsck -f /dev/mapper/vg0-data
e2fsck 1.45.4 (23-Sep-2019)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vg0-data: 14/180224 files (0.0% non-contiguous), 20472/719872 blocks
# 第三步:调整文件系统大小
[root@DNS /]# resize2fs /dev/mapper/vg0-data 1G
resize2fs 1.45.4 (23-Sep-2019)
Resizing the filesystem on /dev/mapper/vg0-data to 262144 (4k) blocks.
The filesystem on /dev/mapper/vg0-data is now 262144 (4k) blocks long.
# 第四步:挂载分区查看容量
[root@DNS /]# mount /dev/mapper/vg0-data /mnt/
[root@DNS /]# df -h
……
/dev/mapper/vg0-data 976M 3.2M 909M 1% /mnt
# 查看结果,发现 lvs 查看后的结果依然是 2.75 G,并没有缩减,缩减的只是文件系统而已
[root@DNS /]# lvdisplay
--- Logical volume ---
LV Path /dev/vg0/data
LV Name data
VG Name vg0
LV UUID Bcikw2-ZKFF-Ksrl-M0E1-9kON-HGAH-is942E
LV Write Access read/write
LV Creation host, time DNS, 2020-08-18 01:13:44 -0400
LV Status available
# open 1
LV Size <2.75 GiB
Current LE 703
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
# 第五步:删除逻辑卷内的内容
[root@DNS /]# lvreduce -L 1G /dev/vg0/data
WARNING: Reducing active and open logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/data? [y/n]: y
Size of logical volume vg0/data changed from <2.75 GiB (703 extents) to 1.00 GiB (256 extents).
Logical volume vg0/data successfully resized.
# 查看,删除成功,容量成功缩减为 1G
[root@DNS /]# lvdisplay
--- Logical volume ---
LV Path /dev/vg0/data
LV Name data
VG Name vg0
LV UUID Bcikw2-ZKFF-Ksrl-M0E1-9kON-HGAH-is942E
LV Write Access read/write
LV Creation host, time DNS, 2020-08-18 01:13:44 -0400
LV Status available
# open 1
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
逻辑卷数据迁移
1 在旧系统中,umount 所有卷组上的逻辑卷 2 禁用卷组
vgchange –a n vg0 lvdisplay
3 导出卷组
vgexport vg0 pvscan
vgdisplay
4 拆下旧硬盘在目标计算机上,并导入卷组:
vgimport vg0
5 启用
vgchange –ay vg0
6 mount 所有卷组上的逻辑卷
拆除指定的 pv 存储设备
[root@DNS /]# vgextend vg0 /dev/sdc2
Volume group "vg0" successfully extended
[root@DNS /]# pvdisplay
--- Physical volume ---
PV Name /dev/sdc1
VG Name vg0
PV Size 5.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 1279
Free PE 1023
Allocated PE 256
PV UUID fIp49z-xU0S-yf40-Pbr6-QDKa-QmdS-uB5n3V
--- Physical volume ---
PV Name /dev/sdc2
VG Name vg0
PV Size 5.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 1279
Free PE 1279
Allocated PE 0
PV UUID qWjfBM-IagU-aJ20-WsGu-llTm-vl3t-xaCLIv
[root@DNS /]# pvmove /dev/sdc1
/dev/sdc1: Moved: 33.98%
/dev/sdc1: Moved: 100.00%
[root@DNS /]# vgreduce vg0 /dev/sdc1
Removed "/dev/sdc1" from volume group "vg0"
[root@DNS /]# pvremove /dev/sdc1
Labels on physical volume "/dev/sdc1" successfully wiped.
[root@DNS /]# mount /dev/mapper/
cl-root cl-swap control vg0-data
[root@DNS /]# mount /dev/mapper/vg0-data /mnt/
[root@DNS /]# cd mnt/
# 数据依然存在
[root@DNS mnt]# ls
1.txt 2.txt 3.txt lost+found
LVM 快照功能
快照是个特殊的逻辑卷,必须与被快照的 lvm 卷在同一个卷组。
逻辑卷快照工作原理
- 生成快照时系统会分配给她一部分空间,只有原本数据发生改变时快照就会存储下来。
- 删除原本快照的 lv 分区时,那么快照区域会将删除的文件存储下来
- 如果文件被更新那么快照区域同样会保存下来
实现逻辑卷快照
# 恢复的时候从快照中直接复制即可
[root@DNS mnt]# lvcreate -s -L 1G -n snap1 /dev/vg0/data
[root@DNS mnt]# mount /dev/mapper/vg0-data /media/
[root@DNS mnt]# mount /dev/mapper/vg0-snap1 /mnt/
[root@DNS mnt]# ll /mnt/ /media/
/media/:
total 16
-rw-r--r-- 1 root root 0 Aug 18 01:22 1.txt
-rw-r--r-- 1 root root 0 Aug 18 01:22 2.txt
-rw-r--r-- 1 root root 0 Aug 18 01:22 3.txt
drwx------ 2 root root 16384 Aug 18 01:21 lost+found
/mnt/:
total 16
-rw-r--r-- 1 root root 0 Aug 18 01:22 1.txt
-rw-r--r-- 1 root root 0 Aug 18 01:22 2.txt
-rw-r--r-- 1 root root 0 Aug 18 01:22 3.txt
drwx------ 2 root root 16384 Aug 18 01:21 lost+found
# 恢复快照
umount /dev/vg0/snap1
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data
# 删除快照
umount /mnt/snap
lvremove /dev/vg0/snap1
# 如果 uuid 相同,那么就使用 mount -o nouuid 进行挂载即可