poetry

冷眼向洋看世界,热风吹雨洒江天。
云横九派浮黄鹤,浪下三吴起白烟。

磁盘管理

磁盘设备根据接口进行命名,IDE接口的,以/dev/hd的形式命名。而SCSI、SATA、SAS、USB接口的,以sda,sdb,sdc的形式命名,不同的设备划分的名字从a-z

1
2
3
4
5
6
IDE的英文全称为“Integrated Drive Electronics”,即“电子集成驱动器”,它的本意是指把“硬盘控制器”与“盘体”集成在一起的硬盘驱动器,这种类型的接口随着接口技术的发展已经被淘汰了,而其后发展分支出更多类型的硬盘接口,比如ATA、Ultra ATA、DMA、Ultra DMA等接口都属于IDE硬盘。

以上是传统的并行ATA传输方式,后来又出现了串行ATA(Serial ATA,简称SATA),其最大数据传输率更进一步提高到了150MB/sec。

SATA的全称是Serial Advanced Technology Attachment,是 由Intel、IBM、Dell、APT、Maxtor和seagate公司共同提出的硬盘接口规范。SATA规范将硬盘的外部传输速率理论值提高到了150MB/s。SATA的优势:支持热插拔 ,传输速度快,执行效率高。
SATA接口需要硬件芯片的支持 ,例如Intel ICH5(R)、VIA VT8237、nVIDIA的MCP RAID和SiS964,如果主板南桥芯片不能直接支持的话,就需要选择第三方的芯片 ,例如SiliconImage 3112A芯片等,不过这样也就会产生一些硬件性能的差异,并且驱动程序也比较繁杂。

更多接口知识:

https://www.cnblogs.com/LinuxSuDa/p/4513996.html

两种分区

部分文件摘录于:

https://blog.csdn.net/efhgyj/article/details/91174541

对于同一块硬盘,又可以有不同的分区,分区的划分以数字命名,如:sdb1,sdb2,sdb3。分区的方式有:MBR分区和GPT分区。

MBR分区

​ MBR的意思是“主引导记录”,是IBM公司早年间提出的。它是存在于磁盘驱动器开始部分的一个特殊的启动扇区。这个扇区包含了已安装的操作系统系统信息,并用一小段代码来启动系统。如果你安装了Windows,其启动信息就放在这一段代码中——如果MBR的信息损坏或误删就不能正常启动Windows,这时候你就需要找一个引导修复软件工具来修复它就可以了。Linux系统中MBR通常会是GRUB加载器。MBR。当一台电脑启动时,它会先启动主板自带的BIOS系统,bios加载MBR,MBR再启动Windows,这就是mbr的启动过程。

GPT分区

GPT的意思是GUID Partition Table,即“全局唯一标识磁盘分区表”。他是另外一种更加先进新颖的磁盘组织方式,一种使用UEFI启动的磁盘组织方式。最开始是为了更好的兼容性,后来因为其更大的支持内存(mbr分区最多支持2T的磁盘),更多的兼容而被广泛使用,特别是苹果的MAC系统全部使用gpt分区。gtp不在有分区的概念,所有CDEF盘都在一段信息中存储。可以简单的理解为更先进但是使用不够广泛的技术。

两者之间的区别

因为兼容问题,gpt其实在引导的最开始部分也有一段MBR引导,也叫做“保护引导”,为了防止设备不支持UEFI

1、MBR最多支持2T,而GPT理论上是无限制的。

2、MBR最多支持四个主分区,GPT没有限制。如果你想跑多系统,MBR最多4个而GPT没有限制。

3、win7只能用MBR分区,从Win8开始微软建议你使用GPT。

4、GPT是由UEFI启动的,而UEFI是后来才提出的概念,兼容性和稳定性不如BIOS+MBR。

image.webp

Windows系统分区

最先出现在Windows8中设置新磁盘,系统会询问你是想要使用MBR还是GPT分区,GPT是一种新的硬盘分区标准。GPT带来了很多新特性,最大支持18EB的大容量(EB=1024 PB,PB=1024 TB);MBR最大只支持2TB,但拥有最好的兼容性。

  • MBR(Master Boot Record)分区:

MBR的意思是“主引导记录”,它有自己的启动器,也就是启动代码,一旦启动代码被破坏,系统就没法启动,只有通过修复才能启动系统。最大支持2TB容量,在容量方面存在着极大的瓶颈,那么GPT在今后的发展就会越来越占优势,MBR也会逐渐被GPT取代。

  • GPT(GUID Partition Table)分区:

GPT意为GUID分区表,这是一个正逐渐取代MBR的新标准,它由UEFI辅助而形成的,这样就有了UEFI用于取代老旧的BIOS,而GPT则取代老旧的MBR。这个标准没有MBR的那些限制。磁盘驱动器容量可以大得多,大到操作系统和文件系统都没法支持。它同时还支持几乎无限个分区数量,限制只在于操作系统,Windows支持最多128个GPT分区。通过UEFI,所有的64位的win10,win8,win7和Vista,以及所对应的服务器都能从GPT启动

有区别,GPT和MBR是不同的分区表类型。使用MBR分区表的硬盘最多只能划分4个主分区磁盘,并且MBR最大仅支持2TB的硬盘。如果需要分区的硬盘容量超过2TB了,则需要使用GPT分区表类型,此分区表类型不受分区个数、硬盘大小的限制。

UEFI,全称Unified Extensible Firmware Interface,即“统一的可扩展固件接口”,是一种详细描述全新类型接口的标准,是适用于电脑的标准固件接口,旨在代替BIOS(基本输入/输出系统)。此标准由UEFI联盟中的140多个技术公司共同创建,其中包括微软公司。UEFI旨在提高软件互操作性和解决BIOS的局限性。

要详细了解UEFI,还得从BIOS讲起。我们都知道,每一台普通的电脑都会有一个BIOS,用于加载电脑最基本的程式码,担负着初始化硬件,检测硬件功能以及引导操作系统的任务。UEFI就是与BIOS相对的概念,这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上,从而达到开机程序化繁为简节省时间的目的。传统BIOS技术正在逐步被UEFI取而代之,在最近新出厂的电脑中,很多已经使用UEFI,使用UEFI模式安装操作系统是趋势所在。

  • 总结

UEFI是新式的BIOS,legacy是传统BIOS。你在UEFI模式下安装的系统,只能用UEFI模式引导;同理,如果你是在Legacy模式下安装的系统,也只能在legacy模式下进系统。UEFI只支持64为系统且磁盘分区必须为GPT模式,传统BIOS使用INT13中断读取磁盘,每次只能读64KB,非常低效,而UEFI每次可以读1MB,载入更快。此外,Win8,更是进一步优化了UEFI支持,号称可以实现瞬时开机。

磁盘分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#选择一块需要划分区的磁盘
[root@localhost ~]# fdisk /dev/sdb

#或者查看磁盘里面的分区
[root@node1 ~]# fdisk /dev/sdb -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x6b7b90db
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 8e Linux LVM
/dev/sdb2 10487808 41943039 15727616 8e Linux LVM
[root@node1 ~]#


#查看内核当中是否识别新的分区
[root@localhost ~]# cat /proc/partitions
#通知内核重新读取磁盘分区
[root@localhost ~]# partx -a /dev/sdb1
partx: /dev/sdb: error adding partition 1
#或者是:
[root@localhost ~]# partprobe /dev/sdb1

#上面那个是识别分区的,下面这个是识别磁盘的。
#执行如下命令扫描磁盘: echo "- - -" > /sys/class/scsi_host/host0/scan

#查看内核分区
[root@node1 ~]# cat /proc/partitions

分区管理的子命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d 删除分区
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l 列出已知分区类型
m 打印帮助菜单
n 添加一个新分区
o create a new empty DOS partition table
p 打印分区表
q 不保存退出
s create a new empty Sun disklabel
t 改变分区系统的ID(类型)
u change display/entry units
v verify the partition table
w 保存修改并退出
x extra functionality (experts only)

新建分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p #选择主分区
Partition number (2-4, default 2): 2 #一个有四个主分区,一个扩展分区,扩展分区可以用来分逻辑分区
First sector (10487808-41943039, default 10487808):
Using default value 10487808
#分1个G给这个分区
Last sector, +sectors or +size{K,M,G} (10487808-41943039, default 41943039): +1G
Partition 2 of type Linux and of size 1 GiB is set

Command (m for help): p #查看当前分区表

Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x8809f989

Device Boot Start End Blocks Id System
/dev/sdd1 2048 10487807 5242880 8e Linux LVM
/dev/sdd2 10487808 12584959 1048576 83 Linux

删除分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Command (m for help): d
Partition number (1,2, default 2):
Partition 2 is deleted

Command (m for help): p

Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x8809f989

Device Boot Start End Blocks Id System
/dev/sdd1 2048 10487807 5242880 8e Linux LVM

改变分区的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Command (m for help): l #列出当前分区的所有格式

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
--------------------------------,,,,------------------------------
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT

Command (m for help): t #改变分区
Selected partition 1
Hex code (type L to list all codes): ff #选择system id
Changed type of partition 'Linux LVM' to 'BBT'

Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sdd1 2048 10487807 5242880 ff BBT

当为磁盘分好分区之后,就要用合适的文件系统格式化这个分区,便于对这块磁盘进行文件存储等操作。

df命令

du和df的区别?

  • du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在

的,没有被删除的。他计算的大小就是当前他认为存在的所有文件大小的累加和。

  • df,disk free,通过文件系统来快速获取空间大小的信息,当我们删除一个文件的时候,这个文件不

是马上就在文件系统当中消失了,而是暂时消失了,当所有程序都不用时,才会根据OS的规则释放掉已

经删除的文件, df记录的是通过文件系统获取到的文件的大小,他比du强的地方就是能够看到已经删除

的文件,而且计算大小的时候,把这一部分的空间也加上了,更精确了。

  • 当文件系统也确定删除了该文件后,这时候du与df就一致了。

  • du查看目录大小,df查看磁盘使用情况。

参数 含义
-a 显示全部的档案系统和各分割区的磁盘使用情形
-i 显示i -nodes的使用量
-k 大小用k来表示 (默认值)
-t 显示某一个档案系统的所有分割区磁盘使用量
-x 显示不是某一个档案系统的所有分割区磁盘使用量
-T 显示每个分割区所属的档案系统名称
-H 人性化输出,换算关系是1000,而不是1024
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
查看块使用情况
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 2.3G 15G 13% /
devtmpfs 899M 0 899M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.4M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 190M 825M 19% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/sdb1 2.0G 6.0M 1.8G 1% /root/m_test



查看Inode使用情况
[root@node1 test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 121503 368 121135 1% /dev
tmpfs 124468 1 124467 1% /dev/shm
tmpfs 124468 720 123748 1% /run
tmpfs 124468 16 124452 1% /sys/fs/cgroup
/dev/mapper/centos-root 8910848 37480 8873368 1% /
/dev/sda1 524288 334 523954 1% /boot
tmpfs 124468 1 124467 1% /run/user/0
/dev/sdb2 10240 4 10236 1% /root/test

du命令

查看某目录总体空间占比

1
2
3
4
5
6
7
8
9
[root@localhost ~]# du -sh /*
157M /boot
35M /etc
76K /home

-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)
--inodes list inode usage information instead of block usage
-L, --dereference 取消所有引用符号链接
-s, --summarize 不显示每一级目录下每一级文件夹的占用空间,只显示当前目录

dd命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dd if=/dev/zero of=/dev/null& pid
if 是源
of 是目的

/dev/zero:吐零机
/dev/null:数据黑洞


bs=# 指定复制单元大小
count=# 指定多少个bs

磁盘拷贝
dd if=/dev/sda of=/dev/sdb
将/dev/sda文件中的东西复制到/dev/sdb中

两个参数
/dev/null --黑洞
/dev/zero --写0

文件系统

概述

1
2
3
4
5
Unix文件系统:FFS、UFS、JFS2
网络文件系统:NFS 、CIFS
集群文件系统:GFS2、OCF2
分布式文件系统:ceph、Glusterfs、moosefs
Linux文件系统:ext3,ext4,xfs

分类:

1
2
3
4
5
6
7
是否支持journal功能:
日志型文件系统:ext3、4、xfs...
非日志型文件系统:ext2、vfat
文件系统的组成部分:
内核中的模块:ext4、xfs、vfat
用户空间的管理工具:mkfs、ext4、xfs、vfat
Linux虚拟文件系统:VFS

格式化磁盘分区

用不同的文件系统格式化磁盘分区

比如:将/dev/sdb1这个分区用ext4文件系统格式

1
2
3
4
5
6
[root@localhost ~]# mkfs.ext4 /dev/sdb1


#一下两种方式是等价的
mkfs.ext4 /dev/DEVICE == mkfs -t ext4 /dev/DEVICE
#其中FS_TYPE是磁盘格式,可以是: ext4 xfs btrfs vfat等

swap交换分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#将/dev/sdb1分区以swap形式格式化
[root@node1 ~]# mkswap /dev/sdd1
mkswap: /dev/sdd1: warning: wiping old LVM2_member signature.
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=14fd926a-fac0-490b-9162-b00ccf8c7797

#查看当前系统内存使用情况,包括物理内存、交换内存和内核缓冲内训
[root@node1 ~]# free -m
total used free shared buff/cache available
Mem: 972 233 486 7 252 584
Swap: 2047 0 2047

#将格式化好的交换分区添加到交换内存中
[root@node1 ~]# swapon /dev/sdd1
[root@node1 ~]# free -m
total used free shared buff/cache available
Mem: 972 237 482 7 252 580
Swap: 7167 0 7167

free -m / -g
-m 以MB为单位
-g 以GB为单位


#临时关闭交换分区
swapoff /dev/sdb1

以上创建挂载swap分区只是临时有效,要想设备重启后依然生效,要将相关信息写入到/etc/fstab配置文件

查看文件系统

部分资料来自于:

https://blog.csdn.net/qq_34870631/article/details/88872938

blkid:查看块设备属性信息

1
2
3
4
[root@node1 ~]# blkid /dev/sdb1
/dev/sdb1: UUID="OZC7Tc-r1R0-tikB-KtAN-zVYK-k3zz-fVeAUU" TYPE="LVM2_member"
【磁盘名称】 【UUID】 【磁盘类型】
这里的磁盘类型是LVM2

UUID的作用:

  • UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中添加了新的存储设备如硬盘,很可能会造成一些麻烦,比如说启动的时候因为找不到设备而失败,而使用UUID则不会有这样的问题。

  • 自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。如果你在插入了USB盘时启动了系统,而下次启动时又把它拔掉了,就有可能导致设备名分配不一致。

  • ubuntu中的许多关键功能现在开始依赖于UUID,例如grub──系统引导程序

Inode

​ 日常在硬盘需要保存的数据实在太多了,因此 Linux 系统中有一个名为 super block 的“硬盘地图”。Linux 并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整个文件系统的信息。因为如果把所有的文件内容都写入到这里面,它的体积将变得非常大,而且文件内容的查询与写入速度也会变得很慢。Linux 只是把每个文件的权限与属性记录在inode 中,而且每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,里面记录着如下信息:

1
2
3
4
5
6
7
8
➢ 该文件的访问权限(read、write、execute);
➢ 该文件的所有者与所属组(owner、group);
➢ 该文件的大小(size);
➢ 该文件的创建或内容修改时间(ctime);
➢ 该文件的最后一次访问时间(atime);
➢ 该文件的修改时间(mtime);
➢ 文件的特殊权限(SUID、SGID、SBIT);
➢ 该文件的真实数据地址(point)。

mount挂载

如果是临时挂载,则需要mount /dev/sdb1 /test,这样挂载重启后就会消失。想要永久挂载则需要更改/etc/fstab中的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#mount:显示当前已经挂载的设备
[root@node1 ~]# mount | tail -n 2
/dev/mapper/V1-LV1 on /appdata type ext4 (rw,relatime,data=ordered)
/dev/mapper/V1-thirdBack on /tmp/thirdUp type ext4 (ro,relatime,data=ordered)
常用选项:
-t:指名要挂载设备上的文件系统类型
-r:readonly,以只读的方式挂载
-w:不更新/etc/mtab
-L:“Label”:以卷标指定挂载设备
-U:“UUID”:以UUID指定挂载设备
-B:绑定目录到另一个目录上

使用-o参数挂载时,可以去定义挂载文件系统的选项
-o,--option<list>
async:异步模式
sync:同步模式
atime/moatime:包含目录和文件
diratime/modiratime:目录的访问时间戳
auto/noauto:是否支持自动挂载
exec/noexec:是否支持将文件系统上的应用程序运行为进程
dev/nodev:是否支持在此文件系统上使用设备文件
suid/nouid:是否支持在此文件系统上使用uid标识
remount:重新挂载
ro:
rw
user/nouser:是否允许普通用户挂载此设备
acl:启用此文件系统上的ACL功能

默认挂载选项:defaults
rw,suid,dev,exec,auto,nouser,async
#以只读的形式挂载
[root@node1 ~]# mount -o ro /dev/sdb3 test

[root@node1 test]# cat /proc/mounts

关于/etc/fstab中的文件含义:

1
2
3
4
5
6
7
8
9
10
11
[root@node1 ~]# cat  /etc/fstab 
# /etc/fstab
# Created by anaconda on Thu Aug 15 02:51:10 2019
#
# 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=b883fe76-ef59-4a95-bf91-db372d66c87f /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
【设备文件】 【挂载目录】 【格式类型】 【权限选项】 【是否备份】 【是否自检】
字段 意义
设备文件 一 般 为 设 备 的 路 径 + 设 备 名 称 , 也 可 以 写 唯 一 识 别 码 ( UUID ,Universally Unique Identifier)
挂载目录 指定要挂载到的目录,需在挂载前创建好
格式类型 指定文件系统的格式,比如 Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
权限选项 若设置为 defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
是否备份 若为 1 则开机后使用 dump 进行磁盘备份,为 0 则不备份
是否自检 若为 1 则开机后自动进行磁盘自检,为 0 则不自检

卸载:umount /dev/sdb1

如果卸载的时候卡死,可以试着用这条命令:fuser -mv -k /dev/sdb1

fuser使用手册:

https://ipcmen.com/fuser

1
yum install psmisc

软硬链接

1
2
3
4
5
6
7
8
9
硬链接: 可以将它理解为一个“指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和文件。所
以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 inode连接
数就会增加 1;而且只有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上
是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,
由于技术的局限性,我们不能跨分区对目录文件进行链接。

软链接(也称为符号链接):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进
行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与 Windows 系统中的“快捷方式”
具有一样的性质。

命令 –ln,格式为ln [选项] 目标

参数 作用
-s 创建“符号链接”(如果不带-s 参数,则默认创建硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
创建两个代表软硬链接的文件夹,之后的测试就在这两个文件夹中进行
[root@node1 diffLinks]# mkdir -p {symbolic,hard}

准备两个文本
[root@node1 diffLinks]# echo "this is symbolic text" > symbolic/s.txt
[root@node1 diffLinks]# echo "this is hard text" > hard/h.txt
[root@node1 diffLinks]# tree
.
├── hard
│ └── h.txt
└── symbolic
└── s.txt

2 directories, 2 files

软链接
[root@node1 diffLinks]# ln -s symbolic/s.txt sym.lnk

硬链接
[root@node1 diffLinks]# ln hard/h.txt had.lnk

可以看到现在两个链接都可以正常查看
[root@node1 diffLinks]# cat sym.lnk
this is symbolic text
[root@node1 diffLinks]# cat had.lnk
this is hard text

现在删除两个链接的源文件
[root@node1 diffLinks]# rm symbolic/s.txt -f
[root@node1 diffLinks]# rm hard/h.txt -f

之后软链接就不可以查看了,硬链接还是可以查看,软链接有点像windows中的快捷方式,硬链接有点像是复制,但这里需要知道Linux文件删除的本质是什么???
[root@node1 diffLinks]# cat sym.lnk
cat: sym.lnk: No such file or directory
[root@node1 diffLinks]# cat had.lnk
this is hard text

RAID阵列

文章摘录于:

https://blog.csdn.net/tianlesoftware/article/details/5429634

RAID(Redundant Arrays of Independent Disks),独立磁盘冗余阵列,简称磁盘阵列。

磁盘阵列分为两种:软阵列(Software Raid)和硬阵列(Hardware Raid)两种。

  • 软阵列:即通过软件程序并由计算机CPU提供运行能力所构成,由于软件程式不是一个完整系统,故只能提供最基本的RAID容错功能,其他如热备用硬盘的设置,远程管理等功能均没有
  • 硬阵列:是由独立操作系统的硬件提供整个磁盘阵列的控制和计算功能,不依靠系统的CPU资源,由于硬阵列是一个完整的系统,所有需要的功能均可以做进去,所以硬阵列所提供的功能和性能均比软阵列好。如果你想把系统也做到磁盘阵列中,硬阵列是唯一的选择,故我们在市场上RAID5级的磁盘阵列均为硬阵列,软阵列只适用于RAID 0和RAID 1

要使用磁盘RAID主要有两种方式,一种就是RAID适配卡,通过RAID适配卡插入PCI插槽,再接上硬盘实现RAID功能。第二种方式就是直接在主板上集成RAID控制芯片,让主板能直接实现磁盘RAID。

RAID 0

条带化(Stripe)存储, 即Data Stripping数据分条技术。RAID 0可以把多块硬盘连成一个容量更大的硬盘群,可以提高磁盘的性能和吞吐量。RAID 0没有冗余或错误修复能力,成本低,要求至少两个磁盘,一般只是在那些对数据安全性要求不高的情况下才被使用。RAID 0连续以位或字节为单位分割数据,并行读/写于多个磁盘上,在所有的级别中,RAID 0的速度是最快的。理论上说,有N个磁盘组成的RAID0是单个磁盘读写速度的N倍。但是RAID 0没有冗余功能的,如果一个磁盘(物理)损坏,则所有的数据都无法使用。因此并不能算是真正的RAID结构。
(1)、RAID 0最简单方式
   就是把N块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起,形成一个独立的逻辑驱动器,容量是单独硬盘的N倍,在电脑数据写时被依次写入到各磁盘中,当一块磁盘的空间用尽时,数据就会被自动写入到下一块磁盘中,它的好处是可以增加磁盘的容量。速度与其中任何一块磁盘的速度相同,如果其中的任何一块磁盘出现故障,整个系统将会受到破坏,可靠性是单独使用一块硬盘的1/n。
(2)、RAID 0的另一方式
  是用N块硬盘选择合理的带区大小创建带区集,最好是为每一块硬盘都配备一个专门的磁盘控制器,在电脑数据读写时同时向N块磁盘读写数据,速度提升n倍。提高系统的性能。

RAID 0.webp

RAID 1

RAID 1会将数据储存两份,称之为镜像(Mirror)存储。提高了可靠性,但磁盘利用率50%,也就是说,两块10G的磁盘组成RAID 1,最后磁盘容量也只有10G。

RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

RAID 1.webp

RAID 3

奇偶校验(XOR)条带存储,共享校验盘,数据条带存储单位为字节。RAID 3是以一个硬盘来存放数据的奇偶校验位,数据则分段存储于其余硬盘中。它象RAID 0一样以并行的方式来存放数,但速度没有RAID 0快。如果数据盘(物理)损坏,只要将坏硬盘换掉,RAID控制系统则会根据校验盘的数据校验位在新盘中重建坏盘上的数据。不过,如果校验盘(物理)损坏的话,则全部数据都无法使用。利用单独的校验盘来保护数据虽然没有镜像的安全性高,但是硬盘利用率得到了很大的提高,为n-1。RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据来说,奇偶盘会成为写操作的瓶颈。

RAID 3.webp

RAID 5

奇偶校验(XOR)条带存储,校验数据分布式存储,数据条带存储单位为块。RAID 5不单独指定的奇偶盘,而是在所有磁盘上交叉地存取数据及奇偶校验信息。在RAID 5上,读/写指针可同时对阵列设备进行操作,提供了更高的数据流量。RAID 5更适合于小数据块和随机读写的数据。RAID 3与RAID 5相比,最主要的区别在于RAID 3每进行一次数据传输就需涉及到所有的阵列盘;而对于RAID 5来说,大部分数据传输只对一块磁盘操作,并可进行并行操作。在RAID 5中有“写损失”,即每一次写操作将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。

RAID 5把校验块分散到所有的数据盘中。它使用了一种特殊的算法,可以计算出任何一个带区校验块的存放位置。这样就可以确保任何对校验块进行的读写操作都会在所有的RAID磁盘中进行均衡,从而消除了产生瓶颈的可能。RAID5的读出效率很高,写入效率一般,块式的集体访问效率不错。RAID 5提高了系统可靠性,但对数据传输的并行性解决不好,而且控制器的设计也相当困难。为了具有RAID-5级的冗余度,需要最少由三个磁盘组成的磁盘阵列(不包括一个热备用)。RAID-5可以通过磁盘阵列控制器硬件实现,也可以通过某些网络操作系统软件实现了。硬盘的利用率为n-1。
当进行恢复时,比如我们需要需要恢复下图中的A0,这里就必须需要B0、C0、D0加0 parity才能计算并得出A0,进行数据恢复。所以当有两块盘坏掉的时候,整个RAID的数据失效。

RAID 5.webp

RAID 10 和RAID 01

1、 RAID 10 是先做条带再做镜像。这种情况中,我们假设当DISK0损坏时,在剩下的3块盘中,只有当DISK1一个盘发生故障时,才会导致整个RAID失效,我们可简单计算故障率为1/3。

RAID10.webp

2、RAID 01 是先做备份在做条带。这种情况下,我们仍然假设DISK0损坏,这时左边的条带将无法读取。在剩下的3块盘中,只要DISK2,DISK3两个盘中任何一个损坏,都会导致整个RAID失效,我们可简单计算故障率为2/3。因此,RAID10比RAID01在安全性方面要强

RAID 01.webp

​ 从数据存储的逻辑位置来看,在正常的情况下RAID01和RAID10是完全一样的,而且每一个读写操作所产生的IO数量也是一样的,所以在读写性能上两者没什么区别。而当有磁盘出现故障时,比如前面假设的DISK0损坏时,我们也可以发现,这两种情况下,在读的性能上面也将不同,RAID10的读性能将优于RAID01。
  把RAID0和RAID1技术结合起来,数据除分布在多个盘上外,每个盘都有其物理镜像盘,提供全冗余能力,允许一个以下磁盘故障,而不影响数据可用性,并具有快速读/写能力。RAID0+1要在磁盘镜像中建立带区集至少4个硬盘。

命令行实现

格式为“mdadm [模式] <RAID设备名称> [选项] [成员设备名称]”。

参数 作用
-a 检测设备名称-
n 指定设备数量
-l 指定 RAID 级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止 RAID 磁盘阵列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@localhost ~]# yum -y install mdadm
[root@localhost ~]# cat /proc/partitions
major minor #blocks name

8 0 20971520 sda
8 1 1048576 sda1
8 2 19921920 sda2
8 16 20971520 sdb
8 48 20971520 sdd
8 64 20971520 sde
8 32 20971520 sdc
--------------------more--------------------
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
--------------------more--------------------
-C 参数代表创建一个 RAID 阵列卡;
-v 参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID磁盘阵列的名称;
-a yes 参数代表自动创建设备文件;
-n 4 参数代表使用 4 块硬盘来部署这个RAID 磁盘阵列;
-l 10 参数则代表 RAID 10 方案;
最后再加上 4 块硬盘设备的名称就搞定了。


将制作好的RAID磁盘阵列格式化为ext4格式
[root@localhost ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
--------------------more--------------------

将制作好的磁盘挂载到目录,并查看属性信息
[root@localhost ~]# mkdir RAID
[root@localhost ~]# mount /dev/md0 RAID/
[root@localhost ~]# df -h RAID/
Filesystem Size Used Avail Use% Mounted on
/dev/md0 40G 49M 38G 1% /root/RAID
四个硬盘,每个20G,为什么size是40G呢?
因为一半用来高速存储,一半用来数据备份了。

查看/dev/md0 磁盘阵列的详细信息
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Aug 13 15:37:47 2019
Raid Level : raid10
--------------------more--------------------

并把挂载信息写入到配置文件中,使其永久生效。
[root@localhost ~]# echo "/dev/md0 /root/RAID ext4 defaults 0 0" >> /etc/fstab

LVM

部分摘录于相关文章:

https://www.cnblogs.com/moox/p/11163229.html

https://blog.51cto.com/13691477/2299707

https://blog.51cto.com/wuyelan/1540859

https://www.thegeekdiary.com/lvm-error-cant-open-devsdx-exclusively-mounted-filesystem/

http://www.liaojl.com/blog/device-devsdb-excluded-by-a-filter/

​ 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要。

​ LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。RHEL5默认安装的分区格式就是LVM逻辑卷的格式,需要注意的是/boot分区不能基于LVM创建,必须独立出来。

原理解析

要想理解好LVM的原理,我们必须首先要掌握4个基本的逻辑卷概念。

PE  (Physical Extend)  物理拓展

PV  (Physical Volume)  物理卷

VG  (Volume Group)  卷组

LV  (Logical Volume)  逻辑卷

image.webp

1.将我们的物理硬盘格式化成PV(Physical Volume)

​ 我们看到,这里有两块硬盘,一块是sda,另一块是sdb,在LVM磁盘管理里,我首先要将这两块硬盘格式化为我们的PV(Physical Volume),也就是我们的物理卷,其实格式化物理卷的过程中LVM是将底层的硬盘划分为了一个一个的PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。这个就是我们的第一步操作。

2.创建一个VG(Volume Group)

​ 在将硬盘格式化成PV以后,我们第二步操作就是创建一个卷组,也就是VG(Volume Group),卷组在这里我们可以将其抽象化成一个空间池,VG的作用就是用来装PE的,我们可以把一个或者多个PV加到VG当中,因为在第一步操作时就已经将该硬盘划分成了多个PE,所以将多个PV加到VG里面后,VG里面就存放了许许多多来自不同PV中的PE,我们通过上面的图片就可以看到,我们格式化了两块硬盘,每个硬盘分别格式化成了3个PE,然后将两块硬盘的PE都加到了我们的VG当中,那么我们的VG当中就包含了6个PE,这6个PE就是两个硬盘的PE之和。通常创建一个卷组的时候我们会为其取一个名字,也就是该VG的名字。

3.基于VG创建我们最后要使用的LV(Logical Volume)

​ 【注意】PV以及VG创建好以后我们是不能够直接使用的,因为PV、VG是我们逻辑卷底层的东西,我们其实最后使用的是在VG基础上创建的LV(Logical Volume),所以第三步操作就是基于VG来创建我们最终要使用的LV。

​ 当我们创建好我们的VG以后,这个时候我们创建LV其实就是从VG中拿出我们指定数量的PE,还是拿上图来说,我们看到我们此时的VG里面已经拥有了6个PE,这时候我们创建了我们的第一个逻辑卷,它的大小是4个PE的大小,也就是16M(因为一个PE的默认大小是4M),而这4个PE有三个是来自于第一块硬盘,而另外一个PE则是来自第二块硬盘。当我们创建第二个逻辑卷时,它的大小就最多只有两个PE的大小了,因为其中的4个PE已经分配给了我们的第一个逻辑卷。

​ 所以创建逻辑卷其实就是我们从VG中拿出我们指定数量的PE,VG中的PE可以来自不同的PV,我们可以创建的逻辑卷的大小取决于VG当中PE存在的数量,并且我们创建的逻辑卷其大小一定是PE的整数倍(即逻辑卷的大小一定要是4M的整数倍)。

4.将我们创建好的LV进行文件系统的格式化,然后挂载使用

​ 在创建好LV以后,这个时候我们就能够对其进行文件系统的格式化了,我们最终使用的就是我们刚创建好的LV,其就相当于传统的文件管理的分区,我们首先要对其进行文件系统的格式化操作,然后通过mount命令对其进行挂载,这个时候我们就能够像使用平常的分区一样来使用我们的逻辑卷了。

​ 我们在创建好LV以后,我们会在 /dev 目录下看到我们的LV信息,例如 /dev/vgname/lvname, 我们每创建一个VG,其会在/dev目录下创建一个以该VG名字命名的文件夹,在该VG的基础上创建好LV以后,我们会在这个VG目录下多出一个以LV名字命名的逻辑卷。

命令整理

命令 含义
fdisk 查看磁盘信息
pvcreate /dev/sdb1 /dev/sdc1 创建PV物理卷
pvdisplay 查看物理卷详细信息
pvs 查看物理卷摘要信息
vgcreate VG1 /dev/sdb1 /dev/sdc1 创建卷组(Volume
vgdisplay 查看所有卷组的详细信息
vgs 查看卷组的摘要信息
lvcreate -n LV1 -L 1G VG1 创建逻辑卷

各参数含义:

  • -n:表示创建逻辑卷名
  • -L :表示分配逻辑卷的大小
  • VG1:表示在卷组VG1上创建逻辑卷LV1
命令 含义
lvs 显示逻辑卷的信息
lvdisplay 显示逻辑卷的详细信息
mke2fs -t ext4 /dev/VG1/LV1 格式化物理卷
mount /dev/VG1/LV1 /root/lvm1 挂载,可以再/etc/fstab中永久挂载
vgextend VG1 /dev/sdd1 扩容卷组容量,把物理卷加入卷组
lvextend -L +2G /dev/VG1/LV1 扩容逻辑卷LV1,增加2G容量
resize2fs /dev/VG1/LV1 确认增加容量
e2fsck -f /dev/VG1/LV1 强制检查LV1逻辑卷,需先卸载
resize2fs /dev/VG1/LV1 1G 缩减逻辑卷,-1G表示缩减1G大小,1G表示缩减到1G
lvreduce -L 1G /dev/VG1/LV1 再进行逻辑卷的LV容量的缩减
pvmove /dev/sdb1 将sdb1磁盘分区的数据转移到其他盘上
vgreduce VG1 /dev/sdb1 把sdb1从VG1卷组中移除
pvremove /dev/sdb1 把sdb1分区从PV物理卷中释放出来
lvcreate -L 20M -n backup -s -p r /dev/V1/LV1 备份逻辑卷LV1
lvremove /dev/V1/backup 删除逻辑卷的备份

内核要求

LVM1版本需要2.4及以后的内核支持;LVM2需要2.6及以后的内核版本支持。

1
2
3
4
[root@node1 LG]# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
[root@node1 LG]# uname -r
3.10.0-1062.1.2.el7.x86_64

磁盘分区

添加两块磁盘,分别为:/dev/sdb/dev/sdc,分别对sdb和sdc进行分区。

sdb的分区是:两个主分区

sdc的分区是:一个主分区和一个扩展分区,其中扩展分区有分出了逻辑分区

第一块磁盘/dev/sdb分区:创建两个主分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@node1 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #主分区
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G
Partition 1 of type Linux and of size 5 GiB is set

Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p #第一块磁盘划分两个主分区
Using default response p
Partition number (2-4, default 2):
First sector (10487808-41943039, default 10487808):
Using default value 10487808
Last sector, +sectors or +size{K,M,G} (10487808-41943039, default 41943039):
Using default value 41943039
Partition 2 of type Linux and of size 15 GiB is set

Command (m for help): t #做LVM管理,需要修改分区类型为Linux LVM
Partition number (1,2, default 2): 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): t
Partition number (1,2, default 2):
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb7ee3c1b

Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 8e Linux LVM
/dev/sdb2 10487808 41943039 15727616 8e Linux LVM

Command (m for help): w #保存分区信息
The partition table has been altered!

#更新内核分区表
[root@node1 ~]# partprobe /dev/sdb
[root@node1 ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2

第二块磁盘sdc的分区:创建一个主分区和一个逻辑分区,用来测试扩展分区和逻辑分区是否能够创建PV物理卷并加入VG卷组,实验证明,扩展分区是无法创建PV和加入VG,主分区和逻辑分区可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
[root@node1 ~]# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.23.2).
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #主分区
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G
Partition 1 of type Linux and of size 5 GiB is set

Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
#扩展分区,要创建扩展分区之后,才能创建逻辑分区;
#扩展分区只能创建一个,分区表支持创建最多四分主分区,
#如果想要创建4个以上的分区,必须创建扩展分区,然后创建逻辑分区
Select (default p): e
Partition number (2-4, default 2):
First sector (10487808-41943039, default 10487808):
Using default value 10487808
Last sector, +sectors or +size{K,M,G} (10487808-41943039, default 41943039):
Using default value 41943039
Partition 2 of type Extended and of size 15 GiB is set

Command (m for help): n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l #创建逻辑分区
Adding logical partition 5
First sector (10489856-41943039, default 10489856):
Using default value 10489856
Last sector, +sectors or +size{K,M,G} (10489856-41943039, default 41943039):
Using default value 41943039
Partition 5 of type Linux and of size 15 GiB is set

Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x313b8a59

Device Boot Start End Blocks Id System
/dev/sdc1 2048 10487807 5242880 83 Linux
/dev/sdc2 10487808 41943039 15727616 5 Extended
/dev/sdc5 10489856 41943039 15726592 83 Linux

Command (m for help): t #修改分区类型
Partition number (1,2,5, default 5): 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): t
Partition number (1,2,5, default 5): 5
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x313b8a59

Device Boot Start End Blocks Id System
/dev/sdc1 2048 10487807 5242880 8e Linux LVM
/dev/sdc2 10487808 41943039 15727616 5 Extended
/dev/sdc5 10489856 41943039 15726592 8e Linux LVM

Command (m for help): w #保存分区表信息
The partition table has been altered!
[root@node1 ~]# partprobe /dev/sdc
[root@node1 ~]# ls -l /dev/sdc*
brw-rw---- 1 root disk 8, 32 Dec 25 06:31 /dev/sdc
brw-rw---- 1 root disk 8, 33 Dec 25 06:31 /dev/sdc1
brw-rw---- 1 root disk 8, 34 Dec 25 06:31 /dev/sdc2
brw-rw---- 1 root disk 8, 37 Dec 25 06:31 /dev/sdc5

创建PV、VG、LV

报错

1
2
3
4
5
[root@node1 ~]# pvcreate /dev/sdb1
Can't open /dev/sdb1 exclusively. Mounted filesystem?
Can't open /dev/sdb1 exclusively. Mounted filesystem?
可以尝试修改配置文件:
/etc/lvm/lvm.conf

创建物理卷PV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# pvcreate /dev/sdc2 #sdc2是扩展分区,无法做成物理卷PV
Device /dev/sdc2 not found (or ignored by filtering).
[root@node1 ~]# pvcreate /dev/sdb1
#把sdb1做成物理卷PV,也可以用下面的写法,一次性把所有主分区或逻辑分区做成物理卷PV
Physical volume "/dev/sdb1" successfully created.
[root@node1 ~]# pvcreate /dev/sdb2 /dev/sdc1 /dev/sdc5
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdc5" successfully created.
[root@node1 ~]# pvs
#显示所有的物理卷
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 --- 5.00g 5.00g
/dev/sdb2 lvm2 --- <15.00g <15.00g
/dev/sdc1 lvm2 --- 5.00g 5.00g
/dev/sdc5 lvm2 --- <15.00g <15.00g

创建卷组VG

1
2
3
4
5
6
7
8
9
10
#创建卷组1,卷组的PV物理卷,可以是不同磁盘,即整合了所有磁盘分区做成资源池
[root@node1 ~]# vgcreate V1 /dev/sdb1 /dev/sdc1
Volume group "V1" successfully created
[root@node1 ~]# vgcreate V2 /dev/sdb2 /dev/sdc5
Volume group "V2" successfully created
[root@node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
V1 2 0 0 wz--n- 9.99g 9.99g
V2 2 0 0 wz--n- 29.99g 29.99g
centos 1 2 0 wz--n- <19.00g 0

创建逻辑卷lv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#-n表示创建逻辑卷名,-L表示分配逻辑卷的空间大小,VG1表示在卷组VG1上创建逻辑卷LVtest1
[root@node1 ~]# lvcreate -n LV1 -L 1G V1
Logical volume "LV1" created.
[root@node1 ~]# lvcreate -n LV2 -L 1G V2
Logical volume "LV2" created.
[root@node1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LV1 V1 -wi-a----- 1.00g
LV2 V2 -wi-a----- 1.00g
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@node1 ~]# ls -l /dev/V1
total 0
lrwxrwxrwx 1 root root 7 Dec 25 07:33 LV1 -> ../dm-2

格式化逻辑卷LV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#物理卷需要格式化之后才能使用,格式化为ext4格式
[root@node1 ~]# mke2fs -t ext4 /dev/V1/LV1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

挂载逻辑卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1 ~]# mkdir LG
[root@node1 ~]# mount /dev/V1/LV1 LG/
[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 2.1G 15G 12% /
/dev/sda1 1014M 176M 839M 18% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/V1-LV1 976M 2.6M 907M 1% /root/LG

#永久挂载逻辑卷需要在/etc/fstab中设置

新增加一块硬盘,并将这块磁盘创建PV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#通知系统重新搜索磁盘
[root@node1 ~]# echo "- - - " > /sys/class/scsi_host/host0/scan

#按照之前的方法,将/dev/sdd分区并更改格式
[root@node1 ~]# fdisk -l /dev/sdd | tail -n 2
Device Boot Start End Blocks Id System
/dev/sdd1 2048 10487807 5242880 8e Linux LVM

#创建物理卷PV
[root@node1 ~]# pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created.

#扩展VG卷组容量,把物理卷加入卷组
[root@localhost ~]# vgextend VG1 /dev/sdd1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@node1 ~]# echo "this is a test for LVM"> LG/test

#在挂载的逻辑卷里添加数据,用来测试在逻辑卷扩容是否会破坏原有数据
[root@node1 ~]# cat LG/test
this is a test for LVM

#扩容逻辑卷LV1,增加2G空间容量(从对应的卷组中划分空间容量)
[root@node1 ~]# lvextend -L +2G /dev/V1/LV1
Size of logical volume V1/LV1 changed from 1.00 GiB (256 extents) to 3.00 GiB (768 extents).
Logical volume V1/LV1 successfully resized.
[root@node1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LV1 V1 -wi-ao---- 3.00g
LV2 V2 -wi-a----- 1.00g
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g

#使用resize2fs命令来进行确认增加容量,前面的步骤只是初步分配,还不能实际使用,
#需要此步骤来确定实际分配使用
[root@node1 ~]# resize2fs /dev/V1/LV1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/V1/LV1 is mounted on /root/LG; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/V1/LV1 is now 786432 blocks long.

#xfs系统确认实际使用的命令
#xfs_growfs /dev/VGtest1/LVtest1

#数据并没有受损
[root@node1 ~]# cat LG/test
this is a test for LVM

缩减逻辑卷

缩减逻辑卷的注意事项:
1、查看逻辑卷使用空间状况
2、不能在线缩减,得先卸载 切记
3、确保缩减后的空间大小依然能存储原有的所有数据
4、在缩减之前应该先强行检查文件,以确保文件系统处于一至性状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#处于挂载状态的LV逻辑卷无法强制检查
[root@node1 ~]# umount /dev/V1/LV1
[root@node1 ~]# e2fsck -f /dev/V1/LV1
e2fsck 1.42.9 (28-Dec-2013)
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/V1/LV1: 12/196608 files (0.0% non-contiguous), 21309/786432 blocks

#首先需要确定缩减逻辑卷到多大空间容量,-1G表示缩减1G大小,1G表示缩减至1G,再进行逻辑卷LV容量缩减
[root@node1 ~]# lvreduce -L 1G /dev/V1/LV1
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce V1/LV1? [y/n]: y
Size of logical volume V1/LV1 changed from 3.00 GiB (768 extents) to 1.00 GiB (256 extents).
Logical volume V1/LV1 successfully resized.

#之后需要重新挂载逻辑卷

缩减磁盘空间

发现物理磁盘空间使用不足,将其中一块硬盘或分区拿掉,避免磁盘浪费

1、pvmove /dev/sdb1 #将/dev/sdb1上存储的数据移到其它物理卷中

2、vgreduce VGtest /dev/sdb1 #将/dev/sdb1从VGtest卷组中移除

3、pvremove /dev/sdb1 #将/dev/sdb1从物理卷上移除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 V1 lvm2 a-- <5.00g <4.00g
/dev/sdb2 V2 lvm2 a-- <15.00g <14.00g
/dev/sdc1 V1 lvm2 a-- <5.00g <5.00g
/dev/sdc5 V2 lvm2 a-- <15.00g <15.00g
/dev/sdd1 lvm2 --- 5.00g 5.00g

#把sdb1磁盘分区的数据转移到其它磁盘上
[root@node1 ~]# pvmove /dev/sdb1
/dev/sdb1: Moved: 43.36%
/dev/sdb1: Moved: 100.00%

#把分区sdb1从VG卷组中移除
[root@node1 ~]# vgreduce V1 /dev/sdb1
Removed "/dev/sdb1" from volume group "V1"

#把sdb1分区从PV物理卷中释放出来
[root@node1 ~]# pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped.
[root@node1 ~]# cat LG/test
cat: LG/test: No such file or directory

#如果磁盘划分了多个分区,做成多个物理卷加入了卷组,那么可以能重复以上步骤,把所有的空间都从卷组和物理卷中释放,然后可以拿走这块磁盘做它用

重新把/dev/sdb1加入到V1中

1
2
3
4
5
6
7
8
9
[root@node1 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[root@node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
V1 1 1 0 wz--n- <5.00g <4.00g
V2 2 1 0 wz--n- 29.99g 28.99g
centos 1 2 0 wz--n- <19.00g 0
[root@node1 ~]# vgextend V1 /dev/sdb1
Volume group "V1" successfully extended

LVM快照

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@node1 LG]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 2.1G 15G 12% /
/dev/sda1 1014M 176M 839M 18% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/V1-LV1 976M 2.6M 907M 1% /appdata


#利用LV1逻辑卷,快照形成一个备份的物理卷BackUp(逻辑卷快照功能)
[root@node1 LG]# lvcreate -L 20M -n BackUp -s -p r /dev/V1/LV1
Logical volume "BackUp" created.
[root@node1 LG]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
LV1 V1 owi-aos--- 1.00g
thirdBack V1 sri-aos--- 20.00m LV1 0.06
LV2 V2 -wi-a----- 1.00g
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@node1 LG]# mkdir /tmp/thirdUp
[root@node1 LG]# mount /dev/V1/thirdBack /tmp/thirdUp/ #把快照的逻辑卷挂载到目录上
mount: /dev/mapper/V1-thirdBack is write-protected, mounting read-only
[root@node1 LG]# cat /tmp/thirdUp/lvm
this is the LVM test

删除LVM快照

1
2
3
[root@node1 ~]# lvremove /dev/V1/backup
Do you really want to remove active logical volume V1/backup? [y/n]: y
Logical volume "backup" successfully removed

知识扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
知识扩展
resize2fs命令
resize2fs命令被用来增大或者收缩未加载的“ext2/ext3”文件系统的大小。如果文件系统是处于mount状态下,那么它只能做到扩容,前提条件是内核支持在线resize。,linux kernel 2.6支持在mount状态下扩容但仅限于ext3文件系统。
-d:打开调试特性;
-p:打印已完成的百分比进度条;
-f:强制执行调整大小操作,覆盖掉安全检查操作;
-F:开始执行调整大小前,刷新文件系统设备的缓冲区
如果是xfs文件系统,则需要使用xfs_growfs命令
e2fsck命令
e2fsck是检查ext2、ext3、ext4等文件系统的正确性。
补充说明:
e2fsck执行后的传回值及代表意义如下:
0 没有任何错误发生。
1 文件系统发生错误,并且已经修正。
2 文件系统发生错误,并且已经修正。
4 文件系统发生错误,但没有修正。
8 运作时发生错误。
16 使用的语法发生错误。
128 共享的函数库发生错误。
参 数:
-a 不询问使用者意见,便自动修复文件系统。
-b <superblock> 指定superblock,而不使用预设的superblock。
-B <区块大小> 指定区块的大小,单位为字节。
-c 一并执行badblocks,以标示损坏的区块。
-C 将检查过程的信息完整记录在file descriptor中,使得整个检查过程都能完整监控。
-d 显示排错信息。
-f 即使文件系统没有错误迹象,仍强制地检查正确性。
-F 执行前先清除设备的缓冲区。
-l <文件> 将文件中指定的区块加到损坏区块列表。
-L <文件> 先清除损坏区块列表,再将文件中指定的区块加到损坏区块列表。因此损坏区块列表的区块跟文件中指定的区块是一样的。
-n 以只读模式开启文件系统,并采取非互动方式执行,所有的问题对话均设置以"no"回答。
-p 不询问使用者意见,便自动修复文件系统。
-r 此参数只为了兼容性而存在,并无实际作用。
-s 如果文件系统的字节顺序不适当,就交换字节顺序,否则不做任何动作。
-S 不管文件系统的字节顺序,一律交换字节顺序。
-t 显示时间信息。
-v 执行时显示详细的信息。
-V 显示版本信息。
-y 采取非互动方式执行,所有的问题均设置以"yes"回答。