欢迎光临
我们一直在努力

Linux 文件系统与磁盘分区完整管理实战指南

引言

Linux 存储是服务器运维的核心基础,从识别块设备、查看磁盘占用,到磁盘分区、格式化、永久挂载,再到文件检索、外置存储兼容、本地 YUM 仓库落地,日常磁盘故障、磁盘满、挂载失效、分区扩容等问题都离不开这套底层操作。本文完整梳理块设备识别、文件系统查看命令、挂载卸载排错、MBR 分区实操、locate/find 文件检索全流程,附带大量可直接复制的生产案例,从零掌握 Linux 磁盘与文件系统全套管理技能

Linux 文件系统基本管理

识别文件系统和设备

Linux 中设备

在Linux中,对存储设备的访问由特殊类型文件-块设备(block)提供。挂载块设备前,必须先使用文件系统对其进行格式化。

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

常见的不同类型接口块设备:

  • 接口:SATA/SAS/USB/SCSI,名称:/dev/sda、/dev/sdb …
  • 接口:virtio-blk,虚拟机磁盘,名称:/dev/vda、/dev/vdb …
  • 接口:NVMe SSD,名称:/dev/nvme0n1、/dev/nvme1n1…
  • 接口:SD/MMC/eMMC,名称:/dev/mmcblk0,/dev/mmcblk1 …

通常,不会将整个存储设备格式化为一个文件系统中,而是将硬盘驱动器划分为多个逻辑存储单元, 这些单元称为分区。各种分区使用不同的文件系统进行格式化或用于不同的用途。 例如,一个分区可以包含用户目录,而另一个分区可以包含系统数据和日志。 如果用户用数据填充主目录分区,则系统分区可能仍然有可用空间。

  • /dev/sda第一个分区为/dev/sda1,第二个分区为/dev/sda2,以此类推。
  • /dev/vda1,/dev/vda2
  • /dev/xvda1,/dev/xvda2
  • /dev/nvme0n1p1,/dev/nvme0n1p2

Linux 文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。

Linux服务器上的文件是按文件系统层次结构访问的。

在这里插入图片描述

管理文件系统需要:

  • 确定存储设备的空间使用情况以及文件系统层次结构中受影响的目录。
  • 存储设备发生故障,而您需要知道哪些文件系统存在风险。

要让文件系统的内容在文件系统层次结构中可用,必须将它挂载到一个空目录上,该目录被称为挂载点。

查看设备和文件系统

lsblk 命令

查看块设备使用情况。

[root@server ~ 17:23:20]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 45.1G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 4.4G 0 rom /usr/share/nginx/html/dvd

结果说明:

  • NAME :块设备名。
  • MAJ:MIN :主要(MAJ)和次要(MIN)设备号。
  • RM :指明设备是否是可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
  • SIZE :本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
  • RO :该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
  • TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
  • MOUNTPOINT :本栏指出设备挂载的挂载点。
df 命令

查看文件系统使用情况。

[root@server ~ 17:25:15]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 1995980 0 1995980 0% /dev
tmpfs 2013056 0 2013056 0% /dev/shm
tmpfs 2013056 12620 2000436 1% /run
tmpfs 2013056 0 2013056 0% /sys/fs/cgroup
/dev/mapper/centos-root 52403200 6016920 46386280 12% /
/dev/sda1 1038336 177436 860900 18% /boot
/dev/mapper/centos-home 47285700 39480 47246220 1% /home
tmpfs 402612 12 402600 1% /run/user/42
tmpfs 402612 0 402612 0% /run/user/1000
/dev/sr0 4635056 4635056 0 100% /usr/share/nginx/html/dvd

# -h选项,友好显示单位,单位进制是1024。
# -T选项,显示文件系统类型。
[root@server ~ 17:25:32]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 13M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 50G 5.8G 45G 12% /
/dev/sda1 xfs 1014M 174M 841M 18% /boot
/dev/mapper/centos-home xfs 46G 39M 46G 1% /home
tmpfs tmpfs 394M 12K 394M 1% /run/user/42
tmpfs tmpfs 394M 0 394M 0% /run/user/1000
/dev/sr0 iso9660 4.5G 4.5G 0 100% /usr/share/nginx/html/dvd

# -H选项,单位进制是1000。
[root@server ~ 17:25:54]# df -H
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 2.1G 0 2.1G 0% /dev
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 2.1G 13M 2.1G 1% /run
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
/dev/mapper/centos-root 54G 6.2G 48G 12% /
/dev/sda1 1.1G 182M 882M 18% /boot
/dev/mapper/centos-home 49G 41M 49G 1% /home
tmpfs 413M 13k 413M 1% /run/user/42
tmpfs 413M 0 413M 0% /run/user/1000
/dev/sr0 4.8G 4.8G 0 100% /usr/share/nginx/html/dvd

# 查看单个文件系统
[root@server ~ 17:26:24]# df -hT /boot
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda1 xfs 1014M 174M 841M 18% /boot

# 查看文件或目录存储在哪个设备
[root@server ~ 17:26:56]# df /tmp
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 52403200 6016864 46386336 12% /

du 命令

查看目录和文件占用磁盘空间大小。

# 查看/boot目录及其子目录占用空间
[root@server ~ 17:27:05]# du /boot
0/boot/efi/EFI/centos/fw
6060/boot/efi/EFI/centos
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
144220/boot

# 只查看/boot目录占用空间
[root@server ~ 17:27:37]# du -s /boot
144220/boot

# -h 选项human方式显示size
[root@server ~ 17:27:46]# du -sh /boot
141M/boot

案例

查找根文件系统中哪个文件占用了大量空间。

# 环境准备,创建一个大小为4GB的文件:使用 0 填充该文件
[root@server ~ 10:43:37]# dd if=/dev/zero of=/usr/share/doc/dhclient-4.2.5/bigfile-4G bs=1M count=4096
记录了4096+0 的读入
记录了4096+0 的写出
4294967296字节(4.3 GB)已复制,16.8175 秒,255 MB/秒

# 查看过程如下:
[root@server ~ 19:12:48]# du -sk /* |sort -n
... ...
6392/home
12604/run
43220/etc
144220/boot
221696/root
1875124/var
3776944/usr

[root@server ~ 19:13:08]# du -sk /usr/* |sort -n
... ...
4696/usr/include
45512/usr/libexec
66944/usr/sbin
145280/usr/bin
868840/usr/lib
1217548/usr/lib64
1428116/usr/share

[root@server ~ 19:13:51]# du -sk /usr/share/* |sort -n
......
213252 /usr/share/help
442228 /usr/share/locale
4279532 /usr/share/doc

[root@server ~ 19:14:30]# 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

[root@server ~ 19:15:39]# du -sk /usr/share/doc/dhclient-4.2.5/* |sort -n
4/usr/share/doc/dhclient-4.2.5/dhclient6.conf.example
4/usr/share/doc/dhclient-4.2.5/dhclient.conf.example
4/usr/share/doc/dhclient-4.2.5/README.dhclient.d

# 方法二:
[root@server ~ 19:16:36]# find / -size +100M 2>/dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/root/CentOS-7-x86_64-DVD-2207-02.iso
/var/cache/yum/x86_64/7/updates/gen/primary_db.sqlite
/var/cache/yum/x86_64/7/updates/gen/filelists_db.sqlite
/var/cache/yum/x86_64/7/updates/packages/firefox-115.12.0-1.el7.centos.x86_64.rpm
/var/spool/abrt/ccpp-2026-07-14-13:36:16-2123/coredump
/usr/lib/locale/locale-archive
/usr/lib64/firefox/libxul.so

Linux 思想:尽可能使用各种小工具完成一个复杂任务。每个小工具专注于特定的功能,KISS 原则(Keep It Simple, Stupid)。

挂载和卸载文件系统

环境准备

# 虚拟机添加一块硬盘/dev/sdb
[root@server ~ 19:17:26]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk

# 格式化文件系统
[root@server ~ 19:20:30]# 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,指明文件系统类型。
  • -o options,指明挂载选项。
  • device,指明要挂载的具有文件系统的设备,可以通过UUID=\\、\\、LABEL=\\、PARTLABEL=\\、PARTUUID=\\等方式指明。例如,/dev/sdb,UUID=“f20547b2-df53-46e5-b526-a8744be26231” 。
  • mountpoint,指明挂载点位置。

# 创建挂载点
[root@server ~ 19:20:45]# mkdir /data

# 显示系统中所有文件系统
[root@server ~ 19:21:48]# blkid

# 显示系统中特定文件系统
[root@server ~ 19:23:04]# blkid /dev/sdb
/dev/sdb: UUID="f20547b2-df53-46e5-b526-a8744be26231" TYPE="xfs"

# 挂载设备并验证
[root@server ~ 19:24:08]# mount /dev/sdb /data
# 或者
[root@server ~ 19:24:32]# mount UUID="f20547b2-df53-46e5-b526-a8744be26231" /data

# 验证
[root@server ~ 19:24:32]# df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sdb 20G 33M 20G 1% /data

# 创建文件测试
[root@server ~ 19:30:39]# touch /data/file-{00..09}
[root@server ~ 19:30:53]# ls /data
file-00 file-02 file-04 file-06 file-08
file-01 file-03 file-05 file-07 file-09

查看系统当前所有挂载,可以看到挂载的详细信息。

[root@server ~ 19:30:58]# 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@server ~ 19:31:18]# mount |grep ^/dev
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

卸载文件系统

当文件系统不使用的时候,通过 umount 命令卸载。

umount命令语法:

umount device | dir

可以通过指定设备或者挂载点,卸载文件系统。

示例:

[root@server ~ 19:31:41]# umount /dev/sdb
# 或者
[root@server ~ 19:32:40]# umount /data
[root@server ~ 19:33:03]# df -h /data
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 5.8G 45G 12% /

卸载失败处理

[root@server ~ 19:33:11]# mount /dev/sdb /data
[root@server ~ 19:33:44]# cd /data
[root@server data 19:33:49]# ls
file-00 file-02 file-04 file-06 file-08
file-01 file-03 file-05 file-07 file-09

# 提示挂载点正在忙碌
[root@server data 19:33:52]# 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,查看打开的 Internet 文件。例如 -i @10.1.8.20:22、-i :80
  • -p pid,根据进程PID查找特定进程打开的文件。
  • -u uid,根据用户 uid查找特定用户打开的文件。
  • names,是文件或者文件系统设备。

# 新开窗口查看哪个进程在使用挂载点
[root@server data 19:35:54]# lsof /data
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2613 root cwd DIR 253,0 156 100666471 /data

fuser 命令

fuser,用于识别进程打开的文件。

fuser 命令语法:

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

常用选项:

  • -k,杀死这些正在访问这些文件的进程。除非使用-signal修改信号,否则将发送SIGKILL信号。
  • -signal,指定发送的信号(signal 使用特定信号替换),缺省信号SIGKILL。
  • -i,交互模式杀死进程。
  • -l,列出所有已知的信号名称。
  • -m,列出文件系统被哪些程序使用。
  • -n,空间,选择不同的名字空间,可是file,udp,tcp。默认是file,也就是文件。
  • -4,仅查询IPV4套接字
  • -6,仅查询IPV6套接字。
  • -u,指定用户名。

# 新开窗口查看哪个进程在使用挂载点
[root@server data 19:36:11]# fuser -m /data
/data: 1508c

终止进程,再次卸载

# 返回家目录,再次卸载
[root@server data 19:36:48]# cd
[root@server ~ 19:37:00]# umount /data

案例1:Linux 挂载 NTFS 格式U盘

思路:默认情况下 Linux不识别NTFS格式文件系统,需要安装相应的模块进行识别。

  • 安装 ntfs-3g (该软件包由epel仓库提供)
  • 挂载
  • yum install -y ntfs-3g
    mount.ntfs /dev/sdb1 /mnt

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

    思路:默认情况下 Linux 不识别 exfat 格式文件系统,需要安装相应的模块进行识别。

    [root@server ~ 19:37:31]# yum install -y ntfs-3g

    wget https://github.com/relan/exfat/releases/download/v1.2.0/fuse-exfat-1.2.0.tar.gz
    tar -xf fuse-exfat-1.2.0.tar.gz
    cd fuse-exfat-1.2.0

    ./configure
    make && make install

    # 挂载exFAT格式的U盘(假设U盘设备为/dev/sdb1)
    mount.exfat /dev/sdb1 /mnt

    案例3:构建基于 ISO 文件的 yum 仓库

    client 想安装图形化,但仓库来源于Internet,希望使用本地仓库以提高速度。

    现要求在server服务器上部署nginx服务发布dvd光盘中的仓库。

    操作思路:

  • server上部署并配置nginx服务
  • server上挂载 ISO 文件到nginx服务网站目录
  • client创建指向server上web站点仓库
  • 测试
  • 部署web服务器

    # 安装软件
    [root@server ~ 11:22:04]# yum install -y nginx

    # 设置允许查看目录中清单
    [root@server ~ 11:40:38]# vim /etc/nginx/nginx.conf
    ......
    http {
    # 添加以下参数
    autoindex on;
    ......
    [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
    [root@server ~ 14:40:10]# systemctl stop firewalld.service

    # 客户端测试
    [root@client ~ 11:44:18]# curl http://server
    welcome to Nginx website.

    挂载光盘到web服务器发布目录

    确保光盘关联正确的iso并连接到虚拟机

    [root@server ~ 11:44:47]# mkdir /usr/share/nginx/html/dvd
    [root@server ~ 11:45:49]# mount /dev/sr0 /usr/share/nginx/html/dvd
    mount: /dev/sr0 is write-protected, mounting read-only

    客户端测试

    [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
    [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

    [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 ~ 14:51:18]# yum repolist dvd
    已加载插件:fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
    源标识 源名称 状态
    dvd dvd from local server 4,070
    repolist: 4,070
    [root@client ~ 14:51:27]# yum list lrzsz –showduplicates
    已加载插件:fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
    已安装的软件包
    lrzsz.x86_64 0.12.20-36.el7 @anaconda
    可安装的软件包
    lrzsz.x86_64 0.12.20-36.el7 dvd

    # 启动图形化
    [root@client ~ 11:49:08]# init 5

    # 切换到字符
    [root@client ~ 11:50:08]# init 3

    课后练习

    查找系统中文件

    locate

    locate 命令根据文件名及其路径,在 mlocate 数据库中查找文件,并返回结果。数据库中存放文件和文件路径信息。

    常规用户查找时,返回的结果仅包含用户有读取权限的目录树中匹配项。

    查找文件前,需要root用户手动执行updatedb命令更新mlocate数据库。

    [root@server ~ 19:38:15]# yum install -y mlocate
    [root@server ~ 19:39:02]# updatedb

    locate命令语法:

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

    常用选项:

    • -b, –basename
    • -i, –ignore-case
    • -c, –count
    • -r, –regexp

    示例:

    [root@server ~ 19:39:11]# yum install -y httpd
    # 安装后,未跟新数据库,所以检索不到
    [root@server ~ 19:39:33]# locate httpd.conf

    # 更新后查找
    [root@server ~ 19:39:50]# updatedb
    [root@server ~ 19:40:21]# locate httpd.conf
    /etc/httpd/conf/httpd.conf
    /usr/lib/tmpfiles.d/httpd.conf

    # -b选项 查找
    [root@server ~ 19:40:35]# locate -b httpd

    # 扩展
    [root@server ~ 19:40:52]# basename /usr/share/doc
    doc
    [root@server ~ 19:41:30]# dirname /usr/share/doc
    /usr/share

    # -i选项 忽略大小写
    [root@server ~ 19:41:43]# locate PASSWD
    /etc/PASSWD
    [root@server ~ 19:41:59]# locate -i PASSWD

    # -c选项 返回找到的数量
    [root@server ~ 19:42:14]# locate -b -c PASSWD
    34

    # -r选项 正则表达式匹配查找
    [root@server ~ 19:42:53]# locate -r 'http.*conf'

    find

    find 命令在本地文件系统中执行实时查找文件。使用find命令的用户对文件夹必须有读取和执行权限。

    语法:

    find [path] [expression] [action]

    • path,是查询路径,如果没有指定文件夹,将会查找当前目录及子目录。
    • expression,是查询条件表达式。
    • action,是找到文件后采取的动作。
    根据文件 name 查找

    [root@server ~ 19:43:08]# touch /etc/PASSWD

    [root@server ~ 19:43:41]# find /etc/ -name passwd
    /etc/pam.d/passwd
    /etc/passwd

    [root@server ~ 19:43:57]# find /etc/ -name '*passwd*'
    /etc/pam.d/passwd
    /etc/passwd
    /etc/security/opasswd
    /etc/passwd-

    [root@server ~ 19:44:27]# find /etc/ -iname passwd
    /etc/pam.d/passwd
    /etc/passwd
    /etc/PASSWD

    根据文件 type 查找

    -type 根据文件类型查找,支持文件类型:

    • b,block (buffered) special。
    • c,character (unbuffered) special。
    • d,directory。
    • p,named pipe (FIFO)。
    • f,regular file。
    • l,symbolic link。
    • s,socket。

    [root@server ~ 19:44:51]# mkdir /etc/yum.repos.d/passwd
    [root@server ~ 19:45:14]# find /etc/ -name 'passwd' -type d
    /etc/yum.repos.d/passwd
    [root@server ~ 19:45:32]# rmdir /etc/yum.repos.d/passwd

    根据文件 owner 查找
    • -user、-uid,属于特定用户。

    [root@server ~ 19:46:38]# id yy
    uid=1000(yy) gid=1000(yy) 组=1000(yy)
    [root@server ~ 19:46:43]# find / -user yy
    [root@server ~ 19:47:08]# find / -uid 1000

    • -group、-gid,属于特定组

    [root@server ~ 19:47:58]# grep wheel /etc/group wheel:x:10:
    [root@server ~ 19:48:43]# find / -group wheel
    [root@server ~ 19:49:01]# find / -gid 10

    • -nouser,不属于任何用户;-nogroup,不属于任何组

    # 查找系统中不属于任何用户或者不属于任何组的文件
    [root@server ~ 19:49:12]# find / -nouser -o -nogroup

    根据文件 perm 查找

    # 准备文件
    [root@server ~ 19:50:10]# mkdir lab;cd lab
    [root@server lab 19:50:20]# touch file-{1..3}
    [root@server lab 19:50:39]# ls -l file*
    -rw-r–r–. 1 root root 0 730 19:50 file-1
    -rw-r–r–. 1 root root 0 730 19:50 file-2
    -rw-r–r–. 1 root root 0 730 19:50 file-3

    • -perm mode,查找文件权限为mode的文件。

    [root@server lab 19:50:44]# chmod 764 file-1

    # 查找文件权限为764的文件
    [root@server lab 19:51:03]# find -perm 764 | xargs ls -l
    -rwxrw-r–. 1 root root 0 730 19:50 ./file-1

    • -perm -mode,例如:mode为764,则ugo必须同时满足的最小权限:user至少为7、group至少为6、other为4。

    [root@server lab 19:51:25]# chmod 777 file-1
    [root@server lab 19:51:47]# chmod 764 file-2
    [root@server lab 19:51:58]# chmod 760 file-3
    [root@server lab 19:52:07]# find . -perm -764 | xargs ls -l
    -rwxrwxrwx. 1 root root 0 730 19:50 ./file-1
    -rwxrw-r–. 1 root root 0 730 19:50 ./file-2

    # 0作为通配符,表示不匹配对应权限位。
    # 查找系统中具有suid权限的文件
    [root@server lab 19:52:29]# find / -perm -4000

    # 查找系统中同时具有特殊权限的文件:suid和sgid
    [root@server lab 19:52:48]# find / -perm -6000 2>/dev/null | xargs ls -l
    -rwsr-sr-x. 1 abrt abrt 15344 102 2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

    • -perm /mode,例如mode为764,则ugo只要有一个满足即可:user至少为7、group至少为6、other至少为4。

    [root@server lab 19:53:30]# chmod a=- file-1
    [root@server lab 19:54:11]# chmod uo=-,g=rwx file-2
    [root@server lab 19:54:31]# chmod ug=-,o=r file-3

    [root@server lab 19:54:46]# find -name 'file-*' -perm /764| xargs ls -l
    —-rwx—. 1 root root 0 730 19:50 ./file-2
    ——-r–. 1 root root 0 730 19:50 ./file-3

    # 查找系统中具有特殊权限的文件:suid、sgid、sticky
    [root@server lab 19:55:17]# find / -perm /7000

    # 查找系统中具有特殊权限的文件:suid或者sgid
    [root@server lab 19:55:53]# find / -perm /6000

    • -readable -writable -executable,文件具有可读、可写、可执行。
    根据文件 size 查找

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

    # 大小等于10M
    [root@server lab 19:56:12]# find -size 10M

    # 大小大于10G
    [root@server lab 19:56:38]# find -size +10G

    # 大小小于10k
    [root@server lab 19:56:59]# find -size -10k

    # 大小等于1M
    [root@server lab 19:57:06]# find -size 1M
    # 注意:size会取整为1个单位,所以find -size 1M结果包含小于1M的文件。
    # 可以使用1024k取代1M
    [root@server ~ 19:58:34]# find -size 1024k

    根据文件 time 查找
    • -amin, -cmin, -mmin 单位1分钟。
    • -atime, -ctime, -mtime 单位24小时。
    • -newer file,比file新的文件。

    # 10分钟前(正好10分钟)
    [root@server ~ 19:58:37]# find -amin 10

    # 10分钟以前(大于10分钟)
    [root@server ~ 19:59:00]# find -amin +10

    # 10分钟以内(小于10分钟)
    [root@server ~ 19:59:09]# find -amin -10

    根据文件硬链接数和 inum 查找

    # 硬链接数等于、大于、小于3的文件
    [root@server ~ 20:00:39]# find -links 3
    [root@server ~ 20:01:11]# find -links +3
    [root@server ~ 20:01:28]# find -links -3

    # inode为67160130的文件
    [root@server ~ 19:59:40]# ls -i /etc/fstab
    67160130 /etc/fstab
    [root@server ~ 20:00:01]# find / -inum 67160130| xargs ls -i
    67160130 /etc/fstab

    多条件表达式
    • 逻辑与: expr1 -a expr2 或者 expr1 expr2

    [root@server ~ 20:01:47]# find . -name 'file-*' -perm /764

    • 逻辑或:expr1 -o expr2

    # 查找系统中不属于任何用户或者不属于任何组的文件
    [root@server ~ 20:02:26]# find / -nouser -o -nogroup

    # 例如
    [root@server ~ 20:02:48]# find / -perm /7000
    # 等效与
    [root@server ~ 20:02:58]# find / -perm -4000 -o -perm -2000 -o -perm -1000

    • 逻辑非:! expr

    [root@server ~ 20:03:18]# find / ! -size -200M 2>/dev/null
    /proc/kcore
    /proc/7147/task/7147/fd/5
    /proc/7147/task/7147/fdinfo/5
    /proc/7147/fd/6
    /proc/7147/fdinfo/6
    /root/CentOS-7-x86_64-DVD-2207-02.iso
    /var/spool/abrt/ccpp-2026-07-14-13:36:16-2123/coredump
    [root@server ~ 20:03:40]# ls -lh /proc/kcore
    -r——–. 1 root root 128T 730 20:03 /proc/kcore

    action
    • -delete,查出找到的文件。

    [root@server ~ 20:03:59]# find / -name PASSWD
    /etc/PASSWD

    [root@server ~ 20:04:22]# find / -name PASSWD -delete
    [root@server ~ 20:04:36]# find / -name PASSWD

    • -ls,相当于 ls -dils 查看找到的文件。

    [root@server ~ 20:04:49]# find /etc/ -name passwd
    /etc/pam.d/passwd
    /etc/passwd

    [root@server ~ 20:05:10]# find /etc/ -name passwd -ls
    101514988 4 -rw-r–r– 1 root root 188 41 2020 /etc/pam.d/passwd
    68084795 4 -rw-r–r– 1 root root 2368 730 14:37 /etc/passwd

    • -exec command ;,找到文件后,执行相应的command。

    [root@server ~ 20:05:35]# find /etc/ -name passwd -exec echo haha \\;
    haha
    haha

    • -exec command {} ;,找到文件后,可以在命令中对文件操作。

    [root@server ~ 20:05:52]# find / -inum 67160130
    /etc/fstab
    # 将inode为67160130的所有文件复制到当前目录
    [root@server ~ 20:06:05]# mkdir findfiles
    [root@server ~ 20:06:11]# find / -inum 67160130 -exec cp -a {} ./findfiles \\;
    [root@server ~ 20:06:16]# ls findfiles/fstab
    findfiles/fstab

    Linux 硬盘分区管理

    硬盘为什么要分区?

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

    MBR 分区方案

    自 1982年以来,主启动记录(MBR)分区方案指定了在运行 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@server ~ 17:04:20]# fdisk -h
    用法:
    fdisk [选项] <磁盘> 更改分区表
    fdisk [选项] -l <磁盘> 列出分区表
    fdisk -s <分区> 给出分区大小(块数)

    选项:
    -b <大小> 扇区大小(512、1024、2048或4096)
    -c[=<模式>] 兼容模式:“dos”或“nondos”(默认)
    -h 打印此帮助文本
    -u[=<单位>] 显示单位:“cylinders”(柱面)或“sectors”(扇区,默认)
    -v 打印程序版本
    -C <数字> 指定柱面数
    -H <数字> 指定磁头数
    -S <数字> 指定每个磁道的扇区数

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

    查看分区

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

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

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

    # 方法1:
    [root@server ~ 17:04:39]# fdisk -l /dev/sdb

    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0xedc62b10

    设备 Boot Start End Blocks Id System

    # 方法2:
    [root@server ~ 17:05:38]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)

    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。

    # 输入m,查看帮助信息
    命令(输入 m 获取帮助):m
    命令操作
    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,打印分区表
    命令(输入 m 获取帮助):p

    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0xedc62b10

    设备 Boot Start End Blocks Id System

    # 输入q,退出管理
    命令(输入 m 获取帮助):q

    创建分区

    # 输入n,创建一个新分区
    命令(输入 m 获取帮助):n

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

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

    # 直接回车,设置分区起始位置为:默认值2048扇区,也就是1M位置。
    起始 扇区 (2048-209715199,默认为 2048)`回车`
    将使用默认值 2048

    # 设置分区结束位置,输入+20G,也就是起始位置之后20
    Last 扇区, +扇区 or +size{K,M,G} (2048-209715199,默认为 209715199):+20G
    分区 1 已设置为 Linux 类型,大小设为 20 GiB

    命令(输入 m 获取帮助):p

    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0xedc62b10

    设备 Boot Start End Blocks Id System
    /dev/sdb1 2048 41945087 20971520 83 Linux

    # 输入w,保存更改并退出
    # 输入q,不保存更改并退出
    命令(输入 m 获取帮助):w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    正在同步磁盘。

    # 再次验证分区表变化
    [root@server ~ 17:09:19]# lsblk /dev/sdb
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sdb 8:16 0 100G 0 disk
    └─sdb1 8:17 0 20G 0 part

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

    [root@server ~ 17:11:30]# partprobe

    删除分区

    [root@server ~ 17:12:25]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)

    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。

    # 输入p,打印分区表
    命令(输入 m 获取帮助):p

    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0xedc62b10

    设备 Boot Start End Blocks Id System
    /dev/sdb1 2048 41945087 20971520 83 Linux

    # 输入d,删除分区,因为只有1个分区,所以自动删除了第一个分区
    命令(输入 m 获取帮助):d
    已选择分区 1
    分区 1 已删除

    命令(输入 m 获取帮助):p

    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0xedc62b10

    设备 Boot Start End Blocks Id System

    # 输入w,保存更改

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

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

    [root@server ~ 17:14:15]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)

    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。

    # 再次创建一个容量为3G的分区
    命令(输入 m 获取帮助):n
    Partition type:
    p primary (1 primary, 0 extended, 3 free)
    e extended
    Select (default p):
    Using default response p
    分区号 (2-4,默认 2)
    起始 扇区 (41945088-209715199,默认为 41945088)
    将使用默认值 41945088
    Last 扇区, +扇区 or +size{K,M,G} (41945088-209715199,默认为 209715199):+3G
    分区 2 已设置为 Linux 类型,大小设为 3 GiB

    # 再次创建一个容量为4G的分区
    命令(输入 m 获取帮助):n
    Partition type:
    p primary (2 primary, 0 extended, 2 free)
    e extended
    Select (default p):
    Using default response p
    分区号 (3,4,默认 3)
    起始 扇区 (48236544-209715199,默认为 48236544)
    将使用默认值 48236544
    Last 扇区, +扇区 or +size{K,M,G} (48236544-209715199,默认为 209715199):+4G
    分区 3 已设置为 Linux 类型,大小设为 4 GiB

    # 创建第4个分区的时候,选择扩展分区,并且使用剩余所有容量
    命令(输入 m 获取帮助):n
    Partition type:
    p primary (3 primary, 0 extended, 1 free)
    e extended
    Select (default e):
    Using default response e
    已选择分区 4
    起始 扇区 (56625152-209715199,默认为 56625152)
    将使用默认值 56625152
    Last 扇区, +扇区 or +size{K,M,G} (56625152-209715199,默认为 209715199)
    将使用默认值 209715199
    分区 4 已设置为 Extended 类型,大小设为 73 GiB

    # 创建第5个分区:在扩展分区中,创建逻辑分区,分配5G容量
    命令(输入 m 获取帮助):n
    All primary partitions are in use
    添加逻辑分区 5
    起始 扇区 (56627200-209715199,默认为 56627200)
    将使用默认值 56627200
    Last 扇区, +扇区 or +size{K,M,G} (56627200-209715199,默认为 209715199):+5G
    分区 5 已设置为 Linux 类型,大小设为 5 GiB

    命令(输入 m 获取帮助):p

    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0xedc62b10

    设备 Boot Start End Blocks Id System
    /dev/sdb1 2048 41945087 20971520 83 Linux
    /dev/sdb2 41945088 48236543 3145728 83 Linux
    /dev/sdb3 48236544 56625151 4194304 83 Linux
    /dev/sdb4 56625152 209715199 76545024 5 Extended
    /dev/sdb5 56627200 67112959 5242880 83 Linux

    命令(输入 m 获取帮助):w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    正在同步磁盘。

    # 查看分区表
    [root@server ~ 17:19:18]# lsblk /dev/sdb
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sdb 8:16 0 100G 0 disk
    ├─sdb1 8:17 0 20G 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@server ~ 17:20:17]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)

    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。

    命令(输入 m 获取帮助):d
    分区号 (1-5,默认 5)
    分区 5 已删除

    命令(输入 m 获取帮助):d
    分区号 (1-4,默认 4)
    分区 4 已删除

    命令(输入 m 获取帮助):d
    分区号 (1-3,默认 3)
    分区 3 已删除

    命令(输入 m 获取帮助):d
    分区号 (1,2,默认 2)
    分区 2 已删除

    命令(输入 m 获取帮助):d
    已选择分区 1
    分区 1 已删除

    命令(输入 m 获取帮助):w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    正在同步磁盘。

    [root@server ~ 17:23:13]# lsblk /dev/sdb
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sdb 8:16 0 100G 0 disk
    Linux
    /dev/sdb3 48236544 56625151 4194304 83 Linux
    /dev/sdb4 56625152 209715199 76545024 5 Extended
    /dev/sdb5 56627200 67112959 5242880 83 Linux

    命令(输入 m 获取帮助):w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    正在同步磁盘。

    # 查看分区表
    [root@server ~ 17:19:18]# lsblk /dev/sdb
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sdb 8:16 0 100G 0 disk
    ├─sdb1 8:17 0 20G 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

    赞(0)
    未经允许不得转载:171主机测评 » Linux 文件系统与磁盘分区完整管理实战指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址