Linux文件系统全网精讲:设备识别、挂载卸载、磁盘排查一站式实战
在Linux运维工作中,文件系统与磁盘管理是最基础、最高频的核心操作。磁盘爆满排查、U盘/光盘挂载、大文件定位、本地YUM仓库搭建,日常90%的存储类问题,都离不开文件系统基础能力。
本文从零梳理Linux文件系统完整知识体系,搭配真实可落地的实操命令、故障解决方案、经典运维案例,适合新手学习、老手复盘,可直接用于生产环境参考。
一、Linux存储核心:块设备与文件系统
1. 块设备基础认知
Linux所有存储设备(硬盘、U盘、光盘、虚拟机磁盘)均以块设备形式管理,所有设备文件统一存放于/dev目录,由系统自动创建生成。
核心使用规则:块设备必须先格式化(创建文件系统)、再挂载到系统目录,才能正常读写使用。
生产环境中几乎不会直接使用整块磁盘,通常会划分多个分区。不同分区可配置不同文件系统、独立存储数据,实现空间隔离,避免单个分区占满导致整个系统故障。
2. 主流块设备命名规范(必记)
Linux严格按照设备接口类型命名,熟记命名规则可快速区分设备类型,排查故障事半功倍:
| 设备接口类型 | 设备命名示例 | 适用场景 |
|---|---|---|
| SATA/SAS/USB/SCSI | /dev/sda、/dev/sdb | 物理机械硬盘、普通SSD、U盘 |
| virtio-blk | /dev/vda、/dev/vdb | KVM虚拟化虚拟机磁盘 |
| NVMe SSD | /dev/nvme0n1、nvme0n1p1 | 高速固态硬盘,p后缀代表分区 |
| SD/MMC/eMMC | /dev/mmcblk0、mmcblk1 | 内存卡、嵌入式设备存储 |
3. 分区命名规则
在磁盘设备名后追加数字,即为对应分区,规则统一:
普通磁盘:
/dev/sda1(第一块硬盘第一个分区)、/dev/vda2(虚拟机磁盘第二个分区)NVMe磁盘:
/dev/nvme0n1p1、/dev/nvme0n1p2
二、文件系统核心原理
文件系统是操作系统管理磁盘数据的规则与数据结构,决定文件的存储、读取、写入、权限管理方式。
Linux 所有文件遵循唯一树形层级结构,以根目录/为顶层起点。
关键特性:裸磁盘/分区无文件系统无法直接使用,必须挂载到空目录(挂载点),融入系统目录树后才可读写。
日常运维核心使用场景:
磁盘空间占用排查、爆满故障处理
超大文件定位、磁盘空间清理
外接设备(U盘/光盘)挂载适配
磁盘故障风险排查、数据分区管理
三、磁盘与文件系统查看核心命令
1. lsblk:树形查看整块设备架构
最常用的存储架构排查命令,可树形展示磁盘、分区、LVM逻辑卷的层级、大小、挂载状态,一目了然。
[root@server ~18:25:32]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda8:00200G0disk ├─sda18:101G0part /boot └─sda28:20199G0part ├─centos-root253:0050G0lvm / ├─centos-swap253:103.9G0lvm[SWAP]└─centos-home253:20145.1G0lvm /home sr011:014.4G0rom核心字段解析
NAME:块设备名称
MAJ:MIN:设备唯一主次编号,系统识别标识
RM:是否为可移动设备(1=是,0=否)
SIZE:设备总容量
RO:是否为只读设备(1=只读,0=可读写)
TYPE:设备类型(disk=整块磁盘、part=分区、lvm=逻辑卷、rom=光驱)
MOUNTPOINT:挂载路径,无内容代表未挂载
2. df:查看文件系统空间使用率
聚焦已挂载文件系统,统计总容量、已用、可用空间、占用百分比,适合排查磁盘爆满问题。
高频参数
df:默认1KB单位展示原始数据df -h:人性化单位(MB/GB),1024进制,可读性最强df -H:1000进制,适配厂商硬盘标称容量df -T:额外显示文件系统类型(xfs/ext4/iso9660)df -i:查看 inode 使用量(磁盘空间充足但无法新建文件优先排查 inode 满)
示例:单独查看boot分区状态df -hT /boot
[root@server ~18:39:16]# df -hT /boot文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sda1 xfs 1014M 174M 841M18% /boot3. du:精准统计文件/目录磁盘占用
df看整体,du看细节!专门统计单个文件、目录的真实磁盘占用,是清理大文件的核心命令。
高频参数
du:递归展示所有子目录占用明细du -s:只展示汇总总大小,屏蔽明细du -h:人性化单位展示du -sk 路径 | sort -rn:按容量从大到小排序,磁盘排查万能组合
4. 实战演练:逐层定位4G超大文件
模拟生产环境磁盘爆满场景,从根目录逐层排查,精准定位异常大文件。
步骤1:生成4G测试空文件
[root@server ~18:44:39]# dd if=/dev/zero of=/usr/share/doc/dhclient-4.2.5/bigfile-4G bs=1M count=4096记录了4096+0 的读入 记录了4096+0 的写出4294967296字节(4.3GB)已复制,12.0437 秒,357 MB/秒命令释义:从空设备/dev/zero读取空数据,每次写入1M,共4096次,生成真实占用4GB的测试文件。
步骤2:逐层目录排查大文件
# 查看根目录一级目录占用,反向排序,同时过滤错文件,只显示前5行[root@server ~18:51:33]# du -sk /* 2>/dev/null | sort -rn | head -n 5# 逐层深入定位[root@server ~18:52:24]# du -sk /usr/* 2>/dev/null | sort -rn | head -n 55622080/usr/share1213888/usr/lib64868848/usr/lib145644/usr/bin66684/usr/sbin[root@server ~18:52:52]# du -sk /usr/share/* 2>/dev/null | sort -rn | head -n 54280320/usr/share/doc442224/usr/share/locale213252/usr/share/help122840/usr/share/fonts83908/usr/share/icons[root@server ~18:53:22]# du -sk /usr/share/doc/* 2>/dev/null | sort -rn | head -n 54194316/usr/share/doc/dhclient-4.2.51216/usr/share/doc/postfix-2.10.11192/usr/share/doc/python-kitchen-1.1.11060/usr/share/doc/pam-1.1.8968/usr/share/doc/opus-1.0.2# 精准锁定目标文件[root@server ~18:53:48]# du -sk /usr/share/doc/dhclient-4.2.5/* 2>/dev/null | sort -rn | head -n 54194304/usr/share/doc/dhclient-4.2.5/bigfile-4G4/usr/share/doc/dhclient-4.2.5/README.dhclient.d4/usr/share/doc/dhclient-4.2.5/dhclient.conf.example4/usr/share/doc/dhclient-4.2.5/dhclient6.conf.example步骤3:快速检索大文件(高效方案)
[root@server ~18:57:48]# find / -size +1024M 2>/dev/null-r--------.1root root1407374862663687月3018:58 /proc/kcore -rw-r--r--.1root root42447715817月2210:46 /root/CentOS-7-x86_64-DVD-2207-02.iso -rw-r--r--.1root root42949672967月3018:45 /usr/share/doc/dhclient-4.2.5/bigfile-4G全局检索大于1024M的文件,过滤权限报错,快速定位异常文件。
四、文件系统挂载与卸载(生产必备)
1. 核心流程及用法
裸磁盘/分区格式化 → 挂载至空目录 → 正常读写使用 → 用完卸载,断开关联。
基础语法:
mount[-t 文件系统][-o 选项]设备源 挂载点-tvfstype,指明文件系统类型-ooptions,指明挂载选项- 设备源:/dev/sdb1、UUID、LABEL、NFS 地址
- 挂载点:必须是已存在空目录
- 卸载:umount 挂载点 / umount /dev/sdb1
2. 完整挂载实操(新增磁盘)
# 1. 查看新增磁盘[root@server ~19:07:12]# lsblk /dev/sdbNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb8:160100G0disk# 2. 格式化xfs文件系统(CentOS7+默认)[root@server ~19:07:23]# mkfs.xfs /dev/sdbmeta-data=/dev/sdbisize=512agcount=4,agsize=6553600blks=sectsz=512attr=2,projid32bit=1=crc=1finobt=0,sparse=0data=bsize=4096blocks=26214400,imaxpct=25=sunit=0swidth=0blks naming=version2bsize=4096ascii-ci=0ftype=1log=internal logbsize=4096blocks=12800,version=2=sectsz=512sunit=0blks, lazy-count=1realtime=noneextsz=4096blocks=0,rtextents=0# 3. 创建挂载点并挂载[root@server ~19:08:15]# mkdir /data# 设备名挂载[root@server ~19:09:28]# mount /dev/sdb /data/# UUID挂载(生产推荐,稳定性更高)# blkid可以查询uuid和文件系统[root@server ~19:09:43]# blkid /dev/sdb/dev/sdb:UUID="017832e7-eec3-4b14-b110-2d6cef44ebdf"TYPE="xfs"[root@server ~19:11:07]# mount UUID="017832e7-eec3-4b14-b110-2d6cef44ebdf" /data# 4. 验证挂载成功[root@server ~19:12:11]# df -h /dev/sdb文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb 100G 33M 100G1% /data# 括号中属性,是文件系统当前支持的功能。[root@server ~19:15:19]# mount | grep ^/dev/dev/mapper/centos-root on /typexfs(rw,relatime,seclabel,attr2,inode64,noquota)/dev/mapper/centos-home on /hometypexfs(rw,relatime,seclabel,attr2,inode64,noquota)/dev/sda1 on /boottypexfs(rw,relatime,seclabel,attr2,inode64,noquota)/dev/sdb on /datatypexfs(rw,relatime,seclabel,attr2,inode64,noquota)3. 卸载文件系统
# 两种卸载方式等效[root@server ~19:15:41]# umount /data # 或用 umount /dev/sdb[root@server ~19:16:12]# lsblk /dev/sdbNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb8:160100G0disk4. 故障解决:设备忙碌无法卸载
报错target is busy:当前终端或进程正在占用挂载目录。
# 创建卸载失败环境[root@server ~19:19:27]# mount /dev/sdb /data[root@server ~19:20:38]# cd /data/[root@server data19:20:51]#[root@server data19:20:51]# umount /dataumount: /data:目标忙。(有些情况下通过 lsof(8)或 fuser(1)可以 找到有关使用该设备的进程的有用信息)# 查看占用进程[root@server data19:21:25]# lsof /dataCOMMAND PIDUSERFD TYPE DEVICE SIZE/OFF NODE NAMEbash1904root cwd DIR8,16664/datalsof2636root cwd DIR8,16664/datalsof2637root cwd DIR8,16664/data[root@server data19:22:42]# fuser -m /data//data: 1904c# 退出目录后重新卸载root@server data19:28:55]# cd ~# 可以正常卸载[root@server ~19:29:42]# df -h /data/文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 50G 13G 38G26% /5. lsof和fuser命令常用选项
基础用法和区别
| 工具 | 全称 | 核心定位 | 安装说明 |
|---|---|---|---|
| lsof | list open files列出已打开的文件 | 全能工具:文件、目录、套接字、管道、端口都能查 | 最小化 CentOS/Debian 默认不带,yum install lsof/apt install lsof |
| fuser | file user查找使用某个文件 / 挂载点的进程 | 轻量化,专注反向查询:资源→进程 | 属于psmisc软件包,yum install psmisc |
llsof语法:
lsof[选项][目标]常用选项
| 选项 | 作用 | 示例 |
|---|---|---|
-i | 查询网络套接字(端口) | lsof -i |
-i :端口 | 查看占用指定端口的进程 | lsof -i :22 |
-i TCP/UDP:端口 | 指定协议端口 | lsof -i TCP:80 |
-p PID | 根据进程号,列出该进程打开所有文件 | lsof -p 1234 |
-u 用户名 | 查询某用户所有进程打开文件 | lsof -u nginx |
文件/目录 | 查询谁正在打开这个文件 | lsof /var/log/messages |
+D 目录 | 递归目录,查找目录下所有被打开文件 | lsof +D /mnt |
-d 描述符 | 按文件描述符筛选,如-d 22 | lsof -d deleted |
-d deleted | ⭐运维重点:查询已经 rm 删除,但句柄未释放的文件(磁盘空间不释放经典场景) | lsof -d deleted |
-n | 不解析主机名,加速查询 | lsof -ni :3306 |
-P | 端口不解析服务名,直接显示数字端口 | lsof -nPi |
fuser语法
fuser[选项]文件/挂载点/端口| 选项 | 功能 | 示例 |
|---|---|---|
-m | 挂载点模式(最常用)后跟挂载目录,查找占用该文件系统所有进程 | fuser -m /mnt |
-n tcp/udp 端口 | 查询占用端口进程 | fuser -n tcp 80 |
-v | verbose 详细输出进程、用户、命令 | fuser -vm / |
-k | 直接杀死占用资源的进程(慎用!高危) | fuser -k -m /mnt |
-i | 交互式杀死,需要确认,配合-k | fuser -ki -m /mnt |
-4 / -6 | 仅 ipv4 /ipv6 协议 | fuser -4 -n tcp 22 |
五、特殊设备挂载实战(U盘+本地YUM仓库)
1. NTFS格式U盘挂载
CentOS默认不兼容NTFS格式,需安装第三方驱动:
# 安装依赖包[root@server ~19:34:29]# yum install -y ntfs-3g# 指定使用 ntfs 内核驱动 进行挂载[root@server ~19:54:20]# mount.ntfs /dev/sdc1 /mnt# 查看是否挂载成功[root@server ~19:54:49]# ls -l /mnt总用量0drwxrwxrwx.1root root010月102025$RECYCLE.BIN drwxrwxrwx.1root root010月102025System Volume Information2. exFAT格式U盘挂载
系统无默认驱动,需编译安装依赖:
# 安装依赖包[root@server ~22:46:33]# yum install -y gcc fuse-devel make pkg-config# 下载源码包[root@server ~22:47:45]# wget https://www.laoma.cloud/class/course-materials/softwares/stage01/fuse-exfat-1.2.0.tar.gz# 解压软件包,并进入软件包目录[root@server ~22:49:01]# tar -xf fuse-exfat-1.2.0.tar.gz[root@server ~22:50:03]# cd fuse-exfat-1.2.0/# 配置文件,且编译安装[root@server fuse-exfat-1.2.022:51:00]# ./configure[root@server fuse-exfat-1.2.022:51:46]# make && make install# 挂载exFAT格式的U盘(假设U盘设备为/dev/sdc1)[root@server fuse-exfat-1.2.022:52:08]# mount.exfat /dev/sdc1 /mnt3. 光盘ISO搭建局域网本地YUM仓库
适用场景:服务器无外网、内网批量部署环境,提升安装速度。
服务端配置(发布仓库)
# 安装并配置nginx,开启目录浏览[root@server ~22:53:55]# yum install -y nginx[root@server ~22:56:01]# vim /etc/nginx/nginx.conf# 在http { 下面一行添加autoindex on;# 开机自启,同时启动程序[root@server ~22:58:20]# systemctl enable nginx --now# 挂载光盘至网站目录[root@server ~22:58:59]# mkdir /usr/share/nginx/html/dvd[root@server ~23:00:14]# mount /dev/sr0 /usr/share/nginx/html/dvd# 关闭防火墙[root@server ~23:00:40]# systemctl disable firewalld.service --now客户端配置(使用本地仓库)
# 迁移默认外网仓库[root@client ~22:46:38]# mkdir /etc/yum.repos.d/old[root@client ~23:01:26]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/old# 新建本地DVD仓库[root@client ~23:01:45]# vim /etc/yum.repos.d/dvd.repo[dvd]name=dvd fromlocalserverbaseurl=http://10.1.8.10/dvdgpgcheck=0# 清理缓存、测试安装[root@client ~23:02:27]# yum clean all && yum makecache# 查看仓库,同时测试安装软件[root@client ~23:03:33]# yum groupinstall[root@client ~23:05:31]# yum groupinstall -y 'Server with GUI'注意:该内网仓库链接需保证服务端10.1.8.10地址正常、Nginx服务开启,否则会出现解析失败。
六、文件查找两大神器:locate vs find
1. locate:数据库快速检索
基于系统预生成数据库查找,速度极快,需手动更新数据库同步新文件。
常用选项用法:
| 选项 | 全称 | 作用说明 |
|---|---|---|
-b | --basename | 仅匹配文件名(基名),忽略路径部分例:搜索test,只会匹配/data/test,不会匹配/data/test.txt之外路径包含 test 的目录 |
-i | --ignore-case | 忽略大小写匹配(大小写不敏感) |
-c | --count | 不输出文件路径,只输出匹配到的总数量 |
-r | --regexp | 使用正则表达式作为匹配条件(默认是通配符 glob 模式) |
# 新安装软件,必须同时更新文件数据库,不然新安装的软件文件无法搜索[root@server ~23:13:54]# locate hpped.conf# 搜索未找到数据[root@server ~23:14:25]# locate httpd.conf# 更新文件数据库[root@server ~23:14:38]# updatedb[root@server ~23:15:30]# locate httpd.conf/etc/httpd/conf/httpd.conf /usr/lib/tmpfiles.d/httpd.conf2. find:实时精准遍历查找(功能最全)
实时遍历磁盘,支持多条件组合匹配,是生产环境首选查找命令。
常用选项和用法:
| 选项 | 含义 | 示例 |
|---|---|---|
-name "字符串" | 按文件名匹配,区分大小写,支持通配符* ? | find /etc -name "*.conf" |
-iname "字符串" | 按文件名,忽略大小写 | find /tmp -iname "test*.log" |
-type | 指定文件类型f 普通文件;d 目录;l 软链接;b 块设备;c 字符设备;p 管道;s 套接字 | find / -type f |
-size | 按文件大小筛选单位:k (KB)、M (MB)、G (GB)+n大于 n;-n小于 n;直接 n = 等于 | find /data -size +100M |
-user 用户名 | 匹配文件属主 | find /home -user tom |
-group 组名 | 匹配文件所属组 | find /opt -group nginx |
-uid / -gid | 使用 UID/GID 数字匹配(适合用户已删除) | find /tmp -uid 1000 |
-perm | 按权限匹配 | find /usr/bin -perm 755 |
-mtime | 修改时间(文件内容变更),单位:天+77 天前;-77 天内 | find /var/log -mtime +30 |
-atime | 访问时间(读取文件) | find /tmp -atime -2 |
-ctime | 属性变更时间(权限、属主修改) | find /etc -ctime -1 |
-mmin | 修改时间,单位:分钟 | find /tmp -mmin -10 |
-amin / -cmin | 访问分钟、属性变更分钟 | 同上逻辑 |
-maxdepth N | 限制搜索层级,避免递归过深 | find /etc -maxdepth 1 -name "*.conf" |
-mindepth N | 从第 N 层目录开始搜索 | find /data -mindepth 2 -type f |
-not / ! | 取反条件(不匹配) | find /tmp -type f -not -name "*.txt" |
-o | 条件或;默认多个条件是与 | find /tmp -name "*.log" -o -name "*.txt" |
# 按文件名,加-i,忽略大小写find/etc/-namepasswdfind/etc-inamepasswd# 从根目录开始递归查找,所有大小大于100MB的文件(包含目录、普通文件等所有类型)find/-size+100M# 当前目录递归查找,只筛选【普通文件】,排除目录、链接、设备文件find.-typef# 全盘搜索,查找拥有SUID权限(4000)的文件find/-perm-4000# 全盘搜索,匹配【不小于200M】的文件;把错误信息(权限不足等)重定向到空设备屏蔽输出find/!-size-200M2>/dev/null# 全盘查找名称为PASSWD的文件,找到后直接删除(区分大小写!高危命令find/-namePASSWD-delete# 在/etc目录下查找文件名为passwd,找到后执行 ls -l 列出文件详情find/etc-namepasswd-execls-l{}\;七、核心知识点总结
Linux存储层级:物理磁盘 → 分区 → 文件系统 → 挂载点,LVM逻辑卷可实现灵活扩容。
df查整体使用率,du查具体文件占用,二者组合是磁盘运维核心手段。
所有外接设备必须格式化+挂载才可使用,卸载前需确保无进程占用。
Linux遵循KISS原则,单命令功能单一,多命令管道组合可完成复杂运维场景。
特殊格式U盘(NTFS/exFAT)需安装第三方驱动,系统原生支持xfs、ext4等文件系统。