我第一次接触 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             # 只显示匹配的行数

findgrep 是 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                 # 搜索软件

updateupgrade 的区别: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 &          # 后台运行,退出终端也不会停

更推荐用 systemdscreen/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 里,没有什么问题是搜索引擎解决不了的。如果有,就换个关键词再搜一次。


写给每一个在终端面前感到无助的新手,你不是一个人。