
Linux文件系统超全详解设备识别、磁盘查看、挂载卸载、文件查找CentOS7实战前言做运维经常遇到磁盘 100% 爆满、U 盘挂载失败、umount 提示 busy。本文全部实操照着敲就能复现整理自己踩过的坑。一、Linux设备与文件系统基础1.1 块设备概念Linux中存储设备以块设备文件存在存放在/dev目录由系统自动生成。磁盘分区后必须格式化文件系统才能够挂载使用。1.2 常见块设备命名SATA/SAS/USB/SCSI/dev/sda、/dev/sdb分区/dev/sda1、/dev/sda2虚拟机virtio磁盘/dev/vda、/dev/vdb分区/dev/vda1NVMe SSD/dev/nvme0n1分区/dev/nvme0n1p1SD/MMC/eMMC/dev/mmcblk0一般不会把整块磁盘作为一个文件系统会划分多个分区不同分区存放不同数据某个分区占满不会影响其他分区。1.3 文件系统文件系统是磁盘上组织文件的数据结构。Linux采用树状层级目录结构。格式化后的磁盘需要挂载到空目录挂载点才可以访问里面的数据。二、磁盘设备与空间查看2.1 lsblk 查看块设备[rootserver~18:44:10]# 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可读写TYPEdisk磁盘 / part分区 / lvm逻辑卷MOUNTPOINT挂载点2.2 df 查看文件系统使用情况[rootserver~18:44:14]# df文件系统 1K-块 已用 可用 已用% 挂载点 devtmpfs1913548019135480% /dev tmpfs1930624019306240% /dev/shm tmpfs1930624436019262641% /run tmpfs1930624019306240% /sys/fs/cgroup /dev/mapper/centos-root5240320051148724728832810% / /dev/sda1103833619106084727619% /boot /dev/mapper/centos-home152092100640681520280321% /home tmpfs386128123861161% /run/user/42 tmpfs38612803861280% /run/user/1000常用参数-h友好单位显示1024进制-T显示文件系统类型-H1000进制[rootserver~18:44:24]# df -hT文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs1.9G01.9G0% /dev tmpfs tmpfs1.9G01.9G0% /dev/shm tmpfs tmpfs1.9G4.3M1.9G1% /run tmpfs tmpfs1.9G01.9G0% /sys/fs/cgroup /dev/mapper/centos-root xfs 50G4.9G 46G10% / /dev/sda1 xfs 1014M 187M 828M19% /boot /dev/mapper/centos-home xfs 146G 63M 145G1% /home tmpfs tmpfs 378M 12K 378M1% /run/user/42 tmpfs tmpfs 378M0378M0% /run/user/1000[rootserver~18:44:45]# df -H文件系统 容量 已用 可用 已用% 挂载点 devtmpfs2.0G02.0G0% /dev tmpfs2.0G02.0G0% /dev/shm tmpfs2.0G4.5M2.0G1% /run tmpfs2.0G02.0G0% /sys/fs/cgroup /dev/mapper/centos-root 54G5.3G 49G10% / /dev/sda11.1G 196M 868M19% /boot /dev/mapper/centos-home 156G 66M 156G1% /home tmpfs 396M 13k 396M1% /run/user/42 tmpfs 396M0396M0% /run/user/1000[rootserver~18:46:08]# df -hT /boot文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sda1 xfs 1014M 187M 828M19% /boot[rootserver~18:47:35]# df /tmp文件系统 1K-块 已用 可用 已用% 挂载点 /dev/mapper/centos-root5240320051127924729040810% /2.3 du 查看目录/文件磁盘占用[rootserver~18:47:49]# du /boot0/boot/efi/EFI/centos/fw6060/boot/efi/EFI/centos1928/boot/efi/EFI/BOOT7988/boot/efi/EFI7988/boot/efi2400/boot/grub2/i386-pc3176/boot/grub2/locale2504/boot/grub2/fonts8096/boot/grub24/boot/grub157844/boot[rootserver~18:47:56]# du -s /boot157844/boot[rootserver~18:48:24]# du -sh /boot155M /boot-s只显示总和不递归子目录-h人性化单位实战查找磁盘中占用空间大文件# 创建4G测试大文件[rootserver~18:51:31]# dd if/dev/zero of/usr/share/doc/dhclient-4.2.5/bigfile-4G bs1M count4096# du逐层定位[rootserver~18:53:41]# du -sk /* 2 /dev/null| sort -rn | head -58031636/usr1094532/var157844/boot43204/etc37248/root[rootserver~18:54:06]# du -sk /usr/* 2 /dev/null| sort -rn | head -55638052/usr/share1214028/usr/lib64877648/usr/lib147552/usr/bin73856/usr/libexec[rootserver~18:54:25]# du -sk /usr/share/* 2 /dev/null| sort -rn | head -54284696/usr/share/doc451260/usr/share/locale213252/usr/share/help122840/usr/share/fonts83908/usr/share/icons[rootserver~18:54:36]# du -sk /usr/share/doc/* 2 /dev/null| sort -rn | head -54194316/usr/share/doc/dhclient-4.2.54376/usr/share/doc/gcc-4.8.51216/usr/share/doc/postfix-2.10.11192/usr/share/doc/python-kitchen-1.1.11060/usr/share/doc/pam-1.1.8[rootserver~18:54:59]# du -sk /usr/share/doc/dhclient-4.2.5/* 2 /dev/null| sort -rn | head -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#发现不是目录说明这个就是占用大量内存的文件[rootserver~18:55:25]# du -sk /usr/share/doc/dhclient-4.2.5/bigfile-4G/*| sort -rn | head -5du: 无法访问/usr/share/doc/dhclient-4.2.5/bigfile-4G/*:不是目录#删除这个文件[rootserver~18:55:39]# rm -f /usr/share/doc/dhclient-4.2.5/bigfile-4G# find直接搜索大于100M文件[rootserver~18:56:36]# find / -size 100M 2/dev/nullLinux设计思想KISS每个工具只做一件事多个小工具组合完成复杂任务。三、挂载与卸载文件系统环境准备磁盘准备首先打开VMware虚拟机点击编辑虚拟机设置点击硬盘后点击添加按钮进入页面后选择下一步磁盘类型选择SCSI后点击下一步选择创建新的虚拟磁盘最大磁盘大小选择100GB方便区分选择将虚拟磁盘存储为单个文件磁盘文件存储为主可以选择虚拟机的地址方便删除的话可以选择桌面,建立新的磁盘就完成了查看新增磁盘# 新增磁盘/dev/sdb[rootserver~19:22:35]# lsblk /dev/sdbNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb8:160100G0disk# 格式化为xfs[rootserver~19:23:17]# mkfs.xfs /dev/sdbmeta-data/dev/sdbisize512agcount4,agsize6553600blkssectsz512attr2,projid32bit1crc1finobt0,sparse0databsize4096blocks26214400,imaxpct25sunit0swidth0blks namingversion2bsize4096ascii-ci0ftype1loginternal logbsize4096blocks12800,version2sectsz512sunit0blks, lazy-count1realtimenoneextsz4096blocks0,rtextents0bmount挂载语法mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint-t指定文件系统类型-o指定挂载选项device设备可以写设备名、UUID、LABELmountpoint挂载点空目录# 创建挂载点[rootserver~19:23:35]# mkdir /data# 查看设备UUID[rootserver~19:23:47]# blkid/dev/sda1:UUIDb329fc34-dc5e-420a-80c3-4ae179b65cf0TYPExfs/dev/sda2:UUIDD3KVOL-A8gw-xsWE-cqQh-K4NB-9Dq5-dYx8MrTYPELVM2_member/dev/sr0:UUID2022-07-26-15-09-17-00LABELCentOS 7 x86_64TYPEiso9660PTTYPEdos/dev/sdb:UUIDdbe25338-420a-4a72-8864-e974bd87a856TYPExfs/dev/mapper/centos-root:UUIDbbd448b7-f760-4089-acb8-500b36f50473TYPExfs/dev/mapper/centos-swap:UUID5a7021ae-0397-493f-a1bc-f8491ac87541TYPEswap/dev/mapper/centos-home:UUID9cdcd7d2-60ac-4e93-b76b-8da20b02cf6aTYPExfs[rootserver~19:23:54]# blkid /dev/sdb/dev/sdb:UUIDdbe25338-420a-4a72-8864-e974bd87a856TYPExfs# 两种挂载方式[rootserver~19:24:11]# mount /dev/sdb /data[rootserver~19:24:32]# mount UUIDdbe25338-420a-4a72-8864-e974bd87a856 /data# 验证[rootserver~19:24:43]# df -h /data文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb 100G 33M 100G1% /data# 测试写入文件[rootserver~19:24:52]# touch /data/file{1..9}[rootserver~19:25:09]# ls /datafile1 file2 file3 file4 file5 file6 file7 file8 file9# 查看系统全部挂载信息[rootserver~19:25:13]# mountsysfs on /systypesysfs(rw,nosuid,nodev,noexec,relatime,seclabel)proc on /proctypeproc(rw,nosuid,nodev,noexec,relatime)devtmpfs on /devtypedevtmpfs(rw,nosuid,seclabel,size1913548k,nr_inodes478387,mode755)securityfs on /sys/kernel/securitytypesecurityfs(rw,nosuid,nodev,noexec,relatime)tmpfs on /dev/shmtypetmpfs(rw,nosuid,nodev,seclabel)......[rootserver~19:26:05]# mount | grep ^/dev/dev/mapper/centos-root on /typexfs(rw,relatime,seclabel,attr2,inode64,noquota)/dev/sda1 on /boottypexfs(rw,relatime,seclabel,attr2,inode64,noquota)/dev/mapper/centos-home on /hometypexfs(rw,relatime,seclabel,attr2,inode64,noquota)/dev/sdb on /datatypexfs(rw,relatime,seclabel,attr2,inode64,noquota)umount卸载语法umount device | 挂载点[rootserver~19:29:14]# umount /data[rootserver~19:29:27]# df -h /data文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 50G4.9G 46G10% /卸载报错 target is busy 处理挂载点被进程占用无法卸载。#挂载点被进程占用无法卸载[rootserver~19:29:59]# umount /dev/sdbumount: /data目标忙。(有些情况下通过 lsof(8)或 fuser(1)可以 找到有关使用该设备的进程的有用信息)[rootserver~19:30:59]# lsof /dataCOMMAND PIDUSERFD TYPE DEVICE SIZE/OFF NODE NAMEbash2164root cwd DIR8,1612364/data# fuser查看访问文件系统进程[rootserver~19:31:12]# fuser -m /data/data: 2164c处理退出进入该目录的shell或者kill对应进程再执行umount。四、实战案例案例1挂载NTFS U盘#epel源安装ntfs-3g[rootcentos7 ~]# yum install -y ntfs-3g[rootcentos7 ~]# mount.ntfs /dev/sdb1 /mnt案例2挂载exfat U盘[rootcentos7 ~]# yum install -y gcc fuse-devel make pkg-config[rootcentos7 ~]# wget http://192.168.50.200/class/course-materials/softwares/stage01/fuse-exfat-1.2.0.tar.gz[rootcentos7 ~]# tar -xf fuse-exfat-1.2.0.tar.gz[rootcentos7 ~]# cd fuse-exfat-1.2.0[rootcentos7 ~]# ./configure[rootcentos7 ~]# make make install[rootcentos7 ~]# mount.exfat /dev/sdb1 /mnt案例3ISO光盘通过Nginx发布搭建本地YUM仓库server端操作#安装nginx[rootserver~19:32:26]# yum install -y nginx#修改配置开启目录浏览 autoindex on[rootserver~19:35:56]# vim /etc/nginx/nginx.conf......http{# 添加以下参数autoindex on;......#启动开机自启[rootserver~19:36:04]# systemctl enable nginx.service --now#修改默认首页[rootserver~19:36:23]# mv /usr/share/nginx/html/index.html{,.ori}[rootserver~19:36:51]# echo welcome to Nginx website. /usr/share/nginx/html/index.html#如果客户端访问测试失败去服务端关闭防火墙[rootclient~19:37:17]# curl http://servercurl:(7)Failed connect to server:80;没有到主机的路由[rootserver~19:37:07]# systemctl disable firewalld.service --nowRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.#客户端访问测试成功[rootclient~19:37:22]# curl http://serverwelcome to Nginx website.#创建目录挂载光盘[rootserver~19:37:53]# mkdir /usr/share/nginx/html/dvd[rootserver~19:38:41]# mount /dev/sr0 /usr/share/nginx/html/dvdmount: /dev/sr0 写保护将以只读方式挂载client端配置yum源#新建dvd.repo[rootclient~19:37:55]# vim /etc/yum.repos.d/dvd.reporepo内容[dvd] name dvd from local server baseurlhttp://10.1.8.10/dvd gpgcheck0#清理缓存[rootclient~19:39:58]# yum clean all已加载插件fastestmirror, langpacks 正在清理软件源 base dvd epel extras updates Cleaning up list of fastest mirrors[rootclient~19:40:34]# yum repolist dvd已加载插件fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.com 源标识 源名称 状态 dvd dvd from liuyifei server4,070repolist:4,070[rootclient~19:41:21]# yum list lrzsz --showduplicates已加载插件fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.com 已安装的软件包 lrzsz.x86_640.12.20-36.el7 anaconda 可安装的软件包 lrzsz.x86_640.12.20-36.el7 base lrzsz.x86_640.12.20-36.el7 dvd五、文件查找 locate find5.1 locatelocate读取mlocate数据库查找文件不会实时扫描磁盘新建文件需要执行updatedb更新数据库才能搜到。[rootserver~19:39:10]# yum install -y mlocate#安装后未跟新数据库所以检索不到更新后查找[rootserver~19:48:11]# updatedb[rootserver~19:48:21]# locate httpd.conf/etc/httpd/conf/httpd.conf /usr/lib/tmpfiles.d/httpd.conf# -b选项 查找[rootserver~19:50:15]# locate -b httpd/etc/httpd /etc/httpd/conf/httpd.conf /etc/logrotate.d/httpd# -i选项 忽略大小写[rootserver~19:51:48]# locate passwd[rootserver~19:51:48]# locate -i passwd/etc/PASSWD# -c选项 返回找到的数量[rootserver~19:52:02]# locate -i -c PASSWD# -r选项 正则表达式匹配查找[rootserver~19:52:15]# locate -r http.*conf#辅助命令 basename dirname[rootserver~19:52:30]# basename /usr/share/doc[rootserver~19:52:41]# dirname /usr/share/doc5.2 find实时遍历磁盘查找文件权限不足会报错。语法find [path] [expression] [action]根据文件名[rootserver~19:53:05]# find /etc/ -name passwd[rootserver~19:53:18]# find /etc/ -name *passwd*[rootserver~19:53:32]# find /etc/ -iname passwd根据文件类型-typeb 块设备、c字符设备、d目录、p管道、f普通文件、l软链接、s socket[rootserver~19:53:55]# find /etc/ -name passwd -type d根据属主属组-user -uid -group -gid -nouser -nogroup[rootserver~19:54:12]# find / -user laoma[rootserver~19:54:26]# find / -uid 1000[rootserver~19:54:40]# find / -group wheel[rootserver~19:54:53]# find / -gid 10[rootserver~19:55:08]# find / -nouser -o -nogroup根据权限-perm-perm mode严格等于该权限-perm -mode至少拥有对应权限-perm /modeugo任意一类满足即可[rootserver~19:55:30]# find -perm 764[rootserver~19:55:44]# find . -perm -764[rootserver~19:55:58]# find -name file-* -perm /764#查找suid文件[rootserver~19:56:15]# find / -perm -4000 2/dev/null#查找suidsgid[rootserver~19:56:32]# find / -perm -6000 2/dev/null#suid sgid sticky任意一个[rootserver~19:56:48]# find / -perm /7000根据大小-size单位 c字节、k、M、G大于-小于无符号等于[rootserver~19:57:05]# find -size 10M[rootserver~19:57:19]# find -size 10G[rootserver~19:57:33]# find -size -10k根据时间-amin -cmin -mmin单位分钟-atime -ctime -mtime单位天[rootserver~19:57:52]# find -amin 10[rootserver~19:58:04]# find -amin 10[rootserver~19:58:16]# find -amin -10根据硬链接数、inode[rootserver~19:58:35]# find -links 3[rootserver~19:58:47]# find -links 3[rootserver~19:58:59]# find -links -3[rootserver~19:59:14]# ls -i /etc/fstab[rootserver~19:59:28]# find / -inum 67160130多条件逻辑与expr1 expr2/-a或-o非![rootserver~19:59:48]# find . -name file-* -perm /764[rootserver~20:00:02]# find / -nouser -o -nogroup[rootserver~20:00:18]# find / ! -size -200M 2/dev/nullaction动作#删除匹配文件[rootserver~20:00:38]# find / -name PASSWD -delete#ls样式输出[rootserver~20:00:54]# find /etc/ -name passwd -ls#exec执行命令[rootserver~20:01:12]# find /etc/ -name passwd -exec echo haha \;[rootserver~20:01:30]# find / -inum 67160130 -exec cp -a {} ./findfiles \;可以直接复制整块粘贴到 Typora。小结lsblk看磁盘结构df看挂载空间du看文件占用磁盘爆满优先组合这三条命令排查。mount挂载、umount卸载遇到busy用lsof/fuser定位占用进程。locate依赖数据库适合快速检索find实时扫描磁盘支持丰富过滤条件。可以把ISO光盘挂载到web目录快速搭建局域网yum源。