1. Linux目录结构:从零开始理解系统布局
刚接触Linux时,最让人困惑的就是那些看似随意的目录名称。其实Linux的文件系统结构遵循Filesystem Hierarchy Standard(FHS)标准,每个目录都有其特定用途。理解这个结构,就像拿到了整栋大楼的平面图。
1.1 根目录:系统的心脏
/(根目录)是整个文件系统的起点,所有其他目录都从这里延伸。想象它是一个巨大的树干,其他目录都是它的分支。这里有几个关键点需要注意:
- 根目录下通常只包含子目录,极少直接存放文件
- 根目录的权限设置非常严格,普通用户通常只有读取权限
- 系统启动时,根文件系统会首先被挂载
提示:在根目录下执行
ls -l,你会看到类似dr-xr-xr-x的权限设置,这意味着即使是root用户也不能直接在根目录下创建文件(虽然技术上可行,但这是不好的实践)
1.2 /bin和/sbin:基础工具仓库
这两个目录存放着系统最基本的命令工具:
/bin(Binary)包含普通用户和系统管理员都需要的命令,如ls、cp、mv等/sbin(System Binary)则存放系统管理命令,如fdisk、ifconfig等
有趣的是,在现代Linux发行版中,这两个目录通常是/usr/bin和/usr/sbin的符号链接。这是为了遵循新的文件系统布局标准。
1.3 /etc:系统的控制中心
/etc(Editable Text Configuration)目录是系统配置的核心所在。这里存放的都是纯文本配置文件,可以用任何文本编辑器修改。几个关键文件:
/etc/passwd:用户账户信息/etc/shadow:加密后的用户密码(仅root可读)/etc/group:用户组信息/etc/fstab:文件系统挂载表/etc/hosts:本地主机名解析
安全提示:修改/etc下的文件前,一定要先备份!一个错误的配置可能导致系统无法启动。
1.4 /home和/root:用户的私人空间
/home目录下每个用户都有一个以用户名命名的子目录,用于存放个人文件/root是超级用户的家目录,与普通用户隔离
家目录的结构通常包括:
code复制/home/username/
├── Desktop/
├── Documents/
├── Downloads/
├── Music/
├── Pictures/
└── .config/ # 用户级应用程序配置
1.5 /var:动态数据的大本营
/var(Variable)目录存放经常变化的文件:
/var/log:系统日志/var/cache:应用程序缓存/var/spool:打印队列、邮件等/var/www:网站文件(Apache默认)/var/lib:数据库文件等
日志文件是系统排障的第一手资料。常见的日志文件包括:
/var/log/syslog:通用系统日志/var/log/auth.log:认证相关日志/var/log/kern.log:内核日志/var/log/apt/:包管理日志
2. Linux核心命令:从入门到精通
2.1 文件系统导航
2.1.1 基本导航命令
pwd(Print Working Directory)显示当前目录的绝对路径。这个简单的命令在复杂的目录结构中特别有用,尤其是当你通过符号链接进入某个目录时。
ls命令可能是使用最频繁的命令之一。除了基本的-l(长格式)、-a(显示隐藏文件)参数外,还有一些实用技巧:
bash复制# 按文件大小排序(大到小)
ls -lS
# 按修改时间排序(新到旧)
ls -lt
# 递归列出子目录内容
ls -R
# 显示inode号(排查硬链接时有用)
ls -i
cd命令的进阶用法:
bash复制# 切换到上一个工作目录
cd -
# 使用pushd/popd实现目录栈
pushd /path/to/dir1 # 进入dir1并压栈
pushd /path/to/dir2 # 进入dir2并压栈
popd # 返回上一个目录
2.1.2 通配符技巧
Linux shell支持强大的通配符(globbing)功能:
bash复制# 匹配所有txt文件
ls *.txt
# 匹配a开头,e结尾的5字符文件名
ls a???e
# 匹配1.txt或2.txt
ls {1,2}.txt
# 匹配1到10的数字
ls file[1-10].txt
2.2 文件操作命令
2.2.1 文件创建与查看
touch命令不仅可以创建空文件,还可以:
bash复制# 批量创建文件
touch file{1..10}.txt
# 修改文件时间戳(常用于触发某些构建系统)
touch -t 202301010000 file.txt # 设置为2023年1月1日
查看文件内容的命令选择:
cat:快速查看小文件less:交互式查看大文件(支持搜索和导航)head/tail:查看文件开头/结尾od:查看二进制文件
2.2.2 文件复制与移动
cp命令的进阶用法:
bash复制# 保留文件属性(权限、时间戳等)
cp -p source dest
# 创建硬链接而非复制
cp -l source dest
# 交互式复制(覆盖前询问)
cp -i source dest
mv命令实际上执行的是重命名操作,在同一个文件系统内是原子操作(瞬间完成)。跨文件系统的移动实际上是复制+删除。
2.2.3 文件删除
rm命令的危险性众所周知。一些安全措施:
bash复制# 使用别名防止误删
alias rm='rm -i'
# 使用trash-cli替代rm
sudo apt install trash-cli
alias rm='trash-put'
2.3 权限管理深入
2.3.1 权限表示法
Linux权限分为三组:
- 所有者权限(u)
- 组权限(g)
- 其他用户权限(o)
每种权限用数字表示:
- 读(r)=4
- 写(w)=2
- 执行(x)=1
例如rwxr-xr--换算为数字:
- 所有者:rwx=4+2+1=7
- 组:r-x=4+0+1=5
- 其他:r--=4+0+0=4
所以权限数字是754
2.3.2 特殊权限
除了基本的rwx,还有三个特殊权限位:
- SUID(4):执行时以文件所有者身份运行
- SGID(2):执行时以文件所属组身份运行,或目录下新建文件继承目录的组
- Sticky(1):目录中的文件只能被所有者删除
设置方法:
bash复制chmod u+s file # 设置SUID
chmod g+s dir # 设置SGID
chmod +t dir # 设置Sticky bit
2.3.3 ACL(访问控制列表)
基本权限系统有时不够灵活,可以使用ACL:
bash复制# 查看ACL
getfacl file
# 设置ACL
setfacl -m u:username:rwx file
setfacl -m g:groupname:rx file
2.4 查找与搜索
2.4.1 find命令高级用法
find是Linux最强大的搜索工具之一:
bash复制# 按时间查找
find / -mtime -1 # 过去24小时修改过的文件
find / -atime +30 # 超过30天未访问的文件
# 按大小查找
find / -size +100M # 大于100MB的文件
find / -size -10k # 小于10KB的文件
# 组合条件
find /tmp -type f -name "*.tmp" -mtime +7 -delete # 删除7天前的临时文件
2.4.2 grep文本搜索
grep是文本处理的瑞士军刀:
bash复制# 基本搜索
grep "pattern" file
# 递归搜索
grep -r "pattern" dir/
# 显示匹配行前后内容
grep -A 3 -B 2 "pattern" file # 显示匹配行及前后3行和2行
# 使用正则表达式
grep -E "^[A-Z]{3}[0-9]{3}$" file # 匹配ABC123格式
2.5 系统监控与进程管理
2.5.1 进程查看
ps命令的常用参数组合:
bash复制ps aux # BSD风格,显示所有进程
ps -ef # UNIX风格,显示所有进程
ps -e --forest # 显示进程树
top交互命令:
- M:按内存使用排序
- P:按CPU使用排序
- k:杀死进程(输入PID)
- 1:显示每个CPU核心的使用情况
2.5.2 系统资源监控
内存查看:
bash复制free -h # 人类可读格式
cat /proc/meminfo # 详细内存信息
vmstat 1 # 实时内存和系统状态
磁盘I/O监控:
bash复制iostat -x 1 # 磁盘I/O统计
iotop # 类似top的I/O监控工具
3. 实战场景:从新手到管理员
3.1 日常文件管理
3.1.1 批量重命名文件
使用rename命令:
bash复制# 将所有.html改为.htm
rename 's/\.html$/\.htm/' *.html
# 使用mmv工具(需要安装)
mmv '*.old' '#1.new'
3.1.2 文件比较与差异
bash复制# 简单比较
diff file1 file2
# 并排比较
diff -y file1 file2
# 目录比较
diff -r dir1 dir2
# 使用vimdiff(更直观)
vimdiff file1 file2
3.2 系统维护任务
3.2.1 磁盘空间管理
查找大文件:
bash复制# 查找大于100MB的文件
find / -type f -size +100M -exec ls -lh {} \;
# 按目录统计大小
du -h --max-depth=1 / | sort -h
清理旧文件:
bash复制# 删除30天前的日志文件
find /var/log -type f -name "*.log" -mtime +30 -delete
3.2.2 系统更新与包管理
Debian/Ubuntu系统:
bash复制sudo apt update # 更新包列表
sudo apt upgrade # 升级所有包
sudo apt autoremove # 删除不需要的包
RHEL/CentOS系统:
bash复制sudo yum check-update # 检查更新
sudo yum update # 更新所有包
sudo yum autoremove # 清理
3.3 网络配置与诊断
3.3.1 网络状态查看
现代Linux推荐使用ip命令替代旧的ifconfig:
bash复制ip addr show # 显示网络接口
ip route show # 显示路由表
ip neigh show # 显示ARP表
3.3.2 网络诊断工具
bash复制ping example.com # 基本连通性测试
traceroute example.com # 路由追踪
mtr example.com # 结合ping和traceroute
nc -zv example.com 80 # 端口测试
telnet example.com 80 # 原始TCP连接测试
4. 安全实践:保护你的系统
4.1 用户与权限安全
4.1.1 用户管理最佳实践
bash复制# 创建新用户并设置家目录
sudo useradd -m -s /bin/bash username
# 设置密码(要求复杂度)
sudo passwd username
# 锁定账户
sudo usermod -L username
# 查看用户登录历史
last
4.1.2 sudo配置
编辑/etc/sudoers(使用visudo命令):
code复制# 允许用户执行特定命令
username ALL=(ALL) /usr/bin/apt,/usr/bin/systemctl
# 允许组执行所有命令
%admin ALL=(ALL) ALL
4.2 系统监控与入侵检测
4.2.1 日志监控
使用journalctl(systemd系统):
bash复制# 查看系统日志
journalctl -xe
# 跟踪特定服务日志
journalctl -u nginx -f
# 按时间筛选
journalctl --since "2023-01-01" --until "2023-01-02"
4.2.2 文件完整性检查
使用AIDE(高级入侵检测环境):
bash复制sudo apt install aide
sudo aideinit
sudo aide --check
4.3 防火墙配置
使用ufw(简单防火墙):
bash复制sudo ufw enable # 启用防火墙
sudo ufw allow ssh # 允许SSH
sudo ufw allow 80/tcp # 允许HTTP
sudo ufw status verbose # 查看状态
或者直接使用iptables:
bash复制# 允许已建立的连接
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 默认拒绝所有
sudo iptables -P INPUT DROP
5. 高效工作流:Shell技巧与脚本
5.1 Shell快捷键
- Ctrl+A:移动到行首
- Ctrl+E:移动到行尾
- Ctrl+U:删除到行首
- Ctrl+K:删除到行尾
- Ctrl+R:反向搜索历史命令
- !!:重复上一条命令
- !$:上一条命令的最后一个参数
5.2 脚本编写基础
一个简单的备份脚本示例:
bash复制#!/bin/bash
# 简单备份脚本
BACKUP_DIR="/backups"
SOURCE_DIR="$HOME/documents"
DATE=$(date +%Y%m%d)
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 创建压缩备份
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR"
# 删除7天前的备份
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +7 -delete
echo "Backup completed: $BACKUP_DIR/backup_$DATE.tar.gz"
5.3 实用工具推荐
tmux或screen:终端复用器htop:增强型进程查看器ncdu:磁盘使用分析器jq:JSON处理器rsync:高效文件同步工具ag(The Silver Searcher):更快的代码搜索工具
6. 问题排查:从症状到解决方案
6.1 常见问题诊断流程
-
系统无法启动
- 检查/boot分区空间
- 使用Live CD修复grub
- 检查/etc/fstab是否有误
-
磁盘空间不足
- 使用
df -h查看挂载点 - 使用
du -sh *查找大目录 - 检查日志文件(/var/log)
- 使用
-
服务无法启动
- 使用
journalctl -xe查看日志 - 检查端口冲突
ss -tulnp - 测试配置文件语法(如
nginx -t)
- 使用
6.2 性能问题排查
CPU瓶颈:
bash复制top -H # 查看线程级CPU使用
perf top # 性能分析工具
mpstat -P ALL 1 # 多核CPU统计
内存问题:
bash复制free -m # 查看内存使用
vmstat 1 # 查看swap使用
cat /proc/meminfo # 详细内存信息
I/O瓶颈:
bash复制iostat -x 1 # 磁盘I/O统计
iotop # 进程级I/O监控
7. 进阶学习路径
7.1 推荐学习资源
-
书籍:
- 《Linux命令行与shell脚本编程大全》
- 《鸟哥的Linux私房菜》
- 《UNIX环境高级编程》
-
在线资源:
- Linux man pages(
man command) - TLDP(The Linux Documentation Project)
- Arch Wiki(即使不使用Arch Linux也很有参考价值)
- Linux man pages(
7.2 认证路径
- Linux Foundation Certified System Administrator (LFCS)
- Red Hat Certified System Administrator (RHCSA)
- CompTIA Linux+
7.3 实践建议
- 每天学习并实践一个新命令
- 尝试用命令行完成所有日常任务
- 搭建自己的Linux服务器(如Raspberry Pi项目)
- 参与开源项目,阅读其部署和维护脚本
- 定期备份并尝试恢复,熟悉灾难恢复流程
8. 个人经验分享
在实际工作中,有几个习惯让我受益匪浅:
-
保持学习笔记:每学到一个新命令或技巧,立即记录并分类保存。我使用Markdown文件配合
grep快速检索。 -
脚本化重复工作:任何需要执行超过三次的操作,都应该考虑写成脚本。这不仅节省时间,还能减少人为错误。
-
理解而非记忆:Linux命令的参数很多,与其死记硬背,不如理解其设计逻辑。例如,
tar的-x表示extract,-z表示gzip,-v表示verbose,这样组合起来就容易记住了。 -
安全第一:在执行可能产生严重后果的命令前(特别是
rm、dd、chmod等),总是先通过--help或man确认语法,或者先在不重要的文件上测试。 -
善用帮助系统:Linux自带的文档系统非常完善。记住三个关键命令:
man command:查看命令手册command --help:快速查看用法info command:更详细的文档(某些命令)
最后,Linux的学习是一个持续的过程。即使工作了十多年,我仍然每天都能学到新东西。保持好奇心和耐心,你会发现命令行不仅强大,而且充满乐趣。