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 # 给所有人加执行权限
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还在)
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文件系统(大文件场景推荐)
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项目时就会顺手很多。下一章我们聊聊用户和组管理,这也是权限控制的重要一环。