1. 为什么我建议每个Linux用户都建一份自己的命令速查手册
刚接触Debian或者Ubuntu那会儿,我最大的感受就是——图形界面能做的事,命令行基本都能做,而且更快;但问题是,命令太多、参数太杂,今天查了明天忘,明天忘了后天又得重新搜。后来我养成了一个习惯:每解决一个实际问题,就把对应的命令和操作步骤记到自己的笔记里,时间一长,这份笔记就成了我日常运维和开发中最依赖的东西。
这篇内容就是基于我这些年积累的Debian/Ubuntu/Linux常用操作设置和命令整理出来的,不是那种从手册里抄一遍的“命令大全”,而是按实际使用场景来组织的——系统装好之后要做什么、日常维护看什么、出问题了怎么排查、效率怎么提上去。适合刚上手Linux的新手建立操作框架,也适合用了一段时间但总觉得知识零散的朋友做一次系统梳理。
我尽量把每条命令背后的逻辑讲清楚,让你知道“为什么要这么敲”,而不是死记硬背。同时会穿插一些我踩过的坑和实际验证过的技巧,这些在官方文档里通常不会写,但真正用起来能省不少时间。
2. 系统初始化与基础环境配置
2.1 装完系统后我必做的几件事
很多人装完Debian或Ubuntu之后就直接开始装软件了,但其实有几件基础工作如果一开始没做好,后面会反复遇到麻烦。我的习惯是按顺序做以下几步。
第一件事是更新软件源和已安装的包。这一步看似简单,但很多人会忽略update和upgrade的区别。apt update只是刷新软件源索引,告诉你有哪些包有新版本可用;apt upgrade才是真正去下载和安装更新。我一般会连着敲:
sudo apt update && sudo apt upgrade -y这里加-y是为了避免每个包都手动确认,批量更新时效率高很多。如果你用的是Ubuntu的LTS版本,更新频率可以低一些;如果是滚动更新的发行版或者开发机,建议每周至少跑一次。
第二件事是配置时区和时间同步。时间不对会导致日志时间戳混乱、证书验证失败、定时任务执行异常等一堆问题。查看当前时区:
timedatectl如果时区不对,用timedatectl set-timezone Asia/Shanghai来设置。时间同步一般由systemd-timesyncd负责,确认它处于active状态就行。我遇到过一台测试机时间慢了十几分钟,排查了半天应用问题,最后发现是时间同步没开,这种坑踩一次就够了。
第三件事是检查磁盘空间和分区情况。df -h看整体使用率,lsblk看块设备结构。如果/分区快满了,后面装什么都费劲。我一般会确保根分区至少留20%的余量,/var和/home如果单独分区也要关注。
2.2 用户权限与sudo配置的实操细节
Linux的权限体系是核心,但很多人对sudo的理解只停留在“命令前面加sudo”。实际上/etc/sudoers文件的配置方式直接影响到安全性和便利性。
编辑sudoers文件必须用visudo命令,不要直接用文本编辑器打开。原因是visudo会在保存时做语法检查,如果写错了会提示你,避免因为配置错误导致所有人都无法使用sudo。我见过有人直接vim /etc/sudoers改错了,结果root密码又忘了,只能进恢复模式修复。
一个常见的需求是让某个用户执行sudo时不需要输密码。在sudoers文件里加一行:
username ALL=(ALL) NOPASSWD: ALL但我要提醒的是,这在个人开发机上方便,在生产环境或者多人共用的机器上要慎重。更安全的做法是只对特定命令免密,比如只允许免密重启某个服务。
另外,把用户加入sudo组是Ubuntu下的标准做法:
sudo usermod -aG sudo username注意-aG的-a表示追加,如果不加-a只用-G,会把用户从其他附加组里移除,这是个很危险的细节。改完之后需要重新登录才生效,或者用newgrp sudo临时切换。
2.3 网络配置与SSH服务调优
Debian和Ubuntu从某个版本开始默认用netplan来管理网络配置(Ubuntu)或者systemd-networkd(Debian),但很多人还是习惯看/etc/network/interfaces。我建议先确认你的系统用的是哪套网络管理工具:
systemctl status systemd-networkd systemctl status NetworkManager哪个在跑就用哪套的配置方式,不要混着改,否则会出现配置不生效的情况。
SSH方面,我建议做几个基础的安全和便利性调整。修改/etc/ssh/sshd_config:
- 把
PermitRootLogin改成no,禁止root直接登录 - 把
PasswordAuthentication根据情况改成no,改用密钥登录 - 调整
ClientAliveInterval和ClientAliveCountMax来避免长时间不操作被断开
改完配置后一定要先sshd -t测试语法,没问题再systemctl reload sshd。千万不要直接restart,万一配置有问题,你当前的连接断了就再也连不上了。我有一次就是改完直接restart,结果配置里有个拼写错误,只能去机房接显示器修复。
3. 文件与目录操作的高频命令与技巧
3.1 文件查找与批量处理的实战方法
find命令是Linux下最强大的文件查找工具,但参数多到让人记不住。我常用的几个组合场景是这样的。
按名称查找并执行操作,比如找出所有.log文件并删除:
find /var/log -name "*.log" -type f -mtime +30 -delete这里的-mtime +30表示修改时间在30天以前,-type f限定只找普通文件。加-delete之前建议先用-print确认一下找到的文件列表,避免误删。
按大小查找大文件,排查磁盘占用时特别有用:
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null2>/dev/null是为了屏蔽权限不足的报错信息,不然输出会非常乱。
locate命令比find快得多,因为它查的是预建索引数据库。但新创建的文件可能还没被索引到,需要先sudo updatedb更新数据库。我一般用locate做快速定位,用find做精确查找和批量操作。
3.2 权限管理中的常见误区与正确做法
文件权限是Linux新手最容易出错的地方之一。chmod 777被很多人当成万能解药,但这在生产环境是严重的安全隐患。
先理清基本概念:r对应数字4,w对应2,x对应1。所以755就是所有者有读写执行权限,组用户和其他用户有读和执行权限。对于目录来说,x权限表示能否进入该目录,r表示能否列出目录内容,w表示能否在目录中创建或删除文件。
一个常见的误区是认为给文件加了x权限就能执行。实际上脚本文件要能执行,除了x权限,文件头部的shebang行(比如#!/bin/bash)也很关键。另外,如果脚本是在Windows下编辑后传到Linux的,可能带有\r换行符,导致执行时报“bad interpreter”错误。解决方法是用dos2unix转换,或者sed -i 's/\r$//' filename去掉回车符。
chown改所有者,chgrp改所属组,但更常用的是chown user:group file一次改完。递归修改用-R,但要对符号链接小心,-R默认会跟随链接,可能改到意料之外的文件。加-h可以只改链接本身而不跟随。
3.3 压缩解压与归档的完整命令速查
Linux下常见的压缩格式有.tar.gz、.tar.bz2、.zip、.xz等,我整理了一个速查表:
| 操作 | 命令 |
|---|---|
| 创建tar.gz | tar -czvf archive.tar.gz /path/to/dir |
| 解压tar.gz | tar -xzvf archive.tar.gz |
| 创建tar.bz2 | tar -cjvf archive.tar.bz2 /path |
| 解压tar.bz2 | tar -xjvf archive.tar.bz2 |
| 创建zip | zip -r archive.zip /path |
| 解压zip | unzip archive.zip -d /target |
| 查看tar内容 | tar -tzvf archive.tar.gz |
记忆技巧:tar的参数里,c是create,x是extract,t是list,z是gzip,j是bzip2,v是verbose,f是file。组合起来就是czvf、xzvf、tzvf。
我踩过的一个坑是:在解压时没有先查看压缩包内容,直接解压到了一个已有文件的目录,结果覆盖了重要文件。所以现在养成了习惯,先用-t看一下内容再解压。另外,解压时加-C /target/dir可以指定目标目录,避免文件散落在当前目录。
4. 系统监控与性能排查的实用命令
4.1 实时资源监控与历史数据查看
top和htop是最常用的实时监控工具。htop界面更友好,支持鼠标操作和颜色区分,但需要额外安装。top的优势在于所有Linux都自带,在最小化安装的服务器上也能用。
top里我重点关注几个指标:load average三个数值分别代表1分钟、5分钟、15分钟的平均负载。一般来说,这个数值不应该超过CPU核心数。比如4核的机器,load average持续超过4就说明有压力了。但要注意,负载高不一定是CPU的问题,IO等待也会推高负载值。
free -h看内存使用,重点看available那一列,它才是真正可用的内存。buff/cache虽然被算作已使用,但实际上是可回收的缓存,不用太担心。
iostat -x 1看磁盘IO情况,%util接近100%说明磁盘是瓶颈。vmstat 1可以同时看CPU、内存、IO、上下文切换等综合指标,排查性能问题时我一般会同时开几个终端分别跑这些命令。
4.2 进程管理与服务控制的正确姿势
找进程用ps aux | grep xxx,但更推荐用pgrep -af xxx,输出更干净。杀进程用kill PID,如果普通kill不生效再用kill -9 PID。但-9是强制杀死,进程没有机会做清理工作,可能导致数据不一致或临时文件残留,所以能不用就不用。
systemctl是管理systemd服务的主力命令:
systemctl status nginx # 查看服务状态 systemctl start nginx # 启动 systemctl stop nginx # 停止 systemctl restart nginx # 重启 systemctl reload nginx # 重载配置(不中断服务) systemctl enable nginx # 开机自启 systemctl disable nginx # 取消自启reload和restart的区别很关键。reload是让服务重新读取配置文件而不中断现有连接,适合Nginx、Apache这类支持热重载的服务。restart是完全停止再启动,会中断服务。生产环境改配置优先用reload。
查看服务日志用journalctl -u nginx -f,-f是实时跟踪。加--since "10 min ago"可以只看最近10分钟的日志。journalctl的日志默认是存在内存里的,重启就没了,如果要持久化需要修改/etc/systemd/journald.conf里的Storage=persistent。
4.3 磁盘空间分析与清理策略
磁盘满了是运维中最常见的问题之一。df -h看整体,du -sh *看当前目录下各子目录的大小。但du在目录很大的时候会很慢,我一般用du -sh --max-depth=1 /path来限制深度。
更快的方案是用ncdu,它是一个交互式的磁盘使用分析工具,扫描完后可以用方向键浏览,按d直接删除文件。安装:sudo apt install ncdu。
常见的磁盘占用大户包括:/var/log下的日志文件、/var/cache/apt下的包缓存、Docker的镜像和容器层、以及各种临时文件。清理APT缓存用sudo apt clean,清理旧内核用sudo apt autoremove。
日志方面,journalctl --vacuum-size=500M可以限制日志总大小为500M,journalctl --vacuum-time=7d只保留最近7天。对于/var/log下的传统日志文件,可以配置logrotate来做自动轮转和清理。
注意:清理任何文件之前,先确认这个文件不是正在被某个进程使用。用
lsof | grep deleted可以查看已删除但空间未释放的文件,这种情况需要重启对应进程才能真正释放空间。
5. 软件包管理与系统更新维护
5.1 apt命令的进阶用法与常见问题
apt是Debian系最核心的包管理工具,但很多人只用过install和remove。以下是我常用的进阶操作。
搜索包:apt search keyword。但搜索结果可能很多,可以配合grep过滤。查看包信息:apt show packagename,会显示版本、依赖、大小、描述等。查看某个文件属于哪个包:dpkg -S /path/to/file。查看某个包安装了哪些文件:dpkg -L packagename。
安装指定版本:apt install packagename=version。这在需要回退版本时很有用。先apt-cache madison packagename列出可用版本,再指定安装。
apt和apt-get的区别:apt是面向用户的命令,输出更友好,有进度条;apt-get更偏向脚本使用,输出格式稳定。在写自动化脚本时建议用apt-get,日常操作apt更顺手。
一个常见问题是apt update报错“Release file expired”或者GPG签名错误。前者通常是系统时间不对,后者可能是软件源的签名密钥过期了。解决方法分别是校准时间和更新密钥。如果某个第三方源一直报错,可以在/etc/apt/sources.list.d/下临时注释掉对应的源文件。
5.2 系统升级与内核管理的注意事项
Ubuntu的版本升级用do-release-upgrade,Debian用修改sources.list后apt full-upgrade。不管哪种方式,升级前一定要备份重要数据,并且确保有足够的磁盘空间。
内核升级后,旧内核不会自动删除,会占用/boot分区的空间。/boot满了会导致无法安装新内核,进而导致apt upgrade失败。查看已安装的内核:
dpkg --list | grep linux-image删除旧内核用sudo apt autoremove --purge,它会自动清理不再需要的依赖和旧内核。但要注意,当前正在运行的内核不会被删除,所以至少会保留一个可用的。
我遇到过/boot只有200M分区的情况,两三个内核就满了。这种时候要么手动删除旧内核,要么在安装时就把/boot分大一点。如果已经装好了不方便重新分区,可以定期手动清理。
5.3 从源码编译安装软件的正确流程
有些软件在APT源里没有,或者版本太旧,需要从源码编译。基本流程是:
./configure --prefix=/usr/local make -j$(nproc) sudo make install--prefix指定安装路径,-j$(nproc)表示用所有CPU核心并行编译,能大幅缩短编译时间。但并行编译偶尔会因为依赖顺序问题出错,这时候去掉-j参数用单线程重新编译通常能解决。
编译前需要安装开发工具和依赖库:sudo apt install build-essential,以及具体的依赖如libssl-dev、zlib1g-dev等。configure脚本报错时,仔细看错误信息,通常是缺少某个头文件或库,对应的-dev包装上就好。
源码安装的软件不会被APT管理,卸载时需要回到源码目录执行sudo make uninstall(如果Makefile支持的话)。所以我现在更倾向于用checkinstall代替make install,它会把源码安装的软件打包成deb包,纳入APT管理体系,后续可以用apt remove卸载。
6. 文本处理与效率提升的实用技巧
6.1 grep、sed、awk三剑客的日常用法
这三个工具是Linux文本处理的核心,但很多人觉得它们太复杂。其实日常使用中掌握几个固定模式就够了。
grep最常用的场景是过滤输出。grep -r "keyword" /path递归搜索,grep -i忽略大小写,grep -v反向匹配(排除包含关键词的行),grep -c只输出匹配行数。组合使用:grep -rn "TODO" --include="*.py"只在Python文件中搜索TODO标记。
sed最常用的是替换:sed -i 's/old/new/g' file。-i表示直接修改文件,不加-i只输出到终端。g表示全局替换,不加只替换每行第一个匹配。我经常用sed -n '10,20p' file来查看文件的第10到20行,比head和tail组合更方便。
awk适合按列处理。awk '{print $1, $3}' file打印第1和第3列。awk -F: '{print $1}' /etc/passwd用冒号做分隔符打印用户名。awk '$3 > 100 {print $0}' file打印第3列大于100的行。统计求和:awk '{sum += $1} END {print sum}' file。
这三个工具组合起来威力更大。比如统计Nginx日志中访问量前10的IP:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -106.2 管道与重定向的进阶理解
管道|把前一个命令的标准输出接到后一个命令的标准输入。重定向>覆盖写入文件,>>追加写入,2>重定向标准错误,&>同时重定向标准输出和标准错误。
一个常见的困惑是sudo echo "text" > /root/file为什么不行。原因是重定向是由shell执行的,而shell没有root权限,所以重定向会失败。正确做法是echo "text" | sudo tee /root/file,tee命令同时输出到终端和文件,而且它是以sudo权限运行的。
tee -a是追加模式。在写脚本时,我经常用command 2>&1 | tee -a logfile来同时记录日志到文件和终端,方便调试。
xargs配合管道使用,把标准输入转换成命令行参数。比如find . -name "*.tmp" | xargs rm -f。但文件名中有空格时会出问题,加-print0和xargs -0可以解决:
find . -name "*.tmp" -print0 | xargs -0 rm -f6.3 定时任务与环境变量配置
crontab -e编辑当前用户的定时任务,crontab -l列出已有任务。格式是五个星号分别代表分、时、日、月、周,后面跟要执行的命令。
# 每天凌晨3点执行备份 0 3 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1crontab里最容易踩的坑是环境变量问题。cron执行时的PATH和登录shell的PATH不一样,所以脚本里用到的命令最好写绝对路径,或者在脚本开头显式设置PATH。另外,cron不会加载.bashrc或.profile,所以自定义的环境变量需要在脚本里单独source或者直接定义。
系统级的定时任务除了/etc/crontab,还有/etc/cron.d/目录和systemd timer。systemd timer比传统cron更灵活,支持更精细的时间控制和依赖管理。创建一个timer需要两个文件:.service定义要执行的任务,.timer定义触发时间。
环境变量方面,/etc/environment是系统级的环境变量文件,对所有用户生效。用户级的在~/.bashrc或~/.profile里设置。export VAR=value设置当前会话的环境变量。查看所有环境变量用env或printenv。我建议把常用的别名和函数放在~/.bash_aliases里,然后在.bashrc中source它,这样配置更清晰。
7. 常见故障排查与应急处理实录
7.1 系统无法启动的排查思路
系统起不来是最让人紧张的情况,但大部分时候是有规律可循的。我的排查顺序是:先看能不能进GRUB,能进GRUB说明引导程序没问题;然后看内核能不能加载,如果卡在内核加载阶段,可能是内核更新出了问题或者/boot分区满了;最后看能不能进单用户模式或恢复模式。
进入恢复模式的方法是在GRUB菜单里选择“Advanced options”,然后选带“recovery mode”的内核。进去之后可以选择fsck检查文件系统、dpkg修复包管理、root进入root shell。
如果/boot满了导致无法启动,可以在恢复模式的root shell里删除旧内核:
dpkg --list | grep linux-image apt purge linux-image-旧版本号如果GRUB本身坏了,需要用Live USB启动,然后chroot到原系统重新安装GRUB。这个过程稍微复杂一些,但网上有详细步骤,核心就是挂载根分区、挂载必要的虚拟文件系统、chroot、grub-install、update-grub。
7.2 网络不通的分层排查法
网络问题排查我习惯按OSI模型从下往上查。先看物理层和链路层:ip link show确认网卡是否UP,ethtool eth0看网线是否连接。然后看网络层:ip addr show确认IP地址是否正确,ip route show确认路由表。再往上:ping 网关、ping 外网IP、ping 域名,逐步定位问题出在哪一层。
如果ping IP通但ping 域名不通,那就是DNS问题。检查/etc/resolv.conf里的DNS服务器配置。但要注意,这个文件可能被systemd-resolved或NetworkManager动态管理,直接改可能不生效。用resolvectl status查看当前的DNS配置。
如果所有网络都不通,先检查防火墙规则:sudo iptables -L -n或者sudo nft list ruleset。Ubuntu默认用ufw,sudo ufw status查看状态。我遇到过防火墙规则把自己锁在外面的情况,这时候只能通过控制台或者恢复模式进去关掉防火墙。
7.3 磁盘满、内存泄漏与CPU飙高的应急处理
磁盘满的应急处理:先用df -h确认哪个分区满了,然后du -sh /*逐层定位大目录。如果是日志文件占满,可以临时清空:> /var/log/bigfile.log(注意是清空不是删除,删除可能导致进程继续写入已删除的文件,空间不会释放)。如果是Docker占满,docker system prune -a可以清理未使用的镜像和容器。
内存泄漏的排查:free -h看内存趋势,ps aux --sort=-%mem | head找出内存占用最高的进程。如果是某个服务持续增长,可能需要重启该服务临时缓解,然后进一步分析原因。valgrind可以用来检测程序的内存泄漏,但需要在开发环境使用。
CPU飙高的排查:top按P键按CPU排序,找到高CPU进程。如果是用户态CPU高,可能是程序逻辑问题;如果是系统态CPU高,可能是IO或锁竞争。perf top可以实时查看热点函数,strace -p PID可以跟踪系统调用。我遇到过一次CPU飙高是因为某个脚本里有个死循环,用strace很快就定位到了。
应急处理的核心原则:先恢复服务,再排查根因。生产环境不要在现场慢慢分析,先用重启、扩容、限流等手段把服务恢复,保留现场信息(日志、dump文件),然后在测试环境慢慢排查。
7.4 常见问题速查表
| 现象 | 可能原因 | 排查命令 | 解决方法 |
|---|---|---|---|
| apt报错Release file expired | 系统时间不对 | date | timedatectl set-ntp true |
| SSH连接被拒绝 | sshd未运行或防火墙拦截 | systemctl status sshd | 启动sshd,检查防火墙规则 |
| 磁盘满但找不到大文件 | 已删除文件被进程占用 | lsof | grep deleted | 重启对应进程 |
| 命令找不到 | PATH不对或包未安装 | echo $PATH | 修正PATH或安装对应包 |
| 权限拒绝 | 文件权限或SELinux/AppArmor | ls -l | 调整权限或策略 |
| 服务启动失败 | 配置错误或端口占用 | journalctl -u 服务名 | 根据日志修正配置 |
| 中文乱码 | locale未设置 | locale | 设置LANG=zh_CN.UTF-8 |
8. 我的个人经验与持续维护建议
这份命令速查我一直在更新,因为Linux生态在变,我自己的使用习惯也在变。早期我追求“记住所有命令”,后来发现这既不现实也没必要。真正重要的是建立一套自己的操作框架:知道遇到什么问题该往哪个方向查,知道哪些命令组合能解决哪类场景,剩下的细节随时查手册就行。
我现在维护这份笔记的方式是:每解决一个新问题,就把命令和简要说明追加到对应的分类下。用Markdown格式写,方便搜索和跳转。定期回顾和整理,把不再用的命令删掉,把新学到的技巧补进去。这样这份笔记就是活的,越用越顺手。
另外,我强烈建议在测试环境或者虚拟机里先验证命令再上生产。尤其是涉及删除、格式化、权限修改的操作,一个参数敲错后果可能很严重。rm -rf后面多一个空格,可能就把整个目录清空了。我现在养成的习惯是,敲完危险命令后先不回车,从头到尾再看一遍,确认路径和参数没问题再执行。
最后分享一个提高效率的小技巧:善用history和Ctrl+R。history | grep keyword可以快速找到之前执行过的命令,Ctrl+R进入反向搜索模式,输入关键词就能调出历史命令。我还会在.bashrc里设置HISTSIZE和HISTFILESIZE大一些,并且加上HISTTIMEFORMAT显示时间戳,方便回溯。这些配置看起来不起眼,但日积月累能省下大量重复输入的时间。