磁盘分区

磁盘分区类型和特点

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里

null

这种方式需要给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   #查看具体的位置

null

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 写入

results matching ""

    No results matching ""