磁盘分区
磁盘分区类型和特点
DOS分区表: 只能用于小于2T的硬盘(常用)。也是MBR分区
GPT分区表: 万能分区表(小于2T,大于2T都可以)。
MBR分区
主分区:
1.必须存在的分区。
2.装系统(第一个主分区)
3.主分区数量不能超过4个。
4.分区编号,只能是1-4
扩展分区
1.独立小磁盘,有独立分区表,不能直接放数据。
2.占用主分区分区编号(2-4),主分区+扩展分区最多4个
3.最多只能有1个。
4.要想存数据必须在其下划分逻辑分区。
逻辑分区
1.不能独立存在,必须在扩展分区之上。
2.编号最小是5,及以上。
3.用来存放数据。
GPT分区
GPT分区没有扩展分区 ,他可以分128个主分区。
使用gdisk和parted工具
gdisk工具和fdisk差不多
分区工具
fdisk(只能用于MBR类型)
fdisk 是 Linux 的磁盘分区表操作工具,只能用于MBR类型支持创建、删除和修改分区,不直接支持在线扩容或缩容分区。如果非要使用fdisk扩容缩容,只能按照以下步骤:
1.备份数据
2.删除分区
3.重新创建分区,以达到想要的磁盘大小
用法
### 语法:
fdisk [-l] 装置名称
### 选项与参数:
-l :输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来
-lu:显示分区磁盘的详细内容,包括分区类型。
d delete a partition #删除分区
m print this menu #打印帮助
n add a new partition #添加新分区
p print the partition table #打印分区表
q quit without saving changes #退出不保存
w write table to disk and exit #保存并退出
fdisk 添加分区
fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x9068f0a6 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n ###添加新分区
Partition type:
p primary (0 primary, 0 extended, 4 free) #主分区
e extended #扩展分区
Select (default p): p ###选择主分区
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G ###设置大小为10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):w ###退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
分区以后:
通知内核分区表已经修改。
partprobe /dev/sdb
fdisk删除分区
fdisk /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: 2DCCA8BC-D71C-4954-8BE9-FEAA1EB765EE
# Start End Size Type Name
1 2048 20973567 10G Linux filesyste Linux filesystem
2 20973568 25167871 2G Linux filesyste Linux filesystem
命令(输入 m 获取帮助):d #删除分区
分区号 (1,2,默认 2):2 #选择分区号为2
分区 2 已删除
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: 2DCCA8BC-D71C-4954-8BE9-FEAA1EB765EE
# Start End Size Type Name
1 2048 20973567 10G Linux filesyste Linux filesystem
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
partprobe /dev/sdb 通知内核分区表已经修改。
警告:删除分区时要小心,请看好分区的序号,如果您删除了扩展分区,扩展分区之下的逻
辑分区都会删除;所以操作时一定要小心;如果知道自己操作错了,请不要惊慌,用 q 不保
存退出;切记切记!!!!在分区操作错了之时,千万不要输入 w 保存退出!!!
gdisk
gdisk既可以用于MBR分区也可以用于GPT分区,支持创建、删除和修改分区,不直接支持在线扩容或缩容分区。
用法:
gdisk /dev/磁盘名
-n 创建一个新分区
-p 显示当前磁盘的分区表
-w 将更改写入并退出
-q 不保存退出
-d 删除分区
不常用的:
b 将GPT数据以文件格式备份
c 更改分区名
i 显示分区详细信息
l 列出分区类型
o 创建一个新的空白GPT分区表
p 显示当前磁盘的分区表
t 改变分区类型
v 验证磁盘分区表
x 专家模式
? 帮助
gdisk添加分区
yum install -y gdisk
gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************
Command (? for help): n #创建一个新分区
Partition number (2-128, default 2): #输入分区编号
First sector (34-41943006, default = 20973568) or {+-}size{KMGTP}: #输入扇区的开始位置,选择默认即可,也可手动指定。
Last sector (20973568-41943006, default = 41943006) or {+-}size{KMGTP}: +2G #输入扇区的结束位置,当然一般都是指定磁盘大小,这里输入+2G表示新分区大小为2G。
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): ##指定文件系统,默认即可,分区完成后可以修改。
Changed type of partition to 'Linux filesystem'
Command (? for help): p #显示当前磁盘的分区表
Disk /dev/sdb: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 2DCCA8BC-D71C-4954-8BE9-FEAA1EB765EE
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 16777149 sectors (8.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 20973567 10.0 GiB 8300 Linux filesystem
2 20973568 25167871 2.0 GiB 8300 Linux filesystem
Command (? for help): w #将更改写入并退出
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y #确认更改
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
partprobe /dev/sdb
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 66G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 10G 0 part
└─sdb2 8:18 0 2G 0 part
可以看到分区成功
gdisk删除分区
gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): d #删除分区
Partition number (1-2): 2 #选择分区2
Command (? for help): p
Disk /dev/sdb: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 2DCCA8BC-D71C-4954-8BE9-FEAA1EB765EE
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 20971453 sectors (10.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 20973567 10.0 GiB 8300 Linux filesystem
Command (? for help): w #保存并退出
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 66G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 10G 0 part /data
└─sdb2 8:18 0 1K 0 part
partprobe /dev/sdb
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 66G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 10G 0 part /data
parted
parted用于对磁盘(或RAID磁盘)进行分区及管理,与fdisk分区工具相比,支持2TB以上的磁盘分区,也可以划分普通的MBR分区。并且允许调整分区的大小。
用法
-h:显示帮助信息;
-i:交互式模式;
-s:脚本模式,不提示用户;
-v:显示版本号。
命令行模式查看指定分区:
parted /dev/sdb print
进入交互模式
parted
交互模式下获取帮助
help
获取指定命令帮助文档
help command
选择分区
select /dev/sdb
查看分区信息剩余磁盘空间
print free
删除一个分区
rm 1
print
创建一个分区
mkpart
将磁盘格式化为GPT磁盘
mklabel gpt
将磁盘格式化为MBR磁盘
mklabel msdos
gpt格式下创建一个分区
mkpart
退出交换模式
quit
parted添加分区
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 1049kB 10.7GB 10.7GB ext4 Linux filesystem
(parted) mkpart
分区名称? []? sdb3
文件系统类型? [ext2]? ext3
起始点? 12G
结束点? 15G
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 1049kB 10.7GB 10.7GB ext4 Linux filesystem
2 12.0GB 15.0GB 3000MB sdb3
(parted) q
信息: You may need to update /etc/fstab.
lsblk
删除分区
parted
GNU Parted 3.1
使用 /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) select /dev/sdb
使用 /dev/sdb
(parted) rm 2
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 1049kB 10.7GB 10.7GB ext4 Linux filesystem
(parted) q
信息: You may need to update /etc/fstab.
swap虚拟分区
什么是swap虚拟分区
swap是一个虚拟的内存空间
作用是当系统的物理内存不够时,将硬盘空间的一部分空间释放出来,以供当前运行的程序使用。
Ps: 当物理内存不够时会随机kill占用内存的进程,从而产生oom,使用swap可以弥补内存不足,防止重要的进程被kill
如何使用
1.找一块硬盘划分1G分区,使用fdisk去划分
2.格式化为swap分区 mkswap /dev/sdb1
3.通过swapon -a /dev/sdb1 将该设备加入已有磁盘空间
4.使用free -m 检查swap的大小
5.想要永久生效需要加入到开机自启
禁用swap
swapoff /dev/sdb1 禁用该设备
swapoff -a 禁用所有设备使用swap
想要永久生效需要加入到开机自启
格式化磁盘
可以格式化整个磁盘,也可以格式化磁盘中的分区
为什么需要格式化:
磁盘分区在没有格式化前,操作系统是无法识别系统上磁盘分区格式的,也就无法存取文件目录属性和权限等内容,把分区格式化成操作系统支持的某个文件系统后,再存放数据,系统就会根据这个文件系统的格式进行存取文件了。
mkfs的选项
-t 指定文件系统类型,ext4,xfs等
-i 设定inode大小
-N 设定inode数量
mkfs -t ext4 /dev/sdb
什么是文件系统
【文件系统】是一种【存储和组织计算机中数据文件的机制或方法】,它使得对计算机内的数据的存储、访问和查找变得更容易、简单。
文件系统落到计算机里其实就是一个应用软件。
如ext2、ext3(CentoS5.x )、ext4(CentoS6.x)、xfs(CentOS7.x)、zfs和Reiserfs或FAr、NTFs等都是常见文件系统。
查看文件系统
df -T
挂载磁盘
-t 指定文件系统
-a 挂载/etc/fstab配置文件中的配置
-o 指定挂载的参数(权限,功能)
mount -t ext4 /dev/sdb /opt
永久挂载
写入/etc/fstab
/etc/fstab 配置文件格式:
/dev/sdb1 /mnt xfs default 0 0
要挂载的设备 挂载点 文件系统类型 挂载参数 是否备份 是否检查
第四列可以写的参数:
1.async/sync:是否为同步方式运行,默认为async,async就是写数据写到内存,sync是写数据直接写到磁盘,sync命令可以直接把buffer数据写入磁盘
2.user/nouser:是否允许普通用户使用mount命令挂载,默认nouser
3.exec/noexec:是否允许可执行文件执行。默认为exec
4.suid/nosuid:是否允许存在suid属性的文件。默认suid
5.auto/noauto:执行mount -a的时候,此文件系统是否被主动挂载。默认为auto
6.rw/ro:是否以只读或读写模式进行挂载,默认为rw
第5列默认0即可:
1.0:代表不备份
2.1:代表要每天备份
3.2:代表不定期备份
挂载磁盘第六列必须要为0 否则系统起不来!!!
写入/etc/rc.local里
which查找mount命令的命令文件位置,用绝对路径的方式挂载磁盘,写入到/etc/rc.local里
这种方式需要给ec.local授予执行权限
查看mount的挂载情况
mount|grep /dev
devtmpfs on /dev type devtmpfs (rw,nosuid,size=3984264k,nr_inodes=996066,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
/dev/sda2 on / type xfs (rw,relatime,attr2,inode64,noquota)
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)
umount取消挂载
umount /opt 或者 umount /dev/sdb
-l 强制卸载
磁盘排障生产案例
inode高案例
inode高一般是有大量的小文件导致的。inode只是存储了文件的元信息,真正的存储是存储在block中的,每个inode会指向block
在收到告警inode高的时候我们需要对每个可能的目录执行以下命令
find /root -type f -o -type d |wc -l
查看某个目录下的所有文件和目录的数量
排查出来之后,还可以看下是否是空文件
find /root -type f -size 0 |wc -l
find /root -type f -size 0 #查看具体的位置
io高的案例
查看系统磁盘整体 I/O:
iostat -x -k -d 1 1
Linux 3.10.0-1160.118.1.el7.x86_64 (localhost.localdomain) 2024年06月29日 _x86_64_ (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.03 1.34 0.68 29.34 7.49 36.56 0.00 0.56 0.35 0.96 0.29 0.06
scd0 0.00 0.00 0.00 0.00 0.26 0.00 114.22 0.00 1.72 1.72 0.00 1.33 0.00
dm-0 0.00 0.00 1.21 0.71 26.27 6.97 34.63 0.00 0.63 0.36 1.09 0.28 0.05
dm-1 0.00 0.00 0.02 0.00 0.57 0.00 50.09 0.00 0.20 0.20 0.00 0.10 0.00
------
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz: 平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
查看进程级别 I/O:
pidstat -d
Linux 3.10.0-1160.118.1.el7.x86_64 (localhost.localdomain) 2024年06月29日 _x86_64_ (1 CPU)
15时43分27秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
15时43分27秒 0 1 10.95 0.04 0.00 systemd
15时43分27秒 0 483 0.25 0.00 0.00 systemd-journal
15时43分27秒 0 508 3.44 0.00 0.00 systemd-udevd
15时43分27秒 0 509 0.02 0.00 0.00 lvmetad
15时43分27秒 0 627 0.02 3.82 0.00 auditd
15时43分27秒 81 650 0.28 0.00 0.00 dbus-daemon
15时43分27秒 0 652 0.16 0.00 0.00 systemd-logind
15时43分27秒 0 653 1.26 0.00 0.00 VGAuthService
15时43分27秒 0 654 0.83 0.00 0.00 vmtoolsd
15时43分27秒 999 655 1.51 0.00 0.00 polkitd
15时43分27秒 0 657 1.48 0.01 0.00 NetworkManager
------
kB_rd/s 每秒从磁盘读取的KB
kB_wr/s 每秒写入磁盘KB
kB_ccwr/s 任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生
Command 进程执行命令
当使用 pidstat -d 定位到哪个应用服务时,接下来则需要使用 strace 和 lsof 定位是那些代码在读写磁盘里的哪些文件,导致 IO 高的原因:
$ strace -p 18940
strace: Process 18940 attached
...
mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f7aee9000
mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f682e8000
write(3, "2018-12-05 15:23:01,709 - __main"..., 314572844
) = 314572844
munmap(0x7f0f682e8000, 314576896) = 0
write(3, "\n", 1) = 1
munmap(0x7f0f7aee9000, 314576896) = 0
close(3) = 0
stat("/tmp/logtest.txt.1", {st_mode=S_IFREG|0644, st_size=943718535, ...}) = 0
strace 命令输出可以看到进程 18940 正在往文件 /tmp/logtest.txt.1 写入 300m
lsof -p 18940
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Java 18940 root cwd DIR 0,50 4096 1549389 /
…
Java 18940 root 2u CHR 136,0 0t0 3 /dev/pts/0
Java 18940 root 3w REG 8,1 117944320 303 /tmp/logtest.txt
----
FD 表示文件描述符号,TYPE 表示文件类型,NODE NAME 表示文件路径
lsof 也可以看出进程 18940 以每次 300MB 的速度往 /tmp/logtest.txt 写入