前言
之前我们讨论了关于硬盘的基本知识、如何分区、创建文件系统(格式化)、挂载和卸载,以及如果对要打算作为交换分区的分区做后两步操作,现在我们来讨论关于磁盘管理的其他部分的知识。
一、逻辑卷LVM
逻辑卷LVM(Logical Volume Manager),它是Linux环境下对磁盘分区进行管理的一种机制,性质与基本的磁盘没有区别。特点是可以随意扩张大小,缩减大小,快照备份。
我们先了解一些术语:
- PV:物理卷(Physical volume)
- VG:卷组(Volume Group)
- LV:逻辑卷(Logical Volume)
1.创建LVM
- 创建pv
将物理磁盘,传换成物理卷PV:
我们可以用pvcreate指令:
pvcreate /dev/sdf
Physical volume "/dev/sdf" successfully created.
这里显示我们的磁盘sdf已经成功创建为物理卷。
- 创建vg
创建卷组VG:
我们用vgcreate指令创建卷组。
vgcreate的格式是 vgcreate+卷组名+卷组成员:
vgcreate vg1 /dev/sdf
Volume group "vg1" successfully created
- 创建逻辑卷
创建逻辑卷与上面同理,用lvcreate指令:
创建逻辑卷,-L 参数后面指定大小, -n参数后面指定卷名,最后面要加上组成逻辑卷的卷组名:
lvcreate -L 4G -n lv1 vg1
Logical volume "lv1" created.
在这里我们用卷组vg1创建了一个大小为4G,名字为lv1的逻辑卷。
- 创建文件系统并挂载
我们可以先用mkfs指令创建文件系统,并且挂载:
mkfs.ext4 /dev/vg1/lv1
注意这里的路径为/dev/卷组名/逻辑卷名
之后会显示信息:
mkfs.ext4 /dev/vg1/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
262144 inodes, 1048576 blocks
52428 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
接下来我们就可以创建挂载的目录并且挂载我们的逻辑卷了:
mkdir /mnt/lv1
mount /dev/vg1/lv1 /mnt/lv1
这之后我们用df指令就可以看到已经挂载的逻辑卷:
df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 974M 0 974M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 11M 980M 2% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 4.2G 13G 25% /
/dev/sda1 xfs 1014M 172M 843M 17% /boot
tmpfs tmpfs 199M 28K 199M 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/vg1-lv1 ext4 3.9G 16M 3.6G 1% /mnt/lv1
可以看到最后一行就是我们的逻辑卷lv1。
2.VG管理
当我们的逻辑卷LVM的空间不够使用的时候,需要进行逻辑卷的扩充,我们需要先扩充卷组VG
首先还是要先创建新的pv:
pvcreate /dev/sdg
Physical volume "/dev/sdg" successfully created.
我们可以用指令pvs查看所有的物理卷:
pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdf vg1 lvm2 a-- <5.00g 1020.00m
/dev/sdg lvm2 --- 5.00g 5.00g
接着,我们可以利用命令 vgextend扩充卷组:
vgextend vg1 /dev/sdg
Volume group "vg1" successfully extended
以此类推,我们可以用vgs来查看卷组:
vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 2 1 0 wz--n- 9.99g 5.99g
可以看到vg1卷组有两个物理卷,创建了1个逻辑卷,大小为10G,有空闲的6G
3.LV扩容
在我们给VG扩充之后,就可以给LV进行扩容。
首先要先观察VG是否有足够的空间,用上面的vgs指令即可。
接着我们用lvextend来进行扩容:
lvextend -L +4G /dev/vg1/lv1
Size of logical volume vg1/lv1 changed from 4.00 GiB (1024 extents) to 8.00 GiB (2048 extents).
Logical volume vg1/lv1 successfully resized.
输出表示扩充逻辑卷成功。
但是这个时候我们如果用df指令查看逻辑卷大小,发现大小没有改变:
df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 974M 0 974M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 11M 980M 2% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 4.2G 13G 25% /
/dev/sda1 xfs 1014M 172M 843M 17% /boot
tmpfs tmpfs 199M 28K 199M 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/vg1-lv1 ext4 3.9G 16M 3.6G 1% /mnt/lv1
接下来我们还要对文件系统进行扩容
利用指令resize2fs ( resize to file system)来进行文件系统的扩充:
resize2fs /dev/vg1/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg1/lv1 is mounted on /mnt/lv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg1/lv1 is now 2097152 blocks long.
现在我们再用df查看逻辑卷大小:
df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 974M 0 974M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 11M 980M 2% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 4.2G 13G 25% /
/dev/sda1 xfs 1014M 172M 843M 17% /boot
tmpfs tmpfs 199M 28K 199M 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/vg1-lv1 ext4 7.8G 18M 7.4G 1% /mnt/lv1
可以看到,逻辑卷已经被扩充了4G的大小。
4.删除逻辑卷
删除逻辑卷就是创建逻辑卷的逆向操作,也就是卸载、删除逻辑卷、删除卷组、删除物理卷:
umount /dev/vg1/lv1
lvremove /dev/vg1/lv1
vgremove /dev/vg1
pvremove /dev/sdf
二、高级存储管理
1.文件系统详解
文件系统的存在,让文件准确放入到磁盘某个位置以及快速定位读取成为了可能。
比较大众的文件系统有
Windows: FAT16,FAT32,NFTS
Linux:EXT3, EXT4, XFS
其中,EXT3,EXT4都为索引(index)文件系统。
索引即为目录,相当于一本字典的前十几页。
由于索引等文件系统的限制,文件系统大小的限制如下:
EXT3:文件系统最大16TB
EXT4:文件系统最大16TB
XFS:文件系统最大100TB
下面我们以EXT4文件系统为例:
- 分块block
在文件系统中,我们一般将非索引的空间分块,称为block,一个block大小为4096B(4KB)。
block存储文件的实际数据,实际存储的文件的内容如果比较大,会占用多个block。
block大小默认为4KB。
一个块不能同时存储不同的文件,如果我们要存储一个5KB和一个2KB的文件,那么第一个文件将会占据第一个块的全部,以及第二个块的1KB,第二个文件不能占用第二个块,只能占据第三个块的2KB空间。
存储一个文件的块可以是不连续的。如果有一个文件系统,删除了其中一个文件,在都被占用的块之间流出了几个空位,那么再次创建的文件将先把这些空位填满,然后再在整个文件系统的后面占用新块。
- 索引inode
inode的i即为index(索引),node即为结点。inode记录着文件的属性(文件的元数据metadata)。
文件的元数据包括文件的属性、大小、权限、属组、属主、链接数、块的数量和编号等等……
在文件系统中,一个文件占用一个inode,同时记录此文件数据所在的block number。
inode的大小为128 Bytes。
- 超级块 superblock
超级块是对inode和block的整体说明。
超级块会存储block和inode的总量,以及已经使用和没有使用的inode、block数量(通过索引位图和数据位图)。
我们可以创建一个文件,观察inode信息:
ll -i 文件名:
touch 1.txt
ll -i 1.txt
11 -rw-r--r--. 1 root root 0 Feb 4 09:14 1.txt
我们可以看见文件1.txt的inode即为11号。
我们可以用df -i查看inode的数量:
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 249227 514 248713 1% /dev
tmpfs 253483 1 253482 1% /dev/shm
tmpfs 253483 1116 252367 1% /run
tmpfs 253483 16 253467 1% /sys/fs/cgroup
/dev/mapper/centos-root 8910848 155601 8755247 2% /
/dev/sda1 524288 340 523948 1% /boot
tmpfs 253483 18 253465 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
/dev/sdb1 131072 10 131062 1% /mnt/disk1
/dev/sdc1 65536 10 65526 1% /mnt/disk2
我们可以看到分区sdc1一共有65536个inode,还有65526个可用。
我们创造大量文件,观察inode的使用情况:
touch file{1..65527}
touch: cannot touch ‘file65527’: No space left on device
这个时候显示file65527无法创建,设备没有空间,这个时候我们用wc计数:
ls -l | wc -l
65527
但是这个时候我们再看磁盘空间大小:
df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 974M 0 974M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 11M 980M 2% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 4.2G 13G 25% /
/dev/sda1 xfs 1014M 172M 843M 17% /boot
tmpfs tmpfs 199M 24K 199M 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 ext4 2.0G 6.3M 1.8G 1% /mnt/disk1
/dev/sdc1 ext4 976M 4.4M 905M 1% /mnt/disk2
可以看到sdc1还有905M的可用空间。
虽然现在不能再创建新的文件,因为inode已经被占满,但是可以向里面书写内容。
磁盘空间的限制依据inode和block两方面,请清理掉填满的分区,避免不必要的报错。
2. 文件链接
- 符号链接
symbolic link 软链接。
我们首先创建一个文件,并且输入内容:
touch /file1
echo 1111 > /file1
我们用重定向在/file1中写入了1111。
如果我们想在当前文件夹里查看这个file1,可以ln(link)创建软链接:
ln -s /file1 /mnt/disk2/file1
这样我们就在当前目录下创建了一个叫做file1的软链接,它的目标位置为/file1。
接下来我们来观察这个软链接:
ll /mnt/disk2/file1
lrwxrwxrwx. 1 root root 6 Feb 4 09:36 /mnt/disk2/file1 -> /file1
首先在权限前面的类型位,为l(d为目录),代表着这个文件为链接文件。后面为它的目标地址。
我们在对这个链接文件进行操作的时候,对于它的目标文件采取同样的操作。
如果我们删除软链接文件,源文件不受影响,反过来,软链接文件将会闪烁,不可用。
实际上,软链接记录的只是源文件的绝对路径。
- 硬链接
首先需要注意的是,硬链接必须在一个分区下面做。
创建硬链接的时候,不要加上 -s:
echo 222 > /file2
ln /file2 /file2-h1
ls -l /file2 /file2-h1
-rw-r--r--. 2 root root 4 Feb 4 09:46 /file2
-rw-r--r--. 2 root root 4 Feb 4 09:46 /file2-h1
我们可以看到,创建了file2和硬链接file2-h1,这两个文件的链接数都是2.
接着:
ln /file2 /file2-h2
ls -l /file2 /file2-h1 /file2-h2
-rw-r--r--. 3 root root 4 Feb 4 09:46 /file2
-rw-r--r--. 3 root root 4 Feb 4 09:46 /file2-h1
-rw-r--r--. 3 root root 4 Feb 4 09:46 /file2-h2
这个时候链接数变为3。
如果我们删除掉file2,那么file2-h1和file2-h2依旧可以看到内容:
rm -rf /file2
cat /file2-h1
222
cat /file2-h2
222
硬链接只能针对文件做,不能对目录做。
硬链接只能在同分区做。
三、 创建软RAID
我们准备四块硬盘(虚拟机):
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 2G 0 part
├─sdb2 8:18 0 200M 0 part
├─sdb3 8:19 0 200M 0 part
├─sdb4 8:20 0 1K 0 part
├─sdb5 8:21 0 200M 0 part
├─sdb6 8:22 0 200M 0 part
├─sdb7 8:23 0 200M 0 part
└─sdb8 8:24 0 2G 0 part
sdc 8:32 0 5G 0 disk
├─sdc1 8:33 0 1G 0 part
└─sdc2 8:34 0 1G 0 part
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
├─sde1 8:65 0 1G 0 part
├─sde2 8:66 0 1G 0 part
└─sde3 8:67 0 3G 0 part
sdf 8:80 0 5G 0 disk
└─vg1-lv1 253:2 0 8G 0 lvm
sdg 8:96 0 5G 0 disk
└─vg1-lv1 253:2 0 8G 0 lvm
sdh 8:112 0 5G 0 disk
sdi 8:128 0 5G 0 disk
└─sdi1 8:129 0 1G 0 part
sdj 8:144 0 1G 0 disk
sdk 8:160 0 1G 0 disk
sdl 8:176 0 1G 0 disk
sdm 8:192 0 1G 0 disk
sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64
下面的sdj,sdk,sdl,sdm即为新加的四块1G硬盘。
我们组一个RAID5,三块数据盘,一块热备盘:
mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd{j,k,l,m}
-C代表创建,-l5代表level5,RAID5,-n3代表三块数据盘+校验盘,-x1代表一块热备盘。如果是n4,那么就三块数据,一块校验,没有热备。这里我们用sdj,sdk,sdl,sdm四块硬盘创建了RAID5:
mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd{j,k,l,m}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
接下来我们格式化并挂载:
mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
130816 inodes, 523264 blocks
26163 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
mkdir /mnt/raid5
mount /dev/md0 /mnt/raid5
这个时候我们用df -hT查看:
df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 974M 0 974M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 11M 980M 2% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 4.2G 13G 25% /
/dev/sda1 xfs 1014M 172M 843M 17% /boot
tmpfs tmpfs 199M 20K 199M 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64
/dev/md0 ext4 2.0G 6.0M 1.9G 1% /mnt/raid5
由于四块盘分工如下:
1G | 1G | 1G | 1G |
---|---|---|---|
数据 | 数据 | 校验 | 热备 |
所以可用数据只有2G。
我们可以用mdadm -D查看RAID详细信息:
mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Feb 4 10:03:50 2021
Raid Level : raid5
Array Size : 2093056 (2044.00 MiB 2143.29 MB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Feb 4 10:05:47 2021
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 7075d8cb:c85a2a6f:bc7e1f86:71800d2c
Events : 18
Number Major Minor RaidDevice State
0 8 144 0 active sync /dev/sdj
1 8 160 1 active sync /dev/sdk
4 8 176 2 active sync /dev/sdl
3 8 192 - spare /dev/sdm
总结
本文我们讨论了逻辑卷、文件系统和廉价冗余磁盘阵列(RAID)相关的知识,至此,关于磁盘管理相关的知识就到此为止,接下来我们将讨论查找和压缩相关的知识。