我第一次接触 Linux 是在大学。
当时选了一门叫"操作系统"的课,老师让我们装个 Ubuntu 虚拟机。我照着教程一步步来,装完之后看着那个紫色的桌面,一脸懵:然后呢?连个软件都不会装。
打开终端,输入 ls,出来一堆文件夹名字。cd 进去,还是文件夹。当时我的感觉就是:这玩意儿怎么这么反人类?
后来工作了,发现服务器全是 Linux,不用也得用。硬着头皮学了一段时间,慢慢发现——其实也没那么难,就是思维方式要变一下。
为什么你该学点 Linux
不是说让你把 Windows 卸了换 Linux。但如果你是做技术相关工作的,或者以后想做,Linux 基本是绕不开的。
原因很简单:全世界大部分服务器跑的都是 Linux。你用的网站、APP、云服务,背后大概率是 Linux 在撑着。想搞运维、后端、DevOps,甚至前端部署项目,多少都得会点 Linux。
而且说实话,用熟了之后你会发现有些事情在 Linux 上反而更方便。
先搞清楚一个事儿:发行版是什么
你会经常听到 Ubuntu、CentOS、Debian、Fedora、Arch 这些名字。它们都是 Linux,但又不完全一样。
打个比方:Linux 是一个发动机,各个发行版是用这个发动机造出来的不同品牌的车。都能跑,但内饰、配置、操作习惯不太一样。
新手建议从 Ubuntu 开始。社区大,教程多,遇到问题搜一下基本都有人踩过坑。别一上来就搞什么 Arch Linux,那是给自己找不痛快。
CentOS 也很常见,特别是企业服务器。但 CentOS 8 已经停止维护了,现在主流是 AlmaLinux 或 Rocky Linux 作为替代。
安装 Linux
方式一:虚拟机(推荐新手)
下载 VirtualBox 或 VMware,然后下载 Ubuntu 的 ISO 镜像,新建虚拟机装进去。好处是不影响你现有的系统,搞坏了重装就行。
方式二:WSL(Windows 用户)
Windows 10/11 自带 WSL(Windows Subsystem for Linux),不用装虚拟机就能跑 Linux:
wsl --install
重启之后就能在 Windows 里用 Linux 了。推荐装 Ubuntu。
方式三:云服务器
买个便宜的云服务器(阿里云、腾讯云都有几十块一年的),直接远程连上去用。好处是更接近真实生产环境。
方式四:双系统
和 Windows 装在同一台电脑上,开机选择进哪个系统。不太推荐新手,分区搞错了可能把 Windows 也弄坏。
终端:你的新朋友(也是你的噩梦)
Linux 的图形界面其实也能用,但大部分操作还是在终端里完成的。刚开始确实不习惯,用久了你会发现效率比鼠标点来点去高多了。
打开终端,你看到的是这样的东西:
xyf@ubuntu:~$
这就是命令行了。$ 前面是你的用户名和主机名,后面就是你输入命令的地方。如果是 root 用户,提示符会变成 #。
先来几个最基础的:
pwd # 我在哪?(显示当前目录路径)
ls # 这里有什么文件?
ls -la # 显示所有文件(包括隐藏的),详细信息
cd /home # 去 /home 目录
cd .. # 回到上一级目录
cd ~ # 回到家目录(也可以直接 cd)
cd - # 回到上一次所在的目录
clear # 清屏(其实也没清,就是滚上去了)
history # 查看历史命令
Linux 的目录结构
Linux 的文件系统和 Windows 不一样。没有 C 盘 D 盘,所有东西都从 /(根目录)开始。
/ # 根目录,一切的起点
├── home/ # 用户的家目录(类似 Windows 的 C:\Users)
│ ├── xyf/ # 用户 xyf 的家目录
│ └── admin/ # 用户 admin 的家目录
├── etc/ # 配置文件的大本营
├── var/ # 可变数据(日志、缓存等)
│ └── log/ # 日志文件,出问题了来这里找线索
├── tmp/ # 临时文件,重启可能会清空
├── usr/ # 用户安装的软件
│ ├── bin/ # 可执行文件
│ └── local/ # 本地安装的软件
├── opt/ # 第三方软件
├── root/ # root 用户的家目录
├── dev/ # 设备文件
├── proc/ # 进程信息(虚拟文件系统)
└── mnt/ # 挂载点
几个重要目录记住就行:
/home— 你的文件都在这/etc— 改配置来这/var/log— 出问题看日志/tmp— 临时文件
文件和目录操作
这是你百分之百会用到的,必须熟练。
创建
mkdir myfolder # 创建文件夹
mkdir -p a/b/c # 递归创建多层目录
touch myfile.txt # 创建空文件
echo "hello" > file.txt # 创建文件并写入内容(会覆盖)
echo "world" >> file.txt # 追加内容(不会覆盖)
查看
cat myfile.txt # 显示文件全部内容
less myfile.txt # 分页查看(按 q 退出,空格翻页,/搜索)
head -20 myfile.txt # 看前 20 行
tail -20 myfile.txt # 看后 20 行
tail -f /var/log/syslog # 实时跟踪文件变化(看日志超好用)
wc -l myfile.txt # 统计行数
复制、移动、删除
cp file1 file2 # 复制文件
cp -r folder1 folder2 # 复制文件夹(-r 递归)
mv file1 file2 # 移动/重命名
rm file1 # 删除文件
rm -i file1 # 删除前确认
rm -rf myfolder # 删除文件夹及其内容(慎用!)
重点提醒:rm -rf 是个狠命令,执行之前一定要确认你删的是对的。Linux 没有回收站,删了就真的没了。 我见过有人手滑把整个 home 目录删了的。
查找
find / -name "*.log" # 在整个系统里找 .log 文件
find /home -name "*.txt" -mtime -7 # 找最近 7 天修改过的 txt 文件
find . -type f -size +100M # 找大于 100MB 的文件
find . -name "*.tmp" -delete # 找到并删除(慎用)
grep "error" logfile.txt # 在文件里搜 "error"
grep -r "TODO" /home/xyf/project/ # 递归搜索目录下所有文件
grep -i "error" logfile.txt # 忽略大小写
grep -n "error" logfile.txt # 显示行号
grep -c "error" logfile.txt # 只显示匹配的行数
find 和 grep 是 Linux 下最常用的两个查找命令。find 找文件名,grep 找文件内容。
文件权限
Linux 里每个文件都有权限设置,决定谁能读、谁能写、谁能执行。
执行 ls -l 你会看到类似这样的东西:
-rw-r--r-- 1 xyf xyf 1234 May 13 file.txt
drwxr-xr-x 2 xyf xyf 4096 May 13 myfolder
开头那串就是权限。以 -rw-r--r-- 为例:
- rw- r-- r--
│ │ │ │
│ │ │ └── 其他用户:只读
│ │ └──────── 同组用户:只读
│ └─────────────── 文件所有者:可读可写
└──────────────────── 文件类型(- 文件,d 目录)
r 是读(4),w 是写(2),x 是执行(1)。数字加起来就行。
chmod 755 script.sh # rwxr-xr-x(自己全权限,其他人可读可执行)
chmod 600 secret.txt # rw-------(只有自己能读写)
chmod -R 755 myfolder # 递归修改目录下所有文件
chown xyf:xyf myfile.txt # 修改文件所有者
chown -R xyf:xyf myfolder # 递归修改
755 适合脚本和程序,600 适合私密文件,644 适合普通文件。
用户和用户管理
用户操作
whoami # 我是谁
id # 查看用户 ID 和组信息
su - xyf # 切换用户(需要密码)
sudo command # 以 root 权限执行命令
sudo -u xyf command # 以指定用户执行命令
用户管理
sudo useradd -m newuser # 创建用户(-m 创建家目录)
sudo passwd newuser # 设置密码
sudo userdel -r newuser # 删除用户(-r 同时删除家目录)
sudo usermod -aG sudo newuser # 把用户加到 sudo 组
sudoers 文件
不是所有用户都能用 sudo。能用 sudo 的用户在 /etc/sudoers 文件或 /etc/sudoers.d/ 目录里配置。
sudo visudo # 编辑 sudoers 文件(安全方式)
不建议直接用文本编辑器改 sudoers,用 visudo 会做语法检查。
软件安装和管理
apt(Ubuntu/Debian 系)
sudo apt update # 更新软件源列表
sudo apt upgrade # 升级所有已安装的软件
sudo apt install nginx # 安装 nginx
sudo apt install nginx mysql-server # 同时装多个
sudo apt remove nginx # 卸载(保留配置文件)
sudo apt purge nginx # 卸载(连配置文件一起删)
sudo apt autoremove # 清理不再需要的依赖
apt list --installed # 查看已安装的软件
apt search keyword # 搜索软件
update 和 upgrade 的区别:update 是更新软件源列表(知道有哪些新版本),upgrade 是真正把软件升级到新版本。
yum/dnf(CentOS/RHEL/Fedora 系)
sudo yum install nginx # CentOS 7
sudo dnf install nginx # CentOS 8+ / Fedora
sudo yum update # 升级所有软件
sudo yum remove nginx # 卸载
snap
Ubuntu 还有 snap 包管理器:
sudo snap install code --classic # 安装 VS Code
snap list # 查看已安装的 snap
sudo snap remove code # 卸载
进程管理
查看进程
top # 实时查看系统资源和进程(按 q 退出)
htop # top 的美化版(需要安装:sudo apt install htop)
ps aux # 查看所有进程
ps aux | grep nginx # 找 nginx 相关的进程
ps -ef | grep python # 另一种写法
pgrep nginx # 直接返回进程 ID
top/htop 里按 P 按 CPU 排序,按 M 按内存排序,按 k 杀进程。
杀进程
kill 12345 # 发送 SIGTERM 信号(优雅停止)
kill -9 12345 # 发送 SIGKILL 信号(强制杀死)
killall nginx # 杀掉所有叫 nginx 的进程
pkill -f "python app" # 按命令行模式匹配杀进程
kill -9 是最后手段,不到万不得已别用。因为它不给程序保存数据的机会,可能导致数据损坏。
后台运行
command & # 命令在后台运行
nohup command & # 后台运行,退出终端也不会停
更推荐用 systemd 或 screen/tmux 来管理后台进程。
系统服务管理:systemd
现在大部分 Linux 都用 systemd 来管理服务。这组命令必须记住:
sudo systemctl start nginx # 启动服务
sudo systemctl stop nginx # 停止服务
sudo systemctl restart nginx # 重启服务
sudo systemctl reload nginx # 重新加载配置(不中断服务)
sudo systemctl status nginx # 查看状态(非常有用)
sudo systemctl enable nginx # 设置开机自启
sudo systemctl disable nginx # 取消开机自启
systemctl list-units --type=service # 查看所有服务
systemctl list-units --failed # 查看失败的服务
status 命令特别有用,能看到服务是否在运行、最近的日志、PID 等信息。
网络相关
查看网络信息
ip addr # 查看 IP 地址(取代 ifconfig)
ip route # 查看路由表
ss -tlnp # 查看哪些端口在被占用(取代 netstat)
ss -tnp # 查看当前网络连接
ss -tlnp 这个命令特别有用,当你发现某个服务起不来、端口被占用的时候,用它查一下就知道是谁在占着。
网络测试
ping google.com # 测试网络连通性
ping -c 4 google.com # 只 ping 4 次
traceroute google.com # 追踪路由
curl https://example.com # 发 HTTP 请求
curl -I https://example.com # 只看响应头
wget https://xxx.com/file.zip # 下载文件
DNS 相关
nslookup google.com # DNS 查询
dig google.com # 更详细的 DNS 查询
cat /etc/resolv.conf # 查看 DNS 配置
防火墙
Ubuntu 用 ufw,CentOS 用 firewalld:
# Ubuntu/ufw
sudo ufw status # 查看状态
sudo ufw enable # 启用防火墙
sudo ufw allow 22 # 允许 22 端口(SSH)
sudo ufw allow 80/tcp # 允许 80 端口(HTTP)
sudo ufw allow 443/tcp # 允许 443 端口(HTTPS)
sudo ufw delete allow 80 # 删除规则
# CentOS/firewalld
sudo firewall-cmd --state
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
文本编辑:vim 还是 nano
编辑配置文件是 Linux 日常操作。两个常用的编辑器:
nano(推荐新手)
sudo nano /etc/nginx/nginx.conf
界面友好,底部有快捷键提示。Ctrl+O 保存,Ctrl+X 退出,Ctrl+K 剪切行,Ctrl+U 粘贴。
vim(功能强大)
sudo vim /etc/nginx/nginx.conf
vim 有三种模式:普通模式、插入模式、命令模式。刚打开是普通模式,按 i 进入插入模式可以编辑,按 Esc 回到普通模式,输入 :wq 保存退出,:q! 不保存退出。
如果你不小心打开了 vim 不知道怎么退出:按 Esc,然后输入 :q! 回车。
我的建议:新手先用 nano,等你熟练了再学 vim。别一上来就逼自己用 vim,会疯的。
磁盘和存储
查看磁盘
df -h # 查看磁盘使用情况(人类可读格式)
du -sh /home/xyf # 查看某个目录占用多大
du -sh * | sort -rh # 当前目录下各文件/文件夹大小排序
lsblk # 查看磁盘分区
挂载
sudo mount /dev/sdb1 /mnt/usb # 挂载设备
sudo umount /mnt/usb # 卸载
压缩和解压
tar -czf archive.tar.gz folder/ # 压缩
tar -xzf archive.tar.gz # 解压
tar -xzf archive.tar.gz -C /target/ # 解压到指定目录
zip -r archive.zip folder/ # zip 压缩
unzip archive.zip # zip 解压
tar 参数记忆:c 创建,x 解压,z gzip,f 文件,v 显示过程。
定时任务:cron
想让某个命令定期自动执行?用 cron:
crontab -e # 编辑当前用户的定时任务
crontab -l # 查看当前用户的定时任务
cron 表达式格式:
分 时 日 月 周 命令
* * * * * command
例子:
0 2 * * * /usr/bin/backup.sh # 每天凌晨 2 点执行
*/5 * * * * /usr/bin/check.sh # 每 5 分钟执行一次
0 0 * * 0 /usr/bin/cleanup.sh # 每周日零点执行
0 9-18 * * 1-5 /usr/bin/monitor.sh # 工作日 9-18 点每小时执行
* 表示"每",*/5 表示"每隔 5",9-18 表示"9 到 18",1-5 表示"周一到周五"。
日志查看
出问题了第一件事就是看日志。
系统日志
journalctl # 查看所有系统日志
journalctl -u nginx # 查看 nginx 的日志
journalctl -u nginx --since today # 只看今天的
journalctl -f # 实时跟踪(类似 tail -f)
journalctl -p err # 只看错误级别的
应用日志
大部分应用的日志在 /var/log/ 下面:
ls /var/log/ # 看有哪些日志
tail -f /var/log/nginx/access.log # 实时跟踪 nginx 访问日志
tail -f /var/log/nginx/error.log # 实时跟踪 nginx 错误日志
tail -100 /var/log/syslog # 看最后 100 行系统日志
SSH:远程连接
SSH 是连接远程 Linux 服务器的标准方式。
基本连接
ssh user@hostname # 密码登录
ssh -p 2222 user@hostname # 指定端口
ssh -i ~/.ssh/key user@host # 使用密钥文件
密钥认证(推荐)
比密码安全,也更方便:
# 生成密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"
# 把公钥复制到服务器
ssh-copy-id user@hostname
# 之后就可以免密登录了
ssh user@hostname
文件传输
scp file.txt user@host:/remote/path/ # 上传文件
scp user@host:/remote/file.txt ./local/ # 下载文件
scp -r folder/ user@host:/remote/path/ # 上传文件夹
rsync -avz folder/ user@host:/remote/path/ # 同步文件(推荐,支持增量)
系统监控
查看系统资源
# CPU 和内存
top # 实时监控(按 q 退出)
htop # 更好看的 top(需要安装)
free -h # 查看内存使用
# 磁盘
df -h # 磁盘使用情况
iotop # 磁盘 I/O 监控(需要安装)
# 网络
iftop # 网络流量监控(需要安装)
nethogs # 按进程查看网络流量(需要安装)
查看系统信息
uname -a # 内核版本
cat /etc/os-release # 发行版信息
lsb_release -a # Ubuntu 版本
uptime # 运行时间和负载
遇到问题怎么办
看日志。 大部分服务的日志在 /var/log/ 下面。也可以用 journalctl -u 服务名 查看 systemd 管理的服务日志。
看报错信息。 终端里报的错一般都很明确,把报错信息复制下来搜一下,十有八九有人遇到过同样的问题。
man 命令。 不知道某个命令怎么用?man ls 就能看 ls 的完整文档。按 q 退出。虽然大部分是英文,但参数说明都在那。
--help 参数。 大部分命令支持 命令 --help,显示简要帮助信息。
善用 Tab 键。 输入命令或文件路径的时候按 Tab 可以自动补全,省得打错字。按两下 Tab 显示所有可能的选项。
善用上下箭头。 翻看之前执行过的命令,不用重新打。
善用 Ctrl+R。 搜索历史命令,输入关键词就能找到之前执行过的命令。
一些小技巧
管道: | 可以把前一个命令的输出传给后一个命令。比如 ps aux | grep nginx 就是把所有进程的输出传给 grep 去筛选。
重定向: > 把输出写入文件(覆盖),>> 是追加。2>&1 把错误输出也重定向。
后台运行: 命令后面加 & 可以让它在后台跑。Ctrl+Z 挂起当前命令,bg 让它在后台继续,fg 拉回前台。
通配符: * 匹配任意字符,? 匹配单个字符。rm *.tmp 删除所有 tmp 文件。
命令组合: && 前一个成功才执行后一个,|| 前一个失败才执行后一个,; 依次执行不管成败。
别名: 给常用命令起别名:
# 在 ~/.bashrc 或 ~/.zshrc 中添加
alias ll='ls -la'
alias gs='git status'
alias dc='docker compose'
alias dps='docker ps'
最后
Linux 这东西,光看教程是学不会的。你得自己动手,装个虚拟机或者搞个云服务器,真的去敲命令。
刚开始肯定会犯错,会把东西搞坏,会对着终端发呆。没关系,大家都这么过来的。
我到现在也不敢说精通 Linux,经常还是要查文档、搜 Stack Overflow。但这不丢人,谁都不是一开始就会的。
记住一句话:在 Linux 里,没有什么问题是搜索引擎解决不了的。如果有,就换个关键词再搜一次。
写给每一个在终端面前感到无助的新手,你不是一个人。