硬盘
硬盘基础概念
- CPU(Central Processing Unit,中央处理器):处理数据。
内存(Memory):数据缓存区。
硬盘(Disk,以前也叫磁盘):数据存储区。- 类比:CPU是喝水,硬盘是水井,内存是水缸。
- 磁道(track):当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。
扇区(sector):磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区默认存放512字节的信息,是硬盘最小存储单元。磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位。
-
计算机容量单位:一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示:
1KB (Kilobyte 千字节)=1024B。
1MB (Megabyte 兆字节,简称“兆”)=1024KB。
1GB (Gigabyte 吉字节,又称“千兆”)=1024MB。
1TB (Terabyte 太字节,万亿字节)=1024GB。
1PB (Petabyte 拍字节,千万亿字节)=1024TB。
1EB (Exabyte 艾字节,百亿亿字节)=1024PB。(现企业常用)
1ZB (Zettabyte 泽字节,十万亿亿字节)= 1024EB。
1YB (Yottabyte 尧字节,一亿亿亿字节)= 1024ZB。
1BB (Brontobyte 一千亿亿亿字节)= 1024YB。 -
硬件厂商的容量单位进率是1000,所以实际容量有误差。
硬盘管理
识别硬盘
- 虚拟机添加硬盘:要先poweroff关机——显示虚拟硬件详情(左下角添加硬件)——开机。
VMware添加的硬盘占用真机空间少,KVM添加的硬盘占用真机空间大。- 开机状态下,添加设备会识别异常。
lsblk
(list block):查看系统连接的设备。
// lsblk查看硬件
[root@local ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPR MOUNTPOINT
sr0 11:0 1 1024M 0 rom // 光驱
vda 252:0 0 20G 0 disk // 第一块硬盘
├─vda1 252:1 0 1G 0 part /boot // 第一块硬盘第一分区
└─vda2 252:2 0 19G 0 part // 第一块硬盘第二分区
├─rl-root 253:0 0 17G 0 lvm /
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
vdb 252:16 0 20G 0 disk // 第二块硬盘
vdc 252:32 0 20G 0 disk // 第三块硬盘
[root@local ~]# ls /dev/vda
/dev/vda
[root@local ~]# ls /dev/vdb
/dev/vdb
[root@local ~]# ls /dev/vdc
/dev/vdc
分区规划 fdisk、parted
- 硬盘分区后,各分区之间不影响。例如:某个分区软件中病毒,其它分区不影响。
(Windows主分区盘符以C起计,AB是软盘。)
分区模式 MBR、GPT
- 分区模式(也叫分区方案):MBR 或 GPT
- MBR(msdos,Master Boot Record,主引导记录)分区模式:
- 系统通过分区表来识别硬盘信息。
分区表存放硬盘分区信息,最大64字节。一个分区至少16字节,所以MBR分区模式最多四个主分区。(不能有第五个主分区,即使有剩余空间可分配使用,因为分区表限制。) - 分区类型:主分区(primary)、扩展分区(extended,占用所有剩余空间)、逻辑分区(logical)。
- 最大支持容量为 2.2TB 的磁盘。
- 可以有一个扩展分区(其不能被格式化,其空间不能直接存储数据,用来建立逻辑分区)。逻辑分区可以有无限个,只能建立在扩展分区之上,可以存储数据。
- 常用分区模式:4个主分区;3个主分区+1个扩展分区(n个逻辑分区,逻辑分区从5起计)。可以2个主分区+1个扩展分区+n个逻辑分区。
- 读写速度主分区比逻辑分区快。
- 系统通过分区表来识别硬盘信息。
- GPT(gpt,GUID Partition Table,GUID全局唯一标识符)分区模式:
- 支持128个主分区,最大支持18EB(1024*1024TB)磁盘。
- GPT和MBR不能同时作用于同一块硬盘。
- MBR(msdos,Master Boot Record,主引导记录)分区模式:
fdisk命令
fdisk 硬盘
(fixed disk):给该硬盘分区。默认使用MBR分区模式(按o
),按g
使用GPT分区模式。
常用的交互式指令(Ctrl+C
退出):n
(new):新建分区。(起始点和结束点可以用数字G,也可以用百分比)d
(delete):删除分区。- 从后往前依次删除分区。例如:共三个分区,要删除第三个分区直接删除就可以,要删除第一个分区,需要先依次删除第三第二第一分区。
p
(print):查看现有的分区表。i
(information):查看具体分区的信息。w
(write):保存修改并退出。q
(quit):放弃更改并退出。
partprobe 硬盘
:强制内核识别分区表。当进行新建修改删除分区操作后,计算机没有相应地识别分区时,可以用该命令刷新计算机对分区表的识别。
// fdisk命令分区之 MBR分区模式/dev/vdb
[root@local ~]# fdisk /dev/vdb
欢迎使用 fdisk(util-linux 2.32.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0xcb4115ec 的新 DOS 磁盘标签。
命令(输入 m 获取帮助):n
分区类型
p 主分区(0个主分区,0个扩展分区,4空闲)
e 扩展分区(逻辑分区容器)
选择(默认 p): // 回车
分区号(1-4,默认 1): // 回车,当前新建分区编号
第一个扇区(2048-41943039,默认 2048) // 回车,当前新建分区扇区起始点
上个扇区,+sectors 或 +size{K,M,G,T,P}(2048-41943039,默认 41943039):+1G // 当前新建分区扇区终点
创建了一个新分区 1,类型为“Linux”,大小为 1 GiB。
命令(输入 m 获取帮助):n
分区类型
p 主分区(0个主分区,0个扩展分区,4空闲)
e 扩展分区(逻辑分区容器)
选择(默认 p): // 回车
分区号(2-4,默认 2): // 回车
第一个扇区(2099200-41943039,默认 2099200) // 回车
上个扇区,+sectors 或 +size{K,M,G,T,P}(2048-41943039,默认 41943039):+2G
创建了一个新分区 2,类型为“Linux”,大小为 2 GiB。
命令(输入 m 获取帮助):p
Disk /dev/vdb:20 GiB,21474836480 字节,41943040 个扇区。
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos // MBR模式磁盘标签类型dos
磁盘标识符:0xcb115ec
设备 启动 起点 末尾 扇区 大小 ID 类型
/dev/vdb1 2048 2099199 2097152 1G 83 Linux
/dev/vdb2 2099200 6293503 4194304 2G 83 Linux
命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
[root@local ~]# lsblk /dev/vdb[1-2]
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb1 252:17 0 1G 0 part
vdb2 252:18 0 2G 0 part
// fdisk命令分区之 GPT分区模式/dev/vdc
[root@local ~]# fdisk /dev/vdc
欢迎使用 fdisk(util-linux 2.32.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x2b5241c2 的新 DOS 磁盘标签。
命令(输入 m 获取帮助):g
已创建新的 GPT 磁盘标签(GUID:04A9776A-6736-1543-A538-3C6D23504DF5)。
命令(输入 m 获取帮助):n
分区号(1-128,默认 1): // 回车,当前新建分区编号
第一个扇区(2048-41943039,默认 2048) // 回车,当前新建分区扇区起始点
上个扇区,+sectors 或 +size{K,M,G,T,P}(2048-41943039,默认 41943039):+1G // 当前新建分区扇区终点
创建了一个新分区 1,类型为“Linux filesystem”,大小为 1 GiB。
命令(输入 m 获取帮助):n
分区号(2-128,默认 2): // 回车
第一个扇区(2099200-41943039,默认 2099200) // 回车
上个扇区,+sectors 或 +size{K,M,G,T,P}(2048-41943039,默认 41943039):+2G
创建了一个新分区 2,类型为“Linux filesystem”,大小为 2 GiB。
命令(输入 m 获取帮助):p
Disk /dev/vdc:20 GiB,21474836480 字节,41943040 个扇区。
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt // GPT模式磁盘标签类型gpt
磁盘标识符:04A9776A-6736-1543-A538-3C6D23504DF5
设备 起点 末尾 扇区 大小 ID 类型
/dev/vdc1 2048 2099199 2097152 1G 83 Linux 文件系统
/dev/vdc2 2099200 6293503 4194304 2G 83 Linux 文件系统
命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
[root@local ~]# lsblk /dev/vdc[1-2]
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdc1 252:65 0 1G 0 part
vdc2 252:66 0 2G 0 part
// 创建逻辑分区(逻辑分区产自扩展分区)/dev/vdd
[root@local ~]# fdisk /dev/vdd
p 查看分区表
n 创建主分区回车--->回车--->回车--->上个扇区 +2G
n 创建主分区回车--->回车--->回车--->上个扇区 +2G
n 创建主分区回车--->回车--->回车--->上个扇区 +2G
p 查看分区表
n 创建扩展分区回车--->回车--->上个扇区 回车 // 将所有剩余空间给扩展分区
p 查看分区表
n 创建逻辑分区--->回车--->上个扇区 +2G
n 创建逻辑分区--->回车--->上个扇区 +2G
n 创建逻辑分区--->回车--->上个扇区 回车
p 查看分区表
设备 起点 末尾 扇区 大小 ID 类型
/dev/vdd1 2048 4196351 4194304 1G 83 Linux
/dev/vdd2 4196351 8390655 4194304 2G 83 Linux
/dev/vdd3 8390655 12584959 4194304 2G 83 Linux
/dev/vdd4 12584959 41943039 29358080 14G 5 扩展
/dev/vdd5 12587008 16781311 4194304 2G 83 Linux
/dev/vdd6 16781311 20977663 4194304 2G 83 Linux
/dev/vdd7 20977663 41943039 20963328 10G 83 Linux
w 保存并退出
[root@local ~]# lsblk // 查看设备
[root@local ~]# parted /dev/vdd
(parted) print // 查看分区类型
Number Start End Size Type File system 标志
1 1049kB 2149MB 2147MB primary
2 2149MB 4296MB 2147MB primary
3 4296MB 6443MB 2147MB primary
4 6443MB 21.5GB 15.0MB extended
5 6443MB 8593MB 2147MB logical
6 8593MB 10.7GB 2147MB logical
7 10.7GB 21.5GB 10.7GB logical
(parted)quit
parted命令
- 除了 fdisk命令之外,也可以用 parted命令给硬盘分区。
parted 硬盘
:给硬盘分区。
常用的交互式指令:help
:查看指令帮助。mktable 模式
:建立指定模式的分区表。模式:msdos(MBR)或gpt(GPT)。mkpart
:交互式分区。(起始点和结束点可以用数字G,也可以用百分比)
mkpart 分区的名称 文件系统类型 start end
:非交互式分区。print
:查看分区表。unit GB
:大小使用GB显示rm 分区序号
:删除指定的分区。quit
:退出交互环境。
- 非交互式:
parted 硬盘 mktable msdos或gpt
:建立指定模式(msdos或gpt)的分区表。parted 硬盘 print
:查看分区表。parted 硬盘 mkpart 分区的名称 start end
:分区。
// parted命令分区之 GPT模式
[root@local ~]# parted /dev/vde
(parted) mktable gpt // 指定分区模式为GPT。MBR模式为msdos
// 交互式分区
(parted) mkpart // 划分新的分区
分区名称? []? haha // 随意写,不写也可以
文件系统类型? [ext2]? ext4 // 随意写,不会进行格式化
起始点? 0
结束点? 5G // 也可以写百分比,是下一个分区的起始点
// 也可以非交互式分区 (parted) mkpart haha ext4 0 5G
忽略/Ignore/放弃/Cancel? Ignore // 选择忽略,输入i(tab)补全
(parted) print // 查看分区表信息
Number Start End Size File system Name 标志
1 17.4kB 5000MB 5000MB ext4 haha
(parted) unit GB // 使用GB作为单位
(parted) print
Number Start End Size File system Name 标志
1 0.00GB 5.00GB 5.00GB ext4 haha
// 非交互式分区,注意起始点时上一个分区的结束点
(parted) mkpart haha ext4 5G 100% // 划分新的分区
(parted) print
Number Start End Size File system Name 标志
1 0.00GB 5.00GB 5.00GB ext4 haha
2 5.00GB 21.50GB 16.50GB ext4 haha
(parted) quit // 退出
[root@local ~]# lsblk
格式化 mkfs
格式化
- 格式化:赋予空间文件系统的过程。
- 例如:使用磁盘空间和家庭装修的类比:分区规划就是垒墙划分使用区域。格式化就是打扫区域并设定基本摆放格局。
- 文件系统:数据在空间中存放的规则。
- Windows常见的文件系统类型:NTFS、FAT(兼容性强,但功能小)
- Linux常见的文件系统类型:ext4(单个数据小,Linux 6系列)、xfs(单个数据大,Linux 7系列以上)、FAT
mkfs命令
-
mkfs.文件系统类型 硬盘的分区
(make file system):格式化该分区,指定文件系统类型。mkfs.xfs
:指定文件系统类型为xfs。
mkfs.ext3
:指定文件系统类型为ext3。
mkfs.ext4
:指定文件系统类型为ext4。
mkfs.vfat
-
blkid 硬盘的分区
(block id):查看该分区文件系统类型(TYPE=)。
blkid
:查看所有分区文件系统类型
// 格式化mkfs,以硬盘/dev/vdb为例
[root@local ~]# mkfs. // 连续按两次tab键,查看文件系统类型种类
mkfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
[root@local ~]# mkfs.ext4 /dev/vdb1 // 格式化文件系统ext4
[root@local ~]# mkfs.xfs /dev/vdb2 // 格式化文件系统xfs
[root@local ~]# blkid /dev/vdb1 // 查看文件系统类型
/dev/vdb1:UUID="40613385-3ebd-4773-997b-5b2bd5a5bb02" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="cb41115ec-01"
[root@local ~]# blkid /dev/vdb2 // 查看文件系统类型
/dev/vdb2:UUID="2ebf6086-d03f-4b66-bb35-00cb8f9b1d79" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="cb41115ec02"
[root@local ~]# mkfs.xfs -f /dev/vdb1 // 强制覆盖格式化文件系统xfs
[root@local ~]# blkid /dev/vdb1
/dev/vdb2:UUID="472c8d86-864b-4689-9346-f8bb97a7b046" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="cb41115ec02-01"
挂载使用
临时挂载分区 mount
-
mount 硬盘分区 挂载点
:挂载使用该硬盘分区。 -
lsblk 设备路径
:查看设备和设备挂载点。 -
df -h 挂载点1 挂载点2
(disk free,human-readable):查看挂载点挂载的设备以及使用情况。-T
(print-Type)选项:显示文件系统类型。
-t
(Type)选项:查看特定文件系统类型。
-
数据写入的分区:
-
挂载成功后,在挂载点目录写数据会储存到实际挂载的分区。
-
没有挂载设备的目录,就会占用根分区的空间。
- 当根分区快满了,找到空目录挂载新分区,在空目录下的内容只占用挂载的新分区空间。
- 挂载设备后,挂载点原内容不可见,写在在根分区,卸载设备后,可见挂载点原内容。
-
// 临时挂载分区,以硬盘/dev/vdb为例
[root@local ~]# mkdir /myb1 /myb2
[root@local ~]# mount /dev/vdb1 /myb1
[root@local ~]# mount /dev/vdb2 /myb2
[root@local ~]# df -h /myb1 /myb2 // 查看该挂载点挂载的设备以及使用情况
文件系统 容量 已用 可用 已用% 挂载点
/dev/vdb1 1014M 40M 975M 4% /myb1
/dev/vdb2 2.0G 47M 2.0G 3% /myb2
开机自动挂载 mount -a
-
开机自动挂载的步骤:编写
vim /etc/fstab
;使用mount -a
检验;无问题重启系统。如果重启系统有问题,登录root后vim /etc/fstab
,注释掉编写的内容后重启系统。 -
/etc/fstab
(file system table):开机自动运行的配置文件。- 编写内容:
设备:/dev/sdb1
或blkid /dev/sdb1
中的UUID可以代表设备。
挂载点。
文件系统类型(要对应) :blkid /dev/sdb1
中的TYPE。
挂载的功能参数:一般写defaults。
备份标记:一般写0。(0代表不做dump备份)
检测顺序:一般写0。(0代表不检测)
- 编写内容:
-
mount -a
(all):检验/etc/fastb
中自动挂载的书写,没有问题则没有屏幕输出并自动挂载。
// 开机自动挂载,以硬盘/dev/vdb为例
[root@local ~]# blkid /dev/vdb1 // 查看文件系统类型,返回xfs
[root@local ~]# blkid /dev/vdb2 // 查看文件系统类型,返回xfs
[root@local ~]# vim /etc/fstab
//设备 挂载点 文件系统类型 local 备份标记 检测标记
/dev/vdb1 /myb1 xfs defaults 0 0
/dev/vdb2 /myb2 xfs defaults 0 0
[root@local ~]# mount -a
[root@local ~]# reboot // 成功重启
// 如果重启失败,登录root进行vim /etc/fstab,注释掉自己编写的内容,reboot重启
// 查看自动挂载的效果
[root@local ~]# lsblk
[root@local ~]# df -h // 如果忘记挂载点可以使用df查询
[root@local ~]# umount /myb* // 卸掉原先的挂载,以备查看自动挂载有无成功
[root@local ~]# df -h // 也可以 df -h | grep /myb*
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/r1-root 17G 4.9G 13G 29% /
/dev/vda1 1014M 255M 760M 26% /boot
[root@local ~]# mount -a /myb*
[root@local ~]# df -h /myb* // 也可以 df -h | grep /myb*
文件系统 容量 已用 可用 已用% 挂载点
/dev/vdb1 1014M 40M 975M 4% /myb1
/dev/vdb2 2.0G 47M 2.0G 3% /myb2
查看挂载和文件系统类型
- 设置开机自动挂载后,如果重启开机出现问题,登录root账号后,
vim /etc/fstab
注释掉自己编写的内容(设备,挂载点,文件系统类型,功能参数defaults,备份标记0,检测顺序0)。
正常重启开机后,从以下两个方面来排查问题:- 查看挂载点的编写:
lsblk [设备]
(list block):查看设备和设备挂载点。df -h [挂载点]
(disk full):查看挂载点挂载的设备以及使用情况。省略目录则是所有挂载点挂载的设备以及使用情况。-T
(type)选项:显示设备文件系统类型。
- 查看文件系统类型的编写:
blkid 目录
(block id):查看该目录(多个硬盘分区)的文件系统类型"TYPE="。省略目录则是所有硬盘分区的文件系统类型。df -Th
- 查看挂载点的编写:
交换空间 (虚拟内存)
- 交换空间(swap,又叫虚拟内存):利用硬盘的空间,充当内存的空间。
- 当物理内存占满了,可以将内存的数据,暂时放入交换空间中,缓解真实物理内存的压力。
查看交换空间
swapon
:查看交换空间(虚拟内存)的详细信息。free -h
(human-readable):查看内存和交换空间(虚拟内存)的总体使用情况。
制作交换空间
mkswap 硬盘的分区
:格式化分区,指定文件系统类型为swap。swapon 空间
:将该空间(文件系统类型为swap)启用为交换空间。swapoff 空间
:停用该交换空间。
// 制作交换空间/dev/vde2
[root@local ~]# ls /dev/vde2
[root@local ~]# mkswap /dev/vde2 // 指定文件系统类型为swap
[root@local ~]# blkid /dev/vde2 // 查看文件系统类型,返回文件系统类型为swap
[root@local ~]# swapon // 查看交换空间的详细信息
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 91.4M -2
[root@local ~]# swapon /dev/vde2 // 启用交换分区/dev/vde2
[root@local ~]# swapon
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 91.4M -2
/dev/vde2 partition 15.3G 0B -3
[root@local ~]# free -h // 查看内存总体使用情况
total used free shared buff/cache available
Mem: 1.3Gi 752Mi 88Mi 8.0Mi 467Mi 404Mi // 该虚拟机的内存
Swap: 17Gi 98Mi 17Gi // 该虚拟机的交换空间
[root@local ~]# swapoff /dev/vde2 // 停用交换分区/dev/vde2
[root@local ~]# swapon
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 91.4M -2
[root@local ~]# free -h // 查看内存总体使用情况
total used free shared buff/cache available
Mem: 1.3Gi 752Mi 88Mi 8.0Mi 467Mi 404Mi
Swap: 2.0Gi 98Mi 1.9Gi
开机自动启用交换空间 swapon -a
-
开机自动启用交换空间的步骤:编写
vim /etc/fstab
;使用swapon -a
检验;无问题重启系统。 -
/etc/fstab
:开机自动运行的配置文件。- 编写内容:
交换空间:/dev/sdb1
或blkid /dev/sdb1
中的UUID可以代表设备。
swap:none或swap (注意这里和开机自动挂载不一样)
文件系统类型(要对应) :swap
功能参数:一般写defaults
备份标记:一般写0
检测顺序:一般写0
- 编写内容:
-
swapon -a
:检测/etc/fstab
中交换空间的书写。没有问题则没有屏幕输出并自动挂载。
// 开机自动启用交换空间
[root@local ~]# mkswap /dev/vde2 // 指定文件系统类型为swap
// 开机自动启用交换空间
[root@local ~]# vim /etc/fstab #增加一行信息
/dev/vde2 swap swap defaults 0 0
[root@local ~]# swapon // 查看交换空间详细信息
[root@local ~]# swapon -a // 检测/etc/fstab的书写
[root@local ~]# swapon
[root@local ~]# reboot // 重启测试
交换文件
- 交换空间(虚拟内存):当物理内存不够用时,使用磁盘空间来模拟内存。
- 交换空间可以是空闲分区,也可以是逻辑卷。
- 交换文件:以较大体积充当交换空间的文件。
- 创建启用交换文件的步骤:
- 创建较大文件:
dd if=源文件路径 of=目标文件路径 bs=大小 count=次数
:读取源文件内容写入目标文件。- bs(block size)是单次读取的大小,count是读取的次数。建议
bs=1M
,单次读取速度较快。 - 目标文件可不存在,但父目录需要存在。
/dev/zero
:该文件会不断产生0,可被dd命令作为源文件使用来创建较大的文件。
- bs(block size)是单次读取的大小,count是读取的次数。建议
- 格式化该文件:
mkswap 文件路径
。 - 启用该文件为交换空间(该文件权限需为600):
swapon 文件路径
。 - 可设置开机自动启用交换文件:
文件路径 none swap sw 0 0
。- 注意功能参数为
sw
- 注意功能参数为
- 创建较大文件:
- 删除交换文件需要注意:删除
/etc/fstab
中的开机启用,停止交换文件的启用。
// 交换文件
// 创建大文件
]# dd if=/dev/zero of=/opt/sw.txt bs=1M count=2048
记录了2048+0 的读入
记录了2048+0 的写出
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 6.22704 s, 345 MB/s
]# ls -l /opt/sw.txt
-rw-r--r--. 1 root root 2147483648 7月 3 08:58 /opt/sw.txt
// 格式化为交换文件
]# mkswap /opt/sw.txt
mkswap: /opt/sw.txt:不安全的权限 0644,建议使用 0600。
正在设置交换空间版本 1,大小 = 2 GiB (2147479552 个字节)
无标签,UUID=888c6cb2-da52-4beb-a028-bc3f1e9dfd9b
]# blkid /opt/sw.txt
/opt/sw.txt: UUID="888c6cb2-da52-4beb-a028-bc3f1e9dfd9b" TYPE="swap"
]# swapon
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 268K -2
// 启用交换文件
]# swapon /opt/sw.txt
swapon: /opt/sw.txt:不安全的权限 0644,建议使用 0600。
]# chmod 600 /opt/sw.txt
]# ls -l /opt/sw.txt
-rw-------. 1 root root 2147483648 7月 3 08:59 /opt/sw.txt
]# swapoff /opt/sw.txt
]# swapon /opt/sw.txt
]# swapon
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 360K -2
/opt/sw.txt file 2G 0B -3
// 开机自动启用交换文件
]# echo "/opt/sw.txt none swap sw 0 0" >> /etc/fstab
]# swapoff /opt/sw.txt
]# swapon
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 352K -2
]# swapon -a
]# swapon
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 352K -2
/opt/sw.txt file 2G 0B -3
// 注意:设置开机自动启用交换文件后,若要删除该交换文件,需要先删除其在/etc/fstab中的配置
]# rm -rf /opt/sw.txt
rm: 无法删除'/opt/sw.txt': 不允许的操作
]# vim /etc/fstab // 删除"/opt/sw.txt none swap sw 0 0"
]# swapoff /opt/sw.txt
]# rm -rf /opt/sw.txt
KVM虚拟机的硬盘问题
- KVM虚拟机(真机为Linux系统):一切皆文件,真机会创建一个大文件,充当虚拟机的硬盘。
- 真机中存放虚拟机硬盘文件的父目录:
/var/lib/libvirt/images
。 - 删除虚拟机硬盘时,需要管理员手动删除对应的硬盘文件,否则继续占用真机空间。
- 虚拟机还原快照不会删除新添加硬盘的硬盘文件,需要在真机上操作,删除不用的硬盘文件。
- 直接删除硬盘之前(不还原快照),要查看开机自动启用配置文件
/etc/fstab
,避免删除了自动挂载的设备导致开机异常。
- 真机中存放虚拟机硬盘文件的父目录:
// 真机上操作,删除不用的硬盘文件
[root@server1 ~]# cd /var/lib/libvirt/images // 虚拟机硬盘在真机的父目录
[root@server1 images]# ls // 查看虚拟机硬盘
// 有多余的硬盘文件可以删除,删除之前要"vim /etc/fstab"查看开机自动挂载的设备
[root@server1 images]# df -h / // 查看根目录的使用情况
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 466G 95G 371G 21% / // 发现根目录也是个挂载点
逻辑卷
-
逻辑卷所需软件:
lvm2
-
物理卷(PV,physical volume):组建卷组的零散存储空间。
卷组(VG,volume group,也叫虚拟硬盘):会清空物理卷原有的数据。
逻辑卷(LV,logical volume):由卷组划分出来的可以存储数据的空间。 -
逻辑卷制作过程:将一个或多个的物理卷(整个分区(主分区或逻辑分区)或整个硬盘)组建成卷组,再从卷组中划分出逻辑卷。卷组划分出的逻辑卷可以是一个到多个。
- 逻辑卷的优点:整合分散的空间;空间支持扩大。
- 逻辑卷的缺点:
- 物理卷损坏会影响卷组,卷组损坏会影响逻辑卷。
- 读取逻辑卷的速度低于读取普通硬盘空间。
-
逻辑卷默认的目录:
/dev/dm-数字
(第一个逻辑卷/dev/dm-0
,第二个逻辑卷/dev/dm-1
)。
逻辑卷两个快捷方式:/dev/卷组名/逻辑卷名
,/dev/mapper/卷组名-逻辑卷名
。
ls -l 逻辑卷快捷方式
:查看快捷方式指向的逻辑卷的目录/dev/dm-数字
。
LVM命令
- 逻辑卷管理(LVM,logical volume manger)
功能 | 物理卷管理PV | 卷组管理VG | 逻辑卷管理LV |
---|---|---|---|
Scan 扫描 | pvs | vgs | lvs |
Create 创建 | pvcreate | vgcreate | lvcreate |
Display 显示 | pvdisplay | vgdisplay | lvdisplay |
Remove 删除 | pvremove | vgremove | lvremove |
Extend 扩展 | / | vgextend | lvextend |
逻辑卷的建立、使用、扩展
- 逻辑卷的建立需要先建立物理卷和卷组。
逻辑卷的使用需要格式化后挂载。
逻辑卷的扩展需要卷组有足够的可用空间支持扩展,并且要格式化扩增的空间。 - 逻辑卷默认的目录:
/dev/dm-数字
(第一个逻辑卷/dev/dm-0
,第二个逻辑卷/dev/dm-1
)。
逻辑卷两个快捷方式:/dev/卷组名/逻辑卷名
,/dev/mapper/卷组名-逻辑卷名
。
ls -l 逻辑卷快捷方式
:查看快捷方式指向的逻辑卷的目录/dev/dm-数字
。
逻辑卷的建立
- 建立命令:
pvcreate 多个硬盘或分区的目录
:将硬盘或分区建立为物理卷。硬盘或分区最好是空白的。vgcreate 卷组名 多个物理卷的目录
:以物理卷建立该卷组。- Linux系统老系列需要先 pvcreate命令建立物理卷,再 vgcreate命令建立卷组。新系列可以直接
vgcreate 卷组名 多个硬盘或分区的目录
来建立卷组。
- Linux系统老系列需要先 pvcreate命令建立物理卷,再 vgcreate命令建立卷组。新系列可以直接
lvcreate -L 大小 -n 逻辑卷名 卷组名
(large,name):在该卷组划分该逻辑卷并指定大小。
- 查看命令:
pvs
:查看系统所有物理卷的信息(所属卷组,大小,可用大小)。vgs
:查看系统所有卷组的信息(物理卷个数,逻辑卷个数,大小,可用大小)。lvs
:查看系统所有逻辑卷的信息(所属卷组,大小)。df -h 逻辑卷的挂载点
:查看挂载点的挂载设备及其详细信息(挂载的逻辑卷,文件系统大小,可用大小)。pvdisplay
:查看系统所有物理卷的详细信息。vgdispaly
:查看系统所有卷组的详细信息。lvdisplay
:查看系统所有逻辑卷的详细信息。
逻辑卷的使用
- 格式化:
mkfs.文件系统类型 逻辑卷路径
:指定逻辑卷的文件系统类型。blkid 逻辑卷路径
:查看文件系统类型。
- 挂载:
vim /etc/fstab
:编写开机自动挂载(设备,挂载点,文件系统类型,功能参数defaults,备份标记0,检测顺序0)。mkdir 挂载点
:创建编写的挂载点。mount -a
:检测/etc/fstab
配置文件的书写并挂载。df -h 挂载点
:查看挂载点的挂载设备。
逻辑卷的扩展
-
扩展的步骤:
lvs
或df
命令查看逻辑卷的大小,确定要扩增的容量(或扩展后的大小)。vg
命令查看卷组的可用大小是否支持扩展,如果容量不够,扩展卷组:vgextend 卷组名 硬盘或分区的目录
。- 扩展逻辑卷:
lvextend -L 目标大小 逻辑卷目录
,目标大小也可写作+增量
,逻辑卷目录可以使用快捷方式/dev/卷组名/逻辑卷名
。 - 扩展逻辑卷后,空间大小(使用lvs命令查看)会变大,但扩增的部分没有指定文件系统类型,因此文件系统的大小(使用df命令查看)没有变。
需要扩展逻辑卷的文件系统(刷新文件系统):xfs_growfs 逻辑卷目录
(刷新xfs文件系统)resize2fs 逻辑卷目录
(刷新ext4文件系统)
lvs
和df
命令查看逻辑卷大小与文件系统大小是否一致。
-
逻辑卷支持缩减变小,但不建议,可能导致已有数据的丢失。
代码示例
// 逻辑卷的建立、使用、扩展
// 环境准备,添加一块80G的硬盘/dev/vdb,分为三个10G的主分区和两个20G的逻辑分区
// 建立卷组vgcreate
/*
* [root@local ~]# pvcreate /dev/vdb{3,5} // 建立物理卷pvcreate
* Physical volume "/dev/vdb3" successfully created.
* Physical volume "/dev/vdb5" successfully created.
* // 老的Linux系统系列制作逻辑卷需要先pvcreate,新系统系列可以直接vgcreate。
*/
[root@local ~]# vgcreate systemvg /dev/vdb[1-2] // 建立卷组vgcreate,卷组名systemvg,使用逻辑卷/dev/vdb[1-2]
Physical volume "/dev/vdb1" successfully created. // 在较新的系统系列,未成为物理卷的空间会自动创建物理卷
Physical volume "/dev/vdb2" successfully created.
Volume group "systemvg" successfully created.
[root@local ~]# pvs // 查看系统的所有物理卷信息
PV VG Fmt Attr PSize PFree // PSize物理卷大小,PFree物理卷可用大小
/dev/vda2 r1 lvm2 a-- <19.00g 0 // 第一个物理卷/dev/vda2,所属卷组rl,可用大小无剩余
/dev/vdb1 systemvg lvm2 a-- <10.00g <10.00g // 第二个物理卷/dev/vdb1,所属卷组systemvg
/dev/vdb2 systemvg lvm2 a-- <10.00g <10.00g
[root@local ~]# vgs // 查看系统的卷组信息
VG #PV #LV #SN Attr VSize VFree // #PV包含的物理卷数量,#LV划分的逻辑卷数量,VSize卷组大小,VFree卷组可用大小
r1 1 2 0 wz--n- <19.00g 0 // 第一个卷组r1,包含1个物理卷,划分了2个逻辑卷,可用大小无剩余。
systemvg 2 0 0 wz--n- 19.99g 19.99g // 第二个卷组systmevg,包含2个物理卷,未划分逻辑卷
// 建立逻辑卷lvcreate
[root@local ~]# lvcreate -L 16G -n vo systemvg // 建立逻辑卷lvcreate,-L大小16G,-n卷名vo,所属卷组systemvg
Logical volume "vo" created.
[root@local ~]# vgs // 查看系统的卷组信息
VG #PV #LV #SN Attr VSize VFree
r1 1 2 0 wz--n- <19.00g 0
systemvg 2 1 0 wz--n- 19.99g 3.99g // systemvg卷组,划分了一个逻辑卷,剩余可用大小19.99-16=3.99g
[root@local ~]# lvs // 查看系统的逻辑卷信息。一共有三个逻辑卷,rl卷组下的root和swap,systemvg卷组下的vo
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rl -wi-ao---- <17.00g // 第一个逻辑卷root,所属卷组rl。
swap rl -wi-ao---- 2.00g // 第二个逻辑卷swap,所属卷组rl。
vo systemvg -wi-a----- 16.00g // 第三个逻辑卷vo,空间大小16.00g
[root@local ~]# ls -l /dev/rl/root // /dev/rl/root是第一个逻辑卷/dev/dm-0的快捷方式
lrwxrwxrwx. 1 root root 7 6月 8 09:13 /dev/rl/root -> ../dm-0
[root@local ~]# ls -l /dev/systemvg/vo // /dev/systemvg/vo是第三个逻辑卷/dev/dm-2的快捷方式
lrwxrwxrwx. 1 root root 7 6月 8 10:36 /dev/systemvg/vo -> ../dm-2
// 使用逻辑卷(格式化并挂载)mkfs.*
[root@local ~]# mkfs.xfs /dev/systemvg/vo // 格式化(指定文件系统类型)
[root@local ~]# blkid /dev/systemvg/vo // 查看文件系统类型
/dev/systemvg/vo:UUID="leeaalaf2-63cf-4cb5-balf-46abf9a0660c" BLOCK_SIZE="512" TYPE="xfs"
[root@local ~]# vim /etc/fatab // 编写开机自动挂载
/dev/systemvg/vo /mylv xfs defaults 0 0 // 设备,挂载点,文件系统类型,功能参数,备份标记,检测顺序。
[root@local ~]# mkdir /mylv // 创建编写的挂载点
[root@local ~]# mount -a // 检验编写,挂载
[root@local ~]# df -h /mylv // 查看挂载的设备及其详细情况
文件系统 容量 已用 可用 已用 挂载点
/dev/systemvg/vo 16G 147M 16G 1% /mylv // mylv目录挂载了/dev/systemvg/vo,文件系统大小16G。
// 扩展逻辑卷lvextend,vo在原有16G的基础上,扩展到18G,也就是+2G
[root@local ~]# df -h | grep vo // 查看vo逻辑卷的文件系统大小(一般是和空间大小一致)
/dev/mapper/systemvg-vo 16G 147M 16G 1% /mylv
[root@local ~]# vgs // 查看系统的卷组信息
VG #PV #LV #SN Attr VSize VFree
r1 1 2 0 wz--n- <19.00g 0
systemvg 2 1 0 wz--n- 19.99g 3.99g // systemvg卷组还有3.99g可用。
[root@local ~]# lvextend -L 18G /dev/systemvg/vo // 扩展逻辑卷的空间大小到18G,这里"18G"也可用"+2G"
Size of logical volume systemvg/vo changed from 16.00 GiB(4096) to 18.00 GiB(4608 extends).
Logical volume systemvg/vo successfully resized.
[root@local ~]# vgs
VG #PV #LV #SN Attr VSize VFree
r1 1 2 0 wz--n- <19.00g 0
systemvg 2 1 0 wz--n- 19.99g 1.99g // systemvg卷组还有1.99g可用。
[root@local ~]# lvs | grep vo // 查看vo逻辑卷的空间大小
vo systemvg -wi-ao---- 18.00g
[root@local ~]# df -h | grep vo // 查看vo逻辑卷的文件系统大小(一般是和空间大小一致)
/dev/mapper/systemvg-vo 16G 147M 16G 1% /mylv // 文件系统大小16G,新扩展的2G没有格式化(指定文件系统类型)
// 扩展逻辑卷的文件系统,也叫刷新文件系统。逻辑卷文件类型是xfs使用xfs_growfs命令,是etx4使用resize2fs命令。
[root@local ~]# xfs_growfs /dev/systemvg/vo
data blocks changed from 4194304 to 4718592
[root@local ~]# df -h | grep vo // 查看vo逻辑卷的文件系统大小
/dev/mapper/systemvg-vo 18G 161M 18G 1% /mylv // 文件系统大小18G,同空间大小一致
// 若扩展逻辑卷时卷组可用大小不足,需先扩展卷组vgextend
[root@local ~]# vgextend systemvg /dev/vdb{3,5,6} // 扩展卷组vgextend,增加物理卷/dev/vdb{3,5,6}
[root@local ~]# vgs // 查看系统的卷组信息
VG #PV #LV #SN Attr VSize VFree
r1 1 2 0 wz--n- <19.00g 0
systemvg 5 1 0 wz--n- 69.98g 51.98g // systemvg卷组的大小69.98g,可用大小51.98g
[root@local ~]# lvs | grep vo
vo systemvg -wi-ao---- 18.00g
[root@local ~]# lvextend -L 25G /dev/systemvg/vo // 扩展vo逻辑卷至25G
Size of logical volume systemvg/vo changed from 18.00 GiB(4608) to 25.00 GiB(6400 extends).
Logical volume systemvg/vo successfully resized.
[root@local ~]# vgs
VG #PV #LV #SN Attr VSize VFree
r1 1 2 0 wz--n- <19.00g 0
systemvg 5 1 0 wz--n- 69.98g 44.98g // systemvg卷组的还有51.98-(25-18)=44.98g可用
[root@local ~]# df -h | grep vo
/dev/mapper/systemvg-vo 18G 161M 18G 1% /mylv // vo逻辑卷的文件系统大小18G,需要扩展到同空间大小一致
[root@local ~]# xfs_growfs /dev/systemvg/vo // 扩展文件系统大小
[root@local ~]# df -h | grep vo
/dev/mapper/systemvg-vo 25G 211M 25G 1% /mylv
PE
- PE(physical extent):是卷组划分逻辑卷的最小单元。
- PE 默认是4M。
例如:划分一个250M大小的逻辑卷时,卷组会默认划分给该逻辑卷252M,因为离250M最近的被4M整除的大小是252M(给多不给少)。
- PE 默认是4M。
- PE相关命令:
vgdisplay 卷组名
:查看该卷组的详细信息。可查看PE的大小。vgchange -s 大小 卷组名
(size):修改该卷组的PE为该大小。vgcreate -s 大小 卷组名 多个物理卷的目录
(size):创建该卷组,并指定PE为该大小。lvcreate -l 数字 -n 逻辑卷名 卷组名
:创建该逻辑卷,并指定逻辑卷大小为数字个PE。lvcreate -L 大小 -n 逻辑卷名 卷组名
(large,name):在该卷组划分该逻辑卷并指定大小。
// PE(卷组划分逻辑卷的最小单元)
// 请在卷组sysytemvg下创建一个大小为250M的逻辑卷lvredhat。
// 因为250M不能被4M整除,因此需要更改卷组的PE值
[root@local ~]# vgdisplay systemvg | grep PE // 查看卷组的详细信息中的PE项
PE Size 4.00 MiB // systemvg卷组的PE默认为4M
[root@local ~]# vgchange -s 1M systemvg // 修改卷组的PE大小为1M
Volume group "systemvg" successfully changed.
[root@local ~]# vgdisplay systemvg | grep PE // 查看卷组的详细信息
PE Size 1.00 MiB // systemvg卷组的PE为1M
[root@local ~]# lvcreate -L 250M -n lvredhat systemvg // 创建250M的逻辑卷lvredhat
Logical volume "lvredhat" created.
[root@local ~]# lvs | grep lvredhat // 查看逻辑卷信息中的lvredhat项
lvredhat systemvg -wi-a----- 250.00m // 大小250MB
// 创建逻辑卷并指定大小为多少个PE大小
[root@local ~]# lvcreate -l 100 -n lvtest systemvg // 创建100个PE大小的逻辑卷lvtest
Logical volume "lvtest" created.
[root@local ~]# lvs | grep lvtest
// 创建卷组并指定PE大小
// 新建大小10G的逻辑分区vdb7
[root@local ~]# vgcreate -s 2M vgtest /dev/vdb7
Physical volume "/dev/vdb7" successfully created.
Volume group "vgtest" successfully created.
[root@local ~]# vgdisplay systemvg | grep PE
PE Size 2.00 MiB
逻辑卷的删除
- 删除逻辑卷的前提:卸载正在挂载使用的逻辑卷(如果有开机自动挂载记得在配置文件删除)。
lvremove 逻辑卷路径1 逻辑卷路径n
:删除逻辑卷。
// 删除逻辑卷:如果使用了逻辑卷,要先卸载。如果有开机自动挂载,要删除编写的配置内容
// 删除逻辑卷/dev/systemvg/vo
[root@local ~]# lvremove /dev/systemvg/vo
Logical volume systemvg/vo contains a filesystem in use.
[root@local ~]# df -h | grep vo // 查找vo逻辑卷的挂载点
/dev/mapper/systemvg-vo 18G 161M 18G 1% /mylv
[root@local ~]# umount /mylv/ // 卸载挂载点
[root@local ~]# grep mylv /etc/fstab // 查看是否有开机自动挂载
/dev/systemvg/vo /mylv xfs defaults 0 0
[root@local ~]# vim /etc/fstab // 删除vo逻辑卷的开机自动挂载
[root@local ~]# lvremove /dev/systemvg/vo
Do you really want to remove active logical volume systemvg/vo? [y/n]: y
Logical volume "vo" successfully removed.
[root@local ~]# lvremove -y /dev/systemvg/lvredhat
Logical volume "vo" successfully removed.
- 删除卷组的前提:基于此卷组创建的所有逻辑卷,要全部删除。
一般删除卷组后空闲的物理卷也删除掉。 vgremove 卷组名1 卷组名n
:删除卷组。pvremove 物理卷路径1 物理卷路径n
:删除物理卷。
// 删除卷组:基于此卷组创建的所有逻辑卷,要全部删除
// 删除卷组/dev/systemvg
[root@local ~]# lvs | grep systemvg // 查看systemvg卷组的所有逻辑卷
lvredhat systemvg ……
lvtest systemvg ……
[root@local ~]# lvremove -y /dev/systemvg/lv* // 删除systemvg卷组的所有逻辑卷,刚好两个逻辑卷都是lv开头
[root@svr1 ~]# vgs // 查看系统的所有卷组的信息
VG #PV #LV #SN Attr VSize VFree
r1 1 2 0 wz--n- <19.00g 0
systemvg 5 0 0 wz--n- 69.98g 69.98g // 5个物理卷,划分逻辑卷0个,可用大小与空间大小一致69.98g
[root@svr1 ~]# vgremove systemvg // 删除卷组
Volume group "systemvg" successfully removed.
[root@svr1 ~]# pvs // 查看系统的所有物理卷的信息
PV VG Fmt Attr PSize PFree
/dev/vda2 r1 lvm2 a-- <19.00g 0
/dev/vdb1 lvm2 --- <10.00g <10.00g // 所属卷组VG为空
/dev/vdb2 lvm2 --- <10.00g <10.00g
/dev/vdb3 lvm2 --- <10.00g <10.00g
/dev/vdb5 lvm2 --- <20.00g <20.00g
/dev/vdb6 lvm2 --- <20.00g <20.00g
[root@svr1 ~]# pvremove /dev/vdb{1,2,3,5,6} // 删除空闲的物理卷
Labels on physical volume "/dev/vdb1" successfully wiped.
Labels on physical volume "/dev/vdb2" successfully wiped.
Labels on physical volume "/dev/vdb3" successfully wiped.
Labels on physical volume "/dev/vdb5" successfully wiped.
Labels on physical volume "/dev/vdb6" successfully wiped.
进程管理
- 程序:静态的没有执行的代码,占用硬盘空间。
进程:动态的执行的代码,占用CPU与内存。提供功能的是进程。 - 父进程与子进程:树型结构。
- PID(process ID):进程编号。子进程PID比父进程大,且没有联系。
- systemd(PID永远为1):所有进程的父进程,也叫上帝进程。
查看进程
- 以下示例的前提准备:新开第二个终端,su切换到用户lisi,
vim /haha.txt
,在原第一个终端查看进程。
pstree 进程树
pstree [选项] 用户名
(processes tree):查看该用户开始的进程树。省略用户则是所有进程。pstree [选项] 进程号
:查看该进程的进程树-p
:显示PID。-a
:显示命令的完整指令。
// pstree -p、-a 查看进程
[root@local ~]# pstree // 显示正在运行的所有进程
[root@local ~]# pstree -p lisi
[root@local ~]# pstree -p lisi // 显示lisi用户开启的进程及其PID
bash(9609)───vim(9656)
[root@local ~]# pstree -a lisi // 显示进程及命令的完整指令
bash
└─vim /haha.txt
[root@local ~]# pstree -ap lisi
bash,9609
└─vim,9656 /haha.txt
ps 快照
-
ps [选项]
(processes snapshot):进程快照。-
aux
:显示当前终端所有进程a
、当前用户在所有终端下的进程x
、以用户格式输出u
。可以查看进程所属用户。-elf
:显示系统内所有进程-e
、以长格式输出信息-l
、包括最完整的进程信息-f
。可以查看父进程。 -
ps -C 进程名
:查看进程的PID 。
-
// ps aux、-elf 进程快照
[root@local ~]# ps aux | less // 用户,PID,%CPU,%内存,……,COMMAND程序指令
[root@local ~]# ps aux | wc -l
[root@local ~]# ps -elf | less // PPID是父进程的PID,PRI/NI进程优先级(越小与越高)
[root@local ~]# ps -elf | wc -l
[root@local ~]# ps -elf | head -1
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
F: 表示进程标志,指示进程的状态和属性,例如运行状态、僵尸状态等。
S: 表示进程的状态,例如运行状态(R)、睡眠状态(S)、僵尸状态(Z)等。
UID: 表示进程所属的用户ID。
PID: 表示进程的ID(进程标识符)。
PPID: 表示父进程的ID(父进程标识符)。
C: 表示进程的CPU使用率。
PRI: 表示进程的优先级。
NI: 表示进程的nice值,用于调整进程的优先级。
ADDR: 表示进程的内存地址空间。
SZ: 表示进程使用的物理内存大小。
WCHAN: 表示进程当前正在等待的事件或条件。
STIME: 表示进程的启动时间。
TTY: 表示进程所连接的终端设备。
TIME: 表示进程的累计CPU占用时间。
CMD: 表示进程的命令行。
[root@python ~]# ps aux |head -1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 表示进程所属的用户名。
PID: 表示进程的ID(进程标识符)。
%CPU: 表示进程的CPU使用率。
%MEM: 表示进程使用的内存占比。
VSZ: 表示进程使用的虚拟内存大小。
RSS: 表示进程使用的物理内存大小。
TTY: 表示进程所连接的终端设备。
STAT: 表示进程的状态。
START: 表示进程的启动时间。
TIME: 表示进程的累计CPU占用时间。
COMMAND: 表示进程的命令行。
top 动态
top [-d 刷新秒数] [-u 用户名]
(delay):动态查看进程。(按P进行CPU排序,按M进行内存排序)- 6:09:开机使用时长。
user:登录的用户(通过终端登陆不计)。
load average:平均一分钟、五分钟、十五分钟处理的进程数。
running运行进程数,sleeping睡眠进程数,stopped停止进程数,zombie僵尸进程数。 uptime
:截取top动态的第一行。
pgrep 条件
pgrep [选项] 字符串
(process grep):查询进程名模糊匹配字符串的进程的PID。-l
(list):输出PID和进程名。-x
(exact):进程名精确匹配字符串。-u
:指定用户开启的进程。注意只能-lu
,不能-ul
。
// pgrep
[root@local ~]# pgrep -l systemd // 显示模糊匹配systemd的进程的PID和进程名
[root@local ~]# pgrep -lx systemd // 显示精确匹配systemd的进程的PID和进程名
[root@local ~]# pgrep -u lisi // 显示lisi用户开启的进程的PID
[root@local ~]# pgrep -lu lisi // 显示lisi用户开始的进程的PID和进程名,不能用"-ul"
控制进程
-
控制进程(进程前后台的调度):
-
命令行 &
:该命令行以正在运行的状态放入后台。 -
Ctrl + z
:挂起当前进程(暂停并放入后台)。 -
jobs
:查看后台任务列表。选项-l
列出进程号PID。 -
bg [数字]
(background):激活后台第数字个被挂起的任务。 -
fg [数字]
(foreground):将后台任务恢复到前台运行。
-
-
sleep 数字
:使进程睡眠数字秒。
// 控制进程
[root@local ~]# sleep 1000
^Z // Ctrl+z,暂停并放入后台
[1]+ 已停止 sleep 1000
[root@local ~]# sleep 2000
^Z // Ctrl+z,暂停并放入后台
[2]+ 已停止 sleep 2000
[root@local ~]# sleep 3000 & // 以运行状态放入后台
[3] 43701
[root@local ~]# jobs // 查看后台任务列表
[1]- 已停止 sleep 1000 // -代表将要成为默认作业
[2]+ 已停止 sleep 2000 // +代表bg和fg无参数时的默认作业
[3] 运行中 sleep 3000
[root@local ~]# bg // 这里没有指定参数,则会激活+的任务
[2]+ sleep 2000 &
[root@local ~]# jobs
[1]+ 已停止 sleep 1000
[2] 已停止 sleep 2000 &
[3]- 运行中 sleep 3000 &
[root@local ~]# fg // 这里没有指定参数,则会激活+的任务
sleep 1000 // Ctrl+c,杀死进程
^C
杀死进程
-
杀死进程的方式:
-
关闭终端。
-
Ctrl+c
:杀死前台的进程。 -
kill [-9] PID
:杀死该PID的进程。根据PID。kill [-9] %后台任务编号
:杀死该编号的后台任务。 -
killall [-9] 进程名
:杀死所有该名的进程。根据进程名。 -
pkill [-9] 字符串
(process kill):杀死名称包含字符串的进程。
pkill [-9] -u 用户名1,用户名n
:杀死用户开启的所有进程。- 不用
-9
则优雅杀死:如果进程正被使用,等使用结束再杀死。 - 用
-9
则残忍杀死:即使进程正被使用,也立即杀死。
- 不用
-
// 杀死进程
[root@local ~]# sleep 3000 &
[1] 35490
[root@local ~]# sleep 3000 &
[2] 35491
[root@local ~]# jobs
[1]- 运行中 sleep 3000 &
[2]+ 运行中 sleep 3000 &
[root@local ~]# killall -9 sleep
[1]- 已杀死 sleep 3000
[2]+ 已杀死 sleep 3000
孤儿进程
- 僵尸进程:子进程先父进程结束,且父进程没有回收子进程释放子进程的资源,子进程成为一个僵尸进程。
- 孤儿进程:父进程先子进程结束,子进程成为一个孤儿进程。
- 孤儿进程要么直接被上帝进程收编,要么被杀死。
- 一般启动进程,都是在当前bash进程启动一个子进程。而系统服务的进程(以httpd、mysqld等),是先在当前bash进程启动一个子进程bash或sh,再在该子进程中启动下一代子进程,然后将子进程杀死,下一代子进程成为孤儿进程,然后被上帝进程收编。这个过程可以通过
sh -c "启动进程命令"
实现。
// 孤儿进程
// 已有的进程树
]# pstree -p
systemd(1)─┬─NetworkManager(509)─┬─{NetworkManager}(552)
│ └─{NetworkManager}(553)
├─agetty(591)
├─agetty(592)
├─crond(564)
├─dbus-daemon(507)
├─irqbalance(505)───{irqbalance}(537)
├─polkitd(508)─┬─{polkitd}(544)
│ ├─{polkitd}(545)
│ ├─{polkitd}(546)
│ ├─{polkitd}(547)
│ └─{polkitd}(548)
├─qemu-ga(510)───{qemu-ga}(536)
├─rsyslogd(589)─┬─{rsyslogd}(658)
│ └─{rsyslogd}(659)
├─sshd(560)───sshd(754)───sshd(766)───bash(767)───pstree(849)
├─systemd(758)───(sd-pam)(760)
├─systemd-journal(457)
├─systemd-logind(506)
├─systemd-udevd(484)
└─tuned(559)─┬─{tuned}(682)
├─{tuned}(687)
├─{tuned}(688)
└─{tuned}(689)
// 一般启动进程
]# sleep 1000 &
[1] 850 // 进程850
]# pstree -p
systemd(1)─┬─NetworkManager(509)─┬─{NetworkManager}(552)
│ └─{NetworkManager}(553)
├─agetty(591)
├─agetty(592)
├─crond(564)
├─dbus-daemon(507)
├─irqbalance(505)───{irqbalance}(537)
├─polkitd(508)─┬─{polkitd}(544)
│ ├─{polkitd}(545)
│ ├─{polkitd}(546)
│ ├─{polkitd}(547)
│ └─{polkitd}(548)
├─qemu-ga(510)───{qemu-ga}(536)
├─rsyslogd(589)─┬─{rsyslogd}(658)
│ └─{rsyslogd}(659)
├─sshd(560)───sshd(754)───sshd(766)───bash(767)─┬─pstree(851)
│ └─sleep(850) // 在当前bash进程767下的进程850
├─systemd(758)───(sd-pam)(760)
├─systemd-journal(457)
├─systemd-logind(506)
├─systemd-udevd(484)
└─tuned(559)─┬─{tuned}(682)
├─{tuned}(687)
├─{tuned}(688)
└─{tuned}(689)
// 孤儿进程
]# sh // 开启子进程sh
sh-4.4# sleep 2000 &
[1] 853 // 进程853
sh-4.4# pstree -p
systemd(1)─┬─NetworkManager(509)─┬─{NetworkManager}(552)
│ └─{NetworkManager}(553)
├─agetty(591)
├─agetty(592)
├─crond(564)
├─dbus-daemon(507)
├─irqbalance(505)───{irqbalance}(537)
├─polkitd(508)─┬─{polkitd}(544)
│ ├─{polkitd}(545)
│ ├─{polkitd}(546)
│ ├─{polkitd}(547)
│ └─{polkitd}(548)
├─qemu-ga(510)───{qemu-ga}(536)
├─rsyslogd(589)─┬─{rsyslogd}(658)
│ └─{rsyslogd}(659)
├─sshd(560)───sshd(754)───sshd(766)───bash(767)─┬─sh(852)─┬─pstree(854)
│ │ └─sleep(853) // 进程853的父进程852
│ └─sleep(850)
├─systemd(758)───(sd-pam)(760)
├─systemd-journal(457)
├─systemd-logind(506)
├─systemd-udevd(484)
└─tuned(559)─┬─{tuned}(682)
├─{tuned}(687)
├─{tuned}(688)
└─{tuned}(689)
sh-4.4# exit // 退出sh子进程852
exit
]# pstree -p
systemd(1)─┬─NetworkManager(509)─┬─{NetworkManager}(552)
│ └─{NetworkManager}(553)
├─agetty(591)
├─agetty(592)
├─crond(564)
├─dbus-daemon(507)
├─irqbalance(505)───{irqbalance}(537)
├─polkitd(508)─┬─{polkitd}(544)
│ ├─{polkitd}(545)
│ ├─{polkitd}(546)
│ ├─{polkitd}(547)
│ └─{polkitd}(548)
├─qemu-ga(510)───{qemu-ga}(536)
├─rsyslogd(589)─┬─{rsyslogd}(658)
│ └─{rsyslogd}(659)
├─sleep(853) // 进程853的父进程852死亡,成为孤儿进程,被上帝进程收编
├─sshd(560)───sshd(754)───sshd(766)───bash(767)─┬─pstree(855)
│ └─sleep(850)
├─systemd(758)───(sd-pam)(760)
├─systemd-journal(457)
├─systemd-logind(506)
├─systemd-udevd(484)
└─tuned(559)─┬─{tuned}(682)
├─{tuned}(687)
├─{tuned}(688)
└─{tuned}(689)
// 系统服务进程的原理
[root@dhcp ~]# sh -c "sleep 3000 &"
[root@dhcp ~]# pstree -p
systemd(1)─┬─NetworkManager(509)─┬─{NetworkManager}(552)
│ └─{NetworkManager}(553)
├─agetty(591)
├─agetty(592)
├─crond(564)
├─dbus-daemon(507)
├─irqbalance(505)───{irqbalance}(537)
├─polkitd(508)─┬─{polkitd}(544)
│ ├─{polkitd}(545)
│ ├─{polkitd}(546)
│ ├─{polkitd}(547)
│ └─{polkitd}(548)
├─qemu-ga(510)───{qemu-ga}(536)
├─rsyslogd(589)─┬─{rsyslogd}(658)
│ └─{rsyslogd}(659)
├─sleep(853)
├─sleep(861) // 实际启动了一个sh进程,在sh进程中启动sleep进程,再杀死该sh进程
├─sshd(560)───sshd(754)───sshd(766)───bash(767)─┬─pstree(862)
│ └─sleep(850)
├─systemd(758)───(sd-pam)(760)
├─systemd-journal(457)
├─systemd-logind(506)
├─systemd-udevd(484)
└─tuned(559)─┬─{tuned}(682)
├─{tuned}(687)
├─{tuned}(688)
└─{tuned}(689)
RAID磁盘阵列
- RAID磁盘阵列(Redundant Arrays of Inexpensive Disks,廉价冗余磁盘阵列)
- 通过硬件/软件技术,将多个较小/低速的磁盘整合成一个大磁盘使用的存储技术。
- 可以存储数据并实现一定程度的冗余保障(备份保障)。
- 阵列的价值:提升I/O效率、硬件级别的数据冗余
- 不同RAID级别的功能、特性各不相同
RAID 0
-
RAID 0,条带模式:
-
同一个文档被分散存放在不同磁盘。
-
并行写入以提高效率。
-
至少需要两块磁盘组成,磁盘利用率100%。
-
读写效率最高,但没有容错功能。
-
-
例如:磁盘AB,数据1234,可以将13写入磁盘A,24写入磁盘B。
RAID 1
-
RAID 1,镜像模式:
-
一个文档复制成多份,被分别写入不同磁盘。
-
多份拷贝提高可靠性(提高容错),提高读效率。
-
至少需要两块磁盘组成,磁盘利用率50%。
-
-
例如:磁盘AB,数据1234,会将1234写入磁盘A,也将1234写入磁盘B。
RAID 5
-
RAID 5,分布式奇偶校验的独立磁盘模式:
-
相当于RAID 0和RAID 1的折中方案。
-
有奇偶校验算法,提高可靠性,效率提升。
-
至少一块磁盘的容量来存放校验数据(可以是零散空间但总量达一块)。
-
至少需要三块磁盘组成,磁盘利用率n-1/n。
-
一般准备四块:三块用,一块备用以防硬盘损坏,最多可以坏一块。
-
RAID 6
-
RAID 6,高性价比/可靠模式:
-
相当于扩展的RAID 5阵列。
-
提供2份独立校验方案。
-
至少两块磁盘的容量来存放校验数据(可以是零散空间但总量达两块)。
-
至少需要四块磁盘组成,磁盘利用率n-2/n。
-
最多可以坏两块。
-
RAID 01/RAID 10
-
RAID 0+1(RAID 01)/RAID 1+0(RAID 10):
- 至少四块盘组成,例如:ABCD四块盘,数据1234。
- RAID 0+1:AB、CD做RAID 0,在此基础上再做RAID 1。
AB写13,CD写24,在此基础上,A写13,B也写13,C写24,D也写24。 - RAID 1+0:AB、CD做RAID 1,在此基础上再做RAID 0。
AB写1234,CD也写1234,在此基础上,A写13,B写24,C写13,D写24。
- RAID 0+1:AB、CD做RAID 0,在此基础上再做RAID 1。
- 整合RAID 0、RAID 1的优势。
- 并行存取提高效率、镜像写入提高可靠性。
- 至少需要四块磁盘组成,磁盘利用率50%
- 至少四块盘组成,例如:ABCD四块盘,数据1234。
对比
对比项 | RAID 0 | RAID 1 | RAID 10 | RAID 5 | RAID 6 |
---|---|---|---|---|---|
磁盘数 | >=2 | >=2 | >=4 | >=3 | >=4 |
存储利用率 | 100% | <=50% | <=50% | n-1/n | n-2/n |
校验盘 | 无 | 无 | 无 | 1 | 2 |
容错性 | 无 | 有 | 有 | 有 | 有 |
IO读写性能 | 高 | 低 | 较高 | 中 | 中 |
- 如果要控制成本且使用较高的冗余性,使用RAID 6。如果要使用较高的读写性能,无需考虑成本,则使用RAID 10。
IPMI
ipmitool -l lanplus -U root -H 服务器IP地址 [-P 密码] power status/on/off/reset // 控制远程服务器电源,查询电源状态/开机/关机/重启
ipmitool -l lanplus -U root -H 服务器IP地址 [-P 密码] sol activate // 激活并连接远程服务器的终端控制台