第一章:初识Linux——理解它的灵魂

1.1 什么是Linux?内核与发行版的区别

很多人混淆了"Linux内核"和"Linux操作系统"这两个概念:

  • Linux内核(Kernel):这是操作系统的心脏。它直接与硬件打交道,负责管理CPU时间片分配、内存寻址、磁盘读写、网络数据包收发等核心任务。内核本身是"看不见"的,它在后台默默工作。

  • Linux发行版(Distribution):这是我们实际安装和使用的操作系统。一个完整的发行版 = Linux内核 + GNU工具集(如ls、grep、gcc等) + 软件包管理器(如apt/yum) + 桌面环境(如GNOME/KDE) + 各种应用程序。

  • 主流发行版家族:

    家族代表发行版包管理工具适合场景
    Debian系Ubuntu、Debian、Linux Mintapt新手入门、桌面开发
    Red Hat系RHEL、Fedora、CentOS Streamdnf/yum企业服务器、生产环境
    SUSE系openSUSE、SLESzypper欧洲企业常用
    独立系Arch Linux、Gentoopacman/源码编译极客定制、深入学习

    新手建议:从Ubuntu Desktop开始,它拥有最完善的图形界面和最大的社区支持,遇到问题几乎都能搜到解决方案。

  • 1.2 Linux的核心哲学:"一切皆文件"

    这是理解Linux的第一把钥匙。Linux将系统中的几乎所有资源都抽象为文件

  • 普通文件(文档、图片、代码)

  • 目录(文件夹)

  • 硬件设备(硬盘 → /dev/sda,键盘 → /dev/input/

  • 网络连接(socket)

  • 进程信息(/proc/ 目录下的虚拟文件)

  • 这种设计的妙处在于统一的操作接口:你可以用 cat 查看文件内容,也可以用 cat /dev/ttyUSB0 读取串口设备的数据;你可以用 echo "hello" > /dev/null 丢弃数据,也可以用 echo "hello" > /dev/tty1 在终端输出。不需要为每种资源学习不同的API。

  • 1.3 Linux的文件系统结构(FHS标准)

    Linux没有Windows那样的C盘、D盘,一切从根目录 / 开始,形成一棵倒置的树。以下是每个开发者必须记住的核心目录:

  • ├── bin/          # 基本用户命令(ls, cp, mv等),所有用户都可执行
    ├── sbin/         # 系统管理命令(fdisk, ifconfig等),通常只有root可执行
    ├── etc/          # 系统和应用程序的配置文件(nginx.conf, sshd_config等)
    ├── home/         # 普通用户的家目录,如 /home/jack
    ├── root/         # root用户的家目录(注意,不在/home下)
    ├── var/          # 经常变化的文件:日志(/var/log)、缓存(/var/cache)邮件(/var/mail)
    ├── tmp/          # 临时文件,重启后通常被清空
    ├── proc/         # 虚拟文件系统,映射进程和内核信息(/proc/cpuinfo, /proc/meminfo)
    ├── dev/          # 设备文件(/dev/sda硬盘, /dev/tty终端)
    ├── usr/          # 用户级应用程序和文件(相当于Windows的 Program Files)
    └── lib/          # 系统库文件(类似于Windows的 DLL)

  • 关键理解:在Linux中,路径分隔符是 / 而不是Windows的 \。路径分为绝对路径(从 / 开始,如 /home/jack/file.txt)和相对路径(从当前目录开始,如 ./file.txt 或 ../dir/)。

第二章:命令行入门——从零开始敲命令

2.1 什么是Shell?

Shell是"外壳",是用户与Linux内核之间的翻译官。你在终端输入命令,Shell解析后传递给内核执行,然后将结果返回给你。

常见的Shell有:

  • Bash(Bourne Again Shell):最主流,功能强大,支持命令补全、历史记录、别名、脚本编程

  • Zsh:比Bash更现代化,Oh-My-Zsh让终端变得绚丽

  • Fish:开箱即用,语法高亮和自动建议做得好

本文所有命令默认在Bash环境下执行。

2.2 文件和目录操作命令

这是你每天都会用到的命令组,务必熟练掌握每一个

ls —— 列出目录内容
ls                  # 列出当前目录的文件(不含隐藏文件)
ls -a               # 列出所有文件,包括以 . 开头的隐藏文件
ls -l               # 以长格式显示详细信息(权限、链接数、属主、大小、修改时间)
ls -h               # 人类可读的文件大小(如 4.2K, 3.1M, 2.5G)
ls -lh              # 组合使用
ls -alh /home       # 列出 /home 目录的详细信息
ls -R               # 递归列出子目录内容

ls -l 输出详解

-rw-r--r-- 1 jack jack 1024 Sep 5 10:30 test.txt
  • 第1位 -:文件类型(- 普通文件,d 目录,l 链接)

  • 第2-4位 rw-:属主权限(可读可写不可执行)

  • 第5-7位 r--:属组权限(只读)

  • 第8-10位 r--:其他人权限(只读)

  • 1:硬链接数

  • jack:文件属主

  • jack:文件属组

  • 1024:文件大小(字节)

  • Sep 5 10:30:最后修改时间

cd —— 切换目录
cd /home/jack      # 切换到 /home/jack
cd ..              # 切换到上级目录(.. 代表上级目录)
cd ../..           # 切换到上上级目录
cd ~               # 切换到当前用户的家目录(~ 是家目录的简写)
cd -               # 切换到上一个访问的目录(快速来回切换)
cd /               # 切换到根目录
pwd —— 显示当前路径
pwd                # 输出当前绝对路径,如 /home/jack/projects
mkdir —— 创建目录
mkdir mydir        # 在当前目录创建 mydir
mkdir -p a/b/c/d   # 递归创建多级目录(如果父目录不存在则自动创建)
mkdir -m 755 mydir # 创建时指定权限
rmdir 与 rm —— 删除
rmdir emptydir     # 只能删除空目录
rm file.txt        # 删除文件
rm -r mydir        # 递归删除目录及其所有内容(危险操作)
rm -f file.txt     # 强制删除,不询问确认(force)
rm -rf /some/dir   # 递归强制删除(使用前务必确认路径!这条命令极其危险)
cp —— 复制
cp source.txt dest.txt          # 复制文件
cp -r source_dir/ dest_dir/      # 递归复制整个目录
cp -i source.txt dest.txt       # 如果目标存在则询问是否覆盖(interactive)
cp -p source.txt dest.txt       # 保留文件属性(权限、时间戳)
cp -a source_dir/ dest_dir/      # 归档复制,保留所有属性(相当于 -r -p -d)
mv —— 移动或重命名
mv oldname.txt newname.txt      # 重命名文件(仍在同一目录)
mv file.txt /home/jack/         # 移动文件到另一个目录
mv -i file.txt /home/jack/      # 如果目标存在则询问

2.3 查看文件内容的命令

cat —— 一次性输出整个文件
cat file.txt        # 输出全部内容
cat file1.txt file2.txt > merged.txt  # 合并多个文件
cat -n file.txt     # 显示行号

注意cat 适合小文件(几十KB),对于几GB的日志文件会直接撑爆终端。

head —— 查看文件头部
head file.txt       # 默认显示前10行
head -n 20 file.txt # 显示前20行
head -n 100 log.txt > top100.log  # 提取前100行保存
tail —— 查看文件尾部
tail file.txt       # 默认显示末尾10行
tail -n 50 file.txt # 显示末尾50行
tail -f log.txt     # 实时追踪文件新增内容(狂按Ctrl+C退出)
tail -f -n 100 log.txt  # 从末尾100行开始实时追踪

tail -f 是调试和监控日志最常用的命令,没有之一。

less 与 more —— 分页查看器
less largefile.log  # 分页查看

less 交互操作

  • 空格键 / PageDown:向下翻一页

  • b / PageUp:向上翻一页

  • Enter:向下翻一行

  • /关键词:向下搜索关键词(按 n 跳到下一个)

  • ?关键词:向上搜索

  • g:跳到文件开头,G:跳到文件末尾

  • q:退出

more 功能较弱,只能向下翻,建议只用 less

2.4 文件统计与过滤

wc —— 统计文件信息
wc file.txt         # 输出 行数 单词数 字节数
wc -l file.txt      # 只统计行数(最常用)
wc -w file.txt      # 只统计单词数
wc -c file.txt      # 只统计字节数
wc -m file.txt      # 只统计字符数(注意中文字符可能占多个字节)
grep —— 强大的文本搜索
grep "error" log.txt           # 在log.txt中搜索包含"error"的行
grep -i "error" log.txt        # 忽略大小写
grep -n "error" log.txt        # 显示匹配行的行号
grep -v "error" log.txt        # 显示不包含"error"的行(反向匹配)
grep -r "TODO" ./src/          # 递归搜索 ./src/ 目录下所有文件
grep -E "error|warning" log.txt  # 使用扩展正则,匹配error或warning

经典组合(从进程列表中找目标):

ps aux | grep nginx | grep -v grep

第一条 ps aux 列出所有进程,管道传给 grep nginx 过滤出包含nginx的行,再传给 grep -v grep 排除grep本身那行。

第三章:重定向与管道——命令组合的艺术

3.1 标准输入输出

Linux中每个命令都有三个数据流:

  • 标准输入(stdin):文件描述符0,默认从键盘接收输入

  • 标准输出(stdout):文件描述符1,默认输出到终端屏幕

  • 标准错误(stderr):文件描述符2,默认输出到终端屏幕

3.2 输出重定向

> —— 覆盖重定向
ls -alh / > list.txt    # 将根目录列表写入list.txt(覆盖原内容)
echo "Hello" > test.txt # 写入"Hello",如果test.txt存在则清空
>> —— 追加重定向
echo "Hello" >> log.txt  # 追加"Hello"到log.txt末尾
date >> log.txt          # 追加当前时间

3.4 管道 | —— 命令链的核心

管道将左边命令的标准输出连接到右边命令的标准输入,像工厂流水线一样串联多个命令:

# 查看CPU信息并过滤
cat /proc/cpuinfo | grep "model name"

# 统计当前目录下有多少个文件
ls -l | wc -l

# 查看历史命令中docker相关操作
history | grep "docker"

# 查看最耗内存的10个进程
ps aux --sort=-%mem | head -11

# 统计nginx访问日志中访问量最高的10个IP
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10

第四章:用户与权限管理——安全的第一道防线

Linux是一个多用户系统,多个用户可以同时登录使用,各用户之间的文件相互隔离。理解用户和权限管理,是保证系统安全的关键。

4.1 用户管理

用户信息存储在 /etc/passwd(注意:不存密码),密码哈希存储在 /etc/shadow(只有root可读)。

useradd —— 添加用户
useradd jack                    # 创建用户jack(但不创建家目录,不设置密码)
useradd -m jack                 # -m:创建家目录 /home/jack
useradd -m -s /bin/bash jack    # -s:指定登录Shell为bash
useradd -m -s /bin/bash -g dev jack  # -g:指定主组为dev组

重要:不加 -m 创建的用户没有家目录,登录时会报错 Could not chdir to home directory

usermod —— 修改用户信息
usermod -s /bin/zsh jack        # 修改jack的Shell为zsh
usermod -g developers jack      # 修改jack的主组
usermod -aG docker jack         # 将jack追加到docker组(-aG表示追加,不会覆盖原有组)
userdel —— 删除用户
userdel jack            # 删除用户jack,但家目录保留
userdel -r jack         # -r:同时删除家目录和邮件池(推荐使用)
passwd —— 设置密码
passwd jack             # root用户修改jack的密码
passwd                  # 当前用户修改自己的密码(会提示输入原密码)
su —— 切换用户
su jack                 # 切换到jack,但环境变量保持当前用户
su - jack               # 切换到jack,并加载jack的环境变量(推荐)
su                      # 切换到root,需要输入root密码
sudo -i                 # 切换到root(有sudo权限时使用)

su 和 su - 的区别

  • su jack:保留当前环境变量,当前目录不变

  • su - jack:切换到jack的家目录,加载jack的 .bashrc.profile 等配置

4.2 组管理

组信息存储在 /etc/group

groupadd developers      # 创建developers组
groupdel developers      # 删除developers组
groups jack              # 查看jack属于哪些组

组的作用是批量管理权限。例如,把多个开发人员加入同一个组,然后对项目目录设置组权限,所有人就都能访问了。

4.3 权限管理(核心中的核心)

权限的组成

每个文件有三组权限,分别对应三类用户:

  • u(user):文件属主

  • g(group):文件属组

  • o(others):其他用户

每组权限包含三个字母:

  • r(read):读权限

  • w(write):写权限

  • x(execute):执行权限

对文件和目录,rwx的含义完全不同:

权限对文件对目录
r可读取文件内容(如 cat)可列出目录内容(如 ls),但需要x配合才能查看文件属性
w可修改文件内容创建、删除、重命名目录中的文件(即使文件本身是只读的)
x可执行文件(脚本或程序)可 cd 进入目录;是访问目录内任何文件的前提

重点理解:删除一个文件,不取决于该文件的权限,而取决于该文件所在目录的写权限。如果目录是 rwx,即使里面的文件是 000,你也能删除它。

chmod —— 修改权限

数字法(最常用)

  • r = 4,w = 2,x = 1

  • 每组权限值 = 三个数字之和

    chmod 755 script.sh    # 属主:7(rwx) 属组:5(r-x) 其他人:5(r-x)
    chmod 644 file.txt     # 属主:6(rw-) 属组:4(r--) 其他人:4(r--)
    chmod 700 secret.sh    # 只有属主可读可写可执行
    chmod 1777 /tmp        # 粘滞位(sticky bit),只允许文件属主删除自己的文件

    常用权限速查

  • 755:目录和脚本的推荐权限

  • 644:普通文件的推荐权限

  • 700:私密文件

  • 777绝对不要用(除非你确定自己在做什么)

chown —— 修改属主和属组
chown jack file.txt          # 将file.txt的属主改为jack
chown :developers file.txt   # 将file.txt的属组改为developers
chown jack:developers file.txt  # 同时修改属主和属组
chown -R jack:dev /project/  # 递归修改整个目录

第五章:软件包管理——在Linux上安装软件

在Windows上安装软件是"下载exe → 双击 → 下一步",在Linux上则通过包管理器完成。包管理器会自动处理依赖关系,这是Linux软件管理的最大优势。

5.1 Debian/Ubuntu 系:apt

sudo apt update              # 更新软件包列表(从软件源获取最新信息)
sudo apt upgrade             # 升级所有已安装的软件包
sudo apt install nginx       # 安装nginx
sudo apt remove nginx        # 卸载nginx(保留配置文件)
sudo apt purge nginx         # 彻底卸载nginx(删除配置文件)
sudo apt autoremove          # 删除不需要的依赖包
apt search nginx             # 搜索包含nginx的软件包
apt show nginx               # 显示nginx包的详细信息

第六章:进程与服务管理

6.1 进程管理

进程是正在运行的程序实例。每个进程有一个唯一ID(PID)。

ps aux                  # 查看所有进程(BSD风格)
ps -ef                  # 查看所有进程(System V风格)
ps aux | grep nginx     # 查找nginx进程
top                     # 实时查看进程资源占用(按q退出)
htop                    # top的增强版(需安装)
kill 1234               # 终止PID为1234的进程
kill -9 1234            # 强制终止(SIGKILL,立即结束,不清理资源)
pkill nginx             # 按名称终止进程

第七章:压缩与归档

8.1 tar —— 归档工具(最常用)

tar 是 Tape ARchive 的缩写,最初用于磁带备份,现在用于打包文件。

参数详解:

  • -c:创建归档(create)

  • -x:解包(extract)

  • -t:查看内容(list)

  • -v:显示详细过程(verbose)

  • -f:指定归档文件名(file)—— 必须放在最后

  • -z:通过gzip压缩/解压

  • -j:通过bzip2压缩/解压

    # 打包并压缩成 .tar.gz(最常用)
    tar -czvf mybackup.tar.gz /home/jack/projects/
    
    # 解包 .tar.gz
    tar -xzvf mybackup.tar.gz
    
    # 只查看内容不解压
    tar -tzvf mybackup.tar.gz
    
    # 打包成 .tar.bz2(压缩率更高,但更慢)
    tar -cjvf mybackup.tar.bz2 /home/jack/projects/
    
    # 解包 .tar.bz2
    tar -xjvf mybackup.tar.bz2
    
    # 解压到指定目录
    tar -xzvf mybackup.tar.gz -C /target/directory/

    注意-f 必须紧跟文件名,tar -czvf my.tar.gz 正确,tar -cfzv my.tar.gz 错误(f 后面必须是文件名)。

  • 8.2 gzip —— 单独压缩工具

    gzip file.txt           # 压缩成 file.txt.gz,原文件被删除
    gunzip file.txt.gz      # 解压,.gz文件被删除
    gzip -d file.txt.gz     # 同 gunzip
    gzip -k file.txt        # 压缩并保留原文件(-k = keep)

    gzip 只能压缩单个文件,所以通常先 tar 打包,再 gzip 压缩——但 tar -z 已集成此流程。

    8.3 zip / unzip —— Windows兼容

    zip -r archive.zip mydir/          # 递归压缩整个目录
    unzip archive.zip                   # 解压到当前目录
    unzip archive.zip -d /target/      # 解压到指定目录
    zip -d archive.zip file.txt        # 从zip中删除文件

    zip 的优势是Windows系统原生支持,传输给同事时很方便。

总结:

Linux的学习曲线确实陡峭,但每当你掌握一个新概念,对计算机世界的理解就会加深一层。我的建议是:

  1. 不要死记命令:多用 man 和 --help,理解了逻辑自然就记住了

  2. 多动手实践:在自己的虚拟机或云服务器上折腾,把服务搞崩再修好,学得最快

  3. 遇到问题先查日志/var/log/ 下的日志文件是你最好的朋友

  4. 参与开源社区:阅读优秀的开源项目代码,学习他们是如何组织脚本和配置的

这条路没有终点,但沿途的风景值得你为之付出。祝你在Linux的世界里探索愉快!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐