主要参考《Linux就该这么学》、《Linux就是这个范》、《鸟哥Linux私房菜》和《RHCSA/RHCE红帽Linux认证学习指南(第7版)》
1. 设备挂载——mount与umount
mount命令很简单,其命令格式为:
mount [ -t 文件系统 ] 设备名称 挂载点
文件系统一般都可以成功,如果需要挂载windows分区时,需要指定文件系统,常见的:
mount -t vfat /dev/sda1 /data
mount的另一个重要参数是-o
,使用如下的命令可以挂载一个虚拟设备,比如虚拟光盘。
mount -o loop 虚拟光盘文件 挂载点
umount命令更简单,可以umount设备,也可以umount挂载点
2. 磁盘分区——fdisk、mkfs
2.1 /etc/fstab
挂载设备或分区之后,系统重启以后,这些挂载的设备就会消失,要想继续使用,需要重新挂载。如果想要每次重启设备之后,都能使用之前挂载的设备,需要编辑/etc/fstab
文件
默认的/etc/fstab文件长这个样子:
#
# /etc/fstab
# Created by anaconda on Fri Apr 3 15:16:08 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
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=4ee04080-ef86-4075-ad17-42314ec609c0 /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
其中的字段依次为:
- 设备
- 挂载点
- 文件系统类型:交换分区为swap,光盘类型为iso9660
- -o的参数,defaults为不指定-o参数
- 是否备份
- 是否自检
2.2 fdisk
fdisk是一个交互式的用于对磁盘进行分区的命令,该命令使用起来比较简单,直接使用如下的命令即可开始分区:
fdisk [设备]
进入之后会提示:
[root@localhost data]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):
输入m后,可以看到一系列的命令提示:
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
可以看到,其中:
- n:创建一个分区
- d:删除一个分区
- p:打印分区列表
- w:写入并退出
之后,输入n,系统会询问是创建一个主分区还是一个扩展分区,你可以根据提示选择创建主分区还是扩展分区,此处我们选择扩展分区(e)
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
之后,系统会询问你要输入的分区编号,我们这里选择默认的(因为之前已经建立了一个分区了,所以此处默认是2),并输入起止地址
Partition number (2-4, default 2):
First sector (31459328-41943039, default 31459328):
Using default value 31459328
Last sector, +sectors or +size{K,M,G} (31459328-41943039, default 41943039):
Using default value 41943039
建立扩展分区之后,必然要建立逻辑分区,因此继续输入n,此时系统的提示会有所变化:
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
我们输入l,并根据你的需求输入逻辑分区的起止地址
Select (default p): l
Adding logical partition 5
First sector (31461376-41943039, default 31461376):
Using default value 31461376
Last sector, +sectors or +size{K,M,G} (31461376-41943039, default 41943039):
Using default value 41943039
Partition 5 of type Linux and of size 5 GiB is set
输入p后,可以看到分区表:
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: 0x710358f3
Device Boot Start End Blocks Id System
/dev/sdb1 2048 31459327 15728640 83 Linux
/dev/sdb2 31459328 41943039 5241856 5 Extended
/dev/sdb5 31461376 41943039 5240832 83 Linux
此时输入w完成磁盘分区操作
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.
可以看到,有的时候会执行不成功,我们可以用partprobe
命令来完成分区操作
2.3 磁盘格式化
完成分区之后,需要对磁盘进行格式化,磁盘格式化的命令为mkfs.****
,****代表的是文件的格式,例如我们可以使用
mkfs.xfs /dev/sdb5
之后就可以将格式化好的设备挂载到对应的目录即可,当然也可以编辑/etc/fstab
文件,并执行
mount -a
3. 交换分区管理——mkswap、swapon
交换分区其实可以理解为Windows中的虚拟内存,要想为本机添加交换分区,首先也要使用fdisk命令来创建一个分区。在添加swap分区前,我们可以先使用free命令来查看一下本机的内存情况:
[root@localhost data]# free -h
total used free shared buffers cached
Mem: 1.9G 1.4G 537M 10M 1.7M 328M
-/+ buffers/cache: 1.1G 867M
Swap: 2.0G 0B 2.0G
可以看到本机的内存有2G,交换分区有2G,要扩展分区仍然要使用fdisk命令先来划分出一块空间,用于进行交换分区,此处我们就不演示整个过程了,只说结论,我们建立了一个2G大小的分区sdc5,之后使用命令mkswap来对其进行格式化
mkswap /dev/sdc5
[root@localhost data]# mkswap /dev/sdc5
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=e9e9f3a2-df18-41fb-9e3c-42abc649e2a0
之后再使用swapon
命令,将其挂载到交换分区上
[root@localhost data]# swapon /dev/sdc5
此时可以看到,交换分区的大小变成了2G
[root@localhost data]# free -h
total used free shared buffers cached
Mem: 1.9G 1.4G 535M 10M 1.8M 328M
-/+ buffers/cache: 1.1G 865M
Swap: 4.0G 0B 4.0G
需要注意的是,使用这种方式后,如果重启系统,那么之前划分的交换分区就会又都不见了,如果想持久化这种交换分区的配额,仍然需要编辑/etc/fstab
文件,需要注意的是,此时不需要写挂载点,而只需要写swap即可生效
/dev/sdc5 swap swap defaults 0 0
2.4 建立交换分区的其他方法
除了前面提到的建立交换分区的方法以外,还可以使用其他方法,比如我们可以使用dd命令新建一个1G大小的空“交换文件”,然后将这个文件进行格式化
dd if=/dev/zero of=./swap bs=1M count=1024
mkswap ./swap
swapon ./swap
此时,使用free命令,可以看到交换分区的大小变成了5G
total used free shared buffers cached
Mem: 1.9G 1.9G 75M 10M 836K 771M
-/+ buffers/cache: 1.1G 847M
Swap: 5.0G 4K 5.0G
可以看到这种方法更加灵活和简单
4. 磁盘配额——quota
磁盘配额是用于管理每个用户能够使用磁盘空间大小的工具。一般而言,磁盘配额主要有两种:
- 软限制:当达到限制时,系统仅仅会提示用户,但不会做出限制
- 硬限制:当达到限制时,会终止用户的操作
当使用ext系统时,需要注意以下几点:
- ext文件系统仅能针对整个文件系统/挂载点,而无法对某个单一的目录进行磁盘配额设置。
- 只对一般用户有效,对root用户无效
- 注意SELinux的设置,在默认设置中由于启动了SELinux,因此仅能对/home目录进行磁盘配额的设置
要启动quota功能,需要在/etc/fstab
文件中进行配置,在defaults后面添加
-
uquota
/usrquota
/quota
:针对用户进行设置,RHEL6以前的版本需要添加usrquota
-
gquota
:针对用户组进行设置 -
pquota
/prjquota
:针对单一文件夹的设置,不可与gquota
同时出现
重启之后,可以用mount
命令来查看已经启用了quota功能。
具体的配额管理比较复杂,主要涉及到了xfs_quota
命令,此处回头慢慢补上。
5. RAID
RAID的管理主要用到了mdadm
命令,常用的参数包括:
- -a:检测设备名称
- -n:指定设备数量
- -l:指定RAID级别
- -C:创建
- -v:显示过程
- -r:移除设备
- -S:停止磁盘阵列
5.1 建立RAID
使用-C
参数可以创建一个RAID磁盘阵列,例如:
mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd{b,c,d,e}
执行上述命令后,系统会提示:
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd{b,c,d,e}
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 20954624K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
之后和普通的磁盘一样,我们需要对其进行格式化,并进行挂在操作
mkdir /RAID
mount /dev/md0 /RAID
vim /etc/fstab
6. 逻辑卷管理器(Logical Volume Manager)
无论是分区,还是RAID,都无法解决一个问题,就是磁盘空间灵活性的问题,这就需要介绍到我们的新朋友——逻辑卷。所谓逻辑卷就是在磁盘分区和文件系统之间增加了一个新的逻辑层,这样当文件系统的容量觉得不够用时,可以向逻辑卷中增加新的分区来进行扩容,反之亦然。
6.1 基本术语
- 物理卷(Physical Volume,PV):物理卷指的是具体的硬盘分区或者是和硬盘分区具有相同功能的设备,比如RAID
- 卷组(Volume Group,VG):类似于LVM系统中的物理硬盘,由多个物理卷组成。
- 物理扩展区(Physical Extend,PE):PE是LVM使用的最小存储单元,默认的PE大小是4M,每个卷组最多仅能包含65534个PE,所以一个卷组的最大容量是256G
- 逻辑卷(Logical Volume,LV):逻辑卷是在卷组之上的再切分,其分割大小必须为PE的整数倍
逻辑卷管理中涉及到的命令主要包括:
功能 | pv管理 | vg管理 | lv管理 |
---|---|---|---|
扫描(scan) | pvscan | vgscan | lvscan |
创建 (create) | pvcreate | vgcreat | lvcreate |
显示 (display) | pvdisplay | vgdisplay | lvdisplay |
移除(remove) | pvremove | vgremove | lvremove |
扩展(extend) | vgextend | lvextend | |
缩小(reduce) | vgreduce | lvreduce |
此外,除了上面以pv、vg和lv开头的一堆命令外,还有以下几个命令需要掌握:
- e2fsck:用于检查磁盘
- resize2fs:用于调整磁盘,用于ext2/3/4格式的磁盘
- xfs_growfs:对应于xfs系统,相当于xfs格式磁盘的resize2fs
- lvresize:参数与lvcreate、lvextend、lvreduce类似,都是用
-L
表示空间大小,用-l
表示PE的多少,只不过在此处用+
表示增加逻辑卷的空间,用-
表示减少逻辑卷的空间
6.2 建立逻辑卷
1)建立物理卷——pvcreate
可以一次建立多个分区
此处,我们选择两块物理磁盘sdb和sdc
[root@localhost ~]# pvcreate /dev/sd{b,c}
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc" successfully created
使用pvscan
命令,可以看到物理卷的一些信息,包括pv对应的分区及其对应的卷组(VG)信息。例如,在这个例子中,我们可以看到/dev/sda2
属于卷组rhel,其他两个硬盘(sdb和sdc)还没有加入到卷组中。
[root@localhost ~]# pvscan
PV /dev/sda2 VG rhel lvm2 [19.51 GiB / 0 free]
PV /dev/sdb lvm2 [20.00 GiB]
PV /dev/sdc lvm2 [20.00 GiB]
Total: 3 [59.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [40.00 GiB]
使用pvdisplay
命令,能够看到更详细的信息:
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name rhel
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4994
Free PE 0
Allocated PE 4994
PV UUID yP2DZY-nKdV-qJd8-Qq9e-l9yb-SBBz-mQi0f0
"/dev/sdb" is a new physical volume of "20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID eXTkZ1-g00O-OAB8-HT1b-EHlQ-b4qA-AIc0ht
"/dev/sdc" is a new physical volume of "20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID EvanJS-Da1Z-TsQl-YRW3-hgFm-F992-XgYHIC
2)建立卷组——vgcreate
使用命令vgcreate <卷组名称> <设备名称>
来建立卷组,其中设备名称为我们之前建立了物理卷的设备,同时设备可以为多个设备。例如,通过下面的命令,我们建立了一个名为storage
的卷组
[root@localhost ~]# vgcreate storage /dev/sd{b,c}
Volume group "storage" successfully created
使用命令vgscan
可以查看一些卷组的简略信息,包括:
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "rhel" using metadata type lvm2
Found volume group "storage" using metadata type lvm2
要想查看更详细的信息,仍然要使用display
命令
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name rhel
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 19.51 GiB
PE Size 4.00 MiB
Total PE 4994
Alloc PE / Size 4994 / 19.51 GiB
Free PE / Size 0 / 0
VG UUID o0UiT0-aQ2G-rF4J-8MPV-ylvG-cA3V-l6IVdI
--- Volume group ---
VG Name storage
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 39.99 GiB
PE Size 4.00 MiB
Total PE 10238
Alloc PE / Size 256 / 1.00 GiB
Free PE / Size 9982 / 38.99 GiB
VG UUID JcxYd8-JK3f-zmDl-ylnx-PFjm-Lpj6-6ZFyj1
3)建立逻辑卷——lvcreate
逻辑卷的建立可以使用下面的命令:
lvcreate -n <逻辑卷名称> -l <卷组名称>
也可以使用下面的命令
lvcreate -n <逻辑卷名称> -L <存储容量> <卷组名称>
例如,我们可以执行如下命令,来创建一个拥有37个PE大小(默认PE=4M,即一共有37*4=148M)的LV
[root@localhost ~]# lvcreate -n mylv -l 37 storage
Logical volume "mylv" created
执行之后,可以使用lvdisplay
来查看创建的结果:
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/rhel/swap
LV Name swap
VG Name rhel
LV UUID l5Le47-EKf1-XhfX-hflv-pKrh-2Msw-WG9Tcd
LV Write Access read/write
LV Creation host, time localhost, 2020-03-28 00:11:59 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Path /dev/rhel/root
LV Name root
VG Name rhel
LV UUID 1MpYHf-VGnT-AHgF-5LMQ-18eX-KWvz-ecEoJH
LV Write Access read/write
LV Creation host, time localhost, 2020-03-28 00:12:00 +0800
LV Status available
# open 1
LV Size 17.51 GiB
Current LE 4482
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Path /dev/storage/mylv
LV Name mylv
VG Name storage
LV UUID Tzc9F9-w1jf-uZoJ-wkzl-Ww7v-Ditu-iltKi1
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2020-04-13 15:33:21 +0800
LV Status available
# open 0
LV Size 148.00 MiB
Current LE 37
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
创建逻辑卷之后,就会在对应的/dev/
文件夹下生成一个具有对应名称的逻辑卷,即/dev/
,此处我们得到的是/dev/storage/my_lv
建立逻辑卷后,为了使用该逻辑卷,需要对其进行格式化(采用xfs格式的逻辑卷只能扩大,不能缩小):
mkfs.ext4 /dev/storage/mylv
在之后就是进行挂载,我们将其挂在到/mylv
目录下,同时编辑 /etc/fstab
文件(此处没有写出对fstab进行修改的详细步骤):
mkdir /mylv
mount /dev/storage/mylv /mylv
6.3 扩容逻辑卷
对逻辑卷进行扩容需要经过以下五个步骤:
1)卸载之前挂载好的逻辑卷:
umount /dev/storage/mylv
2)对逻辑卷进行扩容——lvextend
此处我们将逻辑卷的空间扩展到1G:
lvextend -L 1G /dev/storage/mylv
3)检查磁盘——e2fsck
e2fsck -f /dev/storage/mylv
其中参数f表示即便磁盘内容为空,依然对磁盘进行强制检查
4)重置磁盘容量——resize2fs
resize2fs /dev/storage/mylv
5)重新挂载
mount -a
此时可以使用df命令查看存储空间的变化:
[root@localhost mylv]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 140K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/mapper/storage-mylv 989M 2.7M 931M 1% /mylv
6.4 缩小逻辑卷
缩小逻辑卷的核心步骤与扩充逻辑卷的步骤完全相反:
1)卸载逻辑卷
umount /dev/storage/mylv
2)检查磁盘
e2fsck -f /dev/storage/mylv
- 通知内核重置容量
resize2fs /dev/storage/mylv 500M
此处有个小bug,就是执行时经常会报错,提示需要运行第二步的命令,但是其实在前面已经执行过了,不知道该如何解决。
- 缩小lv
lvreduce -L 500M /dev/storage/mylv
- 重新挂载
mount -a
df -h
6.5 删除逻辑卷
删除的顺序和创建的顺序完全相反,这里只简单的罗列一下基本的命令:
1)移除挂载
umount /dev/storage/mylv
同时删除/etc/fstab中的对应内容
2)删除逻辑卷
lvremove /dev/storage/mylv
3)删除卷组
vgremove storage
4)删除物理卷
pvremove /dev/sd{b,c}