Linux系统管理入门:磁盘管理

1、基本概念

磁盘类型:固态硬盘 SSD、混合硬盘 HHD、机械硬盘 HDD

:每个 0 或 1 就是一个位(bit),位是内存的最小单位。

比特 bit:1 比特等于 1 位,bit 使用 b 表示;

字节 Byte:1Byte=8bit,Byte 使用 B 表示;

扇区 sector:通常为 512B,磁盘最小存储单元;

柱面:不同盘片相同位置的扇区组成一个柱面

block:将多个扇区编号合成一个块(通常 4K),块是文件系统最小存储单元;

inode :又称索引表,由 inode 号组成的一个列表;

inode :又称元数据,指向数据块的指针;

元数据:存放文件或目录的属性信息,包括文件的大小、UID、GID、权限、时间戳及链接数等,但是不包含文件名;人通过文件名识别文件,机器通过 inode 号识别文件。

硬链接:一个 inode 号对应多个文件名,因此数据修改会同步至各个文件名中;硬链接不能跨文件系统,因为首先两个文件系统的文件管理方式可能不同,比如有的文件系统甚至不是索引文件系统,其次是目标文件系统中该 inode 号可能已经使用,会造成 inode 号冲突的现象。

软链接:会产生一个新的 inode、新的文件名,指向的是源文件名,软链接并没有自己的 block 数据块,因此将源文件的数据更新后,软链接文件也同步更新;将源文件 inode 与 block 映射关系删除后,软连接文件也无法查看。创建软连接时建议使用绝对路径,软连接可用跨文件系统。

①一个文件或目录大小由元数据(inode)与 block 数据块构成;

②文件的 block 存放的是文件的具体内容;目录的 block 存放的是目录中的文件名和 inode 的映射关系;

③使用 cp 命令拷贝文件时,会将 block 块拷贝并生成新的 inode;

④使用 mv 命令移动文件时,若在同一个文件系统中,不会由 block 移动也不会产生新的文件,只是更新了对应目录 block 块中的文件名与 inode 的映射关系;在不同的文件系统中,会将 block 拷贝并生成新的 inode。

⑤使用 rm 命令删除文件时,删除的是文件的硬链接数,只有当文件的硬链接数为 0 时,inode 与 block 数据块的映射关系才完全被删除,无法通过文件系统的原本的 inode 索引找到该文件,但是文件对应的数据仍存储在硬盘中。此时该 inode 号被文件系统回收,inode 原本指向的 block 数据块被文件系统置为可用状态,block 块中的数据不会立即被擦除,直到下次写入数据覆盖。

2、接口类型

IDE(Integrated Drive Electronics)电子集成驱动器,其拥有的价格低廉、兼容性强的特点;IDE 代表着硬盘的一种类型,比如 ATA、Ultra ATA、DMA、 Ultra DMA 等接口都属于 IDE 硬盘。

SATA(Serial-ATA)采用串行连接方式,SATA 的出现将 ATA 与 IDE 区分开来, IDE 称为并口,SATA 称为串口;串行 ATA 总线使用嵌入式时钟信号,具备了更强的纠错能力,在很大程度上提高了数据传输的可靠性。

SCSI ( Small Computer System Interface )小型计算机系统接口, 是同 IDE(ATA)完全不同的接口,IDE 接口是普通 PC 的标准接口,而 SCSI 并不是专门为硬盘设计的接口,是一种广泛应用于小型机上的高速数据传输技术。SCSI 接口具有应用范围广、多任务、带宽大、CPU 占用率低,以及热插拔等优点。

SAS(Serial Attached SCSI)即串行连接 SCSI,是新一代的 SCSI 技术,和现在流行的 Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短链接线改善内部空间等。SAS 是并行 SCSI 接口之后开发出的全新接口。此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与 SATA 硬盘的兼容性。

M.2 接口 Intel 推出的一种替代 MSATA 新的接口规范,具有体积小、高速传输的优势,可以兼容多种通信协议,如 sata、PCIe、USB、HSIC、UART、SMBus 等。

3、命名规则

lsblk 命令可查看系统上的设备信息。

IDE 设备:/dev/hda、/dev/hdb

SATA/SCSI/SAS/USB 设备:/dev/sda、/dev/sdb

NVMe 设备:/dev/nvme0n1p1(0 表示接口、1 表示数量、p1 表示分区 1)

virtio-block KVM 虚拟硬盘:/dev/vda、/dev/vdb

virtio-block xen 虚拟硬盘:/dev/xvda、/dev/xvdb

系统虚拟设备(LVM 逻辑卷、vdo 重删压缩卷、stratis 精简卷):/dev/mapper/*

4、文件系统

4.1 基本概念

概念:文件系统是操作系统用于明确存储设备或分区上的文件的方法或数据结构;或者说文件系统是操作系统用来存储和管理文件的一种方法声明。

作用:文件系统是对存储设备的空间进行管理和分配,负责文件存储并对存入的文件进行保护和检查的系统。

区别:不同的文件系统所支持的文件大小、文件目录数量、IO 大小均不同

另外还有网络文件系统 NFS、CIFS;集群文件系统 GFS、GFS2;分布式文件系统 CEPH;光盘文件系统 iso9660 等等

openEuler内核源于Linux,Linux内核支持十多种不同类型的文件系统,比如Btris、JFS、ReiserFS、ext、ext2、ext3、ext4、ISO9660、XFS、Minix、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SvsV、PROC等,表格中列举常用几种并做说明。

4.2 相关命令

(1)df命令

用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法

1
df(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-a或--all:包含全部的文件系统;
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息。

参数

文件:指定文件系统上的文件。

示例

查看系统磁盘设备,默认是KB为单位:

1
2
3
4
5
6
[root@LinServ-1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 146294492 28244432 110498708 21% /
/dev/sda1 1019208 62360 904240 7% /boot
tmpfs 1032204 0 1032204 0% /dev/shm
/dev/sdb1 2884284108 218826068 2518944764 8% /data1

使用-h选项以KB以上的单位来显示,可读性高:

1
2
3
4
5
6
[root@LinServ-1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 140G 27G 106G 21% /
/dev/sda1 996M 61M 884M 7% /boot
tmpfs 1009M 0 1009M 0% /dev/shm
/dev/sdb1 2.7T 209G 2.4T 8% /data1

查看全部文件系统:

1
2
3
4
5
6
7
8
9
10
[root@LinServ-1 ~]# df -a
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 146294492 28244432 110498708 21% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
/dev/sda1 1019208 62360 904240 7% /boot
tmpfs 1032204 0 1032204 0% /dev/shm
/dev/sdb1 2884284108 218826068 2518944764 8% /data1
none 0 0 0 - /proc/sys/fs/binfmt_misc

显示 public 目录中的可用空间量,如以下输出中所示:

1
2
3
df public
# Filesystem 1K-blocks Used Available Use% Mounted on
# /dev/loop0 18761008 15246924 2554392 86% /d Avail

(2)du命令

也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。

语法

1
du [选项][文件]

选项

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
-a, --all                              显示目录中个别文件的大小。
-B, --block-size=大小 使用指定字节数的块
-b, --bytes 显示目录或文件大小时,以byte为单位。
-c, --total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-D, --dereference-args 显示指定符号链接的源文件大小。
-H, --si 与-h参数相同,但是K,M,G是以1000为换算单位。
-h, --human-readable 以K,M,G为单位,提高信息的可读性。
-k, --kilobytes 以KB(1024bytes)为单位输出。
-l, --count-links 重复计算硬件链接的文件。
-m, --megabytes 以MB为单位输出。
-L<符号链接>, --dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
-P, --no-dereference 不跟随任何符号链接(默认)
-0, --null 将每个空行视作0 字节而非换行符
-S, --separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
-s, --summarize 仅显示总计,只列出最后加总的值。
-x, --one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X<文件>, --exclude-from=<文件> 在<文件>指定目录或文件。
--apparent-size 显示表面用量,而并非是磁盘用量;虽然表面用量通常会小一些,但有时它会因为稀疏文件间的"洞"、内部碎片、非直接引用的块等原因而变大。
--files0-from=F 计算文件F中以NUL结尾的文件名对应占用的磁盘空间如果F的值是"-",则从标准输入读入文件名
--exclude=<目录或文件> 略过指定的目录或文件。
--max-depth=N 显示目录总计(与--all 一起使用计算文件)当N为指定数值时计算深度为N,等于0时等同--summarize
--si 类似-h,但在计算时使用1000 为基底而非1024
--time 显示目录或该目录子目录下所有文件的最后修改时间
--time=WORD 显示WORD时间,而非修改时间:atime,access,use,ctime 或status
--time-style=样式 按照指定样式显示时间(样式解释规则同"date"命令):full-iso,long-iso,iso,+FORMAT
--help 显示此帮助信息并退出
--version 显示版本信息并退出

示例

文件从大到小排序

1
2
3
4
5
6
7
8
9
10
11
ubuntu@VM-0-14-ubuntu:~/git-work/linux-command$ du -sh * |sort -rh
2.9M command
1.9M assets
148K template
72K package-lock.json
52K dist
28K build
16K README.md
4.0K renovate.json
4.0K package.json
4.0K LICENSE

只显示当前目录下子目录的大小。

1
2
3
4
5
6
ubuntu@VM-0-14-ubuntu:~/git-work/linux-command$ du -sh ./*/
1.9M ./assets/
28K ./build/
2.9M ./command/
52K ./dist/
148K ./template/

查看指定目录下文件所占的空间:

1
2
3
4
5
6
ubuntu@VM-0-14-ubuntu:~/git-work/linux-command/assets$ du ./*
144 ./alfred.png
452 ./chrome-extensions.gif
4 ./dash-icon.png
1312 ./Linux.gif
16 ./qr.png

只显示总和的大小:

1
2
ubuntu@VM-0-14-ubuntu:~/git-work/linux-command/assets$ du -s .
1932 .

显示总和的大小且易读:

1
2
ubuntu@VM-0-14-ubuntu:~/git-work/linux-command/assets$ du -sh .
1.9M .

(3)fsck命令

被用于检查并且试图修复文件系统中的错误。当文件系统发生错误,可用fsck指令尝试加以修复。

语法

1
fsck(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
-a:自动修复文件系统,不询问任何问题;
-A:依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统;
-N:不执行指令,仅列出实际执行会进行的动作;
-P:当搭配"-A"参数使用时,则会同时检查所有的文件系统;
-r:采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式;
-R:当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查;
-s:依序执行检查作业,而非同时执行;
-t<文件系统类型>:指定要检查的文件系统类型;
-T:执行fsck指令时,不显示标题信息;
-V:显示指令执行过程。

参数

文件系统:指定要查看信息的文件系统。

示例

linux的文件系统损坏会导致linux不正常关机,出错的时候如果系统告诉你是哪一块硬盘的分区有问题,比如是/dev/hda2,接着用如下的命令去对付它:

1
fsck -y /dev/hda2

结束后使用reboot命令重启系统这样就好了!

如果不知道时哪个地方出了问题,可以直接:

1
fsck

在随后的多个确认对话框中输入:y

结束后同样使用reboot命令重启系统这样就好了!

(4)xfs_repair命令

xfs_repair xfs文件系统检测或修改工具

5、swap 交换分区

概念:Linux 系统交换分区 swap 就是磁盘上的一块区域空间、可以是一个文件;

作用:当物理内存资源紧张时,将内存中不常访问的资源保存到预先设定的交换空间,以此来达到释放一定物理内存的效果

(1)swap分区

1
2
3
4
5
6
fdisk	创建分区
mkswap 创建 swap 分区
swapon 挂载 swap 分区
-a 挂载所有未被挂载的 swap
-s 查看所有已挂载的 swap
swapoff -a 卸载 swap 分区

默认情况下,系统会按顺序使用交换空间,先使用第一个已激活的交换分区,空间使用满后,再使用第二个交换空间,也可以为每个交换分区定义一个优先级。

设置优先级,请在/etc/fstab中使用pri选项,系统会优先使用优先级高的交换分区,默认优先级为-2,数字越大优先级越高。

1
2
3
4
5
6
7
$ cat /etc/fstab
UUID= swap swap defaults,pri=10 0 0

$ swapon -s
Filename Type Size Used Priortity
/dev/sdb1 partition 4145148 0 -2
/dev/sdb2 partition 999420 0 10

具有相同优先级的交换分区,系统会以轮询的方式向其中写入。

(2)swap文件

1
2
3
touch	创建文件
mkswap 格式化 swap 文件
swapon 启用 swap 文件

6、磁盘分区

(1)fdisk命令

用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。

语法

1
2
fdisk [选项] <磁盘>           更改分区表
fdisk [选项] -l [<磁盘>...] 列出分区表

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
选项:
-b, --sectors-size <大小> 显示扇区计数和大小
-B, --protect-boot 创建新标签时不要擦除 bootbits
-c, --compatibility[=<模式>] 模式,为“dos”或“nondos”(默认)
-L, --color[=<时机>] 彩色输出(auto, always 或 never)默认启用颜色
-l, --list 显示分区并退出
-x, --list-details 类似 --list 但提供更多细节
-n, --noauto-pt 不要在空设备上创建默认分区表
-o, --output <列表> 输出列
-t, --type <类型> 只识别指定的分区表类型
-u, --units[=<单位>] 显示单位,“cylinders”柱面或“sectors”扇区(默认)
-s, --getsz 以 512-字节扇区显示设备大小[已废弃]
-b, --bytes 以字节为单位而非易读的格式来打印 SIZE
--lock[=<模式>] 使用独占设备锁(yes、no 或 nonblock)
-w, --wipe <模式> 擦除签名(auto, always 或 never)
-W, --wipe-partitions <模式> 擦除新分区的签名(auto, always 或 never)

-C, --cylinders <数字> 指定柱面数
-H, --heads <数字> 指定磁头数
-S, --sectors <数字> 指定每条磁道的扇区数

-h, --help 显示此帮助
-V, --version 显示版本

参数

设备文件:指定要进行分区或者显示分区的硬盘设备文件。

交互式分区命令

交互式其他命令

命令 说明
m 显示帮助信息
p 显示分区信息
l 显示分区类型
F 显示未分配空间大小
d 通过分区号删除指定分区
t 修改分区类型
u 修改分区大小记录单位(扇区——柱面)
o 新建空白 DOS 分区表
g 新建空白 GPT 分区表
G 新建空白SGI 分区表
s 新建空白Sun 分区表
a 设置可引导标记
b 编辑 bsd 磁盘标签
c 设置 DOS 操作系统兼容标记
w/q 保存/不保存退出

示例

首先选择要进行操作的磁盘:

1
[root@localhost ~]# fdisk /dev/sdb

输入m列出可以执行的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
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)

输入p列出磁盘目前的分区情况:

1
2
3
4
5
6
7
8
9
Command (m for help): p

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 1 8001 8e Linux LVM
/dev/sdb2 2 26 200812+ 83 Linux

输入d然后选择分区,删除现有分区:

1
2
3
4
5
Command (m for help): d
Partition number (1-4): 1

Command (m for help): d
Selected partition 2

查看分区情况,确认分区已经删除:

1
2
3
4
5
6
7
8
9
Command (m for help): print

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

Command (m for help):

输入n建立新的磁盘分区,首先建立两个主磁盘分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p //建立主分区
Partition number (1-4): 1 //分区号
First cylinder (1-391, default 1): //分区起始位置
Using default value 1
last cylinder or +size or +sizeM or +sizeK (1-391, default 391): 100 //分区结束位置,单位为扇区

Command (m for help): n //再建立一个分区
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2 //分区号为2
First cylinder (101-391, default 101):
Using default value 101
Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M //分区结束位置,单位为M

确认分区建立成功:

1
2
3
4
5
6
7
8
9
Command (m for help): p

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 100 803218+ 83 Linux
/dev/sdb2 101 125 200812+ 83 Linux

再建立一个逻辑分区:

1
2
3
4
5
6
7
8
9
10
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e //选择扩展分区
Partition number (1-4): 3
First cylinder (126-391, default 126):
Using default value 126
Last cylinder or +size or +sizeM or +sizeK (126-391, default 391):
Using default value 391

确认扩展分区建立成功:

1
2
3
4
5
6
7
8
9
10
Command (m for help): p

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 100 803218+ 83 Linux
/dev/sdb2 101 125 200812+ 83 Linux
/dev/sdb3 126 391 2136645 5 Extended

在扩展分区上建立两个逻辑分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l //选择逻辑分区
First cylinder (126-391, default 126):
Using default value 126
Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): +400M

Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (176-391, default 176):
Using default value 176
Last cylinder or +size or +sizeM or +sizeK (176-391, default 391):
Using default value 391

确认逻辑分区建立成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Command (m for help): p

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 100 803218+ 83 Linux
/dev/sdb2 101 125 200812+ 83 Linux
/dev/sdb3 126 391 2136645 5 Extended
/dev/sdb5 126 175 401593+ 83 Linux
/dev/sdb6 176 391 1734988+ 83 Linux

Command (m for help):

从上面的结果我们可以看到,在硬盘sdb我们建立了2个主分区(sdb1,sdb2),1个扩展分区(sdb3),2个逻辑分区(sdb5,sdb6)

注意:主分区和扩展分区的磁盘号位1-4,也就是说最多有4个主分区或者扩展分区,逻辑分区开始的磁盘号为5,因此在这个实验中试没有sdb4的。

最后对分区操作进行保存:

1
2
3
4
5
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘。

在sdb1上建立ext2分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# mkfs.ext2 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
100576 inodes, 200804 blocks
10040 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=209715200
7 block groups
32768 blocks per group, 32768 fragments per group
14368 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

在sdb6上建立ext3分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# mkfs.ext3 /dev/sdb6
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
217280 inodes, 433747 blocks
21687 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=444596224
14 block groups
32768 blocks per group, 32768 fragments per group
15520 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

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

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]#

建立两个目录/oracle/web,将新建好的两个分区挂载到系统:

1
2
3
4
[root@localhost ~]# mkdir /oracle
[root@localhost ~]# mkdir /web
[root@localhost ~]# mount /dev/sdb1 /oracle
[root@localhost ~]# mount /dev/sdb6 /web

查看分区挂载情况:

1
2
3
4
5
6
7
8
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
6.7G 2.8G 3.6G 44% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 125M 0 125M 0% /dev/shm
/dev/sdb1 773M 808K 733M 1% /oracle
/dev/sdb6 1.7G 35M 1.6G 3% /web

如果需要每次开机自动挂载则需要修改/etc/fstab文件,加入两行配置:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# vim /etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
/dev/sdb1 /oracle ext2 defaults 0 0
/dev/sdb6 /web ext3 defaults 0 0

(2)gdisk命令

gdisk 磁盘分区工具(常用于 GPT 分区)

​ -l 查看指定磁盘的分区信息

交互式分区命令

命令 说明
n 新建分区(1-128)
显示帮助信息
p 显示分区信息
l 显示分区类型
d 通过分区号删除指定分区
t 修改分区类型
c 修改分区名字
w/q 保存/不保存退出

(3)cfdisk命令

cfdisk /dev/nvme0n3 图形化分区工具

(4)parted命令

是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fdisk不同,它支持调整分区的大小。作为一种设计用于Linux的工具,它没有构建成处理与fdisk关联的多种分区类型,但是,它可以处理最常见的分区格式,包括:ext2、ext3、fat16、fat32、NTFS、ReiserFS、JFS、XFS、UFS、HFS以及Linux交换分区。

非交互式语法:parted options device command options …

-l 查看所有磁盘的分区信息

-i 交互模式

-s 脚本模式

-h 显示帮助信息

-v 显示版本信息

command介绍

命令 说明
mktable 创建空白分区表(mktable gpt/msdos)
mklabel 创建空白分区表(mktable gpt/msdos)
mkpart 创建MBR 分区(mkpart 分区类型 起始点 结束点) 创建 GPT 分区(mkpart 分区名 [文件系统] 起始点 结束点)
resizepart 调整分区大小(resizepart 分区号 结束点)
name 修改分区名(name 分区号 新分区名)
set 更改分区标记(swap lvm 等)
rm 删除分区(rm 分区号)
rescue 修复丢失的分区(rescue 起始点 结束点)
select 更换编辑的设备(select /dev/sdc)
disk_set 更改磁盘标记(默认pmbr_boot)
disk_toggle 更改磁盘标记状态(on off)
unit 设置默认单位
print 显示分区信息
help 显示帮助信息(help mktable)
version 显示版本信息
quit 退出(即时保存的)

交互式分区

非交互式命令

7、格式化与挂载

格式化:创建新文件系统覆盖原来的文件系统,并没有彻底删除磁盘上的数据

(1)mkfs命令

用于在设备上(通常为硬盘)创建Linux文件系统。mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。

语法

1
mkfs(选项)(参数)

选项

1
2
3
4
5
fs:指定建立文件系统时的参数;
-t<文件系统类型>:指定要建立何种文件系统;
-v:显示版本信息与详细的使用方法;
-V:显示简要的使用方法;
-c:在制做档案系统前,检查该partition是否有坏轨。

参数

  • 文件系统:指定要创建的文件系统对应的设备文件名;
  • 块数:指定文件系统的磁盘块数。

示例

/dev/hda5上建一个msdos的档案系统,同时检查是否有坏轨存在,并且将过程详细列出来:

1
2
3
4
mkfs -V -t msdos -c /dev/hda5

mkfs -t ext3 /dev/sda6 //将sda6分区格式化为ext3格式
mkfs -t ext2 /dev/sda7 //将sda7分区格式化为ext2格式

(2)mount命令

用于挂载Linux系统外的文件

语法

1
2
3
4
mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-V:显示程序版本
-h:显示辅助讯息
-v:显示较讯息,通常和 -f 用来除错。
-a:将 /etc/fstab 中定义的所有档案系统挂上。
-F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
-f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
-n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
-s-r:等于 -o ro
-w:等于 -o rw
-L:将含有特定标签的硬盘分割挂上。
-U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
-t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
-o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
-o sync:在同步模式下执行。
-o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
-o auto、-o noauto:打开/关闭自动挂上模式。
-o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
-o dev、-o nodev-o exec、-o noexec允许执行档被执行。
-o suid、-o nosuid:允许执行档在 root 权限下执行。
-o user、-o nouser:使用者可以执行 mount/umount 的动作。
-o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
-o ro:用唯读模式挂上。
-o rw:用可读写模式挂上。
-o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

示例

/dev/hda1 挂在 /mnt 之下。

1
mount /dev/hda1 /mnt

/dev/hda1 用唯读模式挂在 /mnt 之下。

1
mount -o ro /dev/hda1 /mnt

/tmp/image.iso 这个光碟的 image 档使用 loop 模式挂在 /mnt/cdrom 之下。用这种方法可以将一般网络上可以找到的 Linux 光碟 ISO 档在不烧录成光碟的情况下检视其内容。

1
mount -o loop /tmp/image.iso /mnt/cdrom

(3)相关命令

umount 卸载,设备名/挂载点路径

fuser -v 挂载点路径 查看正在访问挂载目录的用户及进程pid

fuser -km 挂载点路径 结束正在访问挂载目录的进程

当已挂载的文件系统正在被访问时是无法卸载的,此时需要使用 fuser 查看正在访问挂载目录的用户及进程 pid,也可使用 kill 命令杀死进程后卸载

(4)/etc/fstab文件

若需要开机自动挂载,需将挂载信息写入/etc/fstab 文件中,下面简单对/etc/fstab 文件的各项内容进行说明。

Device:磁盘设备文件或者设备的 UUID、label,可使用 blkid 命令查看;

Mount point:挂载点,设备所需挂载到的指定目录;

Filesystem:文件系统类型,挂载后的文件系统类型;

Parameters:挂载选项,默认为 defaults,与 mount -o 使用的参数一致;

dump:是否使用 dump 命令备份,0 为不备份、1 为每天备份、2 为不定期备份;

fsck:是否被 fsck 命令检验,0 不检查、1、2 检查,1 的检查优先级高于 2;

OpenEuler 教材中解释如下:

8、LVM逻辑卷

8.1 基本概念

LVM 逻辑卷是对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性;

物理单元 PE:LVM 寻址的最小单元,默认为 4M,具有唯一编号;PE 的大小一旦确定将不能改变,同一卷组中所有物理卷 PE 大小是一致的;

逻辑单元 LE:LVM 中可用于分配的最小存储单元,通常在同一个卷组中,LE的大小与 PE 是相同的;

物理卷 PV:底层真正提供容量存放数据的设备,可以是硬盘、分区;

卷组 VG:建立再物理卷之上,由一个或多个物理卷组成,可以把多个物理卷容量整合,一个 LVM 系统中可以有一个卷组,也可以包含多个卷组;

逻辑卷 LV:建立在卷组之上,从卷组中划分出指定容量来创建逻辑卷,是用户最终使用的逻辑设备,逻辑卷在创建之后大小可伸缩;

8.2 lvm常用命令

命令/功能 物理卷 PV 卷组 VG 逻辑卷 LV
查看 pvs vgs lvs
pvscan vgscan lvscan
pvdisplay vgdisplay lvdisplay
状态调整 pvchange vgchange lvchange
创建 pvcreate vgcreate lvcreate
移除 pvremove vgremove lvremove
扩展 不支持 vgextend lvextend
缩小 不支持 vgreduce lvreduce
调整 不支持 不清楚 lvresize

8.3 物理卷PV

pvcreate命令 用于将物理硬盘分区初始化为物理卷,以便LVM使用。

语法

1
pvcreate(选项)(参数)

选项

1
2
3
4
-f:强制创建物理卷,不需要用户确认;
-u:指定设备的UUID;
-y:所有的问题都回答“yes”;
-Z:是否利用前4个扇区。

参数

物理卷:指定要创建的物理卷对应的设备文件名。

pvremove命令 用于删除一个存在的物理卷。使用pvremove指令删除物理卷时,它将LVM分区上的物理卷信息删除,使其不再被视为一个物理卷。

语法

1
pvremove(选项)(参数)

选项

1
2
3
-d # 调试模式;
-f # 强制删除;
-y # 对提问回答“yes”。

参数

物理卷:指定要删除的物理卷对应的设备文件名。

pvchange命令 允许管理员改变物理卷的分配许可。如果物理卷出现故障,可以使用pvchange命令禁止分配物理卷上的PE。

语法

1
pvchange(选项)(参数)

选项

1
2
-u:生成新的UUID;
-x:是否允许分配PE。

参数

物理卷:指定要修改属性的物理卷所对应的设备文件。

示例

1
2
3
4
5
6
7
8
9
pvcreate  /dev/sdb1 /dev/sdc 将 sdb 盘的分区 1 及 sdc 盘创建为 PV

pvremove /dev/sdb1 /dev/sdc 将 sdb 盘的分区 1 及 sdc 盘移除 PV

pvmove /dev/sdb1 /dev/sdc 将/dev/sdb1 中已使用的 PE 迁移至/dev/sdc

pvchange -x n /dev/sdc 将物理卷/dev/sdc 设置为不可分配

pvchange -x y /dev/sdc 将物理卷/dev/sdc 设置为可分配

8.4 卷组VG

vgcreate命令 用于创建LVM卷组。卷组(Volume Group)将多个物理卷组织成一个整体,屏蔽了底层物理卷细节。在卷组上创建逻辑卷时不用考虑具体的物理卷信息。

语法

1
vgcreate(选项)(参数)

选项

1
2
3
-l:卷组上允许创建的最大逻辑卷数;
-p:卷组中允许添加的最大物理卷数;
-s:卷组上的物理卷的PE大小。

参数

  • 卷组名:要创建的卷组名称;
  • 物理卷列表:要加入到卷组中的物理卷列表。

vgchange命令 用于修改卷组的属性,经常被用来设置卷组是处于活动状态或非活动状态。处于活动状态的卷组无法被删除,必须使用vgchange命令将卷组设置为非活动状态后才能删除。

语法

1
vgchange(选项)(参数)

选项

1
-a:设置卷组的活动状态。

参数

卷组:指定要设置属性的卷组。

vgextend命令 用于动态扩展LVM卷组,它通过向卷组中添加物理卷来增加卷组的容量。LVM卷组中的物理卷可以在使用vgcreate命令创建卷组时添加,也可以使用vgextend命令动态的添加。

语法

1
vgextend(选项)(参数)

选项

1
2
-d:调试模式;
-t:仅测试。

参数

  • 卷组:指定要操作的卷组名称;
  • 物理卷列表:指定要添加到卷组中的物理卷列表。

vgremove命令 用于用户删除LVM卷组。当要删除的卷组上已经创建了逻辑卷时,vgremove命令需要进行确认删除,防止误删除数据。

语法

1
vgremove(选项)(参数)

选项

1
-f:强制删除。

参数

卷组:指定要删除的卷组名称。

示例

1
2
3
4
5
6
7
8
9
10
11
vgcreate vg_name  /dev/sdb1    将物理卷/dev/sdb1 创建为卷组 vg_name

vgremove vg_name 将卷组 vg_name 删除

vgextend vg_name /dev/sdc 将物理卷/dev/sdc 添加至卷组 vg_name 中

vgreduce vg_name /dev/sdc 将物理卷/dev/sdc 从卷组 vg_name 中移除

vgchange -a n vg_name 禁用卷组 vg_name

vgchange -a y vg_name 启用卷组 vg_name

8.5 逻辑卷LV

lvcreate命令 用于创建LVM的逻辑卷。逻辑卷是创建在卷组之上的。逻辑卷对应的设备文件保存在卷组目录下,例如:在卷组”vg1000”上创建一个逻辑卷”lvol0”,则此逻辑卷对应的设备文件为”/dev/vg1000/lvol0”。

语法

1
lvcreate(选项)(参数)

选项

1
2
-L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
-l:指定逻辑卷的大小(LE数)。

参数

逻辑卷:指定要创建的逻辑卷名称。

lvremove命令 用于删除指定LVM逻辑卷。如果逻辑卷已经使用mount命令加载,则不能使用lvremove命令删除。必须使用umount命令卸载后,逻辑卷方可被删除。

语法

1
lvremove(选项)(参数)

选项

1
-f:强制删除。

参数

逻辑卷:指定要删除的逻辑卷。

lvchange命令 用于更改逻辑卷属性。LVM逻辑卷管理器是Linux系统中常用的磁盘管理方式,但lvchange命令却并不是LVM技术常用的工具,仅用于需要更改LV逻辑卷属性时才会被用到。

语法

1
lvchange [参数] 逻辑卷路径

选项

1
2
3
4
5
6
7
8
9
10
-a 设置逻辑卷的可用性 
-C 设置逻辑卷的连续分配策略
-p 设置访问权限
-r 设置预读比逻辑卷的扇区数
--minor 设置次要号码
--monitor 启动或停止监控逻辑卷快照
--noudevsync 禁用udev同步
--refresh 重新加载其元数据
--resync 强制镜像完全同步
--sysinit 使用早期系统初始化脚本

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lvcreate -n lv_name -L 20G vg_name  创建大小 20G 名为 lv_name 的逻辑卷

lvcreate -n lv_name -l 5120 vg_name 创建大小 20G 名为 lv_name 的逻辑卷

mkfs.ext4 /dev/vg_name/lv_name 格式化逻辑卷为 ext4 文件系统

mount /dev/vg_name/lv_name /mnt 将逻辑卷挂载至/mnt 供用户使用

umount /mnt 取消挂载逻辑卷

lvremove /dev/vg_name/lv_name 删除名为 lv_name 的逻辑卷

lvchange -a n /dev/vg_name/lv_name 禁用逻辑卷

lvchange -a y /dev/vg_name/lv_name 启用逻辑卷

lvchange -p r /dev/vg_name/lv_name 设置逻辑卷只读

lvchange -p rw /dev/vg_name/lv_name 设置逻辑卷读写

逻辑卷扩容

lvextend命令 用于在线扩展逻辑卷的空间大小,而不中断应用程序对逻辑卷的访问。使用lvextend命令动态在线扩展磁盘空间,整个空间扩展过程对于应用程序来说是完全透明的。

语法

1
lvextend(选项)(参数)

选项

1
2
-L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
-l:指定逻辑卷的大小(LE数)。

参数

逻辑卷:指定要扩展空间的逻辑卷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
lvextend -L +5G /dev/vg_name/lv_name	将 lv_name 逻辑卷扩容 5G

lvextend -L 25G /dev/vg_name/lv_name 将 lv_name 逻辑卷扩容 5G(原 20G)

lvextend -l +1280 /dev/vg_name/lv_name 将 lv_name 逻辑卷扩容 5G

lvextend -l 6400 /dev/vg_name/lv_name 将 lv_name 扩容 5G(原 5120)

-r 在扩展 lv 容量的同时扩展文件系统大小(适用 ext、xfs)

resize2fs /dev/vg_name/lv_name 更新 ext 系列文件系统大小

resize2fs /dev/mapper/vg_name-lvname 更新 ext 系列文件系统大小

xfs_growfs /mnt(假设挂载在/mnt) 更新 xfs 文件系统大小

解释:/dev/vg_name/lv_name 与/dev/mapper/vg_name-lv_name 指向同一设备

逻辑卷缩容

lvreduce命令 用于减少LVM逻辑卷占用的空间大小。使用lvreduce命令收缩逻辑卷的空间大小有可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。

语法

1
lvreduce(选项)(参数)

选项

1
2
-L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
-l:指定逻辑卷的大小(LE数)。

参数

逻辑卷:指定要操作的逻辑卷对应的设备文件。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
umount	/mnt	卸载文件系统

e2fsck -f /dev/vg_name/lv_name 检查文件系统

resize2fs /dev/vg_name/lv_name 20G 缩减文件系统大小为 20G

lvchange -a n /dev/vg_name/lv_name 将逻辑卷设置为不活跃状态

lvreduce -L -5G /dev/vg_name/lv_name 将逻辑卷大小缩减 5G

lvreduce -L 20G /dev/vg_name/lv_name 将逻辑卷大小缩减 5G

lvchange -a y /dev/vg_name/lv_name 将逻辑卷设置为活跃状态

mount /dev/vg_name/lv_name 重新挂载使用

Linux系统管理入门:磁盘管理
https://www.zhoumx.net/Linux系统管理入门:磁盘管理.html
作者
阿星
发布于
2023年12月22日
许可协议