磁盘存储和文件系统

1 磁盘结构

1.1 设备文件

一切皆文件:open(), read(), write(), close()
设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信
设备号码:
        主设备号:major number, 标识设备类型
        次设备号:minor number, 标识同一类型下的不同设备
设备类型:
        块设备:block,存取单位“块”,磁盘
        字符设备:char,存取单位“字符”,键盘
磁盘设备的设备文件命名:

/dev/DEV_FILE
/dev/sdX  # SAS,SATA,SCSI,IDE,USB
/dev/nvme0n#  #nvme协议硬盘,如:第一个硬盘:nvme0n1,第二个硬盘:nvme0n2

虚拟磁盘:

/dev/vd
/dev/xvd

不同磁盘标识:a-z,aa,ab…

#例:
/dev/sda,/dev/sdb, ...

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

/dev/sda1
/dev/sda5
#例:创建设备文件
[root@centos8 ~]#df /boot
Filesystem   1K-blocks  Used Available Use% Mounted on
/dev/sda1     999320 130848   799660  15% /boot
[root@centos8 ~]#ls /boot
config-4.18.0-147.el8.x86_64               loader
efi                           lost+found
grub2                          System.map-4.18.0-
147.el8.x86_64
initramfs-0-rescue-5b85fc7444b240a992c42ce2a9f65db5.img vmlinuz-0-rescue-
5b85fc7444b240a992c42ce2a9f65db5
initramfs-4.18.0-147.el8.x86_64.img           vmlinuz-4.18.0-
147.el8.x86_64
initramfs-4.18.0-147.el8.x86_64kdump.img
[root@centos8 ~]#mknod /data/partition-sda1 b 8 1
[root@centos8 ~]#ll /data/partition-sda1
brw-r--r-- 1 root root 8, 1 Apr 13 09:15 /data/partition-sda1
[root@centos8 ~]#mount /data/partition-sda1 /mnt/
[root@centos8 ~]#ls /mnt
config-4.18.0-147.el8.x86_64               loader
efi                           lost+found
grub2                          System.map-4.18.0-
147.el8.x86_64
initramfs-0-rescue-5b85fc7444b240a992c42ce2a9f65db5.img vmlinuz-0-rescue-
5b85fc7444b240a992c42ce2a9f65db5
initramfs-4.18.0-147.el8.x86_64.img           vmlinuz-4.18.0-
147.el8.x86_64
initramfs-4.18.0-147.el8.x86_64kdump.img
[root@centos8 ~]#ll /dev/zero
crw-rw-rw- 1 root root 1, 5 Apr 13 08:03 /dev/zero
[root@centos8 ~]#mknod /data/zero c 1 5
[root@centos8 ~]#ll /data/zero
crw-r--r-- 1 root root 1, 5 Apr 13 09:17 /data/zero




#例: 操纵设备文件
[root@centos8 ~]#ll /dev/null /dev/zero    
crw-rw-rw- 1 root root 1, 3 Aug 14  2020 /dev/null
crw-rw-rw- 1 root root 1, 5 Aug 14  2020 /dev/zero
[root@centos8 ~]#mknod /data/testdev c 1 5
[root@centos8 ~]#ll /data/testdev
crw-r--r-- 1 root root 1, 5 Aug 14 09:26 /data/testdev
[root@centos8 ~]#dd if=/data/testdev of=/data/test1.img bs=1 count=10
10+0 records in
10+0 records out
10 bytes copied, 9.0379e-05 s, 111 kB/s
[root@centos8 ~]#ll /data/test1.img
-rw-r--r-- 1 root root 10 Aug 14 09:27 /data/test1.img
[root@centos8 ~]#hexdump -C /data/test1.img
00000000  00 00 00 00 00 00 00 00  00 00          |..........|
0000000a

[root@centos8 ~]#rm -f /data/testdev
[root@centos8 ~]#ll /data
total 4
-rw-r--r-- 1 root root 10 Aug 14 09:27 test1.img

[root@centos8 ~]#cp /dev/zero /data/zero
^C
[root@centos8 ~]#ll -h /data/zero
-rw-r--r-- 1 root root 155M Aug 14 09:29 /data/zero
[root@centos8 ~]#ll -h /data/zero /dev/zero
-rw-r--r-- 1 root root 155M Aug 14 09:29 /data/zero
crw-rw-rw- 1 root root 1, 5 Aug 14  2020 /dev/zero
[root@centos8 ~]#cp -a /dev/zero /data/zero
cp: overwrite '/data/zero'? y
[root@centos8 ~]#ll /data/zero
crw-rw-rw- 1 root root 1, 5 Aug 14  2020 /data/zero

1.2 硬盘类型

硬盘接口类型
        IDE:133MB/s,并行接口,早期家用电脑
        SCSI:640MB/s,并行接口,早期服务器
        SATA:6Gbps,SATA数据端口与电源端口是分开的,即需要两条线,一条数据线,一条电源线
        SAS:6Gbps,SAS是一整条线,数据端口与电源端口是一体化的,SAS中是包含供电线的,而SATA中不包含供电线。SATA标准其实是SAS标准的一个子集,二者可兼容,SATA硬盘可以插入SAS主板上,反之不行
        USB:480MB/s
        M.2:
注意:速度不是由单纯的接口类型决定,支持Nvme协议硬盘速度是最快的
服务器硬盘大小
        LFF:3.5寸,一般见到的那种台式机硬盘的大小
        SFF:Small Form Factor 小形状因数,2.5寸,注意不同于2.5寸的笔记本硬盘
L、S分别是大、小的意思,目前服务器或者盘柜采用sff规格的硬盘主要是考内虑增大单位密度内的磁盘容量、增强散热、减小功耗

 1.3 机械硬盘和固态硬盘

机械硬盘(HDD):Hard Disk Drive,即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。机械硬盘中所有的盘片都装在一个旋转轴上,每张盘片之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距离比头发丝的直径还小,所有的磁头联在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向运动,加上盘片每分钟几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上,也可以通过相反方式读取。硬盘为精密设备,进入硬盘的空气必须过滤
固态硬盘(SSD):Solid State Drive,用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也与普通硬盘一致
相较于HDD,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优势,SSD传输速率性能是HDD的2倍

相较于SSD,HDD在价格、容量占有绝对优势硬盘有价,数据无价,目前SSD不能完全取代HHD

1.4 硬盘存储术语

硬盘存储术语 CHS
        head:磁头 磁头数=盘面数
        track:磁道 磁道=柱面数
        sector:扇区,512bytes
        cylinder:柱面 1柱面=512 * sector数/track*head数=512*63*255=7.84M
        CentOS 5 之前版本 Linux 以柱面的整数倍划分分区,CentOS 6之后可以支持以扇区划分分区

#
[root@centos6 ~]#echo "scale=2;512*63*255/1024/1024" |bc
7.84
#查看CHS
[root@centos6 ~]#fdisk -l /dev/sda
Disk /dev/sda: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors/track, 26108 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: 0x0006fc79
 Device Boot   Start     End   Blocks  Id System
/dev/sda1  *      1     131   1048576  83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2       131    12879  102400000  83 Linux
/dev/sda3      12879    19253   51200000  83 Linux
/dev/sda4      19253    26109   55065600   5 Extended
/dev/sda5      19254    19515   2097152  82 Linux swap / Solaris
[root@centos8 ~]#fdisk -u=cylinder -l /dev/sda
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Geometry: 255 heads, 2 sectors/track, 26108 cylinders
Units: cylinders of 510 * 512 = 261120 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x59474ddc
Device   Boot Start  End Cylinders Size Id Type
/dev/sda1 *     5  4117    4113  1G 83 Linux
/dev/sda2     4117 415323   411207 100G 83 Linux
/dev/sda3    415323 620926   205604  50G 83 Linux
/dev/sda4    620926 822413   201488  49G  5 Extended
/dev/sda5    620930 629154    8225  2G 82 Linux swap / Solaris



#例:识别SSD和机械硬盘类型
#1表示机械,0表示SSD
[root@centos8 ~]#lsblk -d -o name,rota
NAME  ROTA
sda     1
sr0     1
nvme0n1   0
nvme0n2   0
[root@centos8 ~]#ls /sys/block/
nvme0n1 nvme0n2 sda sr0
[root@centos8 ~]#cat /sys/block/*/queue/rotational
0
0
1
1
[root@centos8 ~]#cat /sys/block/sda/queue/rotational
1
[root@centos8 ~]#cat /sys/block/sr0/queue/rotational
1
[root@centos8 ~]#cat /sys/block/nvme0n1/queue/rotational
0
[root@centos8 ~]#cat /sys/block/nvme0n2/queue/rotational
0



#例: 测速
[root@ubuntu1804 ~]#dd | hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 1854 MB in  3.00 seconds = 617.80 MB/sec

2 管理存储

使用磁盘空间过程
        1. 设备分区
        2. 创建文件系统
        3. 挂载新的文件系统

2.1 磁盘分区

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

2.2 分区方式

两种分区方式:MBR,GPT

*MBR分区

MBR:Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T
划分分区的单位:
        CentOS 5 之前按整柱面划分
        CentOS 6 版本后可以按Sector划分
0磁道0扇区:512bytes
        446bytes: boot loader 启动相关
        64bytes:分区表,其中每16bytes标识一个分区
        2bytes: 55AA,标识位
MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5
MBR分区结构

磁盘存储和文件系统_第1张图片

磁盘存储和文件系统_第2张图片

 主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序
出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节
分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个
字节,共64字节为分区项1、分区项2、分区项3、分区项4
结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA

MBR中DPT结构

磁盘存储和文件系统_第3张图片

#例: 备份MBR的分区表,并破坏后恢复
#备份MBR分区表
[root@centos8 ~]#dd if=/dev/sda of=/data/dpt.img bs=1 count=64 skip=446
[root@centos8 ~]#scp /data/dpt.img 10.0.0.102:

#破坏MBR分区表
[root@centos8 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446

#无法启动
[root@centos8 ~]#reboot

#用光盘启动,进入rescue mode,选第3项skip to shell
#配置网络
#ifconfig ens160 10.0.0.8/24
#ip a a 10.0.0.8/24 dev ens160

#scp 10.0.0.102:/root/dpt.img .

#恢复MBR分区表
#dd if=dpt.img of=/dev/sda bs=1 seek=446
#reboot

 *GPT分区

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

GPT分区结构分为4个区域:
GPT头
分区表
GPT分区
备份区域 

磁盘存储和文件系统_第4张图片

2.3 BIOS和UEFI

BIOS是固化在电脑主板上的程序,主要用于开机系统自检和引导操作系统。目前新式的电脑基本上都是UEFI启动

BIOS(Basic Input Output System 基本输入输出系统)主要完成系统硬件自检和引导操作系统,操作系统开始启动之后,BIOS的任务就完成了。系统硬件自检:如果系统硬件有故障,主板上的扬声器就会发出长短不同的“滴滴”音,可以简单的判断硬件故障,比如“1长1短”通常表示内存故障,“1长3短”通常表示显卡故障

BIOS在1975年就诞生了,使用汇编语言编写,当初只有16位,因此只能访问1M的内存,其中前640K称为基本内存,后384K内存留给开机和各类BIOS本身使用。BIOS只能识别到主引导记录(MBR)初始化的硬盘,最大支持2T的硬盘,4个主分区(逻辑分区中的扩展分区除外),而目前普遍实现了64位系统,传统的BIOS已经无法满足需求了,这时英特尔主导的EFI就诞生了

EFI(Extensible Firmware Interface)可扩展固件接口,是 Intel 为 PC 固件的体系结构、接口和服务提出的建议标准。其主要目的是为了提供一组在 OS 加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做是BIOS 的继任者,或者理解为新版BIOS。
UEFI是由EFI1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified EFI Form的国际组织

UEFI(Unified Extensible Firmware Interface)统一的可扩展固件接口, 是一种详细描述类型接口的标准。UEFI 相当于一个轻量化的操作系统,提供了硬件和操作系统之间的一个接口,提供了图形化的操作界面。最关键的是引入了GPT分区表,支持2T以上的硬盘,硬盘分区不受限制

*BIOS和UEFI区别

BIOS采用了16位汇编语言编写,只能运行在实模式(内存寻址方式由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位偏移地址形成20位的物理地址)下,可访问的内存空间为1MB,只支持字符操作界面

UEFI采用32位或者64位的C语言编写,突破了实模式的限制,可以达到最大的寻址空间,支持图形操作
界面,使用文件方式保存信息,支持GPT分区启动,适合和较新的系统和硬件的配合使用

磁盘存储和文件系统_第5张图片

 2.4 管理分区

#列出块设备:
    lsblk


#创建分区命令
fdisk 管理MBR分区
gdisk 管理GPT分区
parted 高级分区操作,可以是交互或非交互方式


#重新设置内存中的内核分区表版本,适合于除了CentOS 6 以外的其它版本 5,7,8
    partprobe


#parted 命令
注意:parted的操作都是实时生效的,小心使用

#格式:
parted [选项]... [设备 [命令 [参数]...]...]

#例:
parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print
parted /dev/sdb mkpart primary 1 200 (默认M)
parted /dev/sdb rm 1
parted -l  列出所有硬盘分区信息


#例:
[root@centos8 ~]#parted /dev/sdb print
Error: /dev/sdb: unrecognised disk label
Model: VMware, VMware Virtual S (scsi)                  
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

[root@centos8 ~]#parted /dev/sdb mklabel gpt
Information: You may need to update /etc/fstab.

[root@centos8 ~]#parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags

[root@centos8 ~]#parted /dev/sdb mkpart primary 1 1001
Information: You may need to update /etc/fstab.

[root@centos8 ~]#parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start  End   Size  File system Name   Flags
1   1049kB 1001MB 1000MB        primary

[root@centos8 ~]#parted /dev/sdb mkpart primary 1002 1102
Information: You may need to update /etc/fstab.

[root@centos8 ~]#parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start  End   Size  File system Name   Flags
1   1049kB 1001MB 1000MB        primary
2   1002MB 1102MB  99.6MB        primary

[root@centos8 ~]#parted /dev/sdb rm 2
Information: You may need to update /etc/fstab.

[root@centos8 ~]#parted /dev/sdb print                  
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start  End   Size  File system Name   Flags
1   1049kB 1001MB 1000MB        primary

[root@centos8 ~]#parted /dev/sdb mklabel msdos
Warning: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? Y
Information: You may need to update /etc/fstab.

[root@centos8 ~]#parted /dev/sdb print             
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags

[root@centos8 ~]#parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help
align-check TYPE N            check partition N for TYPE(min|opt)
alignment
help [COMMAND]              print general help, or help on
COMMAND
mklabel,mktable LABEL-TYPE        create a new disklabel (partition
table)
mkpart PART-TYPE [FS-TYPE] START END   make a partition
name NUMBER NAME             name partition NUMBER as NAME
print [devices|free|list,all|NUMBER]   display the partition table,
available devices, free space, all found partitions, or a particular partition
quit                   exit program
rescue START END             rescue a lost partition near START
and END
resizepart NUMBER END          resize partition NUMBER
 rm NUMBER                delete partition NUMBER
select DEVICE              choose the device to edit
disk_set FLAG STATE           change the FLAG on selected device
disk_toggle [FLAG]            toggle the state of FLAG on selected
device
 set NUMBER FLAG STATE          change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]]          toggle the state of FLAG on partition
NUMBER
unit UNIT                 set the default unit to UNIT
version                 display the version number and
copyright information of GNU Parted
(parted)

2.4.1分区工具fdisk和gdisk

fdisk -l [-u] [device...]    查看分区
fdisk [device...]       管理MBR分区
gdisk [device...]       类fdisk 的GPT分区工具


#子命令:
p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存并退出


#查看内核是否已经识别新的分区
cat /proc/partitions



#例:非交互式创建分区
echo -e 'n\np\n\n\n+2G\nw\n' | fdisk /dev/sdc



#例:
#增加了6,7分区
[root@centos6 ~]#fdisk /dev/sda
Command (m for help): w
The partition table has been altered!
WARNING: Re-reading the partition table failed with error 16: Device or resource
busy.
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)
Syncing disks.


#分区表不同步
[root@centos6 ~]#lsblk
NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0   11:0   1  3.7G  0 rom 
sda    8:0   0 200G  0 disk
├─sda1  8:1   0  1G  0 part /boot
├─sda2  8:2   0 97.7G  0 part /
├─sda3  8:3   0 48.8G  0 part /data
├─sda4  8:4   0  1K  0 part
└─sda5  8:5   0  2G  0 part [SWAP]

#同步分区表
[root@centos6 ~]#partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
BLKPG: Device or resource busy
error adding partition 4
BLKPG: Device or resource busy
error adding partition 5
[root@centos6 ~]#lsblk
NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0   11:0   1  3.7G  0 rom 
sda    8:0   0 200G  0 disk
├─sda1  8:1   0  1G  0 part /boot
├─sda2  8:2   0 97.7G  0 part /
├─sda3  8:3   0 48.8G  0 part /data
├─sda4  8:4   0  1K  0 part
├─sda5  8:5   0  2G  0 part [SWAP]
├─sda6  8:6   0  2G  0 part
└─sda7  8:7   0  3G  0 part


#删除了6,7分区
[root@centos6 ~]#fdisk /dev/sda
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource
busy.
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)
Syncing disks.
[root@centos6 ~]#

[root@centos6 ~]#lsblk
NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0   11:0   1  3.7G  0 rom 
sda    8:0   0 200G  0 disk
├─sda1  8:1   0  1G  0 part /boot
├─sda2  8:2   0 97.7G  0 part /
├─sda3  8:3   0 48.8G  0 part /data
├─sda4  8:4   0  1K  0 part
├─sda5  8:5   0  2G  0 part [SWAP]
├─sda6  8:6   0  2G  0 part
└─sda7  8:7   0  3G  0 part


#同步分区表
[root@centos6 ~]#partx -d --nr 6-7 /dev/sda
[root@centos6 ~]#lsblk
NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0   11:0   1  3.7G  0 rom 
sda    8:0   0 200G  0 disk
├─sda1  8:1   0  1G  0 part /boot
├─sda2  8:2   0 97.7G  0 part /
├─sda3  8:3   0 48.8G  0 part /data
├─sda4  8:4   0  1K  0 part
└─sda5  8:5   0  2G  0 part [SWAP]



#例: 批量创建分区
[root@centos8 ~]#echo -e 'n\np\n\n\n+1G\nw' | fdisk /dev/sdb
[root@centos8 ~]#fdisk /dev/sdb <

3文件系统

3.1文件系统概念

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

#查看支持的文件系统:
/lib/modules/`uname -r`/kernel/fs


#各种文件系统:https://en.wikipedia.org/wiki/Comparison_of_file_systems

#帮助:man 5 fs

3.2文件系统类型

Linux 常用文件系统
        ext2:Extended file system 适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区
        ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复
        ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
        xfs:SGI,支持最大8EB的文件系统
        swap
        iso9660 光盘
        btrfs(Oracle)
        reiserfs

Windows 常用文件系统
        FAT32
        NTFS
        exFAT

Unix:
        FFS(fast)
        UFS(unix)
        JFS2

网络文件系统:
        NFS
        CIFS

集群文件系统:

        GFS2
        OCFS2(oracle)

分布式文件系统:
        fastdfs
        ceph
        moosefs
        mogilefs
        glusterfs
        Lustre

RAW:
裸文件系统,未经处理或者未经格式化产生的文件系统

常用的文件系统特性:

#查看当前支持的文件系统:
    cat /proc/filesystems

FAT32
    最多只能支持16TB的文件系统和4GB的文件

NTFS
    最多只能支持16EB的文件系统和16EB的文件

EXT3
    最多只能支持32TB的文件系统和2TB的文件,实际只能容纳2TB的文件系统和16GB的文件
    Ext3目前只支持32000个子目录
    Ext3文件系统使用32位空间记录块数量和 inode数量
    当数据写入到Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块

EXT4:
    EXT4是Linux系统下的日志文件系统,是EXT3文件系统的后继版本
    Ext4的文件系统容量达到1EB,而支持单个文件则达到16TB
    理论上支持无限数量的子目录
    Ext4文件系统使用64位空间记录块数量和 inode数量
    Ext4的多块分配器支持一次调用分配多个数据块

修复速度更快
    XFS
    根据所记录的日志在很短的时间内迅速恢复磁盘文件内容
    用优化算法,日志记录对整体文件操作影响非常小
    是一个全64-bit的文件系统,最大可以支持8EB的文件系统,而支持单个文件则达到8EB
    能以接近裸设备I/O的性能存储数据

3.3 文件系统的组成部分

内核中的模块:ext4, xfs, vfat
Linux的虚拟文件系统:VFS
用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat

磁盘存储和文件系统_第6张图片

3.4 文件系统选择管理

3.4.1 创建文件系统

#创建文件管理工具
mkfs命令:
  (1) mkfs.FS_TYPE /dev/DEVICE
    ext4
    xfs
    btrfs
    vfat
  (2) mkfs -t FS_TYPE /dev/DEVICE
    -L 'LABEL' 设定卷标
  
  mke2fs:ext系列文件系统专用管理工具


#常用选项
-t     {ext2|ext3|ext4|xfs} 指定文件系统类型
-b     {1024|2048|4096} 指定块 block 大小
-L     ‘LABEL’ 设置卷标
-j     相当于 -t ext3, mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i      # 为数据空间中每多少个字节创建一个inode;不应该小于block大小
-N      # 指定分区中创建多少个inode
-I     一个inode记录占用的磁盘空间大小,128---4096
-m      # 默认5%,为管理人员预留空间占总空间的百分比
-O     FEATURE[,...] 启用指定特性
-O     ^FEATURE 关闭指定特性



 4.2 查看和管理分区信息

#blkid 可以查看块设备属性信息


#格式:
blkid [OPTION]... [DEVICE]


#常用选项:
-U UUID 根据指定的UUID来查找对应的设备
-L LABEL根据指定的LABEL来查找对应的设备

#e2label:管理ext系列文件系统的LABEL
    e2label DEVICE [LABEL]

#findfs :查找分区
findfs [options] LABEL=

3.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



#例:修改破坏的ext文件系统
[root@centos8 ~]#mount /dev/sdb2 /mnt
[root@centos8 ~]#cp /etc/fstab /mnt/f1
[root@centos8 ~]#cp /etc/fstab /mnt/f2
[root@centos8 ~]#ls /mnt
f1 f2 lost+found
[root@centos8 ~]#dd if=/dev/zero of=/dev/sdb2 bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00128317 s, 817 MB/s
[root@centos8 ~]#ls /mnt
[root@centos8 ~]#tune2fs -l /dev/sdb2
tune2fs 1.44.6 (5-Mar-2019)
tune2fs: Bad magic number in super-block while trying to open /dev/sdb2
[root@centos8 ~]#df
Filesystem        1K-blocks         Used Available Use% Mounted
on
devtmpfs           391676           0   391676  0% /dev
tmpfs             408092           0   408092  0% /dev/shm
tmpfs             408092         5824   402268  2% /run
tmpfs             408092           0   408092  0%
/sys/fs/cgroup
/dev/sda2         104806400        4381120 100425280  5% /
/dev/sda3          52403200        398584  52004616  1% /data
/dev/sda1           999320        130848   799660  15% /boot
tmpfs             81616           0   81616  0%
/run/user/0
/dev/sdb2    73786976294838107984 73786976294836115464  1976136 100% /mnt
[root@centos8 ~]#umount /mnt

[root@centos8 ~]#e2fsck /dev/sdb2
e2fsck 1.44.6 (5-Mar-2019)
ext2fs_open2: Bad magic number in super-block
e2fsck: Superblock invalid, trying backup blocks...
test was not cleanly unmounted, check forced.
Resize inode not valid. Recreate? yes
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
Block bitmap differences:  +(98304--98560) +(163840--164096) +(229376--229632) +
(294912--295168)
Fix? yes
Free blocks count wrong for group #0 (24280, counted=24281).
Fix?
test: e2fsck canceled.

test: ***** FILE SYSTEM WAS MODIFIED *****
[root@centos8 ~]#e2fsck /dev/sdb2 -y
e2fsck 1.44.6 (5-Mar-2019)
test was not cleanly unmounted, check forced.
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
Free blocks count wrong for group #0 (24280, counted=24281).
Fix? yes

Free blocks count wrong for group #1 (32511, counted=32509).
Fix? yes

Free blocks count wrong (498131, counted=498130).
Fix? yes

Free inodes count wrong for group #0 (8181, counted=8179).
Fix? yes

Free inodes count wrong (131061, counted=131059).
Fix? yes

Padding at end of inode bitmap is not set. Fix? yes


test: ***** FILE SYSTEM WAS MODIFIED *****
test: 13/131072 files (0.0% non-contiguous), 26158/524288 blocks
[root@centos8 ~]#tune2fs -l /dev/sdb2
tune2fs 1.44.6 (5-Mar-2019)
Filesystem volume name:  test
Last mounted on:     
Filesystem UUID:     c44b3a40-70dc-44d2-8427-b8094f73940a
Filesystem magic number: 0xEF53
Filesystem revision #:  1 (dynamic)
Filesystem features:   has_journal ext_attr resize_inode dir_index filetype
extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize
metadata_csum
Filesystem flags:     signed_directory_hash
Default mount options:  user_xattr acl
Filesystem state:     clean
Errors behavior:     Continue
Filesystem OS type:    Linux
Inode count:        131072
Block count:        524288
Reserved block count:   26214
Free blocks:        498130
Free inodes:        131059
First block:        0
Block size:        4096
Fragment size:       4096
Group descriptor size:   64
Reserved GDT blocks:    255
Blocks per group:     32768
Fragments per group:    32768
Inodes per group:     8192
Inode blocks per group:  512
Flex block group size:   16
Filesystem created:    Mon Apr 13 16:10:06 2020
Last mount time:     n/a
Last write time:     Mon Apr 13 16:57:21 2020
Mount count:        0
Maximum mount count:    -1
Last checked:       Mon Apr 13 16:57:21 2020
Check interval:      0 ()
Lifetime writes:      130 MB
Reserved blocks uid:    0 (user root)
Reserved blocks gid:    0 (group root)
First inode:        11
Inode size:      256
Required extra isize:   32
Desired extra isize:    32
Journal inode:       8
Default directory hash:  half_md4
Directory Hash Seed:   8d4f1f25-ab7c-4fb2-b45d-3d23974edede
Journal backup:      inode blocks
Checksum type:      crc32c
Checksum:         0x7f222e49
[root@centos8 ~]#mount /dev/sdb2 /mnt
[root@centos8 ~]#ls /mnt
f1 f2 lost+found
[root@centos8 ~]#cat /mnt/f1

#
# /etc/fstab
# Created by anaconda on Wed Jan 15 21:39:15 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=f7f53add-b184-4ddc-8d2c-5263b84d1e15 /            xfs  
defaults     0 0
UUID=5c2216e3-ae34-444e-aa60-83cbaebb47e7 /boot          ext4 
defaults     1 2
UUID=9a2293a8-9277-4b18-bae1-498e0b9da145 /data          xfs  
defaults     0 0
UUID=eebe3bc7-6d52-4ad9-86aa-916f1a123fd4 swap          swap 
defaults     0 0
[root@centos8 ~]#

3.5挂载

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为

卸载:为解除此关联关系的过程

把设备关联挂载点:mount Point

挂载点下原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空
进程正在使用中的设备无法被卸载

3.5.1 挂载文件系统 mount

#格式:
mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint


#device:指明要挂载的设备
    设备文件:例如:/dev/sda5
    卷标:-L 'LABEL', 例如 -L 'MYDATA'
    UUID: -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
    伪文件系统名称:proc, sysfs, devtmpfs, configfs


#mountpoint:挂载点目录必须事先存在,建议使用空目录


#常用选项:
-t     fstype 指定要挂载的设备上的文件系统类型,如:ext4,xfs
-r     readonly,只读挂载
-w     read and write, 读写挂载,此为默认设置,可省略
-n     不更新/etc/mtab,mount不可见
-a     自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有
auto功能)
-L 'LABEL'     以卷标指定挂载设备
-U 'UUID'     以UUID指定要挂载的设备
-B, --bind     绑定目录到另一个目录上
-o options:    (挂载文件系统的选项),多个选项使用逗号分隔
async  异步模式,内存更改时,写入缓存区buffer,过一段时间再写到磁盘中,效率高,但不安全
 sync   同步模式,内存更改时,同时写磁盘,安全,但效率低下
atime/noatime     包含目录和文件
diratime/nodiratime     目录的访问时间戳
auto/noauto     是否支持开机自动挂载,是否支持-a选项
exec/noexec     是否支持将文件系统上运行应用程序
dev/nodev     是否支持在此文件系统上使用设备文件
suid/nosuid     是否支持suid和sgid权限
remount     重新挂载
ro/rw     只读、读写 
user/nouser     是否允许普通用户挂载此设备,/etc/fstab使用
acl/noacl     启用此文件系统上的acl功能
loop     使用loop设备
_netdev       当网络可用时才对网络资源进行挂载,如:NFS文件系统
defaults     相当于rw, suid, dev, exec, auto, nouser, async



#挂载规则:
一个挂载点同一时间只能挂载一个设备
一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏
一个设备可以同时挂载到多个挂载点通常挂载点一般是已存在空的目录

3.5.2 卸载文件系统 umount

#卸载时:可使用设备,也可以使用挂载点
    umount 设备名|挂载点

3.5.3 查看挂载情况

#查看挂载
#通过查看/etc/mtab文件显示当前已挂载的所有设备
mount

#查看内核追踪到的已挂载的所有设备
cat /proc/mounts


#查看挂载点情况
findmnt  MOUNT_POINT|device

#查看正在访问指定文件系统的进程
lsof MOUNT_POINT
fuser -v MOUNT_POINT

#终止所有在正访问指定的文件系统的进程
fuser -km MOUNT_POINT

3.5.4 持久挂载

#将挂载保存到 /etc/fstab 中可以下次开机时,自动启用挂载
/etc/fstab格式帮助:man 5 fstab


#每行定义一个要挂载的文件系统,,其中包括共 6 项
    要挂载的设备或伪文件系统
    设备文件
        LABEL:LABEL=""
        UUID:UUID=""
    伪文件系统名称:proc, sysfs
    挂载点:必须是事先存在的目录
    文件系统类型:ext4,xfs,iso9660,nfs,none
    挂载选项:defaults ,acl,bind
    转储频率:0:不做备份 1:每天转储 2:每隔一天转储
    fsck检查的文件系统的顺序:允许的数字是0 1 2
    0:不自检 ,1:首先自检;一般只有rootfs才用 2:非rootfs使用


#添加新的挂载项,需要执行下面命令生效
    mount -a


#例:centos7, 8 /etc/fstab 的分区UUID错误,无法启动
自动进入emergency mode,输入root 密码
#cat /proc/mounts 可以查看到/ 以rw方式挂载
#vim /etc/fstab
#reboot


#例:centos 6 /etc/fstab 的分区UUID错误,无法启动
如果/etc/fstab 的挂载设备出错,比如文件系统故障,并且文件系统检测项(即第6项为非0),将导致无
法启动
自动进入emergency mode,输入root 密码
#cat /proc/mounts 可以查看到/ 以ro方式挂载,无法直接修改配置文件
#mount -o remount,rw /
#vim /etc/fstab
将故障行的最后1项,即第6项修改为0,开机不检测此项挂载设备的健康性,从而忽略错误,能实现启动


#例:/etc/fstab格式
[root@centos8 ~]#cat /etc/fstab
UUID=cb7cae1e-d227-4f64-872b-cd6cce20c911 /data/mysql  ext4  noatime   0 0
/disk.img                                 /data/disk   xfs   loop     0 0
/etc                                      /mnt/etc    none  bind      0 0 

[root@centos6 ~]#cat /etc/fstab
/disk.img        /mnt/disk       ext4   loop       0 0

3.6处理交换文件和分区

3.6.1swap 介绍

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

注意:为优化性能,可以将swap 分布存放,或高性能磁盘存放

#Redhat 官方推荐推荐系统 swap 空间
https://access.redhat.com/documentation/zh-
cn/red_hat_enterprise_linux/7/html/installation_guide/sect-disk-partitioning-
setup-ppc#sect-recommended-partitioning-scheme-ppc

磁盘存储和文件系统_第7张图片

3.6.2 交换分区实现过程

1. 创建交换分区或者文件
2. 使用mkswap写入特殊签名
3. 在/etc/fstab文件中添加适当的条目
4. 使用swapon -a 激活交换空间


#启用swap分区
swapon [OPTION]... [DEVICE]

#常用选项:
-a      #激活所有的交换分区
-p PRIORITY #指定优先级(-1到32767之间),值越大,优先级越高.也可在/etc/fstab文件中的第4列指
定:pri=value


#例:创建swap分区
[root@centos8 ~]#echo -e 'n\np\n\n\n+2G\nt\n82\nw\n' | fdisk /dev/sdc
[root@centos8 ~]#mkswap /dev/sdc1
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=d3140a7a-65b7-4cb7-8a2b-12d38aa98c6f
[root@centos8 ~]#blkid /dev/sdc1
/dev/sdc1: UUID="d3140a7a-65b7-4cb7-8a2b-12d38aa98c6f" TYPE="swap"
PARTUUID="b094d43d-01

[root@centos8 ~]#vim /etc/fstab
UUID=d3140a7a-65b7-4cb7-8a2b-12d38aa98c6f swap     swap defaults 0 0

[root@centos8 ~]#swapon -a
[root@centos8 ~]#free -h
      total    used    free   shared buff/cache  available
Mem:      3.7Gi    264Mi    3.2Gi    9.0Mi    261Mi    3.2Gi
Swap:     4.0Gi     0B    4.0Gi
[root@centos8 ~]#cat /proc/swaps
Filename Type Size Used Priority
/dev/sda5                partition 2097148 0 -2
/dev/sdc1                partition 2097148 0 -3


#禁用swap分区:
swapoff [OPTION]... [DEVICE]


#例:禁用swap分区
[root@centos8 ~]#sed -i.bak '/swap/d' /etc/fstab
[root@centos8 ~]#swapoff -a



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


#例: 修改swap分区的优先级
[root@centos8 ~]#cat /etc/fstab
#
UUID=acf9bd1f-caae-4e28-87be-e53afec61347 /       xfs   defaults    0 0
UUID=1770b87e-db5a-445e-bff1-1653ac64b3d6 /boot     ext4  defaults   1 2
UUID=ffffd919-d674-44d9-a4e7-402874f0a1f0 /data     xfs   defaults    0 0
UUID=409e36d2-ac5e-423f-ad78-9b12db4576bd swap      swap  defaults    0 0
UUID=509ee336-6aec-48b0-b390-12c1f9889520 swap      swap   pri=100    0 0
修改玩优先级之后,要卸载所更改的swap分区使用,swap off /dev/***,然后在启用使之生效,使用swapon -a 命令使其生效

#例: 以文件实现swap功能
[root@centos8 ~]#dd if=/dev/zero of=/swapfile bs=1M count=1024
[root@centos8 ~]#mkswap /swapfile
[root@centos8 ~]#blkid /swapfile >> /etc/fstab
[root@centos8 ~]#/etc/fstab
/swapfile swap     swap  defaults     0 0 #不要用
UUID,使用文件的路径
[root@centos8 ~]#chmod 600 /swapfile
[root@centos8 ~]#swapon -a
[root@centos8 ~]#swapon -s
Filename Type Size Used Priority
/dev/sda5               partition 2097148 0 -2
/swapfile               file   1048572 0 -3


3.6.3 swap的使用策略

#/proc/sys/vm/swappiness 的值决定了当内存占用达到一定的百分比时,会启用swap分区的空间

#使用规则
当内存使用率达到100-swappiness时,会启用交换分区
简单地说这个参数定义了系统对swap的使用倾向,此值越大表示越倾向于使用swap。
可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性


#例:
#说明:CentOS7和8默认值为30,内存在使用到100-30=70%的时候,就开始出现有交换分区的使用。
[root@centos8 ~]# cat /proc/sys/vm/swappiness
30
[root@centos7 ~]# cat /proc/sys/vm/swappiness
30
[root@centos6 ~]# cat /proc/sys/vm/swappiness
60
[root@rhel5 ~]# cat /proc/sys/vm/swappiness
60
root@ubuntu2004:~# cat /proc/sys/vm/swappiness
60
[root@ubuntu1804 ~]# cat /proc/sys/vm/swappiness
60

3.7移动介质

挂载意味着使外来的文件系统看起来如同是主目录树的一部分,所有移动介质也需要挂载,挂载点通常在/media 或/mnt下
访问前,介质必须被挂载
摘除时,介质必须被卸载
按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软盘、USB等等)

3.7.1 使用光盘

#在图形环境下自动启动挂载/run/media//

#手工挂载
mount /dev/cdrom /mnt/

#操作光盘
eject #弹出光盘
eject -t #弹入光盘

#创建ISO文件,需要使用光盘,当/dev/cdrom目录检测到介质,可使用此命令
cp /dev/cdrom /root/centos.iso

使用命令创建iso文件
mkisofs  -r  -o /root/etc.iso /etc  #centos8来自于genisoixin包,centos7来自于genisoimage包

扩展:
使用mkisofs命令制作ISO文件:
mkisofs -o [目标ISO文件路径] [源文件或目录路径]

例如,如果您想将当前目录下的所有文件和文件夹制作成一个名为myiso.iso的ISO文件,可以使用以下命令:mkisofs -o myiso.iso .

此外,根据需要,您还可以添加其他选项来配置ISO文件的属性和特性,如Rock Ridge扩展。以下是一个示例命令,使用了Rock Ridge扩展:
mkisofs -r -o myiso.iso /path/to/source/directory





#刻录光盘
wodim -v -eject centos.iso     


#将ISO制作为U盘工具Rufus
官网: http://rufus.ie/
Rufus 是一个开源免费的快速制作 U 盘系统启动盘和格式化 USB 的实用小工具,它可以快速把 ISO 格
式的系统镜像文件快速制作成可引导的 USB 启动安装盘,支持 Windows 或 Linux 启动。Rufus 小巧玲
珑,软件体积仅 7 百多 KB,然而麻雀虽小,它却五脏俱全

3.7.2 USB介质

#查看USB设备是否识别
lsusb  #来自于usbutils包


#被内核探测为SCSI设备,表现为/dev/sdaX、/dev/sdbX或类似的设备文件
在图形环境中自动挂载在/run/media//

手动挂载
mount /dev/sdX# /mnt


#例:插入U盘后可以看到日志信息
[root@centos8 ~]#tail /var/log/messages -f
Apr 15 14:25:06 centos8 kernel: usb 4-1: new SuperSpeed Gen 1 USB device number
2 using xhci_hcd
Apr 15 14:25:06 centos8 kernel: usb 4-1: New USB device found, idVendor=0951,
idProduct=1666, bcdDevice= 1.10
Apr 15 14:25:06 centos8 kernel: usb 4-1: New USB device strings: Mfr=1,
Product=2, SerialNumber=3
Apr 15 14:25:06 centos8 kernel: usb 4-1: Product: DataTraveler 3.0
Apr 15 14:25:06 centos8 kernel: usb 4-1: Manufacturer: Kingston
Apr 15 14:25:06 centos8 kernel: usb 4-1: SerialNumber: AC220B280A43B03189723CA0
Apr 15 14:25:06 centos8 kernel: usb-storage 4-1:1.0: USB Mass Storage device
detected
Apr 15 14:25:06 centos8 kernel: scsi host3: usb-storage 4-1:1.0
Apr 15 14:25:06 centos8 kernel: usbcore: registered new interface driver usb-
storage
Apr 15 14:25:06 centos8 kernel: usbcore: registered new interface driver uas
Apr 15 14:25:07 centos8 kernel: scsi 3:0:0:0: Direct-Access   Kingston
DataTraveler 3.0 PMAP PQ: 0 ANSI: 6
Apr 15 14:25:07 centos8 kernel: sd 3:0:0:0: Attached scsi generic sg4 type 0
Apr 15 14:25:07 centos8 kernel: sd 3:0:0:0: [sdd] 60555264 512-byte logical
blocks: (31.0 GB/28.9 GiB)
Apr 15 14:25:07 centos8 kernel: sd 3:0:0:0: [sdd] Write Protect is off
Apr 15 14:25:07 centos8 kernel: sd 3:0:0:0: [sdd] Write cache: disabled, read
cache: enabled, doesn't support DPO or FUA
Apr 15 14:25:07 centos8 kernel: sdd: sdd1
Apr 15 14:25:07 centos8 kernel: sd 3:0:0:0: [sdd] Attached SCSI removable disk
Apr 15 14:30:02 centos8 systemd[1]: Started /usr/bin/systemctl start man-db-
cache-update.
Apr 15 14:30:02 centos8 systemd[1]: Starting man-db-cache-update.service...
Apr 15 14:30:03 centos8 systemd[1]: Started man-db-cache-update.service.
Apr 15 14:33:21 centos8 kernel: usb 4-1: USB disconnect, device number 2
^C
[root@centos8 ~]#dmesg
[ 1861.537401] usb 4-1: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd
[ 1861.551660] usb 4-1: New USB device found, idVendor=0951, idProduct=1666,
bcdDevice= 1.10
[ 1861.551663] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1861.551664] usb 4-1: Product: DataTraveler 3.0
[ 1861.551665] usb 4-1: Manufacturer: Kingston
[ 1861.551666] usb 4-1: SerialNumber: AC220B280A43B03189723CA0
[ 1861.568499] usb-storage 4-1:1.0: USB Mass Storage device detected
[ 1861.570443] scsi host3: usb-storage 4-1:1.0
[ 1861.570822] usbcore: registered new interface driver usb-storage
[ 1861.574790] usbcore: registered new interface driver uas
...


#例:格式化U盘为 FAT32 文件系统,此设备可格式化U盘,支持多系统,linux,windows
[root@centos8 ~]#dnf -y install dosfstools
[root@centos8 ~]#mkfs.vfat /dev/sdd1
mkfs.fat 4.1 (2017-01-24)
[root@centos8 ~]#mount /dev/sdd1 /mnt
[root@centos8 ~]#sync  将内存中数据写入磁盘
[root@centos8 ~]#umount /mnt  取消挂在之后拔出U盘




#例:查看USB设备
[root@centos8 ~]#yum -y install usbutils
[root@centos8 ~]#lsusb
Bus 004 Device 002: ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9
G2
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

3.8磁盘常见工具

3.8.1 文件系统空间实际真正占用等信息的查看工具 df

#格式:
df [OPTION]... [FILE]...


#常用选项:
-H 以10为单位
-T 文件系统类型
-h human-readable
-i inodes instead of blocks
-P 以Posix兼容的格式输出


#例:
[root@centos8 ~]#df -Th
Filesystem   Type   Size Used Avail Use% Mounted on
devtmpfs    devtmpfs 887M   0 887M  0% /dev
tmpfs     tmpfs   903M   0 903M  0% /dev/shm
tmpfs     tmpfs   903M  8.7M 894M  1% /run
tmpfs     tmpfs   903M   0 903M  0% /sys/fs/cgroup
/dev/sda2   xfs    100G  2.7G  98G  3% /
/dev/sda3   xfs    50G  1.4G  49G  3% /data
/dev/sda1   ext4   976M 128M 781M  15% /boot
tmpfs     tmpfs   181M   0 181M  0% /run/user/0


[root@centos8 ~]#lsblk -f
NAME  FSTYPE LABEL           UUID                
MOUNTPOINT
sda                                      
├─sda1 ext4                5c2216e3-ae34-444e-aa60-83cbaebb47e7
/boot
├─sda2 xfs                f7f53add-b184-4ddc-8d2c-5263b84d1e15 /
├─sda3 xfs                9a2293a8-9277-4b18-bae1-498e0b9da145
/data
├─sda4                                    
├─sda5 swap                eebe3bc7-6d52-4ad9-86aa-916f1a123fd4
[SWAP]
└─sda6                                    
sdb                                      
└─sdb1 ext4  /data/mysql        cb7cae1e-d227-4f64-872b-cd6cce20c911
sdc  swap                a3dc8863-b7a6-462b-a8e5-72d034a442de
sr0  iso9660 CentOS-8-1-1911-x86_64-dvd 2020-01-03-21-42-40-00 


#例:
[root@rhel5 ~]# df
Filesystem      1K-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
           99415464  2084776  92199220  3% /
/dev/sda1        101086   12056   83811  13% /boot
tmpfs          517536     0   517536  0% /dev/shm
[root@rhel5 ~]# df -P
Filesystem     1024-blocks   Used Available Capacity Mounted on
/dev/mapper/VolGroup00-LogVol00  99415464  2084776  92199220    3% /
/dev/sda1        101086   12056   83811    13% /boot
tmpfs 

3.8.2 查看某目录总体空间实际占用状态 du

#显示指定目录下面各个子目录的大小,单位为KB
    du [OPTION]... DIR

#常用选项:
-a  --all 显示所有文件和目录的大小,默认只显示目录大小
-h human-readable
-s  summary 
--max-depth=#  指定最大目录层级
-x, --one-file-system  #忽略不在同一个文件系统的目录


#例:
[root@centos8 ~]#du -sh /*
0 /bin
116M /boot
4.0K /data
0 /dev
22M /etc
24K /home
0 /lib
0 /lib64
0 /media
0 /misc
0 /mnt
0 /net
12K /opt
du: cannot access '/proc/1529/task/1529/fd/4': No such file or directory
du: cannot access '/proc/1529/task/1529/fdinfo/4': No such file or directory
du: cannot access '/proc/1529/fd/4': No such file or directory
du: cannot access '/proc/1529/fdinfo/4': No such file or directory
0 /proc
197M /root
13M /run
0 /sbin
0 /srv
0 /sys
0 /tmp
1.7G /usr


#例:
[root@centos8 ~]#du -h -x --max-depth=1 /
22M ./etc
197M ./root
138M ./var
1.7G ./usr
24K ./home
0 ./media
0 ./mnt
12K ./opt
0 ./srv
0 ./tmp
2.1G .
138M /var

3.8.3 工具 dd

#dd 命令:convert and copy a file

#格式:
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
conv=conversion[,conversion...]     用指定的参数转换文件




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



#例:
[root@centos8 ~]#cat f1.txt;
abcdef
[root@centos8 ~]#cat f2.txt
123456789
[root@centos8 ~]#dd if=f1.txt of=f2.txt bs=1 count=2 skip=3 seek=4 
2+0 records in
2+0 records out
2 bytes copied, 6.6515e-05 s, 30.1 kB/s
[root@centos8 ~]#cat f2.txt
1234de[root@centos8 ~]#echo 123456789 > f2.txt
[root@centos8 ~]#cat f2.txt
123456789
[root@centos8 ~]#cat f1.txt
abcdef
[root@centos8 ~]#cat f1.txt; cat f2.txt
abcdef
123456789
[root@centos8 ~]#dd if=f1.txt of=f2.txt bs=1 count=2 skip=3 seek=4 conv=notrunc
2+0 records in
2+0 records out
2 bytes copied, 7.6153e-05 s, 26.3 kB/s
[root@centos8 ~]#cat f2.txt
1234de789




#备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

#破坏MBR中的bootloader
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

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

#将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/dev/sdy

#将/dev/sdx全盘数据备份到指定路径的xin文件
dd if=/dev/sdx of=/path/to/xin

#备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
dd if=/dev/sdx | gzip >/path/to/xin.gz

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

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

#将内存里的数据拷贝到root目录下的mem.bin文件
dd if=/dev/mem of=/root/mem.bin bs=1024

#拷贝光盘数据到root文件夹下,并保存为cdrom.iso文件
dd if=/dev/cdrom of=/root/cdrom.iso

#销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1

#通过比较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

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

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

4RAID

"RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 于1987年在加州大学伯克利分校发明的。在1988年6月SIGMOD会议上提交的论文"A Case for Redundant Arrays of Inexpensive Disks”"中提出,当时性能最好的大型机不增长的个断人电脑市场开发的一系列廉价驱动器的性能所击败。尽管故障与驱动器数量的比例会上升,但通过配置冗余,阵列的可靠性可能远远超过任何大型单个驱动器的可靠性

独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价(独立)磁盘冗余阵列
(Redundant Array of Inexpensive Disks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。

RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。

简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作。

RAID功能实现
        提高IO能力,磁盘并行读写
        提高耐用性,磁盘冗余算法来实现

RAID实现的方式
        外接式磁盘阵列:通过扩展卡提供适配能力
        内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置
        软件RAID:通过OS实现,比如:群晖的NAS

4.1RAID级别

级别:多块磁盘组织在一起的工作方式有所不同

参考链接: https://zh.wikipedia.org/wiki/RAID

RAID-0:条带卷,strip
RAID-1:镜像卷,mirror
RAID-2
......
RAID-5
RAID-6
RAID-7
RAID-10
RAID-01
RAID-50
......

4.1.1 RAID-0

以 chunk 单位,读写数据,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失

读、写性能提升
可用空间:N*min(S1,S2,...)
无容错能力
最少磁盘数:1+

磁盘存储和文件系统_第8张图片

4.1.2 RAID-1

也称为镜像, 两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID 0相同。另外写入速度有微小的降低。

读性能提升、写性能略有下降
可用空间:1*min(S1,S2,...)

磁盘利用率 50%
有冗余能力
最少磁盘数:2+

磁盘存储和文件系统_第9张图片

4.1.3 RAID-4

多块数据盘异或运算值存于专用校验盘
磁盘利用率 (N-1)/N
有冗余能力
至少3块硬盘才可以实现 

磁盘存储和文件系统_第10张图片

4.1.4 RAID-5

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

磁盘存储和文件系统_第11张图片

 4.1.5 RAID-6

双份校验位,算法更复杂
读、写性能提升
可用空间:(N-2)*min(S1,S2,...)
有容错能力:允许最多2块磁盘损坏
最少磁盘数:4, 4+

磁盘存储和文件系统_第12张图片

4.1.6 RAID-10

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

磁盘存储和文件系统_第13张图片

4.1.7 RAID-01

多块磁盘先实现RAID0,再组合成RAID1

磁盘存储和文件系统_第14张图片

4.1.8 RAID-50

多块磁盘先实现RAID5,再组合成RAID0

磁盘存储和文件系统_第15张图片

 4.1.9 RAID-60

磁盘存储和文件系统_第16张图片

4.2.0其它级别

 功能:将多块磁盘的空间合并一个大的连续空间使用
第一块硬盘存放所有磁盘的分段信息,如果损坏,整个阵列会失败
后续磁盘损坏只会影响本块磁盘的数据
可用空间:sum(S1,S2,...)

磁盘存储和文件系统_第17张图片 RAID7

RAID 7并非公开的RAID标准,而是美国公司的Storage Computer Corporation的专利硬件产品名称,RAID 7是以RAID 3及RAID 4为基础所发展,但是经过强化以解决原来的一些限制。另外,在实现中使用大量的缓冲存储器以及用以实现异步数组管理的专用即时处理器,使得RAID 7可以同时处理大量的IO要求,所以性能甚至超越了许多其他RAID标准的实际产品。但也因为如此,在价格方面非常的高昂.RAID7 可以理解为一个独立存储计算机,自身带有操作系统和管理工具,可以独立运行,理论上性能最高的RAID模式

SHR(Synology Hybrid RAID)

群晖公司的技术,适合不了解RAID的普通用户
根据磁盘个数自动组成不同的RAID,1块普通磁盘,2块RAID1,3块RAID4,SHR2类似于RAID6
只支持群晖系统

4.2.1RAID 总结

常用级别:RAID-0, RAID-1, RAID-5, RAID-10, RAID-50,RAID-60

磁盘存储和文件系统_第18张图片

RAID
等级















安全性 目的 应用场景
单一
硬盘
(参
考)
0 1 1 1
JBOD 1 0 N 1 1 无(同RAID
0)
增加容量 个人(暂
时)存储
备份
0 1 0 N N N 一个硬盘异常,
全部硬盘都会异
常        
追求最大容量、
速度
影片剪接
缓存用途
1 2 N-1 1 N 1 高,一个正常即可 追求最大安全性 个人、企业备份
5 3 1 N-1 N-1 N-1 追求最大容量、
最小预算
个人、企
业备份
6 4 2 N-2 N-2 N-2 安全性较RAID
5高
同RAID 5,但
较安全
个人、企
业备份
10 4 综合RAID 0/1优
点,理论速度较
大型数据
库、服务
50 6 提升数据安全 
60 8 提升数据安全

 4.3 实现软RAID

#mdadm工具:为软RAID提供管理界面,为空余磁盘添加冗余,结合内核中的md(multi devices)
RAID设备可命名为/dev/md0、/dev/md1、/dev/md2、/dev/md3等

#mdadm:模式化的工具,支持的RAID级别:LINEAR, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10
命令的语法格式:
    mdadm [mode]  [options] 


#常用选项
模式:
    创建:-C
    装配:-A
    监控:-F
    管理:-f, -r, -a
: /dev/md#
: 任意块设备
-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

5逻辑卷管理器(LVM)

5.1 LVM介绍

LVM: Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,允许在多个物理设备间重新组织文件系统

LVM可以弹性的更改LVM的容量

磁盘存储和文件系统_第19张图片

通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中的PE加到LV中以加大容量

实现过程
        将设备指定为物理卷
        用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent,
PE)来定义的
        在物理卷上创建的逻辑卷, 是由物理区域(PE)组成
        可以在逻辑卷上创建文件系统并挂载 

磁盘存储和文件系统_第20张图片

#第一个逻辑卷对应设备名:/dev/dm-#
dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块



#软链接:
    /dev/mapper/VG_NAME-LV_NAME
    /dev/VG_NAME/LV_NAME

#例:
/dev/mapper/vol0-root
/dev/vol0/root

 5.2实现逻辑卷

添加新的磁盘后:
查看主机scsi 总线号
[root@dhcp-1 ~]#ls /sys/class/scsi_host/
host0  host1


重新扫描 scsi 总线以热插拔方式添加新设备。
[root@dhcp-1 ~]#echo "- - -" /sys/class/scsi_host/host2/scan
- - - /sys/class/scsi_host/host2/scan

如果还没识别可以换 host1,host0 重复以上操作就可以了。


分完区之后需要使用 partprobe 命令,通知内核读取更新的分区表,从而识别新的分区。
[root@dhcp-1 ~]#partprobe


查看分区表是否更新
[root@dhcp-1 ~]#cat /proc/partitions
major minor  #blocks  name

 252        0  104857600 vda
 252        1    1048576 vda1
 252        2   51379200 vda2
  11        0    1048575 sr0
 253        0   46133248 dm-0
 253        1    5242880 dm-1
 252       16   10485760 vdb
 252       17    1048576 vdb1
 252       18    3145728 vdb2
 252       32   10485760 vdc
 252       33     512000 vdc1
 252       34    5242880 vdc2
 253        2    1552384 dm-2

5.2.1 pv管理工具

#相关工具来自于 lvm2 包
[root@centos8 ~]#yum -y install lvm2


#显示pv信息:
pvs:简要pv信息显示
pvdisplay


#创建pv
pvcreate /dev/DEVICE


#删除pv
pvremove /dev/DEVICE

例:
[root@dhcp-1 ~]#pvcreate /dev/vdb2 /dev/vdc2
  Physical volume "/dev/vdb2" successfully created.
  Physical volume "/dev/vdc2" successfully created.

5.2.2 vg管理工具

#显示卷组
vgs
vgdisplay


#创建卷组
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath
[PhysicalDevicePath...]

#例
vgcreate -s 16M vg0 /dev/sdb /dev/sdc  #指定PE的大小,默认4M


#管理卷组
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]


#删除卷组:
先做pvmove
再做vgremove

5.2.3 lv管理工具

#显示逻辑卷
lvs
Lvdisplay

#创建逻辑卷
lvcreate -L #[mMgGtT] -n NAME VolumeGroup

#例:
lvcreate -l 60%VG -n mylv testvg
lvcreate -l 100%FREE -n yourlv testvg


#删除逻辑卷
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


#例:
#创建物理卷
pvcreate /dev/sda3
#为卷组分配物理卷
vgcreate vg0 /dev/sda3
#从卷组创建逻辑卷
lvcreate  -L 256M  -n data vg0
#mkfs.xfs  /dev/vg0/data
#挂载
mount /dev/vg0/data /mnt/data

5.2.4 扩展和缩减逻辑卷

#在线扩展逻辑卷

#两步实现
#第一步实现逻辑卷的空间扩展
lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
#第二步实现文件系统的扩展

针对ext*
resize2fs /dev/VG_NAME/LV_NAME
[root@dhcp-1 ~]#resize2fs /dev/mapper/vg_data-lv_data
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mapper/vg_data-lv_data is mounted on /root/mysql; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mapper/vg_data-lv_data is now 388096 blocks long.


针对xfs
xfs_growfs MOUNTPOINT
[root@dhcp-1 ~]#xfs_growfs  跟上挂载点
xfs_admin      xfs_copy       xfs_estimate   xfs_fsr        xfs_info       xfs_logprint   xfs_metadump   xfs_ncheck     xfs_repair     
xfs_bmap       xfs_db         xfs_freeze     xfs_growfs     xfs_io         xfs_mdrestore  xfs_mkfile     xfs_quota      xfs_rtcp

扩展前:
[root@dhcp-1 ~]#df -Th /dev/mapper/vg_data-lv_data 
Filesystem                  Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data ext4  2.5G  1.8M  2.4G   1% /root/mysql

将创建好的物理卷pv扩展加入逻辑卷组vg
[root@dhcp-1 ~]#vgextend vg_data /dev/vd{b2,c2}
  Volume group "vg_data" successfully extended


一步实现空间和文件系统的扩展 
注:
    +100%FREE(将剩余所有空间全部扩展到逻辑卷)
[root@dhcp-1 ~]#lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
         


扩展指定大小:
[root@dhcp-1 ~]#lvextend -r -L +1G /dev/vg_data/lv_data 
  Size of logical volume vg_data/lv_data changed from 1.48 GiB (379 extents) to 2.48 GiB (635 extents).
  Logical volume vg_data/lv_data successfully resized.
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mapper/vg_data-lv_data is mounted on /root/mysql; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mapper/vg_data-lv_data is now 650240 blocks long.


剩余空间全部扩展:
[root@dhcp-1 ~]#lvextend -r -l +100%free /dev/mapper/vg_data-lv_data
  Size of logical volume vg_data/lv_data changed from 2.48 GiB (635 extents) to 9.47 GiB (2425 extents).
  Logical volume vg_data/lv_data successfully resized.
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mapper/vg_data-lv_data is mounted on /root/mysql; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mapper/vg_data-lv_data is now 2483200 blocks long.


扩展后查看:
[root@dhcp-1 ~]#df -Th
/dev/mapper/vg_data-lv_data ext4      9.4G  2.6M  9.0G   1% /root/mysql



#缩减逻辑卷
#注意:缩减有数据损坏的风险,建议先备份再缩减,xfs文件系统不支持缩减
步骤:

1,取消挂载:umount /dev/VG_NAME/LV_NAME
2,检查文件系统完整性:e2fsck -f /dev/VG_NAME/LV_NAME
3,缩减文件系统:resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
4,缩减逻辑卷:lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
5,重新恢复挂载:mount /dev/VG_NAME/LV_NAME mountpoint



#例:
[root@centos8 ~]#blkid /dev/vg0/mysql
/dev/vg0/mysql: UUID="94674607-2196-4015-9194-4632ac23f36a" TYPE="ext4"
[root@centos8 ~]#lvs
LV  VG Attr    LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mysql vg0 -wi-a----- 2.99g 

[root@centos8 ~]#df
Filesystem      1K-blocks  Used Available Use% Mounted on
devtmpfs         391676    0   391676  0% /dev
tmpfs           408092    0   408092  0% /dev/shm
tmpfs           408092   5792   402300  2% /run
tmpfs           408092    0   408092  0% /sys/fs/cgroup
/dev/sda2       104806400 2274504 102531896  3% /
/dev/sda3        52403200  398576  52004624  1% /data
/dev/sda1         999320  130848   799660  15% /boot
tmpfs           81616    0   81616  0% /run/user/0
/dev/mapper/vg0-mysql  3022704   9204  2840240  1% /data/mysql

#第一步
[root@centos8 ~]#umount /data/mysql
[root@centos8 ~]#resize2fs /dev/vg0/mysql 1G
resize2fs 1.44.6 (5-Mar-2019)
Please run 'e2fsck -f /dev/vg0/mysql' first.

#第二步
[root@centos8 ~]#fsck -f /dev/vg0/mysql
fsck from util-linux 2.32.1
e2fsck 1.44.6 (5-Mar-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-mysql: 14/196224 files (0.0% non-contiguous), 31009/784384
blocks

#第三步
[root@dhcp-1 ~]#resize2fs /dev/vg_data/lv_data 2G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg_data/lv_data to 524288 (4k) blocks.
The filesystem on /dev/vg_data/lv_data is now 524288 blocks long.

#第四步
[root@dhcp-1 ~]#lvreduce -L 2G /dev/vg_data/lv_data(此操作前一定要备份)
  WARNING: Reducing active logical volume to 2.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg_data/lv_data? [y/n]: y
  Size of logical volume vg_data/lv_data changed from 9.47 GiB (2425 extents) to 2.00 GiB (512 extents).
  Logical volume vg_data/lv_data successfully resized.

#第五步:
[root@dhcp-1 ~]#mount /dev/vg_data/lv_data mysql
[root@dhcp-1 ~]#df -h /dev/vg_data/lv_data 
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data  2.0G  1.8M  1.9G   1% /root/mysql
[root@dhcp-1 ~]#lvs
LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
 lv_data vg_data -wi-ao----   2.00g






#缩减逻辑卷缩写步骤
1,取消挂载:umount /dev/VG_NAME/LV_NAME
2,所见逻辑卷:lvreduce  -L #[mMgGtT] -r /dev/VG_NAME/LV_NAME
3,恢复挂载:mount /dev/VG_NAME/LV_NAME mountpoint


#例: 缩减逻辑卷简化步骤
[root@centos8 ~]#df -h /mnt
Filesystem      Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0  1G  2.7M 439M  1% /mnt
[root@centos8 ~]#lvs
LV  VG Attr    LSize  Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
lv0 vg0 -wi-a----- 1023.00m    
[root@centos8 ~]#umount /mnt

使用选项-r 可以同时缩减卷和文件系统,-r选项同时支持xfs和ext4文件系统
[root@centos8 ~]#lvreduce -L 500M -r /dev/vg0/lv0
fsck from util-linux 2.32.1
/dev/mapper/vg0-lv0: 116/65536 files (0.0% non-contiguous), 9152/261888 blocks
resize2fs 1.45.6 (20-Mar-2020)
Resizing the filesystem on /dev/mapper/vg0-lv0 to 128000 (4k) blocks.
The filesystem on /dev/mapper/vg0-lv0 is now 128000 (4k) blocks long.
Size of logical volume vg0/lv0 changed from 1023.00 MiB (1023 extents) to
500.00 MiB (500 extents).
Logical volume vg0/lv0 successfully resized.
[root@centos8 ~]#lvs
LV  VG Attr    LSize  Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
lv0 vg0 -wi-a----- 500.00m                         
[root@centos8 ~]#mount /dev/vg0/lv0 /mnt
[root@centos8 ~]#df -h /mnt
Filesystem      Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 476M  2.7M 439M  1% /mnt








#例: 缩减XFS文件系统的逻辑卷
#因为XFS文件系统不支持缩减,可以用下面方式缩减

#先备份XFS文件系统数据
[root@centos8 ~]#yum -y install xfsdump

#备份/data挂载点对应的逻辑卷
#注意挂载点后面不要加/,否则会出错:xfsdump: ERROR: /data/ does not identify a file
system
[root@centos8 ~]#xfsdump -f data.img /data

#卸载文件系统
[root@centos8 ~]#umount /data

#缩减逻辑卷
[root@centos8 ~]#lvreduce -L 10G /dev/vg0/lv0

#重新创建文件系统
[root@centos8 ~]#mkfs.xfs -f /dev/vg0/lv0

#重新挂载
[root@centos8 ~]#mount /dev/vg0/lv0 /data

#还原数据
[root@centos8 ~]#xfsrestore -f data.img /data

5.2.5 跨主机迁移卷组

#源计算机上
1 在旧系统中,umount 所有卷组上的逻辑卷
2 禁用卷组
    vgchange -a n vg0
    lvdisplay

3 导出卷组
    vgexport vg0
    pvscan
    vgdisplay

4 拆下旧硬盘在目标计算机上,并导入卷组:
    vgimport vg0

5 启用
    vgchange -ay vg0 
6 mount 所有卷组上的逻辑卷



#

5.2.6 拆除指定的PV存储设备

[root@centos8 ~]#pvdisplay
 --- Physical volume ---
PV Name        /dev/sda7
VG Name        vg0
PV Size        3.00 GiB / not usable 4.00 MiB
Allocatable      yes
PE Size        4.00 MiB
Total PE        767
Free PE        255
Allocated PE      512
PV UUID        rAYPLI-H4Or-Kz7L-44So-IZaD-vEbj-meOz7N
 --- Physical volume ---
PV Name        /dev/sdc
VG Name        vg0
PV Size        10.00 GiB / not usable 4.00 MiB
Allocatable      yes
PE Size        4.00 MiB
Total PE        2559
Free PE        2303
Allocated PE      256
PV UUID        RDR8Ge-Oxb0-OrT2-CVj7-8doA-r5fo-hj4ZCm
 --- Physical volume ---
PV Name        /dev/sdb
VG Name        vg0
PV Size        20.00 GiB / not usable 4.00 MiB
Allocatable      yes
PE Size        4.00 MiB
Total PE        5119
Free PE        5119
Allocated PE      0
PV UUID        Ky0f8z-qjVT-ikWZ-gfwL-H5d7-ZsZ2-NDcJ3v


[root@centos8 ~]#pvmove /dev/sdc
/dev/sdc: Moved: 0.78%
/dev/sdc: Moved: 100.00%


[root@centos8 ~]#pvdisplay
 --- Physical volume ---
PV Name        /dev/sda7
VG Name        vg0
PV Size        3.00 GiB / not usable 4.00 MiB
Allocatable      yes
PE Size        4.00 MiB
Total PE        767
Free PE        255
Allocated PE      512
PV UUID        rAYPLI-H4Or-Kz7L-44So-IZaD-vEbj-meOz7N
 --- Physical volume ---
PV Name        /dev/sdc
VG Name        vg0
PV Size        10.00 GiB / not usable 4.00 MiB
Allocatable      yes
PE Size        4.00 MiB
Total PE        2559
Free PE        2559
Allocated PE      0
PV UUID        RDR8Ge-Oxb0-OrT2-CVj7-8doA-r5fo-hj4ZCm
 --- Physical volume ---
PV Name        /dev/sdb
VG Name        vg0
PV Size        20.00 GiB / not usable 4.00 MiB
Allocatable      yes
PE Size        4.00 MiB
Total PE        5119
Free PE        4863
Allocated PE      256
PV UUID        Ky0f8z-qjVT-ikWZ-gfwL-H5d7-ZsZ2-NDcJ3v


[root@centos8 ~]#vgreduce vg0 /dev/sdc
Removed "/dev/sdc" from volume group "vg0"


[root@centos8 ~]#pvs
PV     VG Fmt Attr PSize  PFree 
/dev/sda7 vg0 lvm2 a--  <3.00g 1020.00m
/dev/sdb  vg0 lvm2 a-- <20.00g <19.00g
/dev/sdc    lvm2 ---  10.00g  10.00g

[root@centos8 ~]#pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.



取消挂载:
[root@dhcp-1 ~]#umount /root/mysql

删除逻辑卷:
[root@dhcp-1 ~]#lvremove /dev/vg_data
Do you really want to remove active logical volume vg_data/lv_data? [y/n]: y
  Logical volume "lv_data" successfully removed

删除卷组:
[root@dhcp-1 ~]#vgremove vg_data

删除物理卷:
[root@dhcp-1 ~]#pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/vdb1         lvm2 ---    1.00g   1.00g
  /dev/vdc1         lvm2 ---  500.00m 500.00m
  /dev/vdc2         lvm2 ---    5.00g   5.00g
[root@dhcp-1 ~]#pvremove /dev/vdc1
  Labels on physical volume "/dev/vdc1" successfully wiped.
[root@dhcp-1 ~]#pvremove /dev/vdc2
  Labels on physical volume "/dev/vdc2" successfully wiped.
[root@dhcp-1 ~]#pvremove /dev/vdb1
  Labels on physical volume "/dev/vdb1" successfully wiped.

[root@dhcp-1 ~]#pvs
  PV         VG     Fmt  Attr PSize   PFree

至此逻辑卷已删除干净,可以更换新的磁盘

5.3逻辑卷快照

5.3.1 逻辑卷快照原理

磁盘存储和文件系统_第21张图片

快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空间,建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照

逻辑卷管理器快照
快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享 

逻辑卷快照工作原理
        在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
        当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
        快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据

由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量

快照特点:
        备份速度快,瞬间完
        应用场景是测试环境,不能完成代替备份
        快照后,逻辑卷的修改速度会一定有影响

5.3.2实现逻辑卷快照

注意:逻辑卷快照只能使用一次,恢复完之后,即自动删除

#例:
mkfs.xfs /dev/vg0/data
mount /dev/vg0/data/ /mnt/data

#为现有逻辑卷创建快照,注意ext4建议使用-p r 实现只读
lvcreate -l 64 -s -n data-snapshot /dev/vg0/data

#挂载快照,xfs注意要使用-o指定不使用UUID,ro实现只读,防止快照被修改
mkdir  -p /mnt/snap
mount -o ro,nouuid /dev/vg0/data-snapshot  /mnt/snap

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

#删除快照
umount /mnt/snap
lvremove /dev/vg0/data-snapshot

你可能感兴趣的:(java,开发语言)