Linux 文件系统超详细新手入门实操

识别文件系统和设备

Linux 中设备

在Linux中,对存储设备的访问由特殊类型文件-块设备(block)提供。挂载块设备前,必须先使用文件系统对其进行格式化。新手须知:磁盘、U盘、固态硬盘都属于块设备,必须格式化+挂载后才能读写使用。

块设备文件与其他的设备文件一起存储在/dev目录中。设备文件是由操作系统自动创建的,无需手动新建。

常见的不同类型接口块设备(新手熟记,日常实操高频):

  • 接口:SATA/SAS/USB/SCSI(物理机常用硬盘、U盘),名称:/dev/sda、/dev/sdb ...

  • 接口:virtio-blk(虚拟机虚拟磁盘),名称:/dev/vda、/dev/vdb ...

  • 接口:NVMe SSD(高速固态硬盘),名称:/dev/nvme0n1、/dev/nvme1n1...

  • 接口:SD/MMC/eMMC(内存卡、嵌入式存储),名称:/dev/mmcblk0,/dev/mmcblk1 ...

通常,不会将整个存储设备格式化为一个文件系统中,而是将硬盘驱动器划分为多个逻辑存储单元, 这些单元称为分区。各种分区使用不同的文件系统进行格式化或用于不同的用途。 例如,一个分区可以存放用户目录数据,另一个分区存放系统数据和日志,有效避免单一数据占满整个磁盘导致系统崩溃。

分区命名规则(Linux统一规范):

  • /dev/sda第一个分区为/dev/sda1,第二个分区为/dev/sda2,以此类推。

  • /dev/vda1,/dev/vda2(虚拟机磁盘分区)

  • /dev/xvda1,/dev/xvda2(云服务器磁盘分区)

  • /dev/nvme0n1p1,/dev/nvme0n1p2(NVMe固态硬盘分区,带p后缀)

Linux 文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,简单说:就是磁盘文件的「存储规则」,常见类型有xfs、ext4、ntfs、exfat等。

Linux服务器上的文件严格按照文件系统层次结构访问,所有文件都从根目录 / 开始延伸。

![image-20260730183512936](../AppData/Roaming/Typora/typora-user-images/image-20260730183512936.png)

日常管理文件系统核心需求:

  • 查看存储设备空间使用情况,定位爆满磁盘、目录

  • 磁盘故障时,快速确认受影响的文件系统与数据

要让格式化后的文件系统正常使用,必须将它挂载到一个空目录上,这个空目录被称为挂载点,未挂载的磁盘无法读写数据。

查看设备和文件系统

lsblk 命令(查看块设备信息)

核心作用:查看系统所有块设备(磁盘、分区、U盘),展示磁盘容量、挂载点、分区类型、是否可移动等全量信息,新手排查磁盘首选命令。

[root@centos7 ~]# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0    20G  0 disk 
sr0          11:0    1  13.2G  0 rom  
nvme0n1     259:0    0   200G  0 disk 
├─nvme0n1p1 259:1    0     1G  0 part /boot
└─nvme0n1p2 259:2    0   199G  0 part 
  ├─rl-root 253:0    0    70G  0 lvm  /
  ├─rl-swap 253:1    0   3.9G  0 lvm  [SWAP]
  └─rl-home 253:2    0 125.1G  0 lvm  /home

命令输出结果逐字段详解(新手必看):

  • NAME :块设备名称,系统识别的磁盘、分区唯一名称

  • MAJ:MIN :主次设备号,系统内核区分硬件设备的唯一标识,无需手动修改

  • RM :是否为可移动设备,1=可移动(U盘、光驱),0=固定硬盘

  • SIZE:设备总容量,自动适配GB/MB单位展示

  • RO :是否为只读设备,0=可读写,1=只读

  • TYPE :设备类型,disk=整块磁盘,part=分区,rom=光驱

  • MOUNTPOINT :设备挂载路径,为空代表未挂载,无法使用

df 命令(查看文件系统空间使用率)

核心作用:查看已挂载文件系统的空间使用情况,包含已用空间、可用空间、使用率、挂载路径,专门用于排查磁盘爆满问题。

[root@centos7 ~]# df
# 默认以1K块为单位展示空间使用(精准统计,可读性差)
文件系统                1K-块     已用      可用 已用% 挂载点
devtmpfs              1971384        0   1971384    0% /dev
tmpfs                 1991520        0   1991520    0% /dev/shm
tmpfs                 1991520    17380   1974140    1% /run
tmpfs                 1991520        0   1991520    0% /sys/fs/cgroup
/dev/mapper/rl-root  73364480  6713888  66650592   10% /
/dev/sr0             13880362 13880362         0  100% /dvd
/dev/nvme0n1p1        1038336   206096    832240   20% /boot
/dev/mapper/rl-home 131081692   946976 130134716    1% /home
tmpfs                  398304        0    398304    0% /run/user/0

# -h选项:人性化单位显示(KB/MB/GB),进制1024,新手最常用
# -T选项:额外显示文件系统类型(xfs/ext4等)
[root@centos7 ~]# df -hT
文件系统            类型      容量  已用  可用 已用% 挂载点
devtmpfs            devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs               tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs               tmpfs     1.9G   17M  1.9G    1% /run
tmpfs               tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/rl-root xfs        70G  6.5G   64G   10% /
/dev/sr0            iso9660    14G   14G     0  100% /dvd
/dev/nvme0n1p1      xfs      1014M  202M  813M   20% /boot
/dev/mapper/rl-home xfs       126G  925M  125G    1% /home
tmpfs               tmpfs     389M     0  389M    0% /run/user/0

# -H选项:厂商进制1000计算容量,用于对标硬件标称容量
[root@centos7 ~]# df -H
文件系统             容量  已用  可用 已用% 挂载点
devtmpfs             2.1G     0  2.1G    0% /dev
tmpfs                2.1G     0  2.1G    0% /dev/shm
tmpfs                2.1G   18M  2.1G    1% /run
tmpfs                2.1G     0  2.1G    0% /sys/fs/cgroup
/dev/mapper/rl-root   76G  6.9G   69G   10% /
/dev/sr0              15G   15G     0  100% /dvd
/dev/nvme0n1p1       1.1G  212M  853M   20% /boot
/dev/mapper/rl-home  135G  970M  134G    1% /home
tmpfs                408M     0  408M    0% /run/user/0

# 查看单个指定文件系统的空间信息,精准查询某分区
[root@centos7 ~]# df -hT /boot
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/nvme0n1p1 xfs  1014M  202M  813M   20% /boot

# 查看指定文件/目录所属的磁盘分区,快速定位文件存储位置
[root@centos7 ~]# df /tmp
文件系统               1K-块    已用     可用 已用% 挂载点
/dev/mapper/rl-root 73364480 6713888 66650592   10% /
du 命令(统计文件/目录占用空间)

核心作用:精准统计目录、文件实际占用的磁盘空间,和df互补(df看分区整体,du看具体文件占用),专门用于定位大文件、冗余文件。

# 查看/boot目录及其所有子目录的逐级空间占用详情
[root@centos7 ~]# du /boot
0	/boot/efi/EFI/rl/fw
6060	/boot/efi/EFI/rl
1928	/boot/efi/EFI/BOOT
7988	/boot/efi/EFI
7988	/boot/efi
2400	/boot/grub2/i386-pc
3176	/boot/grub2/locale
2504	/boot/grub2/fonts
8096	/boot/grub2
4	/boot/grub
142368	/boot

# -s 参数:仅显示目录总占用空间,不展示子目录详情(简洁查看)
[root@centos7 ~]# du -s /boot
142368	/boot

# -h 参数:人性化单位展示空间大小,新手首选组合参数 -sh
[root@centos7 ~]# du -sh /boot
140M	/boot
实操案例:排查根目录大文件,解决磁盘爆满

场景:服务器磁盘使用率过高,通过命令逐层排查,精准定位占用空间的大文件。

# 环境准备:dd命令创建4GB测试大文件,模拟磁盘爆满场景
# bs=1M 单次写入1M数据,count=4096 累计写入4096次,总大小4G
[root@centos7 ~]# dd if=/dev/zero of=/usr/share/doc/dhclient-4.2.5/bigfile-4G  bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 38.6659 s, 111 MB/s

# 方法一:du+sort 逐层排序排查大目录、大文件
# 排查根目录下所有目录空间占用,从小到大排序
[root@centos7 ~]# du -sk /* |sort -n
......
42988	/etc
142368	/boot
560424	/var
7917328	/usr

# 逐层深入,排查usr目录下大文件
[root@centos7 ~]# du -sk /usr/* |sort -n
......
866408	/usr/lib
1176764	/usr/lib64
5612684	/usr/share

# 排查share子目录空间占用
[root@centos7 ~]# du -sk /usr/share/* |sort -n
......
213252	/usr/share/help
442228	/usr/share/locale
4279532	/usr/share/doc

# 精准定位doc目录下的超大文件
[root@centos7 ~]# du -sk /usr/share/doc/* |sort -n
......
1192	/usr/share/doc/python-kitchen-1.1.1
1216	/usr/share/doc/postfix-2.10.1
4194316	/usr/share/doc/dhclient-4.2.5

# 最终定位4G超大文件
[root@centos7 ~]# du -sk /usr/share/doc/dhclient-4.2.5/* |sort -n
4	/usr/share/doc/dhclient-4.2.5/README.dhclient.d
4	/usr/share/doc/dhclient-4.2.5/dhclient.conf.example
4	/usr/share/doc/dhclient-4.2.5/dhclient6.conf.example
4194304	/usr/share/doc/dhclient-4.2.5/bigfile-4G

# 方法二:find命令直接筛选100M以上大文件,快速检索
# 2>/dev/null 屏蔽系统无效报错,只展示有效结果
[root@centos7 ~]# find / -size +100M 2>/dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/usr/share/doc/dhclient-4.2.5/bigfile-4G

Linux 核心思想(新手必记):遵循 KISS 原则(Keep It Simple, Stupid),用单个小工具完成单一功能,组合多个小工具实现复杂运维操作,简单高效、不易出错。

挂载和卸载文件系统(核心实操)

环境准备

提前为虚拟机添加一块20G硬盘 /dev/sdb,格式化xfs文件系统,作为后续挂载、卸载实操设备,全程无数据风险。

# 查看新增的磁盘设备/dev/sdb,确认系统已识别
[root@centos7 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk 

# 对整块/dev/sdb磁盘格式化xfs文件系统(CentOS7默认文件系统)
[root@centos7 ~]# mkfs.xfs /dev/sdb 
meta-data=/dev/sdb              isize=512    agcount=4, agsize=1310656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

挂载文件系统

核心逻辑:磁盘/分区格式化后,系统无法直接识别,必须通过mount命令挂载到空目录,才能正常读写文件。

mount 命令标准语法:

mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint

核心选项新手详解:

  • -t vfstype:手动指定文件系统类型(xfs/ext4/ntfs/exfat),多数场景系统可自动识别,无需手动填写

  • -o options:指定特殊挂载参数(只读、权限、同步写入等),进阶场景使用

  • device:待挂载设备,支持设备名、UUID、LABEL多种方式(UUID唯一,推荐生产环境使用)

  • mountpoint:挂载点,必须是空白目录,禁止挂载在有文件的目录上

# 1. 创建空目录/data,作为/dev/sdb的挂载点
[root@centos7 ~]# mkdir /data

# 2. blkid查看系统所有设备的UUID和文件系统类型
[root@centos7 ~]# blkid

# 3. 单独查看/dev/sdb设备的UUID、文件系统类型
[root@centos7 ~]# blkid /dev/sdb
/dev/sdb: UUID="f20547b2-df53-46e5-b526-a8744be26231" TYPE="xfs"

# 4. 两种常用挂载方式(效果一致,任选其一)
# 方式1:通过设备名挂载(新手实操首选,简单直观)
[root@centos7 ~]# mount /dev/sdb /data
# 方式2:通过UUID挂载(生产环境首选,避免设备名变动导致挂载失败)
[root@centos7 ~]# mount UUID="f20547b2-df53-46e5-b526-a8744be26231" /data

# 5. 验证挂载是否成功,查看/data空间信息
[root@centos7 ~]# df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        20G   33M   20G   1% /data

# 6. 测试挂载目录可正常创建文件,验证读写权限
[root@centos7 ~]# touch /data/file-{00..09}
[root@centos7 ~]# ls /data
file-00  file-02  file-04  file-06  file-08
file-01  file-03  file-05  file-07  file-09

查看系统所有挂载信息,可查看挂载权限、属性、挂载类型等详细参数。

[root@centos7 ~]# mount
......
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
......

# 过滤仅查看物理磁盘挂载信息,屏蔽虚拟文件系统
[root@centos7 ~]# mount |grep ^/dev
/dev/mapper/rl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

卸载文件系统

设备不再使用时,通过umount命令卸载,释放设备占用,避免数据异常、磁盘锁定。

umount命令标准语法:

umount device | dir

支持两种卸载方式:指定设备名 或 指定挂载点目录,两种方式效果完全一致。

卸载实操示例:

# 方式1:通过设备名卸载/dev/sdb
[root@centos7 ~]# umount /dev/sdb
# 方式2:通过挂载点目录卸载/data
[root@centos7 ~]# umount /data

# 验证卸载成功,/data目录回归根分区默认空间
[root@centos7 ~]# df -h /data
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/rl-root   50G  4.3G   46G   9% /

卸载失败处理(新手高频报错解决)

常见报错:target is busy(设备忙碌),原因是挂载点被进程占用(终端处于挂载目录、程序读写挂载文件),无法直接卸载。

# 重新挂载设备,模拟实操场景
[root@centos7 ~]# mount /dev/sdb /data
# 进入挂载目录,模拟目录被终端占用
[root@centos7 data]# cd /data
[root@centos7 data]# ls
file-00  file-02  file-04  file-06  file-08
file-01  file-03  file-05  file-07  file-09

# 执行卸载,触发设备忙碌报错
[root@centos7 data]# umount /dev/sdb
umount: /data: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
lsof 命令(查找占用挂载点的进程)

lsof(list open files):查看系统中正在占用文件、目录的进程,精准定位挂载点占用源,解决设备忙碌问题。

lsof 命令语法:

lsof [options] [names]

新手常用选项详解:

  • -i:查看网络进程占用,可指定IP、端口,如 -i @10.1.8.20:22-i :80

  • -p pid:根据进程PID,精准查询该进程打开的所有文件

  • -u uid:根据用户UID,查询该用户所有占用的文件/进程

  • names:指定查询的目录、文件、设备(核心用法)

# 精准查看占用/data挂载点的所有进程
[root@centos7 ~]# lsof /data
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1508 root  cwd    DIR   8,17      156   64 /data
fuser 命令(终止占用进程)

fuser:专门针对文件系统、挂载点的进程排查工具,可直接查看并终止占用进程,适配卸载报错场景。

fuser 命令语法:

fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...

新手常用选项详解:

  • -k:强制杀死占用文件/目录的进程,默认发送强制终止信号

  • -signal:自定义终止信号,替换默认的SIGKILL

  • -i:交互模式,手动确认是否杀死进程,防止误操作

  • -l:列出系统所有可用信号名称

  • -m:核心参数,专门查看占用文件系统/挂载点的所有进程

  • -n:指定查询空间(文件/网络),默认文件空间

  • -4/-6:仅查询IPv4/IPv6网络进程

  • -u:显示占用进程的所属用户名

# 查看占用/data文件系统的进程
[root@centos7 ~]# fuser -m /data
/data:                1508c

最终解决:终止进程,正常卸载

# 退出挂载目录,解除终端进程占用(最简单解决方式)
[root@centos7 data]# cd 
# 重新执行卸载,卸载成功
[root@centos7 ~]# umount /data

案例1:Linux 挂载 NTFS 格式U盘(WindowsU盘适配)

场景:CentOS默认不识别Windows NTFS格式U盘,插入后无法挂载,需安装第三方工具实现兼容。

实操思路:1、安装ntfs-3g兼容工具(依赖epel扩展源);2、使用专用命令挂载NTFS分区。

# 安装NTFS格式挂载依赖工具
[root@centos7 ~]# yum install -y ntfs-3g
# 挂载U盘NTFS分区到/mnt目录(/dev/sdb1为U盘分区,根据实际设备名修改)
[root@centos7 ~]# mount.ntfs /dev/sdb1 /mnt

案例2:Linux 挂载 exfat 格式U盘

场景:Linux默认不识别exfat格式U盘,需手动编译安装fuse-exfat依赖模块实现挂载。原下载链接存在URL报错,实操时替换有效源即可。

# 安装编译依赖环境(gcc编译器、fuse依赖、make工具、配置工具)
[root@centos7 ~]# yum install -y gcc fuse-devel make pkg-config 
# 原官方链接报错,替换为有效exfat源码包下载地址即可
[root@centos7 ~]# wget 有效exfat安装包地址
# 解压源码压缩包
[root@centos7 ~]# tar -xf fuse-exfat-1.2.0.tar.gz
# 进入源码编译目录
[root@centos7 ~]# cd fuse-exfat-1.2.0
# 执行编译配置,检测系统环境
[root@centos7 ~]# ./configure
# 编译并安装模块
[root@centos7 ~]# make && make install
# 挂载exFAT格式U盘(/dev/sdb1为U盘分区)
[root@centos7 ~]# mount.exfat /dev/sdb1 /mnt

案例3:搭建本地ISO YUM仓库(内网高速安装软件)

业务场景:默认外网YUM仓库下载速度慢、易超时,通过服务端Nginx发布本地ISO光盘仓库,实现内网高速安装软件、图形化桌面。

完整实操思路:

  1. 服务端部署Nginx服务,开启目录浏览功能

  2. 服务端挂载系统ISO光盘到Nginx网站目录,作为仓库源

  3. 客户端新建本地repo仓库文件,指向服务端内网地址

  4. 清理YUM缓存,测试仓库可用性,安装图形化环境

第一步:服务端部署Nginx Web服务

# 服务端安装Nginx服务
[root@server ~ 11:22:04]# yum install -y nginx

# 修改Nginx配置,开启目录自动索引,允许访问仓库文件列表
[root@server ~ 11:40:38]# vim /etc/nginx/nginx.conf
......
http {
    # 添加该参数,开启目录浏览功能
    autoindex on;
......

# 设置Nginx开机自启并立即启动服务
[root@server ~ 11:42:06]# systemctl enable nginx.service --now

# 备份默认首页,自定义测试页面
[root@server ~ 11:43:26]# mv /usr/share/nginx/html/index.html{,.ori}
[root@server ~ 11:43:36]# echo welcome to Nginx website. > /usr/share/nginx/html/index.html

# 客户端测试Nginx服务是否正常访问
[root@client ~ 11:44:18]# curl http://server
welcome to Nginx website.

第二步:挂载ISO光盘到Nginx发布目录

前置要求:虚拟机已加载系统ISO镜像,默认光盘设备为/dev/sr0,网页地址解析异常不影响本地实操。

# 在Nginx网站根目录创建dvd挂载目录,用于存放光盘文件
[root@server ~ 11:44:47]# mkdir /usr/share/nginx/html/dvd
# 挂载只读光盘设备到web发布目录,实现网页访问仓库资源
[root@server ~ 11:45:49]# mount /dev/sr0 /usr/share/nginx/html/dvd
mount: /dev/sr0 is write-protected, mounting read-only

第三步:客户端配置本地YUM仓库并测试

# 客户端备份原有外网YUM仓库文件,避免冲突
[root@client ~ 11:44:23]# mkdir /etc/yum.repos.d/old
[root@client ~ 11:46:19]# mv /etc/yum.repos.d/*repo /etc/yum.repos.d/old

# 新建本地dvd仓库配置文件,指向服务端Nginx仓库地址
[root@client ~ 11:46:28]# vim /etc/yum.repos.d/dvd.repo
[dvd]
name= dvd from local server
baseurl=http://10.1.8.10/dvd
gpgcheck=0

# 清理YUM旧缓存,加载新仓库配置
[root@client ~ 11:47:09]# yum clean all
# 查看仓库可用软件组,验证仓库配置生效
[root@client ~ 11:47:51]# yum grouplist
Loaded plugins: fastestmirror
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
Available Environment Groups:
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
......

# 通过本地仓库安装图形化桌面环境
[root@client ~ 11:48:08]# yum groupinstall -y 'Server with GUI'

# 切换图形化界面
[root@client ~ 11:49:08]# init 5
# 切换回字符命令行界面
[root@client ~ 11:50:08]# init 3

查找系统中文件(两大核心命令)

locate 命令(快速检索,基于数据库)

核心特点:基于mlocate 数据库检索文件,检索速度极快,适合全局模糊查找文件。

新手重点:数据库不会自动更新,新建、新增的文件无法被检索,必须手动执行updatedb更新数据库。

权限说明:普通用户仅能检索自身有权限访问的文件,root用户可检索系统所有文件。

# 安装locate文件检索工具(最小化系统默认未安装)
[root@centos7 ~]# yum install -y mlocate
# 手动更新文件数据库,同步系统全量文件信息
[root@centos7 ~]# updatedb

locate命令标准语法:

locate [OPTION]... [PATTERN]...

新手常用选项:

  • -b, --basename:仅匹配文件名,忽略文件路径,精准过滤文件

  • -i, --ignore-case:忽略大小写匹配,新手高频使用

  • -c, --count:仅输出匹配到的文件总数量,不展示具体路径

  • -r, --regexp:支持正则表达式匹配,实现复杂检索

实操示例:

# 安装httpd服务,生成新配置文件
[root@centos7 ~]# yum install -y httpd

# 未更新数据库,无法检索到新安装的配置文件
[root@centos7 ~]# locate httpd.conf

# 更新数据库后,正常检索文件完整路径
[root@centos7 ~]# updatedb
[root@centos7 ~]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf

# -b 仅匹配文件名,过滤路径匹配结果
[root@centos7 ~]# locate -b httpd

# 扩展工具:basename获取纯文件名、dirname获取文件所在路径
[root@centos7 ~]# basename /usr/share/doc
doc
[root@centos7 ~]# dirname /usr/share/doc
/usr/share

# 大小写敏感检索(默认模式)
[root@centos7 ~]# locate PASSWD
/etc/PASSWD
# -i 忽略大小写检索,匹配所有大小写组合文件
[root@centos7 ~]# locate -i PASSWD

# -c 统计匹配文件总数
[root@centos7 ~]# locate -i -c PASSWD
34

# -r 正则匹配检索含http和conf的配置文件
[root@centos7 ~]# locate -r 'http.*conf'

find 命令(精准实时查找,无缓存)

核心特点:实时遍历磁盘文件系统查找,无数据库缓存,精准度100%,支持多条件复杂筛选,适合精准排查、批量处理文件。

使用前提:执行命令的用户,必须对检索目录拥有读、执行权限,否则检索失效。

标准语法:

find [path] [expression] [action]
  • path:检索路径,默认当前目录及所有子目录

  • expression:筛选条件(名称、大小、权限、时间、归属等)

  • action:匹配文件后执行的操作(删除、查看、执行命令)

1、根据文件名查找

-name 大小写敏感匹配;-iname 忽略大小写匹配,支持通配符 * 模糊匹配

# 精准匹配/etc目录下passwd文件(大小写敏感)
[root@centos7 ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd

# 通配符匹配所有含passwd字符的文件
[root@centos7 ~]# find /etc/ -name '*passwd*'
/etc/security/opasswd
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-

# 创建大写测试文件,测试大小写匹配差异
[root@centos7 ~]# touch /etc/PASSWD
# 忽略大小写匹配所有passwd相关文件
[root@centos7 ~]# find /etc/ -iname passwd
/etc/pam.d/passwd
/etc/passwd
/etc/PASSWD
2、根据文件类型查找

-type 参数精准筛选不同类型文件,新手熟记核心类型:

  • b:块设备文件

  • c:字符设备文件

  • d:目录文件(高频使用)

  • p:管道文件

  • f:普通文件(文本、压缩包、程序,高频使用)

  • l:软链接文件

  • s:套接字文件

# 创建测试目录,用于实操演示
[root@centos7 ~]# mkdir /etc/yum.repos.d/passwd
# 查找/etc下名为passwd的目录文件
[root@centos7 ~]# find /etc/ -name 'passwd' -type d
/etc/yum.repos.d/passwd

# 删除测试目录,避免残留冗余文件
[root@centos7 ~]# rmdir /etc/yum.repos.d/passwd
3、根据文件归属(用户/用户组)查找

用于排查文件权限、清理冗余文件,可根据用户名、用户ID、用户组精准筛选。

  • -user/-uid:匹配指定用户/用户ID拥有的文件
# 查看普通用户HYC的UID、GID、所属用户组
[root@centos7 ~]# id HYC
uid=1000(HYC) gid=1000(HYC) groups=1000(HYC)

# 查找系统中所有属于HYC用户的文件
[root@centos7 ~]# find / -user HYC
# 通过UID精准查找(规避用户名修改导致的检索失效)
[root@centos7 ~]# find / -uid 1000
  • -group/-gid:匹配指定用户组/组ID拥有的文件
# 查看wheel管理员组信息
[root@centos7 ~]# grep wheel /etc/group
wheel:x:10:

# 查找系统中所有wheel管理员组拥有的文件
[root@centos7 ~]# find / -group wheel
[root@centos7 ~]# find / -gid 10
  • -nouser/-nogroup:查找无归属用户、无归属组的残留垃圾文件
# 全盘排查系统残留的无归属冗余文件
[root@centos7 ~]# find / -nouser -o -nogroup
4、根据文件权限查找

支持三种权限匹配模式,精准筛选特定权限文件,常用于排查高危权限文件。

# 新建测试目录与空白文件,用于权限实操
[root@centos7 ~]# mkdir lab;cd lab
[root@centos7 lab]# touch file-{1..3}
[root@centos7 lab]# ls -l file*
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-1
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-2
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-3
  • -perm mode:精准匹配完全一致的权限
# 修改file-1权限为764
[root@centos7 lab]# chmod 764 file-1
# 精准查找权限恰好为764的文件
[root@centos7 lab]# find -perm 764 | xargs ls -l
-rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-1
  • -perm -mode:最小权限匹配,所有者、组、其他用户权限均≥指定权限
# 修改测试文件权限,模拟不同权限场景
[root@centos7 lab]# chmod 777 file-1
[root@centos7 lab]# chmod 764 file-2
[root@centos7 lab]# chmod 760 file-3

# 匹配所有权限≥764的文件
[root@centos7 lab]# find . -perm -764 | xargs ls -l
-rwxrwxrwx. 1 root root 0 Dec 24 20:28 ./file-1
-rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-2

# 查找系统中所有带SUID特殊权限的高危文件
[root@centos7 lab]# find / -perm -4000

# 查找同时带SUID、SGID双重特殊权限的文件
[root@centos7 lab]# find / -perm -6000 2>/dev/null |xargs ls -l
-rwsr-sr-x. 1 abrt abrt 15344 Oct  2  2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
  • -perm /mode:任意权限匹配,三类用户任意一项满足即可
# 重置测试文件权限
[root@centos7 lab]# chmod a=- file-1
[root@centos7 lab]# chmod uo=-,g=rwx file-2
[root@centos7 lab]# chmod ug=-,o=r file-3

# 匹配任意一项满足764权限的文件
[root@centos7 lab]# find -name 'file-*' -perm /764| xargs ls -l
----rwx---. 1 root root 0 Dec 24 20:28 ./file-2
-------r--. 1 root root 0 Dec 24 20:28 ./file-3

# 查找
根据文件 size 查找

单位 c(字节)、k(KiB)、M(MiB)、G(GiB)

# 大小等于10M
[root@centos7 ~]# find -size 10M

# 大小大于10G
[root@centos7 ~]# find -size +10G

# 大小小于10k
[root@centos7 ~]# find -size -10k

# 大小等于1M
[root@centos7 ~]# find -size 1M
# 注意:size会取整为1个单位,所以find -size 1M结果包含小于1M的文件。
# 可以使用1024k取代1M
[root@centos7 ~]# find -size 1024k
根据文件 time 查找
  • -amin, -cmin, -mmin 单位1分钟。
  • -atime, -ctime, -mtime 单位24小时。
  • -newer file,比file新的文件。
# 10分钟前(正好10分钟)
[root@centos7 ~]# find -amin 10

# 10分钟以前(大于10分钟)
[root@centos7 ~]# find -amin +10

# 10分钟以内(小于10分钟)
[root@centos7 ~]# find -amin -10
根据文件硬链接数和 inum 查找
# 硬链接数等于、大于、小于3的文件
[root@centos7 ~]# find -links 3
[root@centos7 ~]# find -links +3
[root@centos7 ~]# find -links -3

# inode为67160130的文件
[root@centos7 ~]# ls -i /etc/fstab
67160130 /etc/fstab
[root@centos7 ~]# find / -inum 67160130| xargs ls -i
67160130 /etc/fstab
多条件表达式
  • 逻辑与expr1 -a expr2 或者 expr1 expr2
[root@centos7 lab]# find . -name 'file-*' -perm /764
  • 逻辑或:expr1 -o expr2
# 查找系统中不属于任何用户或者不属于任何组的文件
[root@centos7 ~]# find / -nouser -o -nogroup

# 例如
[root@centos7 ~]# find / -perm /7000
# 等效与
[root@centos7 ~]# find / -perm -4000 -o -perm -2000 -o -perm -1000
  • 逻辑非:! expr
[root@centos7 ~]# find / ! -size -200M 2>/dev/null
/proc/kcore
/proc/59432/task/59432/fd/5
/proc/59432/task/59432/fdinfo/5
/proc/59432/fd/6
/proc/59432/fdinfo/6
[root@centos7 ~]# ls -lh /proc/kcore
-r--------. 1 root root 128T Dec 24 22:00 /proc/kcore
action
  • -delete,查出找到的文件。
[root@centos7 ~]# find / -name PASSWD
/etc/PASSWD

[root@centos7 ~]# find / -name PASSWD -delete
[root@centos7 ~]# find / -name PASSWD
  • -ls,相当于 ls -dils 查看找到的文件。
[root@centos7 ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd

[root@centos7 ~]# find /etc/ -name passwd -ls
67584593    4 -rw-r--r--   1 root     root          188 Apr  1  2020 /etc/pam.d/passwd
69030856    4 -rw-r--r--   1 root     root         2315 Dec 24 19:59 /etc/passwd
  • -exec command ;,找到文件后,执行相应的command。
[root@centos7 ~]# find /etc/ -name passwd -exec echo haha \;
haha
haha
  • -exec command {} ;,找到文件后,可以在命令中对文件操作。
[root@centos7 ~]# find / -inum 67160130
/etc/fstab
# 将inode为67160130的所有文件复制到当前目录
[root@centos7 ~]# mkdir findfiles
[root@centos7 ~]# find / -inum 67160130 -exec cp -a {} ./findfiles \;
[root@centos7 ~]# ls findfiles/fstab
fstab

Linux 硬盘分区管理

硬盘为什么要分区?

  • 将操作系统文件与用户文件分隔开,避免应用数据太多撑满操作系统盘。
  • 限制应用或用户的可用空间。
  • 如果一个分区出现逻辑损坏,仅损坏该分区数据而不影响硬盘上其他分区。
  • 用于创建交换分区。
  • 限制磁盘空间使用,以提高诊断工具和备份镜像的性能。
  • 便于定制文件系统,例如有的文件系统存放大量小文件,有的文件系统存放大量大文件。

MBR 分区方案

自 1982年以来,主启动记录(MBR-Master Boot Record)分区方案指定了在运行 BIOS 固件 的系统上如何对磁盘进行分区:

在这里插入图片描述

  • 该方案支持最多4个主分区。
  • 在 Linux系统上,管理员可以使用扩展分区和逻辑分区来创建最多 15个分区

逻辑分区是可以格式化(format),扩展分区是不可以格式化。

  • MBR 记录用4个字节(1byte=8bit)存储分区的总扇区数,最大能表示2的32次方的扇区个数,按每扇区512字节计算,每个分区最大不能超过 2 TiB

类比为:笔记本只有4个usb接口,如果不够用,则将第四个usb接口外接扩展坞,由扩展坞提供多个usb接口。

通常,我们将磁盘第一个扇区称为主引导扇区,位于硬盘的柱面0、磁头0、扇区1的位置,这一扇区包含MBR引导代码,承担系统启动职能。它不属于磁盘上任何分区,因而分区空间内的格式化命令不能清除主引导记录的任何信息。

主引导扇区由三个部分组成:
在这里插入图片描述

  • 引导程序(占446个字节),硬盘启动时将系统控制权转给分区表中的某个操作系统。
  • 磁盘分区表项(DPT,Disk Partition Table),由四个分区表项构成(每个16个字节)。
  • 结束标志(占2个字节),其值为AA55(十六进制)。

fdisk 工具

fdisk 工具可用于管理采用 MBR 分区方案的磁盘,用户可以根据实际情况进行划分分区。

fdisk 命令语法

[root@centos7 ~]# fdisk -h
Usage:
 fdisk [options] <disk>    change partition table
 fdisk [options] -l <disk> list partition table(s)
 fdisk -s <partition>      give partition size(s) in blocks

Options:
 -b <size>             sector size (512, 1024, 2048 or 4096)
 -c[=<mode>]           compatible mode: 'dos' or 'nondos' (default)
 -h                    print this help text
 -u[=<unit>]           display units: 'cylinders' or 'sectors' (default)
 -v                    print program version
 -C <number>           specify the number of cylinders
 -H <number>           specify the number of heads
 -S <number>           specify the number of sectors per track

除了使用-l选项查看分区表,其他选项暂时都不用。

查看分区

fdisk工具大部分操作通过交互式完成,出了查看分区表。

DOS disklabel 指的硬盘管理方式是MBR。

我们使用上一章准备的一块硬盘/dev/sdb。

# 方法1:
[root@centos7 ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x78ceaffe

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   83  Linux

# 方法2:
[root@centos7 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 输入m,查看帮助信息
Command (m for help): `m`
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

# 输入p,打印分区表
Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x78ceaffe

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   83  Linux

# 输入q,退出管理
Command (m for help): q

创建分区

# 输入n,创建一个新分区
Command (m for help): `n`

# 选择分区类型
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
# 直接回车,选择默认分区类型:primary
Select (default p): `回车`
Using default response p

# 直接回车,分区号,使用默认值1
Partition number (1-4, default 1): 

# 直接回车,设置分区起始位置为:默认值2048扇区,也就是1M位置。
First sector (2048-41943039, default 2048): 
Using default value 2048

# 设置分区结束位置,输入+2G,也就是起始位置之后2
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x78ceaffe

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux

# 输入w,保存更改并退出
# 输入q,不保存更改并退出
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# 再次验证分区表变化
[root@centos7 ~]# lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  20G  0 disk 
`-sdb1   8:17   0   2G  0 part

注意:如果此时分区表未生成,执行以下命令,通知kernel重新生成分区表。有时候重启系统才会生成最新分区表。

[root@centos7 ~]# partprobe

删除分区

[root@centos7 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 输入p,打印分区表
Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x78ceaffe

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   83  Linux

# 输入d,删除分区,因为只有1个分区,所以自动删除了第一个分区
Command (m for help): `d`
Selected partition 1
Partition 1 is deleted

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x78ceaffe

   Device Boot      Start         End      Blocks   Id  System

如果硬盘空间比较大,需要的文件系统数量超过4个,那么就需要借助扩展分区创建逻辑分区了。

如下示例,创建第4个分区的时候,类型选择扩展分区;创建第5个分区的时候,类型选择逻辑分区。

[root@centos7 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 再次创建一个容量为3G的分区
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 
Using default response p
Partition number (2-4, default 2): 
First sector (4196352-41943039, default 4196352): 
Using default value 4196352
Last sector, +sectors or +size{K,M,G} (4196352-41943039, default 41943039): +3G
Partition 2 of type Linux and of size 3 GiB is set

# 再次创建一个容量为4G的分区
Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): 
Using default response p
Partition number (3,4, default 3): 
First sector (10487808-41943039, default 10487808): 
Using default value 10487808
Last sector, +sectors or +size{K,M,G} (10487808-41943039, default 41943039): +4G
Partition 3 of type Linux and of size 4 GiB is set

# 创建第4个分区的时候,选择扩展分区,并且使用剩余所有容量
Command (m for help): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): 
Using default response e
Selected partition 4
First sector (18876416-41943039, default 18876416): 
Using default value 18876416
Last sector, +sectors or +size{K,M,G} (18876416-41943039, default 41943039): 
Using default value 41943039
Partition 4 of type Extended and of size 11 GiB is set

# 创建第5个分区:在扩展分区中,创建逻辑分区,分配5G容量
Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (18878464-41943039, default 18878464): 
Using default value 18878464
Last sector, +sectors or +size{K,M,G} (18878464-41943039, default 41943039): +5G
Partition 5 of type Linux and of size 5 GiB is set

Command (m for help): p         

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x78ceaffe

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352    10487807     3145728   83  Linux
/dev/sdb3        10487808    18876415     4194304   83  Linux
/dev/sdb4        18876416    41943039    11533312    5  Extended
/dev/sdb5        18878464    29364223     5242880   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# 查看分区表
[root@centos7 ~]# lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  20G  0 disk 
|-sdb1   8:17   0   2G  0 part 
|-sdb2   8:18   0   3G  0 part 
|-sdb3   8:19   0   4G  0 part 
|-sdb4   8:20   0   1K  0 part 
|-sdb5   8:21   0   5G  0 part 

创建分区演示完成,只保留1个分区,多余的删除。

[root@centos7 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d
Partition number (1-5, default 5): 
Partition 5 is deleted

Command (m for help): d
Partition number (1-4, default 4): 
Partition 4 is deleted

Command (m for help): d
Partition number (1-3, default 3): 
Partition 3 is deleted

Command (m for help): d
Partition number (1,2, default 2): 
Partition 2 is deleted

Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐