3. Linux文件系统管理:文件与目录操作

文件系统管理,说白了就是Linux运维的“地基”。你想想看,服务器上跑的所有东西——代码、日志、配置文件、数据库文件——最终都得落到磁盘上。如果连文件怎么创建、权限怎么控制、磁盘怎么挂载都搞不清楚,那后面部署Java项目时肯定会踩坑。

我个人习惯把文件系统管理分成三块来学:基础操作(增删改查)、权限控制(谁可以干什么)、存储管理(磁盘怎么用)。咱们一个一个来。

3.1 文件与目录基础操作:ls/cd/mkdir/rm

这几个命令,我敢说每个Linux运维每天至少用几十次。但很多人只是“会用”,没想过背后的逻辑。

3.1.1 ls:查看文件列表

ls 是最常用的命令,没有之一。但它的参数组合,很多人记不全。

# 基础用法
ls                    # 列出当前目录
ls -l                 # 长格式显示(权限、大小、时间)
ls -a                 # 显示隐藏文件(以.开头的)
ls -lh                # 人性化显示大小(K、M、G)
ls -lt                # 按时间排序(最新的在最上面)
ls -ltr               # 按时间倒序(最旧的在最上面)
ls -R                 # 递归显示子目录

我在项目中遇到过一个问题:某天线上服务突然报“磁盘空间不足”,但用 df -h 一看,磁盘明明还有50%空闲。后来排查发现,是某个进程一直在写日志,但日志文件被删除了——ls -l 看不到,但 lsof 能看到文件句柄还在。嗯,这里要注意:文件被删除不代表磁盘空间立即释放,得等持有文件句柄的进程关闭才行。

3.1.2 cd:切换目录

cd 太简单了?别急,有几个技巧你可能不知道。

cd /home/project    # 绝对路径
cd ../              # 返回上级目录
cd ~                # 回到家目录
cd -                # 返回上一次所在的目录(这个超实用!)
cd /                # 回到根目录

我个人最常用的是 cd -。比如我在 /etc/nginx/conf.d 改完配置,想切回 /home/project/logs 看日志,一个 cd - 就回去了,不用重新敲路径。

3.1.3 mkdir:创建目录

mkdir mydir              # 创建单个目录
mkdir -p a/b/c/d         # 递归创建多级目录(父目录不存在时自动创建)
mkdir -m 755 mydir       # 创建目录并指定权限

-p 参数我几乎每次都用。你想想看,如果手动一层层 mkdir,那得多累?

3.1.4 rm:删除文件或目录

rm file.txt              # 删除文件
rm -r mydir              # 递归删除目录及其内容
rm -f file.txt           # 强制删除(不提示)
rm -rf mydir             # 递归强制删除(慎用!)
⚠️ 警告: rm -rf / 是Linux界的“核弹”。我曾经见过一个同事,在清理临时目录时手滑多打了个空格——rm -rf / tmp(注意那个空格),结果系统直接崩了。所以我的习惯是:永远不要用root执行 rm -rf,实在要用,先 ls 确认路径再删。

3.2 文件权限管理:chmod/chown

Linux的权限模型,说白了就是三组权限(所有者、所属组、其他人)和三种操作(读、写、执行)。这个设计从70年代沿用至今,简单但有效。

3.2.1 权限表示法

ls -l 看到的权限长这样:

-rwxr-xr--  1 root root  1234 Mar 15 10:00 app.sh

拆开来看:

位置 含义 示例
第1位 文件类型(-普通文件,d目录,l软链接) -
第2-4位 所有者权限(u) rwx(可读可写可执行)
第5-7位 所属组权限(g) r-x(可读可执行,不可写)
第8-10位 其他人权限(o) r--(只可读)

3.2.2 chmod:修改权限

有两种方式:数字法和符号法。我个人更推荐数字法,简洁明了。

# 数字法:r=4, w=2, x=1
chmod 755 app.sh        # 所有者rwx,所属组r-x,其他人r-x
chmod 644 config.yml    # 所有者rw-,所属组r--,其他人r--

# 符号法
chmod u+x app.sh        # 给所有者加执行权限
chmod g-w app.sh        # 给所属组去掉写权限
chmod o=r app.sh        # 给其他人设置为只读
chmod a+x app.sh        # 给所有人加执行权限
💡 我的习惯: 对于Java项目的配置文件(如 application.yml),我一般给 644;对于启动脚本(如 start.sh),给 755。这样既保证安全,又方便运维。

3.2.3 chown:修改所有者

chown root:root app.sh          # 修改所有者和所属组
chown tomcat:tomcat app.sh      # 改成tomcat用户和组
chown -R tomcat:tomcat /app     # 递归修改整个目录

我在部署Java应用时,经常遇到权限问题。比如Tomcat启动后写不了日志,十有八九是日志目录的所有者没改成 tomcat。嗯,这里要注意:Java进程是以什么用户启动的,它就能读写什么用户的文件

3.3 软链接与硬链接

链接这个概念,很多新手容易搞混。我换个角度给你讲:

  • 硬链接:同一个文件的不同名字。就像一个人有两个身份证,指向同一个身体。
  • 软链接:一个快捷方式。就像Windows的快捷方式,指向另一个文件。

3.3.1 软链接(符号链接)

ln -s /data/logs /home/project/logs    # 创建软链接
ls -l /home/project/logs               # 会显示 -> /data/logs

软链接的特点:

  • 可以跨文件系统(比如从 / 链接到 /data
  • 可以链接目录
  • 原文件删除后,软链接会变成“死链接”(红色闪烁)

我经常用软链接来管理Java项目的日志目录。比如把日志统一放到 /data/logs 分区,然后在项目目录下建个软链接。这样即使项目重装,日志也不会丢。

3.3.2 硬链接

ln /data/file.txt /backup/file.txt     # 创建硬链接
ls -li                                 # 查看inode号,两个文件inode相同

硬链接的特点:

  • 不能跨文件系统
  • 不能链接目录
  • 删除原文件,硬链接仍然可用(因为inode还在)
🔑 核心区别: 软链接有自己的inode,硬链接和原文件共享同一个inode。说白了,硬链接就是同一个文件的不同入口,软链接只是一个“路标”。

3.4 磁盘挂载与分区

这部分是运维的硬功夫。你想想看,服务器买回来,硬盘插上去,怎么让系统认识它?

3.4.1 查看磁盘信息

lsblk                   # 列出所有块设备(树形结构)
fdisk -l                # 查看磁盘分区表
df -h                   # 查看已挂载分区的使用情况
blkid                   # 查看分区的UUID

3.4.2 磁盘分区

/dev/sdb 为例:

fdisk /dev/sdb          # 进入交互式分区工具
# 常用命令:
# n - 新建分区
# p - 查看分区表
# d - 删除分区
# w - 保存并退出

分区完成后,需要格式化:

mkfs.ext4 /dev/sdb1     # 格式化为ext4文件系统
mkfs.xfs /dev/sdb2      # 格式化为xfs文件系统(大文件场景推荐)
💡 我的选择: 对于Java项目的日志分区,我推荐用 xfs。为什么?因为日志文件通常很大(动不动几十G),xfs对大文件的处理效率比ext4高。我曾经在线上对比过,同样写10G日志,xfs比ext4快大约15%。

3.4.3 挂载与自动挂载

# 临时挂载
mount /dev/sdb1 /data

# 查看挂载情况
mount | grep sdb1

# 卸载
umount /data

但临时挂载重启后就没了。要实现开机自动挂载,得改 /etc/fstab

# 查看UUID
blkid /dev/sdb1

# 编辑 /etc/fstab,添加一行:
UUID=xxxx-xxxx-xxxx  /data  xfs  defaults  0  2

/etc/fstab 的格式:

字段 含义 示例
第1列 设备或UUID UUID=xxxx
第2列 挂载点 /data
第3列 文件系统类型 xfs
第4列 挂载选项 defaults
第5列 是否dump备份 0(不备份)
第6列 fsck检查顺序 2(非根分区)
⚠️ 避坑指南: 我曾经在修改 /etc/fstab 时写错了UUID,结果服务器重启后直接进不了系统——因为挂载失败了。从那以后,我每次改完 fstab 都会先执行 mount -a 测试一下,确认没问题再重启。这个习惯救了我好几次。

3.4.4 实战:给Java项目挂载数据盘

假设你买了一台云服务器,系统盘只有40G,但数据盘有500G。你想把Java项目的日志和数据库都放到数据盘上:

# 1. 查看新磁盘
lsblk

# 2. 分区
fdisk /dev/sdb
# 输入 n, p, 1, 回车, 回车, w

# 3. 格式化
mkfs.xfs /dev/sdb1

# 4. 创建挂载点
mkdir -p /data

# 5. 挂载
mount /dev/sdb1 /data

# 6. 配置自动挂载
blkid /dev/sdb1 >> /etc/fstab
# 编辑 /etc/fstab,添加 UUID=xxx /data xfs defaults 0 2

# 7. 创建项目目录
mkdir -p /data/project/logs
mkdir -p /data/mysql/data

# 8. 设置权限
chown -R tomcat:tomcat /data/project
chown -R mysql:mysql /data/mysql

这样,你的Java项目日志和数据库就都跑在大容量数据盘上了。系统盘只放操作系统和程序本身,即使日志写爆了,也不会影响系统运行。

嗯,文件系统管理这块内容不少,但都是基本功。你把这些命令练熟了,后面部署Java项目时就会顺手很多。下一章我们聊聊用户和组管理,这也是权限控制的重要一环。