Linux的磁盘管理

主要参考《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系统时,需要注意以下几点:

  1. ext文件系统仅能针对整个文件系统/挂载点,而无法对某个单一的目录进行磁盘配额设置。
  2. 只对一般用户有效,对root用户无效
  3. 注意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
  1. 通知内核重置容量
resize2fs /dev/storage/mylv 500M

此处有个小bug,就是执行时经常会报错,提示需要运行第二步的命令,但是其实在前面已经执行过了,不知道该如何解决。

  1. 缩小lv
lvreduce -L 500M /dev/storage/mylv
  1. 重新挂载
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}

你可能感兴趣的:(Linux的磁盘管理)