Linux 文件系统基本管理

一、构建基于 ISO 文件的 yum 仓库

应用场景

客户端需安装图形化界面,但默认依赖互联网 YUM 仓库,为提升安装速度,在 Server 端部署 Nginx 发布 DVD 光盘 ISO 文件作为本地 YUM 仓库,客户端指向该仓库完成安装。

操作步骤

1. Server 端部署并配置 Nginx 服务
# 安装Nginx软件
[root@server ~ 10:32:03]# yum install -y nginx

# 编辑Nginx配置文件,开启目录清单功能
[root@server ~ 10:39:03]# vim /etc/nginx/nginx.conf
......
http {
    # 添加以下参数,允许查看目录文件清单
    autoindex on;
......

# 设置Nginx开机自启并立即启动
[root@server ~ 10:39:38]# systemctl enable nginx.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

# 准备测试文件,验证Nginx服务可用性
[root@server ~ 10:39:58]# mv /usr/share/nginx/html/index.html{,.ori}
[root@server ~ 10:40:09]# echo welcome to Nginx website. > /usr/share/nginx/html/index.html
[root@server ~ 10:40:21]# systemctl start nginx
2.客户端测试 Nginx 服务连通性
[root@client ~ 11:44:18]# curl http://10.1.8.10
welcome to Nginx website.
3. Server 端挂载 ISO 文件到 Nginx 发布目录

前提:确保 ISO 文件已关联到虚拟机并正确识别光盘设备

# 创建挂载目录
[root@server ~ 10:41:56]# mkdir /usr/share/nginx/html/dvd

# 挂载光盘设备到Nginx发布目录(只读模式)
[root@server ~ 10:43:05]# mount /dev/sr0 /usr/share/nginx/html/dvd
mount: /dev/sr0 写保护,将以只读方式挂载
4.Client 端配置本地 YUM 仓库并安装图形化界面
# 备份原有YUM仓库配置
[root@client ~ 10:42:14]# mkdir /etc/yum.repos.d/old
[root@client ~ 10:43:30]#  mv /etc/yum.repos.d/*repo /etc/yum.repos.d/old

# 创建新的YUM仓库配置文件
[root@client ~ 10:43:39]# 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 ~ 10:44:15]# yum clean all
[root@client ~ 10:44:24]# yum grouplist
已加载插件:fastestmirror
没有安装组信息文件
Maybe run: yum groups mark convert (see man yum)
Determining fastest mirrors
dvd                                                                                                                     | 3.6 kB  00:00:00    
(1/2): dvd/group_gz                                                                                                     | 153 kB  00:00:00    
(2/2): dvd/primary_db                                                                                                   | 3.3 MB  00:00:00    
可用的环境分组:
   最小安装
   基础设施服务器
   计算节点
   文件及打印服务器
   基本网页服务器
   虚拟化主机
   带 GUI 的服务器
   GNOME 桌面
   KDE Plasma Workspaces
   开发及生成工作站
可用组:
   传统 UNIX 兼容性
   兼容性程序库
   图形管理工具
   安全性工具
   开发工具
   控制台互联网工具
   智能卡支持
   科学记数法支持
   系统管理
   系统管理工具
完成

# 降级open-vm-tools(解决软件版本兼容性问题)
[root@client ~ 10:46:20]# yum downgrade open-vm-tools-11.0.5-3.el7_9.3 -y

# 安装“带 GUI 的服务器”组包
[root@client ~ 10:46:36]# yum groupinstall -y '带 GUI 的服务器'

# 启动图形化界面
[root@client ~ 10:49:41]# init 5

# 切换回字符界面(可选)
[root@client ~ 10:50:01]# init 3

二、Linux 文件查找工具详解

1. locate:基于数据库快速查找

原理

locate 通过查询mlocate数据库(存储文件路径和名称)实现快速查找,常规用户仅能查到有读取权限的文件;查找前需通过updatedb更新数据库。

# 安装httpd(用于测试)
[root@client ~ 11:35:17]# yum install -y httpd

# 未更新数据库时查找(提示数据库不存在)
[root@client ~ 11:37:48]# locate httpd.conf
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录

# 更新数据库后查找
[root@client ~ 11:38:28]# updatedb
[root@client ~ 11:39:49]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf

# -b选项:仅匹配文件名(忽略路径)
[root@client ~ 11:39:54]# locate -b httpd
/etc/httpd
/etc/httpd/conf/httpd.conf
/etc/logrotate.d/httpd
/etc/sysconfig/httpd
/usr/lib/systemd/system/httpd.service
/usr/lib/tmpfiles.d/httpd.conf
/usr/lib64/httpd
/usr/libexec/initscripts/legacy-actions/httpd
/usr/sbin/httpd
/usr/share/httpd
/usr/share/augeas/lenses/dist/httpd.aug
/usr/share/augeas/lenses/dist/thttpd.aug
/usr/share/doc/httpd-2.4.6
/usr/share/doc/httpd-tools-2.4.6
/usr/share/doc/httpd-2.4.6/httpd-dav.conf
/usr/share/doc/httpd-2.4.6/httpd-default.conf
/usr/share/doc/httpd-2.4.6/httpd-info.conf
/usr/share/doc/httpd-2.4.6/httpd-languages.conf
/usr/share/doc/httpd-2.4.6/httpd-manual.conf
/usr/share/doc/httpd-2.4.6/httpd-mpm.conf
/usr/share/doc/httpd-2.4.6/httpd-multilang-errordoc.conf
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
/usr/share/man/man8/httpd.8.gz
/usr/share/setroubleshoot/plugins/httpd_can_sendmail.py
/usr/share/setroubleshoot/plugins/httpd_can_sendmail.pyc
/usr/share/setroubleshoot/plugins/httpd_can_sendmail.pyo
/usr/share/setroubleshoot/plugins/httpd_unified.py
/usr/share/setroubleshoot/plugins/httpd_unified.pyc
/usr/share/setroubleshoot/plugins/httpd_unified.pyo
/usr/share/setroubleshoot/plugins/httpd_write_content.py
/usr/share/setroubleshoot/plugins/httpd_write_content.pyc
/usr/share/setroubleshoot/plugins/httpd_write_content.pyo
/var/cache/httpd
/var/log/httpd

# 扩展:basename/dirname(提取文件名/路径)
[root@client ~ 11:41:28]# basename /usr/doc
doc
[root@client ~ 11:42:06]# dirname /usr/share/doc
/usr/share

# -i选项:忽略大小写
[root@client ~ 11:42:34]# locate PASSWD
/etc/PASSWD
[root@client ~ 11:43:03]# locate -i PASSWD
/etc/PASSWD
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
/usr/bin/grub2-mkpasswd-pbkdf2
/usr/bin/htpasswd
/usr/bin/lppasswd
/usr/bin/passwd
/usr/bin/vncpasswd
/usr/lib/firewalld/services/kpasswd.xml
/usr/lib64/samba/pdb/smbpasswd.so
/usr/lib64/security/pam_unix_passwd.so
/usr/sbin/chgpasswd
/usr/sbin/chpasswd
/usr/sbin/lpasswd
/usr/sbin/saslpasswd2
/usr/share/augeas/lenses/dist/htpasswd.aug
/usr/share/augeas/lenses/dist/passwd.aug
/usr/share/awk/passwd.awk
/usr/share/bash-completion/completions/chpasswd
/usr/share/bash-completion/completions/passwd
/usr/share/cups/www/help/man-lppasswd.html
/usr/share/doc/passwd-0.79
/usr/share/doc/passwd-0.79/AUTHORS
/usr/share/doc/passwd-0.79/COPYING
/usr/share/doc/passwd-0.79/ChangeLog
/usr/share/doc/passwd-0.79/NEWS
/usr/share/locale/ar/LC_MESSAGES/passwd.mo
/usr/share/locale/as/LC_MESSAGES/passwd.mo
/usr/share/locale/ast/LC_MESSAGES/passwd.mo
/usr/share/locale/bg/LC_MESSAGES/passwd.mo
/usr/share/locale/bn/LC_MESSAGES/passwd.mo
/usr/share/locale/bn_IN/LC_MESSAGES/passwd.mo
/usr/share/locale/bs/LC_MESSAGES/passwd.mo
/usr/share/locale/ca/LC_MESSAGES/passwd.mo
/usr/share/locale/cs/LC_MESSAGES/passwd.mo
/usr/share/locale/cy/LC_MESSAGES/passwd.mo
/usr/share/locale/da/LC_MESSAGES/passwd.mo
/usr/share/locale/de/LC_MESSAGES/passwd.mo
/usr/share/locale/el/LC_MESSAGES/passwd.mo
/usr/share/locale/en_GB/LC_MESSAGES/passwd.mo
/usr/share/locale/es/LC_MESSAGES/passwd.mo
/usr/share/locale/et/LC_MESSAGES/passwd.mo
/usr/share/locale/eu/LC_MESSAGES/passwd.mo
/usr/share/locale/fa/LC_MESSAGES/passwd.mo
/usr/share/locale/fi/LC_MESSAGES/passwd.mo
/usr/share/locale/fr/LC_MESSAGES/passwd.mo
/usr/share/locale/gl/LC_MESSAGES/passwd.mo
/usr/share/locale/gu/LC_MESSAGES/passwd.mo
/usr/share/locale/he/LC_MESSAGES/passwd.mo
/usr/share/locale/hi/LC_MESSAGES/passwd.mo
/usr/share/locale/hr/LC_MESSAGES/passwd.mo
/usr/share/locale/hu/LC_MESSAGES/passwd.mo
/usr/share/locale/hy/LC_MESSAGES/passwd.mo
/usr/share/locale/id/LC_MESSAGES/passwd.mo
/usr/share/locale/is/LC_MESSAGES/passwd.mo
/usr/share/locale/it/LC_MESSAGES/passwd.mo
/usr/share/locale/ja/LC_MESSAGES/passwd.mo
/usr/share/locale/ka/LC_MESSAGES/passwd.mo
/usr/share/locale/kn/LC_MESSAGES/passwd.mo
/usr/share/locale/ko/LC_MESSAGES/passwd.mo
/usr/share/locale/ku/LC_MESSAGES/passwd.mo
/usr/share/locale/lo/LC_MESSAGES/passwd.mo
/usr/share/locale/mk/LC_MESSAGES/passwd.mo
/usr/share/locale/ml/LC_MESSAGES/passwd.mo
/usr/share/locale/mr/LC_MESSAGES/passwd.mo
/usr/share/locale/ms/LC_MESSAGES/passwd.mo
/usr/share/locale/my/LC_MESSAGES/passwd.mo
/usr/share/locale/nb/LC_MESSAGES/passwd.mo
/usr/share/locale/nds/LC_MESSAGES/passwd.mo
/usr/share/locale/nl/LC_MESSAGES/passwd.mo
/usr/share/locale/nn/LC_MESSAGES/passwd.mo
/usr/share/locale/or/LC_MESSAGES/passwd.mo
/usr/share/locale/pa/LC_MESSAGES/passwd.mo
/usr/share/locale/pl/LC_MESSAGES/passwd.mo
/usr/share/locale/pt/LC_MESSAGES/passwd.mo
/usr/share/locale/pt_BR/LC_MESSAGES/passwd.mo
/usr/share/locale/ro/LC_MESSAGES/passwd.mo
/usr/share/locale/ru/LC_MESSAGES/passwd.mo
/usr/share/locale/si/LC_MESSAGES/passwd.mo
/usr/share/locale/sk/LC_MESSAGES/passwd.mo
/usr/share/locale/sl/LC_MESSAGES/passwd.mo
/usr/share/locale/sq/LC_MESSAGES/passwd.mo
/usr/share/locale/sr/LC_MESSAGES/passwd.mo
/usr/share/locale/sr@latin/LC_MESSAGES/passwd.mo
/usr/share/locale/sv/LC_MESSAGES/passwd.mo
/usr/share/locale/ta/LC_MESSAGES/passwd.mo
/usr/share/locale/te/LC_MESSAGES/passwd.mo
/usr/share/locale/tr/LC_MESSAGES/passwd.mo
/usr/share/locale/uk/LC_MESSAGES/passwd.mo
/usr/share/locale/ur/LC_MESSAGES/passwd.mo
/usr/share/locale/vi/LC_MESSAGES/passwd.mo
/usr/share/locale/wa/LC_MESSAGES/passwd.mo
/usr/share/locale/zh_CN/LC_MESSAGES/passwd.mo
/usr/share/locale/zh_TW/LC_MESSAGES/passwd.mo
/usr/share/man/cs/man1/gpasswd.1.gz
/usr/share/man/de/man1/gpasswd.1.gz
/usr/share/man/de/man8/chgpasswd.8.gz
/usr/share/man/de/man8/chpasswd.8.gz
/usr/share/man/fr/man1/gpasswd.1.gz
/usr/share/man/fr/man8/chgpasswd.8.gz
/usr/share/man/fr/man8/chpasswd.8.gz
/usr/share/man/hu/man1/gpasswd.1.gz
/usr/share/man/it/man1/gpasswd.1.gz
/usr/share/man/it/man8/chgpasswd.8.gz
/usr/share/man/it/man8/chpasswd.8.gz
/usr/share/man/ja/man1/gpasswd.1.gz
/usr/share/man/ja/man1/passwd.1.gz
/usr/share/man/ja/man8/chpasswd.8.gz
/usr/share/man/man1/gpasswd.1.gz
/usr/share/man/man1/grub2-mkpasswd-pbkdf2.1.gz
/usr/share/man/man1/htpasswd.1.gz
/usr/share/man/man1/lpasswd.1.gz
/usr/share/man/man1/lppasswd.1.gz
/usr/share/man/man1/passwd.1.gz
/usr/share/man/man1/sslpasswd.1ssl.gz
/usr/share/man/man1/vncpasswd.1.gz
/usr/share/man/man3/passwd2des.3.gz
/usr/share/man/man5/passwd.5.gz
/usr/share/man/man5/smbpasswd.5.gz
/usr/share/man/man8/chgpasswd.8.gz
/usr/share/man/man8/chpasswd.8.gz
/usr/share/man/man8/saslpasswd2.8.gz
/usr/share/man/pt_BR/man1/gpasswd.1.gz
/usr/share/man/ru/man1/gpasswd.1.gz
/usr/share/man/ru/man8/chgpasswd.8.gz
/usr/share/man/ru/man8/chpasswd.8.gz
/usr/share/man/zh_CN/man1/gpasswd.1.gz
/usr/share/man/zh_CN/man8/chgpasswd.8.gz
/usr/share/man/zh_CN/man8/chpasswd.8.gz
/usr/share/man/zh_TW/man8/chpasswd.8.gz
/usr/share/vim/vim74/ftplugin/passwd.vim
/usr/share/vim/vim74/syntax/passwd.vim

# -c选项:返回匹配结果数量
[root@client ~ 11:43:22]# locate -b -c PASSWD
1

# -r选项:正则表达式匹配
[root@client ~ 11:44:06]# locate -r 'http.*conf'
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.modules.d
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/conf.d/README
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/usr/lib/tmpfiles.d/httpd.conf
/usr/lib64/httpd/modules/mod_log_config.so
/usr/libexec/initscripts/legacy-actions/httpd/configtest
/usr/share/doc/httpd-2.4.6/httpd-dav.conf
/usr/share/doc/httpd-2.4.6/httpd-default.conf
/usr/share/doc/httpd-2.4.6/httpd-info.conf
/usr/share/doc/httpd-2.4.6/httpd-languages.conf
/usr/share/doc/httpd-2.4.6/httpd-manual.conf
/usr/share/doc/httpd-2.4.6/httpd-mpm.conf
/usr/share/doc/httpd-2.4.6/httpd-multilang-errordoc.conf
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
/usr/share/doc/httpd-2.4.6/proxy-html.conf

2. find:实时遍历文件系统查找

原理

find 命令实时遍历指定路径的文件系统,用户需对目标路径有读 / 执行权限;支持多维度条件筛选和后续操作。

(1)按文件名查找
# 创建测试文件
[root@server ~ 16:49:45]# touch /etc/PASSWD

# 精确匹配(区分大小写)
[root@server ~ 16:49:59]# find /etc/ -name passwd
/etc/passwd
/etc/pam.d/passwd

# 模糊匹配
[root@server ~ 16:50:11]# find /etc/ -name '*passwd*'
/etc/passwd-
/etc/passwd
/etc/pam.d/passwd
/etc/security/opasswd

# 忽略大小写匹配
[root@server ~ 16:50:39]# find /etc/ -iname passwd
/etc/passwd
/etc/pam.d/passwd
/etc/PASSWD
(2)按文件类型查找
类型参数 说明
b 块设备文件
c 字符设备文件
d 目录
f 普通文件
l 软链接文件
p 管道文件
s 套接字文件
# 创建测试目录
[root@server ~ 16:50:49]# mkdir /etc/yum.repos.d/passwd

# 查找名为passwd的目录
[root@server ~ 16:51:24]# find /etc/ -name 'passwd' -type d
/etc/yum.repos.d/passwd

# 删除测试目录
[root@server ~ 16:51:35]# rmdir /etc/yum.repos.d/passwd
(3)按文件属主 / 属组查找
# 查看用户uid
[root@server ~ 16:51:43]# id liu
uid=1000(liu) gid=1000(liu)=1000(liu)

# 按用户名查找
[root@server ~ 16:52:10]# find / -user liu
/home/liu
/home/liu/.bash_logout
/home/liu/.bash_profile
/home/liu/.bashrc

# 按uid查找
[root@server ~ 16:52:41]# find / -uid 1000
/home/liu
/home/liu/.bash_logout
/home/liu/.bash_profile
/home/liu/.bashrc

# 查看组信息
[root@server ~ 16:53:03]# grep wheel /etc/group
wheel:x:10:

# 按组名查找
[root@server ~ 16:54:00]# find / -group wheel

# 按gid查找
[root@server ~ 16:54:19]# find / -gid 10

# 查找无属主/无属组文件
[root@server ~ 16:54:36]# find / -nouser -o -nogroup
(4)按文件权限查找
# 准备测试文件
[root@server ~ 16:55:50]# mkdir lab;cd lab
[root@server lab 16:56:25]# touch file-{1..3}
[root@server lab 16:56:46]# ls -l file*
-rw-r--r-- 1 root root 0 520 16:56 file-1
-rw-r--r-- 1 root root 0 520 16:56 file-2
-rw-r--r-- 1 root root 0 520 16:56 file-3

# -perm mode:精确匹配权限
[root@server lab 16:56:54]# chmod 764 file-1
[root@server lab 16:57:25]# find -perm 764 |xargs ls -l
-rwxrw-r-- 1 root root 0 520 16:56 ./file-1

# -perm -mode:ugo至少满足指定权限(例:764 → u≥7, g≥6, o≥4)
[root@server lab 16:57:54]# chmod 777 file-1
[root@server lab 16:58:33]# chmod 764 file-2
[root@server lab 16:58:40]# chmod 760 file-3
[root@server lab 16:59:04]# find . -perm -764 |xargs ls -l
-rwxrwxrwx 1 root root 0 520 16:56 ./file-1
-rwxrw-r-- 1 root root 0 520 16:56 ./file-2

# 查找SUID权限文件(4000为SUID位)
[root@server lab 17:01:10]# find / -perm -4000

# 查找同时含SUID+SGID的文件(6000=4000+2000)
[root@server lab 17:01:59]# find / -perm -6000 2>/dev/null |xargs ls -l
总用量 0
-rwxrwxrwx 1 root root 0 520 16:56 file-1
-rwxrw-r-- 1 root root 0 520 16:56 file-2
-rwxrw---- 1 root root 0 520 16:56 file-3

# -perm /mode:ugo任一满足指定权限(例:764 → u≥7 或 g≥6 或 o≥4)
[root@server lab 17:03:26]# chmod a=- file-1
[root@server lab 17:03:31]# chmod uo=-,g=rwx file-2
[root@server lab 17:03:41]# chmod ug=-,o=r file-3
[root@server lab 17:03:50]# find -name 'file-*' -perm /764| xargs ls -l
----rwx--- 1 root root 0 520 16:56 ./file-2
-------r-- 1 root root 0 520 16:56 ./file-3

# 查找含SUID/SGID/Sticky的文件(7000=4000+2000+1000)
[root@server lab 17:04:03]# find / -perm /7000

# 查找含SUID或SGID的文件
[root@server lab 17:05:04]# find / -perm /6000

# 按可读/可写/可执行属性查找
find / -readable  # 可读
find / -writable  # 可写
find / -executable  # 可执行
(5)按文件大小查找
单位 说明
c 字节
k KiB(1024 字节)
M MiB(1024KiB)
G GiB(1024MiB)
# 等于10MiB
[root@server ~ 17:05:58]# find -size 10M

# 大于10GiB
[root@server ~ 17:06:05]# find -size +10G

# 小于10KiB
[root@server ~ 17:06:18]# find -size -10k

# 等于1MiB(注意:size取整,1M包含小于1M的文件,建议用1024k)
[root@server ~ 17:06:29]# find -size 1M
[root@server ~ 17:06:41]# find -size 1024k
(6)按文件时间查找
参数 单位 说明
-amin 分钟 访问时间
-cmin 分钟 状态修改时间
-mmin 分钟 内容修改时间
-atime 24 小时 访问时间
-ctime 24 小时 状态修改时间
-mtime 24 小时 内容修改时间
-newer - 比指定文件新
# 正好10分钟前访问的文件
[root@server ~ 17:08:46]# find -amin 10

# 超过10分钟前访问的文件
[root@server ~ 17:08:53]# find -amin +10

# 10分钟内访问的文件
[root@server ~ 17:08:59]# find -amin -10
(7)按硬链接数 / Inode 查找
# 硬链接数等于3
[root@server ~ 17:09:03]# find -links 3

# 硬链接数大于3
[root@server ~ 17:10:03]# find -links +3

# 硬链接数小于3
[root@server ~ 17:10:08]# find -links -3

# 按Inode查找(示例:Inode=67160130)
[root@server ~ 17:10:11]# ls -i /etc/fstab
67160130 /etc/fstab
[root@server ~ 17:10:35]# find / -inum 67160130| xargs ls -i
67160130 /etc/fstab
(8)多条件组合
逻辑符 说明 示例
-a / 空格 find /etc -name passwd -type f
-o find / -nouser -o -nogroup
! find / ! -size -200M
# 查找/etc下名为passwd的普通文件
find /etc -name passwd -type f

# 查找无属主或无属组的文件
find / -nouser -o -nogroup

# 查找大小不小于200MiB的文件(屏蔽错误输出)
[root@server ~ 17:12:44]# find / ! -size -200M 2>/dev/null
/proc/kcore
/proc/2465/task/2465/fd/6
/proc/2465/task/2465/fdinfo/6
/proc/2465/fd/5
/proc/2465/fdinfo/5
(9)后续操作(action)
# -delete:删除找到的文件
[root@server ~ 17:13:44]# find / -name PASSWD
/etc/PASSWD
[root@server ~ 17:14:29]# find / -name PASSWD -delete
[root@server ~ 17:14:42]# find / -name PASSWD

# -ls:查看文件详情(等效ls -dils)
[root@server ~ 17:14:45]# find /etc/ -name passwd -ls
67448031    4 -rw-r--r--   1 root     root          886 513 17:09 /etc/passwd
33992548    4 -rw-r--r--   1 root     root          188 41  2020 /etc/pam.d/passwd

# -exec:执行命令(\;表示命令结束)
[root@server ~ 17:15:57]# find /etc/ -name passwd -exec echo haha \;
haha
haha

# -exec {}:引用找到的文件(示例:复制指定Inode文件)
[root@server ~ 17:16:00]# find / -inum 67160130
/etc/fstab
[root@server ~ 17:16:23]# mkdir findfiles
[root@server ~ 17:16:31]# find / -inum 67160130 -exec cp -a {} ./findfiles \;
[root@server ~ 17:17:09]# ls findfiles/fstab
findfiles/fstab

三、Linux 硬盘分区管理

1. 硬盘分区的意义
  • 隔离系统文件与用户文件,避免应用数据占满系统盘;
  • 限制用户 / 应用的磁盘可用空间;
  • 分区损坏时仅影响该分区数据,降低故障范围;
  • 支持创建交换分区(SWAP);
  • 优化诊断 / 备份性能,适配不同文件类型(小文件 / 大文件)的存储需求。
2.MBR 分区方案(BIOS 固件)
核心特性
  • 支持最多 4 个主分区;
  • 可通过 “扩展分区 + 逻辑分区” 扩展至最多 15 个分区(扩展分区不可格式化,逻辑分区可格式化);
  • 单分区最大容量≤2TiB(4 字节存储扇区数,2^32 × 512 字节)。

主引导扇区结构(柱面 0、磁头 0、扇区 1)

部分 大小 作用
引导程序 446 字节 系统启动时转交控制权给指定分区的 OS
磁盘分区表(DPT) 64 字节(4 个分区项 ×16 字节) 存储分区信息
结束标志 2 字节 固定值 0xAA55,标识扇区有效性
fdisk 工具(管理 MBR 分区)
(1)命令语法
[root@server ~ 17:19:26]# fdisk -h
用法:
 fdisk [选项] <磁盘>    更改分区表
 fdisk [选项] -l <磁盘> 列出分区表
 fdisk -s <分区>        给出分区大小(块数)

选项:
 -b <大小>             扇区大小(512、1024、2048或4096)
 -c[=<模式>]           兼容模式:“dos”或“nondos”(默认)
 -h                    打印此帮助文本
 -u[=<单位>]           显示单位:“cylinders”(柱面)或“sectors”(扇区,默认)
 -v                    打印程序版本
 -C <数字>             指定柱面数
 -H <数字>             指定磁头数
 -S <数字>             指定每个磁道的扇区数
(2)查看分区表
# 方法1:直接列出
[root@server ~ 17:19:29]# fdisk -l /dev/sdb
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

# 方法2:交互式查看
[root@server ~ 17:20:23]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xe94a0510 创建新的 DOS 磁盘标签。

# 输入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
磁盘标识符:0xe94a0510
   设备 Boot      Start         End      Blocks   Id  System

# 输入q退出
命令(输入 m 获取帮助):q
(3)创建 MBR 分区
# 进入交互式管理
[root@server ~ 17:22:34]# fdisk /dev/sdb

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

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

# 选择分区号(默认1)
分区号 (1-4,默认 1)# 设置起始扇区(默认2048)
起始 扇区 (2048-209715199,默认为 2048):
将使用默认值 2048

# 设置结束扇区(+2G表示2GiB)
Last 扇区, +扇区 or +size{K,M,G} (2048-209715199,默认为 209715199):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB

# 输入p验证分区
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x41c8b607
   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux

# 输入w保存并退出
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。

# 验证分区创建结果
[root@server ~ 17:26:32]# lsblk /dev/sdb
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  100G  0 disk 
└─sdb1   8:17   0    2G  0 part 

# 若分区表未生效,通知内核更新
[root@server ~ 17:26:56]# partprobe

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

[root@server ~ 17:26:56]# partprobe
(4)删除 MBR 分区
[root@server ~ 17:27:30]# fdisk /dev/sdb
# 输入p查看分区
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x41c8b607
   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux

# 输入d删除分区(自动选中唯一分区1)
命令(输入 m 获取帮助):d
已选择分区 1
分区 1 已删除

# 输入p验证删除结果
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x41c8b607
   设备 Boot      Start         End      Blocks   Id  System

# 输入w保存更改
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
(5)创建扩展分区 + 逻辑分区(突破 4 个主分区限制)
[root@server ~ 18:30:10]# fdisk /dev/sdb
# 创建主分区1(2GiB)
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-209715199,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-209715199,默认为 209715199):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB

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

# 创建主分区3(4GiB)
命令(输入 m 获取帮助):n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): 
Using default response p
分区号 (3,4,默认 3):
起始 扇区 (10487808-209715199,默认为 10487808):
将使用默认值 10487808
Last 扇区, +扇区 or +size{K,M,G} (10487808-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
起始 扇区 (18876416-209715199,默认为 18876416):
将使用默认值 18876416
Last 扇区, +扇区 or +size{K,M,G} (18876416-209715199,默认为 209715199):
将使用默认值 209715199
分区 4 已设置为 Extended 类型,大小设为 91 GiB

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

# 输入p验证分区结构
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x41c8b607
   设备 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   209715199    95419392    5  Extended
/dev/sdb5        18878464    29364223     5242880   83  Linux

# 输入w保存并退出
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。

# 验证分区
[root@server ~ 18:35:13]# lsblk /dev/sdb
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  100G  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 

# 清理测试分区(仅保留演示环境)
[root@server ~ 18:35:35]# fdisk /dev/sdb
命令(输入 m 获取帮助):d
分区号 (1-5,默认 5):5
分区 5 已删除
命令(输入 m 获取帮助):d
分区号 (1-4,默认 4):4
分区 4 已删除
命令(输入 m 获取帮助):d
分区号 (1-3,默认 3):3
分区 3 已删除
命令(输入 m 获取帮助):d
分区号 (1,2,默认 2):2
分区 2 已删除
命令(输入 m 获取帮助):d
已选择分区 1
分区 1 已删除
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
3. GPT 分区方案(UEFI 固件)
核心特性
  • 单分区最大容量≤18ZiB(8 字节存储扇区数,2^64 × 512 字节);
  • 支持最多 128 个分区(实际建议不超过 120 个,避免格式化异常);
  • 分区表信息冗余备份,自带 CRC32 校验,容错性更强

GPT 分区表结构

区域 说明
LBA0(保护性 MBR) 446 字节引导程序 + 0xEE 标识符(标识 GPT 磁盘,防止老工具误修改)
LBA1(GPT 表头) 记录分区表位置 / 大小、备份 GPT 位置、CRC32 校验码
LBA2-33(分区记录区) 共 32 个 LBA,每个 LBA 存储 4 组分区记录(每组 128 字节),总计 128 组

gdisk 工具(管理 GPT 分区)

(1)查看 GPT 分区表
# 安装gdisk
[root@server ~ 18:37:57]# yum install -y gdisk

# 查看分区表(自动识别MBR并提示转换)
[root@server ~ 18:38:11]# gdisk -l /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present

***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. 
***************************************************************
Disk /dev/sdb: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D80CB0F8-A526-4185-8AC3-9102D33CC195
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 209715133 sectors (100.0 GiB)
Number  Start (sector)    End (sector)  Size       Code  Name
(2)转换 MBR 为 GPT 分区表
[root@server ~ 18:38:41]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present

***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************

# 输入?查看帮助信息
Command (? for help): ?
b	back up GPT data to a file
c	change a partition's name
d	delete a partition
i	show detailed information on a partition
l	list known partition types
n	add a new partition
o	create a new empty GUID partition table (GPT)
p	print the partition table
q	quit without saving changes
r	recovery and transformation options (experts only)
s	sort partitions
t	change a partition's type code
v	verify disk
w	write table to disk and exit
x	extra functionality (experts only)
?	print this menu

# 输入 o,创建全新 GPT 分区表(清空原有 MBR 分区)
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y

# 输入 p,查看新 GPT 分区表(已清空)
Command (? for help): p
Disk /dev/sdb: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 4759EFA7-E486-4F31-B4B5-DA184AD628E2
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 209715133 sectors (100.0 GiB)
Number  Start (sector)    End (sector)  Size       Code  Name

# 输入 w,写入 GPT 分区表并退出
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
(3)在 GPT 磁盘上创建分区
[root@server ~ 18:43:20]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present
Found valid GPT with protective MBR; using GPT.

# 输入 n,创建新分区
Command (? for help): n

# 分区编号,默认 1,直接回车
Partition number (1-128, default 1):

# 起始扇区,默认 2048,直接回车
First sector (34-209715166, default = 2048) or {+-}size{KMGTP}:

# 结束扇区,输入 +2G,创建 2G 分区
Last sector (2048-209715166, default = 209715166) or {+-}size{KMGTP}: +2G
Current type is 'Linux filesystem'

# 输入 L 查看分区类型,直接回车默认 8300(Linux 文件系统)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

# 输入 p,查看分区
Command (? for help): p
Disk /dev/sdb: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 4759EFA7-E486-4F31-B4B5-DA184AD628E2
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 205520829 sectors (98.0 GiB)
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300  Linux filesystem
(4)更改 GPT 分区名称
# 输入 c,修改分区名
Command (? for help): c
Using 1
Enter name: data01

# 输入 p 查看
Command (? for help): p
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300  data01
(5)查看分区详细信息
Command (? for help): i
Using 1
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: 19AE5CDC-1AB2-4EBA-B9E2-AE9E7BF42653
First sector: 2048 (at 1024.0 KiB)
Last sector: 4196351 (at 2.0 GiB)
Partition size: 4194304 sectors (2.0 GiB)
Attribute flags: 0000000000000000
Partition name: 'data01'
(6)删除 GPT 分区
# 输入 d,删除分区 1
Command (? for help): d
Using 1

# 输入 p 查看,已删除
Command (? for help): p
Number  Start (sector)    End (sector)  Size       Code  Name

# 输入 w 保存退出
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

四、文件系统持久化挂载

环境准备

利用 parted 创建一个分区,并格式化为xfs文件系统。

[root@server ~ 19:10:40]# parted /dev/sdb mklabel gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want
to continue?
是/Yes/否/No? y                                                           
信息: You may need to update /etc/fstab.


[root@server ~ 19:11:15]# parted /dev/sdb unit MiB mkpart data01 xfs 1 2049
信息: You may need to update /etc/fstab.

[root@server ~ 19:11:48]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, 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

# 如果格式化时候,提示存在文件系统,则需要-f选项强制格式化
[root@server ~ 19:12:13]# mkfs.xfs /dev/sdb1
mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.

[root@server ~ 19:12:39]# mkfs.xfs -f /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, 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
持久化挂载

当服务器重启时,系统不会再次将文件系统自动挂载到目录树上,用户无法访问。为了确保系统在启动时自动挂载文件系统, 需要在 /etc/fstab文件中添加一个条目。

/etc/fstab 是以空格分隔的文件,每行具有六个字段。

  • **第一个字段指定设备。**可以使用UUID或device来指定设备。
  • **第二个字段是目录挂载点。**通过它可以访问目录结构中的块设备。挂载点必须存在;如果不存在,请使用mkdir命令进行创建。
  • 第三个字段包含文件系统类型,如xfs或ext4 。
  • 第四个字段是挂载选项,以逗号分隔的。 defaults是一组常用选项。详细信息参考mount(8) 。
  • 第五个字段指定dump命令是否备份设备。
  • 第六个字段指定fsck顺序字段,决定了在系统启动吋是否应运行fsck命令,以验证文件系统是否干净。 该字段中的值指示了 fsck的运行顺序。 对于XFS文件系统, 请将该字段设为0 ,因为XFS并不使用fsck来检查自己的文件系统状态。 对于ext4 文件系统,如果是根文件系统, 请将该字段设 为 1 ; 如果是其他ext4 文件系统, 则将该字段设为2。 这样, fsck就会先处理根文件系统,然后同步检查不同磁盘上的文件系统,并按顺序检查同一磁盘上的文件系统。

示例:

[root@server ~ 19:13:11]# blkid /dev/sdb1
/dev/sdb1: UUID="31872be1-fd55-4689-8b6e-91e084f44148" TYPE="xfs" PARTLABEL="data01" PARTUUID="e84b3213-6124-4072-91b1-b04d79908016" 

[root@server ~ 19:13:20]# mkdir /data01


[root@server ~ 19:13:45]# vim /etc/fstab
# 最后一行增加一个条目
UUID="31872be1-fd55-4689-8b6e-91e084f44148" /data01 xfs defaults 0 0


# 使用如下命令立刻挂载
[root@server ~ 19:15:14]# mount /data01

# 验证
[root@server ~ 19:15:31]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1       2.0G   33M  2.0G    2% /data01

# 重启系统验证
[root@centos7 ~]# reboot
[root@server ~ 19:16:36]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1       2.0G   33M  2.0G    2% /data01

### 取消持久化挂载
删除/etc/fstab中对应条目即可。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐