磁盘存储和文件系统
磁盘结构
设备文件
设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信
设备号码:
* 主设备号: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
在Linux系统中,mknod 命令用于创建特殊的文件,如块设备文件或字符设备文件。这个命令通常用于创建设备文件,这些文件代表系统中的硬件设备。
命令 mknod /data/partition-sda1 b 8 1 的含义如下:
mknod:命令名,用于创建特殊文件。
/data/partition-sda1:这是你想要创建的设备文件的路径和名称。在这个例子中,你将在 /data 目录下创建一个名为 partition-sda1 的文件。
b:表示你正在创建一个块设备文件。块设备是指那些以块为单位读写数据的设备,如硬盘。
8:这是主设备号,它标识了设备的类型。在Linux系统中,8通常代表第一个SCSI硬盘。
1:这是次设备号,它用于区分同一类型的不同设备。在这个例子中,1表示第一个分区。
总的来说,这个命令的作用是在 /data 目录下创建一个名为 partition-sda1 的块设备文件,代表第一个SCSI硬盘的第一个分区。这个文件可以用来访问和操作这 个分区,就像访问一个普通文件一样。
mknod /data/zero c 1 5个命令的作用是在 /data 目录下创建一个名为 zero 的字符设备文件,1:这是主设备号,它标识了设备的类型。5:这是次设备号,它用于区分同一类型的不同设备。在这个例子中,5表示这个特定的字符设备。
范例: 操纵设备文件
[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
硬盘类型
硬盘接口类型
- 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规格的硬盘主要是考内虑增大单位密度内的磁盘 容量、增强散热、减小功耗
机械硬盘和固态硬盘
机械硬盘(HDD):Hard Disk Drive,即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电 机,磁头控制器,数据转换器,接口,缓存等几个部分组成。机械硬盘中所有的盘片都装在一个旋转轴 上,每张盘片之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距离比头发丝的直 径还小,所有的磁头联在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径 方向运动,加上盘片每分钟几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操 作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上,也可以通过相反方式读取。硬盘为精 密设备,进入硬盘的空气必须过滤 固态硬盘(SSD):Solid State Drive,用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单 元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的 完全相同,在产品外形和尺寸上也与普通硬盘一致 相较于HDD,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优势,SSD传输速率性能是HDD 的2倍 相较于SSD,HDD在价格、容量占有绝对优势 硬盘有价,数据无价,目前SSD不能完全取代HHD
硬盘存储术语
- 硬盘存储术语 CHS
- head:磁头 磁头数=盘面数
- track:磁道 磁道=柱面数
- sector:扇区,512bytes
- cylinder:柱面 1柱面=512 * sector数/trackhead数=51263*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
fdisk 是一个用于磁盘分区的程序。它提供了磁盘分区管理功能,包括创建、删除、修改和查看磁盘分区等。
命令 fdisk -u=cylinder -l /dev/sda 的含义如下:
fdisk:命令名,用于磁盘分区管理。
-u=cylinder:这个选项指定 fdisk 使用柱面作为显示单位。在旧式的硬盘驱动器中,柱面是磁盘分区的物理单位。现代硬盘通常使用扇区作为单位,但是在某些情况下,使用柱面可能更方便,尤其是在处理旧硬件或兼容性问题时。
-l:这个选项告诉 fdisk 列出指定的磁盘分区的信息,而不是进入交互式模式。
/dev/sda:这是你要查看的磁盘设备的路径。在Linux系统中,/dev/sda 通常代表第一个SCSI或SATA硬盘驱动器。
执行这个命令将显示 /dev/sda 硬盘的分区表信息,包括每个分区的编号、类型、起始和结束柱面、大小等详细信息。如果硬盘上有多个分区,这些分区将被列出。
范例:识别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: 148 MB in 3.14 seconds = 47.11 MB/sec
d 命令: dd 是一个强大的命令行工具,用于转换和复制文件,同时可以在复制过程中进行格式转换。它通常用于备份磁盘分区、制作磁盘映像、或者从设备中读取原始数据,你可以使用 dd 从一个磁盘分区创建一个镜像文件:dd if=/dev/sda of=image.img bs=4M
if=/dev/sda 表示输入文件是 /dev/sda,of=image.img 表示输出文件是 image.img,bs=4M 表示以 4MB 的块大小进行复制。
hdparm 命令: hdparm 是一个用于获取和设置SATA/IDE硬盘参数的命令行工具。它常用于测试硬盘的读取速度或设置硬盘的一些性能参数。-t 选项告诉 hdparm 执行读取速度测试,/dev/sda 是要测试的硬盘设备。
CHS
- CHS采用 24 bit位寻址
- 其中前10位表示cylinder,中间8位表示head,后面6位表示sector
- 最大寻址空间 8 GB LBA(logical block addressing)
- LBA是一个整数,通过转换成 CHS 格式完成磁盘具体寻址
- ATA-1规范中定义了28位寻址模式,以每扇区512位组来计算,ATA-1所定义的28位LBA上限达到 128 GiB。2002年ATA-6规范采用48位LBA,同样以每扇区512位组计算容量上限可达128Petabytes 由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB时,可以使用CHS寻址方 式或是LBA寻址方式;在磁盘容量大于大概8GB时,则只能使用LBA寻址方式
管理存储
使用磁盘空间过程
- 设备分区
- 创建文件系统
- 挂载新的文件系统
磁盘分区
为什么分区
- 优化I/O性能
- 实现磁盘空间配额限制
- 提高修复速度
- 隔离系统和程序
- 安装多个OS
- 采用不同文件系统
分区方式
两种分区方式: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分区结构
MBR分区结构http://www.178linux.com/85121
硬盘主引导记录MBR由4个部分组成
十六进制地址范围 | 描述 | 分类 |
---|---|---|
0000-0088 | Master Boot Record 主引导程序 | 主引导程序 |
0089-01BD | 出错信息数据区 | 数据区 |
01BE-01CD | 分区项1(16字节) | 分区表 |
01CE-01DD | 分区项2(16字节) | 分区表 |
01DE-01ED | 分区项3(16字节) | 分区表 |
01EE-01FD | 分区项4(16字节) | 分区表 |
01FE | 55 | 结束标志 |
01FF | AA | 结束标志 |
- 主引导程序(偏移地址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结构
存储字节节位 内容及含义 第1字节 引导标志。若值为80H表示活动分区,若值为00H表示非活动分区。 第2、3、4字节 本分区的起始磁头号、扇区号、柱面号。
磁头号——第2字节;
扇区号——第3字节的低6位;
柱面号——为第3字节高2位+第4字节8位。第5字节 分区类型符。
00H——表示该分区未用(即没有指定);
06H——FAT16基本分区;
0BH——FAT32基本分区;
05H——扩展分区;
07H——NTFS分区;
0FH——(LBA模式)扩展分区(83H为Linux分区等)。第6、7、8字节 本分区的结束磁头号、扇区号、柱面号。
磁头号——第6字节; 扇区号——第7字节的低6位;
柱面号——为第7字节高2位+第8字节8位。第9、10、11、12字节 本分区之前已用了的扇区数, 第13、14、15、16字节 本分区的总扇区数
范例: 备份MBR的分区表,并破坏后恢复
#备份MBR分区表
[root@centos8 ~]#dd if=/dev/sda of=/data/dpt.img bs=1 count=64 skip=446
dd:命令名,用于数据复制和转换。
if=/dev/sda:if 代表 input file,这里指定输入文件为 /dev/sda,即第一个SCSI或SATA硬盘。
of=/data/dpt.img:of 代表 output file,这里指定输出文件为 /data/dpt.img,即将数据写入到这个文件中。
bs=1:bs 代表 block size,这里指定块大小为 1 字节。
count=64:count 代表要复制的块数,这里指定复制 64 块。
skip=446:skip 代表在开始复制之前要跳过的块数,这里指定跳过 446 块。
这个命令的作用是从 /dev/sda 硬盘的第 447 块(因为计数是从 0 开始的)开始,复制下一个 64 块(每个块大小为 1 字节)的数据到 /data/dpt.img 文件中。这种操作通常用于复制磁盘上的特定数据,例如磁盘的引导记录或分区表。
[root@centos8 ~]#scp /data/dpt.img 10.0.0.102:
scp(secure copy)是一个用于在网络上在不同主机之间安全地复制文件的命令。它使用SSH协议进行加密传输,确保数据的安全。
#破坏MBR分区表
[root@centos8 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446
dd:命令名,用于数据复制和转换。
if=/dev/zero:if 代表 input file,这里指定输入文件为 /dev/zero,这是一个特殊的设备文件,它会不断返回空字符(即 ASCII 码的 0)。
of=/dev/sda:of 代表 output file,这里指定输出文件为 /dev/sda,即第一个SCSI或SATA硬盘。
bs=1:bs 代表 block size,这里指定块大小为 1 字节。
count=64:count 代表要复制的块数,这里指定复制 64 块。
seek=446:seek 代表在开始写入之前要跳过的块数,这里指定跳过 446 块。
这个命令的作用是从 /dev/zero 读取 64 个字节的空字符,然后将这些字符写入到 /dev/sda 硬盘的第 447 块(因为计数是从 0 开始的)开始的 64 个块中。这种操作通常用于清零磁盘上的特定数据,例如磁盘的引导记录或分区表。
#无法启动
[root@centos8 ~]#reboot
#用光盘启动,进入rescue mode,选第3项skip to shell Rescue a Rocky Linux system
#配置网络
#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分区结构
GPT分区结构分为4个区域:
- GPT头
- 分区表
- GPT分区
- 备份区域
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分区启动,适合和较新的系统和硬件的配合使用
管理分区
列出块设备
lsblk
创建分区命令
fdisk 管理MBR分区
gdisk 管理GPT分区
parted 高级分区操作,可以是交互或非交互方式
重新设置内存中的内核分区表版本,适合于除了CentOS 6 以外的其它版本 5,7,
partprobe
parted 命令
注意:parted的操作都是实时生效的,小心使用
格式:
parted [选项]... [设备 [命令 [参数]...]...]
parted 是一个功能强大的磁盘分区和分区表管理工具,它支持多种分区表类型,包括传统的 MBR(Master Boot Record)和现代的 GPT(GUID Partition Table)。以下是一些 parted 命令的常见选项: 帮助选项:
-h, –help 显示此求助信息
-l, –list 列出所有设别的分区信息
-i, –interactive 在必要时,提示用户
-s, –script 从不提示用户
-v, –version 显示版本
print:显示磁盘的分区表和分区信息。
parted /dev/sdb print
:打印 /dev/sdb 硬盘的分区信息。
mklabel:创建一个新的分区表。
parted /dev/sdb mklabel gpt
:在 /dev/sdb 硬盘上创建一个新的 GPT 分区表。
mkpart:创建一个新的分区。
parted /dev/sdb mkpart primary ext4 1MB 2GB
:在 /dev/sdb 硬盘上从 1MB 开始创建一个 2GB 大小的主分区,并使用 ext4 文件系统。
rm:删除一个分区。
parted /dev/sdb rm 1
:删除 /dev/sdb 硬盘上的第一个分区。
resizepart:调整一个分区的大小。
parted /dev/sdb resizepart 2 5GB
:将 /dev/sdb 硬盘上的第二个分区大小调整为 5GB。 resize:这个命令通常用于调整文件系统的大小。在你调整了分区大小之后,可能需要调整文件系统 以适应新的分区大小。resize 命令不是 parted 的直接命令,而是特定于文件系统的工具的一部分。 例如,如果你使用的是 ext2/ext3/ext4 文件系统,你可能需要使用 resize2fs 命令来调整文件系统的大小。
set:设置分区标志。
parted /dev/sdb set 1 boot on
:将 /dev/sdb 硬盘上的第一个分区设置为可引导。
unit:设置默认的单位(例如,MB、GB、%)。
parted /dev/sdb unit GB
:设置默认单位为 GB。
align:设置分区对齐方式。
parted /dev/sdb align optimal
:设置分区对齐方式为最优。
name:给分区命名。
parted /dev/sdb name 1 MyPartition
:将 /dev/sdb 硬盘上的第一个分区命名为 “MyPartition”。
quit:退出 parted 交互式模式。 补充: cp [FROM-DEVICE] FROM-MINOR TO-MINOR #将文件系统复制到另一个分区
help [COMMAND] #打印通用求助信息,或关于 COMMAND 的信息
move MINOR 起始点 终止点 #移动编号为 MINOR 的分区
rescue 起始点 终止点 #挽救临近“起始点”、“终止点”的遗失的分区
select 设备 #选择要编辑的设备
请注意,使用 parted 对磁盘进行操作可能会损坏数据,因此在执行任何分区操作之前,务必确保备份重要数据。此外,对磁盘进行操作通常需要管理员权限(root)。
范例:
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:
parted:命令名,用于磁盘分区和管理。
/dev/sdb:指定要操作的磁盘设备,这里是指第二个SCSI或SATA硬盘。
print:打印磁盘的分区表信息。
[root@centos8 ~]#parted /dev/sdb mklabel gpt mklabel gpt 创建一个 GPT(GUID Partition Table)分区表。
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 执行这个命令将启动 parted 的交互式模式,
允许你直接在 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)
分区工具fdisk和gdisk
fdisk -l [-u] [device...] 查看分区
fdisk [device...] 管理MBR分区
gdisk [device...] 类fdisk 的GPT分区工具
子命令:
p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存并退出
l 列出所有可用的分区类型
device 指定要操作的磁盘设备
查看内核是否已经识别新的分区
cat /proc/partitions
CentOS 7,8 同步分区表:
partprobe
CentOS6 通知内核重新读取硬盘分区表
新增分区用
partx -a /dev/DEVICE
kpartx -a /dev/DEVICE -f: force
#示例:
[root@centos6 ~]#partx -a /dev/sda
删除分区用
partx -d --nr M-N /dev/DEVICE
#示例:
[root@centos6 ~]#partx -d --nr 6-8 /dev/sda
范例:非交互式创建分区
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!
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 ~]#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 <<EOF
n
p
+1G
w
EOF
[root@centos8 ~]#lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 1G 0 part
文件系统
文件系统概念
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的
方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进
行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的
存取,安全控制,日志,压缩,加密等
支持的文件系统
/lib/modules/`uname -r`/kernel/fs
各种文件系统:https://en.wikipedia.org/wiki/Comparison_of_file_systems
帮助:man 5 fs
文件系统类型
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:
- 裸文件系统,未经处理或者未经格式化产生的文件系统
- 常用的文件系统特性: 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的性能存储数据 查前支持的文件系统:
cat /proc/filesystems
文件系统的组成部分
- 内核中的模块:ext4, xfs, vfat
- Linux的虚拟文件系统:VFS
- 用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
创建文件系统
创建文件管理工具
- 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 关闭指定特性
范例:
mkfs.ext4 /dev/sdb1
查看和管理分区信息
blkid 可以查看块设备属性信息
格式:
blkid [OPTION]... [DEVICE]
blkid /dev/sdb1 查看文件系统是否创建成功
常用选项:
-U UUID 根据指定的UUID来查找对应的设备
-L LABEL 根据指定的LABEL来查找对应的设备
e2label:管理ext系列文件系统的LABEL
e2label DEVICE [LABEL]
findfs :查找分区
findfs [options] LABEL=<label>
findfs [options] UUID=<uuid>
范例:
[root@centos8 ~]#findfs UUID=f7f53add-b184-4ddc-8d2c-5263b84d1e15
/dev/sda2
范例:
[root@centos8 ~]#findfs `sed -En '/data/s#^([^ ]+).*#\1#p' /etc/fstab`
/dev/sda3
tune2fs:重新设定ext系列文件系统可调整参数的值
-l 查看指定文件系统超级块信息;super block
-L 'LABEL’ 修改卷标
-m # 修预留给管理员的空间百分比
-j 将ext2升级为ext3
-O 文件系统属性启用或禁用, -O ^has_journal
-o 调整文件系统的默认挂载选项,-o ^acl
-U UUID 修改UUID号
dumpe2fs:显示ext文件系统信息,将磁盘块分组管理
-h:查看超级块信息,不显示分组信息
范例:查看ext文件系统的元数据和块组信息
[root@centos8 ~]#dumpe2fs /dev/sda1
dumpe2fs 1.44.6 (5-Mar-2019)
Filesystem volume name: <none>
Last mounted on: /boot
Filesystem UUID: 5c2216e3-ae34-444e-aa60-83cbaebb47e7
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype
needs_recovery 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: 65536
Block count: 262144
Reserved block count: 13107
Free blocks: 217118
Free inodes: 65227
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 127
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Thu Jan 16 10:39:10 2020
Last mount time: Mon Apr 13 12:03:10 2020
Last write time: Mon Apr 13 12:03:10 2020
Mount count: 6
Maximum mount count: -1
Last checked: Thu Jan 16 10:39:10 2020
Check interval: 0 (<none>)
Lifetime writes: 236 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: 5737d3fe-91ce-4cf3-bb5b-125ea41dd70f
Journal backup: inode blocks
Checksum type: crc32c
Checksum: 0x66531756
Journal features: journal_incompat_revoke journal_64bit
journal_checksum_v3
Journal size: 32M
Journal length: 8192
Journal sequence: 0x00000150
Journal start: 1
Journal checksum type: crc32c
Journal checksum: 0x96f6d31c
Group 0: (Blocks 0-32767) csum 0x874c [ITABLE_ZEROED]
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-128
Block bitmap at 129 (+129), csum 0x094b3829
Inode bitmap at 137 (+137), csum 0x520c0d78
Inode table at 145-656 (+145)
28511 free blocks, 7885 free inodes, 8 directories, 7884 unused inodes
Free blocks: 4257-32767
Free inodes: 308-8192
Group 1: (Blocks 32768-65535) csum 0xb8c0 [ITABLE_ZEROED]
Backup superblock at 32768, Group descriptors at 32769-32769
Reserved GDT blocks at 32770-32896
Block bitmap at 130 (bg #0 + 130), csum 0xd4258ac5
Inode bitmap at 138 (bg #0 + 138), csum 0xbc34b300
Inode table at 657-1168 (bg #0 + 657)
7813 free blocks, 8190 free inodes, 2 directories, 8189 unused inodes
Free blocks: 32944-33321, 33324-33791, 36736-36863, 38912, 38914, 38917-40959,
44988-45055, 60132-60415, 61085, 61095-65535
Free inodes: 8195-16384
Group 2: (Blocks 65536-98303) csum 0x6a55 [INODE_UNINIT, ITABLE_ZEROED]
Block bitmap at 131 (bg #0 + 131), csum 0x5a5af22f
Inode bitmap at 139 (bg #0 + 139), csum 0x00000000
Inode table at 1169-1680 (bg #0 + 1169)
25533 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
·······
xfs_info:显示示挂载或已挂载的 xfs 文件系统信息
xfs_info mountpoint|devname
范例:
[root@centos8 ~]#xfs_info /dev/sda7
meta-data=/dev/sda7 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
超级块和INODE TABLE
块组描述符表(GDT)
ext文件系统每一个块组信息使用32字节描述,这32个字节称为块组描述符,所有块组的块组描述符组
成块组描述符表GDT(group descriptor table)。虽然每个块组都需要块组描述符来记录块组的信息和属
性元数据,但是不是每个块组中都存放了块组描述符。将所有块组的块组信息组成一个GDT保存,并将该
GDT存放于某些块组中,类似存放superblock和备份superblock的块
文件系统检测和修复
文件系统夹故障常发生于死机或者非正常关机之后,挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下执行下面命令修复
fsck: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
fsck.ext4 -p /dev/sda1 检查并自动修复这个文件系统上的任何错误
fsck -t xfs /dev/sdb2 对 /dev/sdb2 分区上的 xfs 文件系统进行检查,并在可能的情况下修复发现的问题。
注意: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<y>? 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<y>? yes
Free blocks count wrong for group #0 (24280, counted=24281).
Fix<y>?
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
ree 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: <not available>
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 (<none>)
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 ~]#
挂载
添加新硬盘,让kernel发现新硬盘
echo '- - -' > /sys/class/scsi_host/host0|1|2/scan
2、再分区设置文件系统
parted /dev/sda mklabel msdos|gtp
3、分区
parted /dev/sda mkpart primary 1 300
4.设置文件系统
mkfs.ext4 /dev/sda1
5、挂载
mount /dev/sda1 /opt/test
挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入
口的行为
卸载:为解除此关联关系的过程
把设备关联挂载点:mount Point
挂载点下原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空
进程正在使用中的设备无法被卸载
挂载文件系统 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:挂载点目录必须事先存在,建议使用空目录mount 常用命令选项
-f 模仿挂载,但不实际执行挂载操作。这可以用来检查挂载命令是否正确。
-t fstype 指定要挂载的设备上的文件系统类型,如:ext4,xfs
-r readonly, 只读挂载
-w read and write, 读写挂载,此为默认设置,可省略
-n 不更新/etc/mtab,mount不可见(挂载时不将信息记录在 /etc/mtab 或 /proc/mounts 文件中。)
-a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有
auto功能)
-L 'LABEL' 以卷标指定挂载设备
-U 'UUID' 以UUID指定要挂载的设备
-B, --bind 绑定目录到另一个目录上
-s 严格模式,mount 将以传统模式运行,不使用 libmount 库。
-o options: (挂载文件系统的选项),多个选项使用逗号分隔。指定挂载时使用的特定选项,
如 ro(只读)、rw(读写)、user(允许普通用户挂载)、exec(允许执行文件)等。
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
device 指定要挂载的设备,如 /dev/sda1。
mountpoint 指定文件系统挂载的目录,如 /mnt/data。
挂载规则:
- 一个挂载点同一时间只能挂载一个设备
- 一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏
- 一个设备可以同时挂载到多个挂载点
- 通常挂载点一般是已存在空的目录
卸载文件系统 umount
卸载时:可使用设备,也可以使用挂载点
umount 设备名|挂载点
查看挂载情况
查看挂载
#通过查看/etc/mtab文件显示当前已挂载的所有设备
mount
#查看内核追踪到的已挂载的所有设备
cat /proc/mounts
查看挂载点情况
findmnt MOUNT_POINT|device
查看正在访问指定文件系统的进程
lsof MOUNT_POINT
fuser -v MOUNT_POINT
终止所有在正访问指定的文件系统的进程
fuser -km MOUNT_POINT
持久挂载
将挂载保存到 /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
范例:/etc/fstab格式
[root@rocky ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Dec 8 07:59:56 2024
#
# 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.
#
/dev/mapper/rl_192-root / xfs defaults 0 0
UUID=04c2ba22-c928-4cdd-8334-25d6bccca8c2 /boot xfs defaults 0 0
/dev/mapper/rl_192-swap none swap defaults 0 0
[root@centos6 ~]#cat /etc/fstab
/disk.img /mnt/disk ext4 loop 0 0
范例: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,开机不检测此项挂载设备的健康性,从而忽略错误,能实现启动
处理交换文件和分区
swap 介绍
swap交换分区是系统RAM的补充,swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据 时会将数据写入 swap 分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过 多 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露
注意:为优化性能,可以将swap 分布存放,或高性能磁盘存放
Redhat 官方推荐推荐系统 swap 空间
系统中的 RAM 量 | 推荐的 swap 空间 | 允许休眠的建议 swap 空间大小 |
---|---|---|
低于 2 GB | RAM 量的2倍数 | RAM 容量的三倍 |
2 GB - 8 GB | 等于 RAM 量 | RAM 量的倍数 |
8 GB - 64 GB | 4 GB 到 RAM 容量的 0.5 倍 | RAM 容量的 1.5 倍 |
超过 64 GB | 独立负载(至少 4GB) | 不建议使用休眠功能 |
交换分区实现过程
- 创建交换分区或者文件
- 使用mkswap写入特殊签名
- 在/etc/fstab文件中添加适当的条目
- 使用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 s hared buff/cache available
Mem: 3.7Gi 264Mi 3.2Gi 9.0Mi 2 61Mi 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 p artition 2097148 0 -3
禁用swap分区:
swapoff [OPTION]... [DEVICE]
范例:禁用swap分区
[root@centos8 ~]#sed -i.bak '/swap/d' /etc/fstab
[root@centos8 ~]#swapoff -a
调整swap启用标准
[root@rocky ~]# cat /proc/sys/vm/swappiness
60 可用空间低于60%启用swap
[root@rocky ~]# echo 0 > /proc/sys/vm/swappiness
[root@rocky ~]# cat /proc/sys/vm/swappiness
0
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功能
[root@centos8 ~]#dd if=/dev/zero of=/swapfile bs=1M count=1024
[root@centos8 ~]#mkswap /swapfile
[root@centos8 ~]#blkid /swapfile >> /etc/fstab
/swapfile swap swap defaults 0 0 #注释后,重启就不再启用swap。
不重启办法
[root@rocky ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1048572 25656 -2
[root@rocky ~]# free -h
total used free shared buff/cache available
Mem: 456Mi 121Mi 185Mi 0.0Ki 161Mi 335Mi
Swap: 1.0Gi 25Mi 998Mi
[root@rocky ~]# swapoff /dev/dm-1
[root@rocky ~]# free -h
total used free shared buff/cache available
Mem: 456Mi 142Mi 164Mi 3.0Mi 165Mi 314Mi
Swap: 0B 0B 0B
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
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
移动介质
挂载意味着使外来的文件系统看起来如同是主目录树的一部分,所有移动介质也需要挂载,挂载点通常
在/media 或/mnt下
访问前,介质必须被挂载
摘除时,介质必须被卸载
按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软盘、USB等等)
使用光盘
在图形环境下自动启动挂载/run/media//
手工挂载
mount /dev/cdrom /mnt/
操作光盘
eject #弹出光盘
eject -t #弹入光盘
创建ISO文件
cp /dev/cdrom /root/centos.iso
mkisofs -r -o /root/etc.iso /etc #来自于genisoimage包
mkisofs:这是命令的名称,用于创建 ISO 文件。
-r:这个选项告诉 mkisofs 以 Rock Ridge 扩展模式创建 ISO 文件,这意味着 ISO 文件将包含更多的 Unix 文件系统信息,如文件权限和符号链接。
-o /root/etc.iso:这个选项指定了输出 ISO 文件的路径和文件名。在这个例子中,ISO 文件将被命名为 etc.iso,并保存在 /root 目录下。
/etc:这是要包含在 ISO 文件中的目录。在这个例子中,/etc 目录下的所有文件和目录将被复制到 ISO 文件中。
这个命令的作用是将 /etc 目录及其所有内容创建为一个 ISO 光盘映像文件,该文件可以在 /root 目录下找到,并命名为 etc.iso。这个 ISO 文件可以被用来创建一个包含 /etc 目录内容的可启动光盘,或者用于备份 /etc 目录。
刻录光盘
wodim -v -eject centos.iso.
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
[ 1862.628850] scsi 3:0:0:0: Direct-Access Kingston DataTraveler 3.0 PMAP
PQ: 0 ANSI: 6
[ 1862.631979] sd 3:0:0:0: Attached scsi generic sg4 type 0
[ 1862.634222] sd 3:0:0:0: [sdd] 60555264 512-byte logical blocks: (31.0 GB/28.9
GiB)
[ 1862.636424] sd 3:0:0:0: [sdd] Write Protect is off
[ 1862.636429] sd 3:0:0:0: [sdd] Mode Sense: 45 00 00 00
[ 1862.640597] sd 3:0:0:0: [sdd] Write cache: disabled, read cache: enabled,
doesn't support DPO or FUA
[ 1862.650723] sdd: sdd1
[ 1862.656289] sd 3:0:0:0: [sdd] Attached SCSI removable disk
范例:格式化U盘为 FAT32 文件系统
[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
范例:查看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
磁盘常见工具
文件系统空间实际真正占用等信息的查看工具 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
查看某目录总体空间实际占用状态 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
138M /var
[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
大厂面试题:
df 和 du 区别,什么时候df >du
空分区
df包含元数据
什么时候df < du?
目录内挂载有其它分区时的情况
当删除文件但不释放空间时,有什么不同?
du 查看文件空间释放,df不释放
工具 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全盘数据备份到指定路径的image文件
dd if=/dev/sdx of=/path/to/image
#备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
dd if=/dev/sdx | gzip >/path/to/image.gz
#将备份文件恢复到指定盘
dd if=/path/to/image of=/dev/sdx
#将压缩的备份文件恢复到指定盘
gzip -dc /path/to/image.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
练习
1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求
此分区开机后自动挂载至/test目录,且默认有acl挂载选项
2、写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备
(2) 如磁盘数量为1,则显示其空间使用信息
RAID
RAID功能实现
提高IO能力,磁盘并行读写
提高耐用性,磁盘冗余算法来实现
RAID实现的方式
外接式磁盘阵列:通过扩展卡提供适配能力
内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置
软件RAID:通过OS实现,比如:群晖的NAS
RAID级别
级别:多块磁盘组织在一起的工作方式有所不同
参考链接: 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
RAID-0
读、写性能提升
可用空间:N*min(S1,S2,...)
无容错能力
最少磁盘数:1+
RAID-1
读性能提升、写性能略有下降
可用空间:1*min(S1,S2,...)
磁盘利用率 50%
有冗余能力
最少磁盘数:2+
RAID-4
多块数据盘异或运算值存于专用校验盘
磁盘利用率 (N-1)/N
有冗余能力
至少3块硬盘才可以实现
RAID-5
读、写性能提升
可用空间:(N-1)*min(S1,S2,...)
有容错能力:允许最多1块磁盘损坏
最少磁盘数:3, 3+
RAID-6
双份校验位,算法更复杂
读、写性能提升
可用空间:(N-2)*min(S1,S2,...)
有容错能力:允许最多2块磁盘损坏
最少磁盘数:4, 4+
RAID-10 比RAID01更好, 1/3
读、写性能提升
可用空间:N*min(S1,S2,...)/2
有容错能力:每组镜像最多只能坏一块
最少磁盘数:4, 4+
RAID-01 2/3
多块磁盘先实现RAID0,再组合成RAID1
逻辑卷管理器(LVM)
LVM介绍
LVM基础http://www.178linux.com/74565
VM: Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,
允许在多个物理设备间重新组织文件系统
LVM可以弹性的更改LVM的容量
通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备
中的PE加到LV中以加大容量
实现过程
- 将设备指定为物理卷
- 用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent, PE)来定义的
- 在物理卷上创建的逻辑卷, 是由物理区域(PE)组成
- 可以在逻辑卷上创建文件系统并挂载
第一个逻辑卷对应设备名:/dev/dm-#
dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块
软链接:
- /dev/mapper/VG_NAME-LV_NAME
- /dev/VG_NAME/LV_NAME 范例
/dev/mapper/vol0-root
/dev/vol0/root
实现逻辑卷
相关工具来自于 lvm2 包
[root@centos8 ~]#yum -y install lvm2
范例:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
└─sda1 8:1 0 5G 0 part
sdb 8:16 0 10G 0 disk
sr0 11:0 1 1.8G 0 rom
nvme0n1 259:0 0 200G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 199G 0 part
├─rl-root 253:0 0 70G 0 lvm /
├─rl-swap 253:1 0 2G 0 lvm [SWAP]
└─rl-home 253:2 0 127G 0 lvm /home
[root@localhost ~]# pvs 查看物理卷
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p2 rl lvm2 a-- <199.00g 0
[root@localhost ~]# pvcreate /dev/sdb /dev/sda1 创建物理卷,可一步可两步。
WARNING: ext4 signature detected on /dev/sda1 at offset 1080. Wipe it? [y/n]: y
Wiping ext4 signature on /dev/sda1.
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sda1" successfully created.
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rl 1 3 0 wz--n- <199.00g 0
[root@localhost ~]# vgcreate -s 4M testvg0 /dev/sdb /dev/sda1 创建逻辑卷组(包括了两个物理卷) -s 4M 指定PW Size大小
Volume group "testvg0" successfully created
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name rl
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size <199.00 GiB
PE Size 4.00 MiB
Total PE 50943
Alloc PE / Size 50943 / <199.00 GiB
Free PE / Size 0 / 0
VG UUID knhB0W-gb2s-ZWFT-jSeN-adeV-rukB-jatNJr
--- Volume group ---
VG Name testvg0
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
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 14.99 GiB
PE Size 4.00 MiB
Total PE 3838
Alloc PE / Size 0 / 0
Free PE / Size 3838 / 14.99 GiB
VG UUID 4alfMP-1eeI-rept-aL8k-J6OL-aUhZ-18lNrf
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p2 rl lvm2 a-- <199.00g 0
/dev/sda1 testvg0 lvm2 a-- <5.00g <5.00g
/dev/sdb testvg0 lvm2 a-- <10.00g <10.00g
[root@localhost ~]# lvcreate -L 6G -n mysql testvg0 创建指定大小的逻辑卷,不能超过VG Size 14.99 GiB
Logical volume "mysql" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home rl -wi-ao---- 126.98g
root rl -wi-ao---- 70.00g
swap rl -wi-ao---- <2.02g
mysql testvg0 -wi-a----- 6.00g
[root@localhost ~]# ll /d
data/ dev/
[root@localhost ~]# ll /dev/testvg0/mysql
lrwxrwxrwx. 1 root root 7 Dec 17 16:11 /dev/testvg0/mysql -> ../dm-3
[root@localhost ~]# ll /dev//dm*
brw-rw----. 1 root disk 253, 0 Dec 17 14:05 /dev//dm-0
brw-rw----. 1 root disk 253, 1 Dec 17 14:05 /dev//dm-1
brw-rw----. 1 root disk 253, 2 Dec 17 14:05 /dev//dm-2
brw-rw----. 1 root disk 253, 3 Dec 17 16:11 /dev//dm-3
crw-rw----. 1 root audio 14, 9 Dec 17 14:05 /dev//dmmidi
/dev//dma_heap:
total 0
crw-------. 1 root root 251, 0 Dec 17 14:05 system
[root@localhost ~]# mkfs.ext4 /dev/testvg0/mysql 创建文件系统后即可挂载
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1572864 4k blocks and 393216 inodes
Filesystem UUID: 8e93d6b1-0055-4d4d-9fe9-a965a5270735
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# vim /etc/fstab
/dev/mapper/rl-root / xfs defaults 0 0
UUID=dd377e35-a149-4f7d-a9c9-ca32c66fc90e /boot xfs defaults 0 0
/dev/mapper/rl-home /home xfs defaults 0 0
/dev/mapper/rl-swap none swap defaults 0 0
UUID=8e93d6b1-0055-4d4d-9fe9-a965a5270735 /data/mysql ext4 defaults 0 0
[root@localhost ~]# mkdir /data/mysql
[root@localhost ~]# mount -a
mount: (hint) your fstab has been modified, but systemd still uses
the old version; use 'systemctl daemon-reload' to reload.
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 871M 0 871M 0% /dev/shm
tmpfs 349M 5.2M 344M 2% /run
/dev/mapper/rl-root 70G 2.1G 68G 3% /
/dev/nvme0n1p1 960M 305M 656M 32% /boot
/dev/mapper/rl-home 127G 939M 127G 1% /home
tmpfs 175M 0 175M 0% /run/user/0
/dev/mapper/testvg0-mysql 5.9G 24K 5.6G 1% /data/mysql
pv管理工具
显示pv信息
pvs
用于显示 LVM(逻辑卷管理)物理卷的简略信息的命令。与 pvdisplay 相比,pvs 提供的信息更为简洁,通常只包括物理卷的名称、大小和所属的卷组(VG)。pvdisplay
用于显示 LVM(逻辑卷管理)物理卷属性的命令。
创建pv
pvcreate用于将物理磁盘分区初始化为 LVM(逻辑卷管理)物理卷的命令。这个命令通常在设置 LVM 存储时使用,作为创建逻辑卷的第一步。
范例:
pvcreate /dev/DEVICE
删除pv
pvremove 是一个用于从 LVM(逻辑卷管理)中移除物理卷的命令。这个命令通常在不再需要某个物理卷作为 LVM 存储的一部分时使用。
pvremove /dev/DEVICE
vg管理工具
显示卷组
vgs
vgs 是一个用于显示 LVM(逻辑卷管理)卷组的简略信息的命令。这个命令提供的信息包括卷组的名称、大小、可用空间、物理卷(PV)的数量以及逻辑卷(LV)的数量。
vgdisplay
vgdisplay 是一个用于显示 LVM(逻辑卷管理)卷组的详细信息的命令。这个命令提供的信息包括卷组的名称、ID、状态、大小、可用空间、物理卷(PV)的数量、逻辑卷(LV)的数量以及每个物理卷的详细信息。
创建卷组
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath
[PhysicalDevicePath...]
#示例
vgcreate -s 16M vg0 /dev/sdb /dev/sdc #指定PE的大小,默认4M
管理卷组
vgextend
是一个用于扩展 LVM(逻辑卷管理)卷组的命令。这个命令允许你向已经存在的卷组中添加一个或多个物理卷(PV),从而增加卷组的总大小。
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
- VolumeGroupName:这是你想要扩展的卷组的名称。
- PhysicalDevicePath:这是你想要添加到卷组中的一个或多个物理卷的设备路径。 例如,如果你有一个名为 vg_data 的卷组,并且想要将 /dev/sdd1 和 /dev/sde1 两个物理卷添加到这个卷组中,你可以使用以下命令:
vgextend vg_data /dev/sdd1 /dev/sde1
在执行 vgextend 命令之前,你需要确保这些物理卷已经被初始化(使用 pvcreate 命令),并且没有被包含在任何其他卷组中。此外,对磁盘进行操作通常需要管理员权限(root) 删除卷组
- 先做pvmove
- 再做vgremove
lv管理工具
显示逻辑卷
lvs
是一个用于显示 LVM(逻辑卷管理)逻辑卷的简略信息的命令。这个命令提供的信息包括逻辑卷的名称、卷组(VG)的名称、大小、设备文件路径以及状态。
Lvdisplay
是一个在Linux系统中用于显示逻辑卷(Logical Volume,LV)信息的命令。逻辑卷是在逻辑卷管理器(Logical Volume Manager,LVM)中创建的,它允许系统管理员更灵活地管理磁盘空间。
当执行 lvdisplay 命令时,它会列出所有逻辑卷的详细信息,包括但不限于:
- LV Path:逻辑卷的设备路径,通常位于 /dev/mapper/ 或 /dev/ 目录下。
- LV Name:逻辑卷的名称。
- VG Name:包含该逻辑卷的卷组(Volume Group,VG)的名称。
- LV UUID:逻辑卷的唯一标识符。
- LV Write Access:逻辑卷的写入权限,通常为 read/write(可读可写)。
- LV Creation host, time:创建逻辑卷的主机名和时间。
- LV Status:逻辑卷的状态,例如 available(可用)、inactive(未激活)等。
- # open:当前打开该逻辑卷的次数。
- LV Size:逻辑卷的大小。
- Current LE:逻辑卷当前使用的逻辑扩展(Logical Extents,LE)数量。
- Segments:逻辑卷包含的段数。
- Allocation:逻辑卷的分配策略。
- Read ahead sectors:预读扇区的数量,用于优化磁盘读取性能。
- Block device:与逻辑卷关联的块设备号。
创建逻辑卷
lvcreate -L #[mMgGtT] -n NAME VolumeGroup
- -L:指定逻辑卷的大小。# 表示大小数字,后面可以跟着单位,如 m(兆字节),M(兆兆字节),g(千兆字节),G(千千兆字节),t(太字节),T(太兆字节)。如果不指定单位,默认为兆字节(MB)。
- -n:指定逻辑卷的名称。NAME 是你想要给逻辑卷命名的名称。
- VolumeGroup:指定逻辑卷所属的卷组名称。卷组是在物理卷(Physical Volume,PV)之上创建的,逻辑卷必须属于一个卷组。 范例:
lvcreate -l 60%VG -n mylv testvg -l 60%VG:这个选项指定了新逻辑卷的大小。60%VG 表示新逻辑卷将占用指定卷组(VG)总空间的60%。这里的 %VG 表示百分比,即相对于卷组的总空间。
lvcreate -l 100%FREE -n yourlv testvg -l 100%FREE:这个选项指定新逻辑卷的大小为卷组中所有可用空间的大小。100%FREE 表示使用卷组中所有剩余的可用空间。
删除逻辑卷
lvremove /dev/VG_NAME/LV_NAME
在执行 lvremove 命令之前,确保已经卸载了该逻辑卷,并且没有其他应用程序正在使用它,否则删除操作可能会失败。此外,这是一个破坏性的操作,一旦逻辑卷被删除,存储在其中的所有数据将会丢失,因此执行此命令前务必谨慎。
重设文件系统大小
fsadm [options] resize device [new_size[BKMGTEP]]
fsadm 是一个用于调整文件系统大小的工具。命令 fsadm [options] resize device [new_size[BKMGTEP]] 的含义如下:
- fsadm:这是命令的名称,用于调整文件系统的大小。
- [options]:这里可以指定一些可选的参数,例如 -y 表示自动回答 yes,跳过确认提示。
- resize:这是 fsadm 的子命令,用于调整文件系统的大小。
- device:这是要调整大小的文件系统的设备文件路径,例如 /dev/sda1。
- [new_size[BKMGTEP]]:这是可选的新文件系统大小,可以指定为字节(B)、千字节(K)、兆字节(M)、吉字节(G)、太字节(T)、艾字节(E)或拍字节(P)。如果不指定大小,fsadm 将尝试将文件系统扩展到设备的最大可用空间。
resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
resize2fs 是一个在Linux系统中用于调整ext2, ext3, 或 ext4文件系统大小的工具。这个命令的各个部分意义如下:
- resize2fs:这是调整文件系统大小的命令。
- -f:强制执行文件系统大小调整,即使文件系统处于挂载状态。
- -F:重新启动 resize2fs 进程,即使它已经运行。
- -M:将文件系统缩减到最小大小。
- -P:打印出文件系统的最小和最大允许大小,但不实际调整大小。
- -p:在调整大小的过程中打印进度信息。
- device:要调整大小的文件系统的设备文件,例如 /dev/sda1。
- [new_size]:可选参数,指定新的文件系统大小。如果不提供这个参数,resize2fs 会将文件系统扩展到设备上的所有可用空间。
xfs_growfs /mountpoint
xfs_growfs 是一个用于调整 XFS 文件系统大小的工具。命令 xfs_growfs /mountpoint 的含义如下:
- xfs_growfs:这是命令的名称,用于调整 XFS 文件系统的大小。
- /mountpoint:这是文件系统挂载点的路径,例如 / 或 /home。 例如,如果你想要调整挂载在 / 的 XFS 文件系统的大小,使其使用设备的100g空间,你可以使用以下命令:
xfs_repair -i -s size=100G /dev/device
xfs_growfs /
使用设备的所有可用空间
备份重要数据-卸载文件系统-调整分区大小-调整文件系统大小-重新挂载文件系统
范例:
#创建物理卷
pvcreate /dev/sda3
#为卷组分配物理卷
vgcreate vg0 /dev/sda3
#从卷组创建逻辑卷
lvcreate -L 256M -n data vg0
#mkfs.xfs /dev/vg0/data
#挂载
mount /dev/vg0/data /mnt/data
扩展和缩减逻辑卷
在线扩展逻辑卷
#两步实现
#第一步实现逻辑卷的空间扩展
lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/VG_NAME/LV_NAME
#针对xfs
xfs_growfs MOUNTPOINT MOUNTPOINT:这是XFS文件系统挂载点的路径。例如,如果你将文件系统挂载到了 /mnt/data,那么 MOUNTPOINT 就是 /mnt/data。
#一步实现容间和文件系统的扩展
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
缩减逻辑卷
注意:缩减有数据损坏的风险,建议先备份再缩减,xfs文件系统不支持缩减
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint
umount /dev/VG_NAME/LV_NAME:
- umount:这是一个用于卸载文件系统的命令。
- /dev/VG_NAME/LV_NAME:这是要卸载的逻辑卷的设备路径。VG_NAME 是卷组的名称,LV_NAME 是逻辑卷的名称。
e2fsck -f /dev/VG_NAME/LV_NAME:
- e2fsck:这是一个用于检查和修复ext2, ext3, 或 ext4文件系统的工具。
- -f:这个选项表示强制检查文件系统,即使文件系统看起来是干净的。
- /dev/VG_NAME/LV_NAME:这是要检查的逻辑卷的设备路径。
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]:
- resize2fs:这是一个用于调整ext2, ext3, 或 ext4文件系统大小的工具。
- /dev/VG_NAME/LV_NAME:这是要调整大小的逻辑卷的设备路径。
- #[mMgGtT]:这是新的文件系统大小,可以是字节、千字节、兆字节、吉字节或太字节,分别用 b, k, m, g, t 表示。
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME:
- lvreduce:这是一个用于缩小逻辑卷大小的命令。
- -L [-]#[mMgGtT]:这个选项表示新的逻辑卷大小。如果大小前面有 -,表示减少相应的大小。
- /dev/VG_NAME/LV_NAME:这是要缩小的逻辑卷的设备路径。
mount /dev/VG_NAME/LV_NAME mountpoint:
- mount:这是一个用于挂载文件系统的命令。
- /dev/VG_NAME/LV_NAME:这是要挂载的逻辑卷的设备路径。
- mountpoint:这是文件系统应该被挂载到的目录。
#或者可以简写
umount /dev/VG_NAME/LV_NAME
lvreduce -L #[mMgGtT] -r /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint
umount /dev/VG_NAME/LV_NAME:
- umount:这是一个用于卸载文件系统的命令。
- /dev/VG_NAME/LV_NAME:这是要卸载的逻辑卷的设备路径。VG_NAME 是卷组的名称,LV_NAME 是逻辑卷的名称。
lvreduce -L #[mMgGtT] -r /dev/VG_NAME/LV_NAME:
- lvreduce:这是一个用于缩小逻辑卷大小的命令。
- -L #[mMgGtT]:这个选项表示新的逻辑卷大小。# 是大小数字,m, M, g, G, t, T 分别表示兆字节、吉字节、太字节。
- -r:这个选项表示在缩小逻辑卷大小之后,自动调整文件系统的大小以匹配新的逻辑卷大小。这个选项只对某些文件系统类型有效,如ext2, ext3, ext4。
- /dev/VG_NAME/LV_NAME:这是要缩小的逻辑卷的设备路径。
mount /dev/VG_NAME/LV_NAME mountpoint:
- 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 98576 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@centos8 ~]#resize2fs /dev/vg0/mysql 1G
resize2fs 1.44.6 (5-Mar-2019)
Resizing the filesystem on /dev/vg0/mysql to 262144 (4k) blocks.
The filesystem on /dev/vg0/mysql is now 262144 (4k) blocks long.
[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
[root@centos8 ~]#mount -a
[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 966584 7676 890096 1% /data/mysql
[root@centos8 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 383M 0 383M 0% /dev
tmpfs 399M 0 399M 0% /dev/shm
tmpfs 399M 5.7M 393M 2% /run
tmpfs 399M 0 399M 0% /sys/fs/cgroup
/dev/sda2 100G 2.2G 98G 3% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 128M 781M 15% /boot
tmpfs 80M 0 80M 0% /run/user/0
/dev/mapper/vg0-mysql 944M 7.5M 870M 1% /data/mysql
[root@centos8 ~]#lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mysql vg0 -wi-ao---- 2.99g
[root@centos8 ~]#umount /data/mysql
#第四步
[root@centos8 ~]#lvreduce -L 1G /dev/vg0/mysql
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/mysql? [y/n]: y
Size of logical volume vg0/mysql changed from 2.99 GiB (766 extents) to 1.00
GiB (256 extents).
Logical volume vg0/mysql successfully resized.
#第五步
[root@centos8 ~]#mount -a
[root@centos8 ~]#lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mysql vg0 -wi-ao---- 1.00g
[root@centos8 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 383M 0 383M 0% /dev
tmpfs 399M 0 399M 0% /dev/shm
tmpfs 399M 5.7M 393M 2% /run
tmpfs 399M 0 399M 0% /sys/fs/cgroup
/dev/sda2 100G 2.2G 98G 3% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 128M 781M 15% /boot
tmpfs 80M 0 80M 0% /run/user/0
/dev/mapper/vg0-mysql 944M 7.5M 870M 1% /data/mysql
范例: 缩减逻辑卷简化步骤
[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 可以同时缩减卷和文件系统
[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
跨主机迁移卷组
源计算机上
1 在旧系统中,umount 所有卷组上的逻辑卷
2 禁用卷组
vgchange -a n vg0
lvdisplay
vgchange -a n vg0:
- vgchange:这是一个用于更改卷组属性的命令。
- -a n:这个选项表示禁用卷组,n 代表 “no”,意味着卷组中的所有逻辑卷都将被禁用。
- vg0:这是要禁用的卷组的名称。 lvdisplay:
- lvdisplay:这是一个用于显示逻辑卷信息的命令。
3 导出卷组
vgexport vg0
pvscan
vgdisplay
vgexport
命令用于导出 LVM(逻辑卷管理)卷组,使其在系统中不可见。这样做通常是为了将卷组移动到另一台计算机或进行备份。命令 vgexport vg0 的含义如下:
- vgexport:这是命令的名称,用于导出卷组。
- vg0:这是要导出的卷组的名称。 执行 vgexport vg0 命令后,卷组 vg0 将不再在系统中可见,这意味着你不能对其执行任何操作,包括创建、扩展或缩小逻辑卷等。
接下来,pvscan 命令用于扫描所有磁盘,查找包含 LVM 物理卷的设备。这个命令在执行 vgexport 后使用,以确保系统更新其关于可用物理卷的信息。
最后,vgdisplay 命令用于显示 LVM 卷组的详细信息。由于你已经导出了 vg0 卷组,vgdisplay 命令将不再显示 vg0 卷组的信息,因为它在系统中不再可见。
4 拆下旧硬盘在目标计算机上,并导入卷组:
vgimport vg0
vgimport 命令用于将一个已经导出(exported)的卷组(Volume Group,VG)重新导入到LVM系统中。当卷组被导出时,它从LVM的激活列表中移除,这意味着它的逻辑卷(Logical Volumes,LVs)不能被访问。导入卷组后,可以重新激活并访问其逻辑卷。
5 启用
vgchange -ay vg0
gchange 命令用于改变 LVM(逻辑卷管理)卷组的属性。命令 vgchange -ay vg0 的含义如下:
- vgchange:这是命令的名称,用于改变卷组的属性。
- -ay:这个选项用于激活卷组。其中,a 表示激活,y 表示 yes,即对所有询问回答 yes。 执行 vgchange -ay vg0 命令后,卷组 vg0 将被激活,这意味着它的逻辑卷将变得可访问,并且可以挂载和使用。
6 mount 所有卷组上的逻辑卷
拆除指定的PV存储设备
要拆除一个指定的物理卷(PV)存储设备,需要执行以下步骤:
**卸载逻辑卷:**首先,确保与该物理卷相关的所有逻辑卷(LV)都已经卸载。你可以使用 umount 命令来卸载它们。
**删除逻辑卷:**如果物理卷上有任何逻辑卷,你需要先删除这些逻辑卷。使用 lvremove 命令来删除逻辑卷。
**从卷组中移除物理卷:**使用 vgreduce 命令从卷组中移除物理卷。
**删除物理卷 **
**拆除物理设备 **
[root@centos8 ~]#pvdisplay
[root@centos8 ~]#pvmove /dev/sdc
[root@centos8 ~]#pvdisplay
[root@centos8 ~]#vgreduce vg0 /dev/sdc
[root@centos8 ~]#pvs
[root@centos8 ~]#pvremove /dev/sdc
[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.
逻辑卷快照
逻辑卷快照原理
快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据临
时拷贝以及其它操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空间,
建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照
逻辑卷管理器快照
快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移
动到快照区,没有改动的区域则由快照区和文件系统共享
逻辑卷快照工作原理
- 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
- 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
- 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候
的文件数量不能高于快照区的实际容量
快照特点: - 备份速度快,瞬间完
- 应用场景是测试环境,不能完成代替备份
- 快照后,逻辑卷的修改速度会一定有影响
实现逻辑卷快照
范例:
mkfs.xfs /dev/vg0/data
mount /dev/vg0/data/ /mnt/data
为现有逻辑卷创建快照
注意ext4建议使用-p r 实现只读
lvcreate -l 64 -s -n data-snapshot /dev/vg0/data
lvcreate -l 64 -s -n data-snapshot /dev/vg0/data -p r
lvcreate -n lv-mysal-snapshot -s -p r -L 1G /dev/testvg0/lv-mysql
1G
- lvcreate:这是命令的名称,用于创建逻辑卷。
- -l 64:这个选项用于指定逻辑卷的大小。在这种情况下,64 表示逻辑卷将使用 64 个物理扩展(PE)。
- -L 1G: 以容量大小。
- -s:这个选项用于创建一个快照卷。
- -n data-snapshot:这个选项用于指定新创建的逻辑卷(快照卷)的名称为 data-snapshot。
- /dev/vg0/data:这是原始逻辑卷的设备文件路径,其中 vg0 是卷组名称,data 是原始逻辑卷的名称。
- -p r:这个选项用于指定快照卷的权限模式为只读。 执行这个命令后,将创建一个名为 data-snapshot 的快照卷,它是 /dev/vg0/data 的快照,并且这个快照卷将以只读模式创建。
挂载快照
xfs注意要使用-o ro实现只读,防止快照被修改
mkdir -p /mnt/snap
mount -o ro,nouuid /dev/vg0/data-snapshot /mnt/snap
mkdir -p /mnt/snap 命令用于创建一个目录树,如果该目录树中的目录不存在,则会创建它们。-p 选项表示如果目录树中的任何目录不存在,就创建它。这个命令通常用于确保一个目录路径存在,而不管它是否已经存在。
- mount 是命令的名称,用于挂载文件系统。
- -o ro,nouuid 是挂载选项。ro 表示以只读模式挂载文件系统,nouuid 表示在挂载时忽略文件系统的 UUID,这在挂载某些类型的文件系统时可能是有用的,例如 LVM 快照卷。
- /dev/vg0/data-snapshot 是要挂载的文件系统的设备文件路径。vg0 是卷组名称,data-snapshot 是快照卷的名称。
- /mnt/snap 是挂载点,即文件系统将被挂载到的目录。 执行这个命令后,/dev/vg0/data-snapshot 文件系统将以只读模式挂载到 /mnt/snap 目录。
恢复快照
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot
umount /dev/vg0/data-snapshot:
- umount:这是一个用于卸载文件系统的命令。
- /dev/vg0/data-snapshot:这是要卸载的快照卷的设备路径。vg0 是卷组的名称,data-snapshot 是快照卷的逻辑卷名称。
umount /dev/vg0/data:
- umount:这是用于卸载文件系统的命令。
- /dev/vg0/data:这是要卸载的原始逻辑卷的设备路径。vg0 是卷组的名称,data 是原始逻辑卷的名称。
lvconvert –merge /dev/vg0/data-snapshot:
- lvconvert:这是一个用于转换逻辑卷的命令。
- –merge:这个选项表示将快照卷合并回其原始逻辑卷。
- /dev/vg0/data-snapshot:这是要合并的快照卷的设备路径。
删除快照
umount /mnt/snap
lvremove /dev/vg0/data-snapshot
- umount:这是命令的名称,用于卸载文件系统。
- /mnt/snap:这是要卸载的挂载点,即之前文件系统被挂载到的目录。 执行 umount /mnt/snap 命令后,/mnt/snap 目录下的文件系统将被卸载,不再可访问。
lvremove 命令用于删除 LVM(逻辑卷管理)逻辑卷。命令 lvremove /dev/vg0/data-snapshot 的含义如下:
- lvremove:这是命令的名称,用于删除逻辑卷。
- /dev/vg0/data-snapshot:这是要删除的逻辑卷的设备文件路径,其中 vg0 是卷组名称,data-snapshot 是逻辑卷的名称。
练习
1、创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创
建大小为5G的逻辑卷testlv;挂载至/users目录
2、 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复
制/etc/pam.d目录至自己的家目录
3、扩展testlv至7G,要求archlinux用户的文件不能丢失
4、收缩testlv至3G,要求archlinux用户的文件不能丢失
5、对testlv创建快照,并尝试基于快照备份数据,验证快照的功能
卸载逻辑卷
反着来一遍 先取消挂载,若写入了fstab文件,也需要删除。
[root@localhost ~]# mount /data/mysql
mount: /data/mysql: /dev/mapper/testvg0-mysql already mounted on /data/mysql.
mount: (hint) your fstab has been modified, but systemd still uses
the old version; use 'systemctl daemon-reload' to reload.
[root@localhost ~]# umount /dev/testvg0/mysql
[root@localhost ~]# lvremove /dev/testvg0/mysql
Do you really want to remove active logical volume testvg0/mysql? [y/n]: y
Logical volume "mysql" successfully removed.
[root@localhost ~]# vgremove testvg0
Volume group "testvg0" successfully removed
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rl 1 3 0 wz--n- <199.00g 0
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p2 rl lvm2 a-- <199.00g 0
/dev/sda1 lvm2 --- 5.00g 5.00g
/dev/sdb lvm2 --- 10.00g 10.00g
[root@localhost ~]# pvremove /dev/sda1 /dev/sdb
Labels on physical volume "/dev/sda1" successfully wiped.
Labels on physical volume "/dev/sdb" successfully wiped.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p2 rl lvm2 a-- <199.00g 0
常见面试题
- 使用 parted命令将4T硬盘分区,然后制作成LVM,硬盘并挂载到/data目录,请写出操作步骤?(系 统:Centos7)
- df 和 du 的区别
- 查看一下那几个文件的占用磁盘空间大,需要做一个使用空间大小的排序?
#du -a / | sort -n -r
- 说说Raid0,1,5,6,10的区别