04 磁盘存储和文件系统
目录
1 设备查看lsblk/df
##lsblk显示所有块设备,专注于显示物理磁盘及其分区
[root@anolis-31 ~]$lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─ao-root 252:0 0 17G 0 lvm /
└─ao-swap 252:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 2.6G 0 rom
##df专注于显示已挂载文件系统的磁盘空间使用情况
[root@anolis-31 ~]$df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 973364 0 973364 0% /dev
tmpfs 992956 0 992956 0% /dev/shm
tmpfs 992956 8824 984132 1% /run
tmpfs 992956 0 992956 0% /sys/fs/cgroup
/dev/mapper/ao-root 17811456 2721208 15090248 16% /
/dev/sda1 1038336 207608 830728 20% /boot
tmpfs 198588 0 198588 0% /run/user/0
##设备目录
[root@anolis-31 ~]$ll /dev/ | wc -l
162
范例:特殊设备 null/zero/random
##/dev/null,空设备
##任何写入到/dev/null的数据都会消失,不会保存在磁盘上,也不会占用任何存储空间
##如脚本中将ping日志丢弃,就不打印
ping -c1 -w1 ${net}.${id} &> /dev/null && echo ${net}.${id} is up || echo ${net}.${id} is down
##如清空文件内容
[root@anolis-31 ~]$cat /dev/null > fstab_1.txt
##/dev/zero,零字节设备
##提供无限个零字节的设备文件,它总是返回零,是创建占位文件或内存填充的理想工具。
[root@anolis-31 ~]$dd if=/dev/zero of=file.txt bs=1M count=10
##/dev/random、/dev/urandom,随机数设备
##提供加密质量随机数的设备文件。它们常被用于需要高度随机性的场景,如生成加密密钥等。
##random更安全,urandom更快。
##获取6位字母数字的随机数
[root@anolis-31 ~]$cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 6
HeK8db
2 RAID磁盘阵列
机械硬盘HDD
固态硬盘SSD
相较于HDD ,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优势, SSD传输速率性能是HDD 的2倍
相较于SSD , HDD在价格、容量占有绝对优势
硬盘有价,数据无价,目前SSD不能完全取代HHD 机械硬盘结构
RAID:磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。
RAID功能实现
提高IO能力,磁盘并行读写
提高耐用性,磁盘冗余算法来实现
常见组合:
RAID0:读写并行,速度快;无冗余无容错,一个磁盘坏都坏;
RAID1:读快,写两次较慢;有冗余,成本高;
RAID5:读写性能提升,有校验位,允许最多1快磁盘损坏;
RAID1+0:先做1,再做0;每组镜像最多坏一块;
3 管理存储
3.1 第一步fdisk创建磁盘分区
两种分区方式: MBR ,GPT
MBR:最多4主分区,分区不超过2T 划分分区的单位。
GPT:支持128个分区,还能更好地管理大磁盘空间。
BIOS+MBR与UEFI+GPT,主板程序与分区搭配
##查询分区类别,dos用MBR管理工具fdisk,gpt用GPT管理工具gdisk
[root@rocky-41 ~]#fdisk -l | grep -C2 -e "dos" -e "gpt"
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x06a2ab88
[root@ubuntu51 ~]#fdisk -l | grep -C2 -e "dos" -e "gpt"
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:1F452381-AD24-4210-936F-D545FABB6454
##新加磁盘后,需要扫描,否则lsblk看不到
##触发系统重新扫描SCSI总线,执行echo "- - -">/sys/class/scsi_host/host0/scan将会触发对指定SCSI主机的重新扫描
[root@anolis-31 ~]$for i in {1..10};do echo "- - -">/sys/class/scsi_host/host$i/scan;done
##扫描完后,新增sdb磁盘
[root@anolis-31 ~]$lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─ao-root 252:0 0 17G 0 lvm /
└─ao-swap 252:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
sr0 11:0 1 2.6G 0 rom
##手动创建
[root@anolis-31 ~]$fdisk /dev/sdb
[root@anolis-31 ~]$lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─ao-root 252:0 0 17G 0 lvm /
└─ao-swap 252:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
├─sdb1 8:17 0 2G 0 part
└─sdb2 8:18 0 1G 0 part
sr0 11:0 1 2.6G 0 rom
##非交互式创建
##1、n,创建;2、p,主分区;3、默认分区号;4、从上次分区结束的位置开始;5、大小设置,+1G,1G大小;6、w,报错退出;
[root@anolis-31 ~]$echo -e 'n\np\n\n\n+1G\nw\n' | fdisk /dev/sdb &>/dev/null
[root@anolis-31 ~]$lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─ao-root 252:0 0 17G 0 lvm /
└─ao-swap 252:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
├─sdb1 8:17 0 2G 0 part
├─sdb2 8:18 0 1G 0 part
└─sdb3 8:19 0 1G 0 part
sr0 11:0 1 2.6G 0 rom
##注意查看设备类型,后续需要8e的逻辑卷LVM类型,方便扩容
##可手动fdisk /dev/sdb时修改,也可以记住选项(t修改)后使用非交互
[root@anolis-31 ~]$fdisk -l
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 4196351 4194304 2G 8e Linux LVM
/dev/sdb2 4196352 6293503 2097152 1G 82 Linux swap / Solaris
/dev/sdb3 6293504 8390655 2097152 1G 83 Linux
3.2 第二步mkfs创建文件系统
常用文件系统
ext4:提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件 (16TB)、最大1EB的文件系统,以及速度的提升
xfs :SGI,支持最大8EB的文件系统
swap
##查看红帽系列默认xfs文件系统,ubuntu是ext4文件系统
[root@anolis-31 ~]$df -T | awk '/^\/dev\//{print $1,$2}'
/dev/mapper/ao-root xfs
/dev/sda1 xfs
[root@rocky-41 ~]$df -T | awk '/^\/dev\//{print $1,$2}'
/dev/mapper/rl-root xfs
/dev/sda1 xfs
[root@ubuntu51 ~]#df -T | awk '/^\/dev\//{print $1,$2}'
/dev/mapper/ubuntu--vg-ubuntu--lv ext4
/dev/sda2 ext4
[root@anolis-31 ~]$mkfs.xfs /dev/sdb1
3.3 第三步mount挂载使用
##临时挂载,挂载完才能看到
[root@anolis-31 ~]$mount /dev/sdb1 /data/new_sdb/
[root@anolis-31 ~]$df -T | awk '/^\/dev\//{print $1,$2,$NF}'
/dev/mapper/ao-root xfs /
/dev/sda1 xfs /boot
/dev/sdb1 xfs /data/new_sdb
##临时取消,umount取消挂载
[root@anolis-31 ~]$umount /data/new_sdb
[root@anolis-31 ~]$df -T | awk '/^\/dev\//{print $1,$2,$NF}'
/dev/mapper/ao-root xfs /
/dev/sda1 xfs /boot
##持久操作,需要修改文件/etc/fstab
##1uuid:blkid能查到
##2挂载点:先创建空目录
##3文件系统:ext4、xfs
##4挂载选项:defaults,acl,bind对应修改
##5转储频率:对应修改
##6fsck检查的顺序:对应修改
[root@anolis-31 ~]$grep '^[^#]' /etc/fstab
/dev/mapper/ao-root / xfs defaults 0 0
UUID=3bf09b78-243f-4327-941e-8914b0f9e255 /boot xfs defaults 0 0
/dev/mapper/ao-swap none swap defaults 0 0
##查看uuid
[root@anolis-31 ~]$blkid | grep sdb1
/dev/sdb1: UUID="3bef38ce-7f00-4000-bfc4-b59a0656f1c1" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="5d0caad6-01"
##对应修改,添加到文件内
[root@anolis-31 ~]$cat >>/etc/fstab<<EOF
> UUID=3bef38ce-7f00-4000-bfc4-b59a0656f1c1 /dev/sdb1 xfs defaults 0 0
> EOF
##生效
[root@anolis-31 ~]$mount -a
3.4 swap交换分区
swap交换分区是系统RAM的补充,swap分区支持虚拟内存。
注意:为优化性能,可以将swap分布存放,或高性能磁盘存放
*系统中的* *RAM* *量* | *推荐的* *swap* *空间* | *允许休眠的建议* *swap* *空间大小* |
---|---|---|
低于 2 GB | RAM 量的2倍数 | RAM 容量的三倍 |
2 GB - 8 GB | 等于 RAM 量 | RAM 量的倍数 |
8 GB - 64 GB | 4 GB 到 RAM 容量的 0.5 倍 | RAM 容量的 1.5 倍 |
超过 64 GB | 独立负载(至少 4GB) | 不建议使用休眠功能 |
##新增10G磁盘
##扫描
[root@rocky-41 ~]$for i in {1..40};do echo "- - -">/sys/class/scsi_host/host$i/scan;done
[root@rocky-41 ~]$lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rl-root 253:0 0 17G 0 lvm /
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
sr0 11:0 1 2.4G 0 rom
##创建82类型swap分区并写入配置
[root@rocky-41 ~]$echo -e 'n\np\n\n\n+2G\nt\n82\nw\n' | fdisk /dev/sdb
[root@rocky-41 ~]$mkswap /dev/sdb1
正在设置交换空间版本 1,大小 = 2 GiB (2147479552 个字节)
无标签,UUID=c8ff66e3-acaf-49f3-9e97-8496ad20cc2b
[root@rocky-41 ~]$blkid /dev/sdb1
/dev/sdb1: UUID="c8ff66e3-acaf-49f3-9e97-8496ad20cc2b" TYPE="swap" PARTUUID="423e6950-01"
[root@rocky-41 ~]$cat >>/etc/fstab <<EOF
> UUID=c8ff66e3-acaf-49f3-9e97-8496ad20cc2b swap swap defaults 0 0
> EOF
##激活所有的交换分区,验证
[root@rocky-41 ~]$swapon -a
[root@rocky-41 ~]$free -h
total used free shared buff/cache available
Mem: 1.7Gi 568Mi 103Mi 6.0Mi 1.0Gi 988Mi
Swap: 4.0Gi 195Mi 3.8Gi
[root@rocky-41 ~]$cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 199720 -2
/dev/sdb1 partition 2097148 0 -3
##关闭swap分区,因为交换分区性能不足,有可能需要关闭
##配置文件swap注释,关闭swap
[root@rocky-41 ~]$sed -i.bak -E '/swap/s/(.*)/#\1/' /etc/fstab
[root@rocky-41 ~]$swapoff -a
[root@rocky-41 ~]$free -h
total used free shared buff/cache available
Mem: 1.7Gi 617Mi 98Mi 9.0Mi 1.0Gi 938Mi
Swap: 0B 0B 0B
[root@rocky-41 ~]$cat /proc/swaps
Filename Type Size Used Priority
##设置swap的使用策略
##0禁止使用,100总是使用,越低则降低使用,修改后验证
[root@rocky-41 ~]$echo vm.swappiness=10 >> /etc/sysctl.conf
[root@rocky-41 ~]$sysctl -p
vm.swappiness = 10
[root@rocky-41 ~]$sysctl -a | grep vm.swappiness
vm.swappiness = 10
3.7 磁盘常见工具df/du/dd
##df文件系统空间
##-T类型;-h容量human-readable单位;
[root@rocky-41 ~]$df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 848M 0 848M 0% /dev
tmpfs tmpfs 868M 0 868M 0% /dev/shm
tmpfs tmpfs 868M 8.7M 859M 1% /run
tmpfs tmpfs 868M 0 868M 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 17G 9.3G 7.8G 55% /
/dev/sda1 xfs 1014M 198M 817M 20% /boot
tmpfs tmpfs 174M 0 174M 0% /run/user/0
##du目录总体空间
##-h:容量human-read;--max-depth:最大目录层级;
[root@rocky-41 /]$du -h --max-depth=0 /var
541M /var
##dd 读取、转换并输出数据
##dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
#测试硬盘写速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
#测试硬盘读速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
4 逻辑卷管理LVM
##软件包lvm2
LVM:可以允许对卷进行方便操作的抽象层
物理卷:Physical Volume,PV
物理块:Physical Extent,PE
卷组:Volume Group,VG
逻辑卷:Logical Volume,LV
实现过程
1、将设备指定为物理卷(PV),PV=n个PE(PE为物理块,相当于自定义的基本单位,默认4M);相当于分解;
2、卷组(VG),VG=n个PV;相当于合并资源池;
3、逻辑卷(LV),建立在VG上,可以建立文件系统;相当于在资源池取资源使用;
pv管理工具:
pv信息显示:pvs;pvdisplay
pvcreate /dev/DEVICE
pvremove /dev/DEVICE
vg管理工具:
vg显示信息:vgs;vgdisplay
vgcreate -s 16M vg0 /dev/sdb /dev/sdc #指定PE的大小 ,默认4M
vgextend VolumeGroupName PhysicalDevicePath #扩展
vgremove
lv管理工具:
lv显示信息:lvs;lvdisplay
lvcreate -L #[mMgGtT] -n NAME VolumeGroup
lvcreate -l 100%FREE -n yourlv testvg
lvremove /dev/VG_NAME/LV_NAME
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME #扩容
范例:创建逻辑卷并弹性扩容
##即使空间足够也不缩容,有可能造成数据丢失
##目标:/data/lv_test 弹性扩容
##实现初始使用分区sdb2的1G,后续增加1G;空间不够时,再使用分区sdb3的空间再增加2G;
##创建后的分区
[root@rocky-41 ~]$fdisk -l /dev/sdb
Disk /dev/sdb:10 GiB,10737418240 字节,20971520 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x423e6950
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 2048 4196351 4194304 2G 82 Linux swap / Solaris
/dev/sdb2 4196352 8390655 4194304 2G 8e Linux LVM
/dev/sdb3 8390656 14682111 6291456 3G 8e Linux LVM
##创建pv
[root@rocky-41 ~]$pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
[root@rocky-41 ~]$pvcreate /dev/sdb3
Physical volume "/dev/sdb3" successfully created.
[root@rocky-41 ~]$pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rl lvm2 a-- <19.00g 0
/dev/sdb2 lvm2 --- 2.00g 2.00g
/dev/sdb3 lvm2 --- 3.00g 3.00g
##创建vg
[root@rocky-41 ~]$vgcreate -s 16M vg0 /dev/sdb2
Volume group "vg0" successfully created
[root@rocky-41 ~]$vgs
VG #PV #LV #SN Attr VSize VFree
rl 1 2 0 wz--n- <19.00g 0
vg0 1 0 0 wz--n- 1.98g 1.98g
##创建lv
[root@rocky-41 ~]$lvcreate -L 1G -n lv1 vg0
Logical volume "lv1" created.
[root@rocky-41 ~]$lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rl -wi-ao---- <17.00g
swap rl -wi-a----- 2.00g
lv1 vg0 -wi-a----- 1.00g
##创建文件系统并临时挂载,查看容量
[root@rocky-41 ~]$mkfs.xfs /dev/vg0/lv1
[root@rocky-41 ~]$mount /dev/vg0/lv1 /data/lv_test/
[root@rocky-41 ~]$df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg0-lv1 1014M 40M 975M 4% /data/lv_test
##扩容,vg已无空间
[root@rocky-41 ~]$lvresize -r -l +100%FREE /dev/vg0/lv1
[root@rocky-41 ~]$df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg0-lv1 2.0G 47M 2.0G 3% /data/lv_test
[root@rocky-41 ~]$vgs
VG #PV #LV #SN Attr VSize VFree
rl 1 2 0 wz--n- <19.00g 0
vg0 1 1 0 wz--n- 1.98g 0
##创建新pv,加入到vg0
[root@rocky-41 ~]$pvcreate /dev/sdb3
Physical volume "/dev/sdb3" successfully created.
[root@rocky-41 ~]$vgextend vg0 /dev/sdb3
Volume group "vg0" successfully extended
[root@rocky-41 ~]$vgs
VG #PV #LV #SN Attr VSize VFree
rl 1 2 0 wz--n- <19.00g 0
vg0 2 1 0 wz--n- <4.97g 2.98g
##扩容,增加2G
[root@rocky-41 ~]$lvresize -r -L +2G /dev/vg0/lv1
[root@rocky-41 ~]$df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg0-lv1 4.0G 62M 4.0G 2% /data/lv_test
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!