Linux操作系统从入门到精通:一份保姆级学习指南
第一章:初识Linux——理解它的灵魂
1.1 什么是Linux?内核与发行版的区别
很多人混淆了"Linux内核"和"Linux操作系统"这两个概念:
-
Linux内核(Kernel):这是操作系统的心脏。它直接与硬件打交道,负责管理CPU时间片分配、内存寻址、磁盘读写、网络数据包收发等核心任务。内核本身是"看不见"的,它在后台默默工作。
-
Linux发行版(Distribution):这是我们实际安装和使用的操作系统。一个完整的发行版 = Linux内核 + GNU工具集(如ls、grep、gcc等) + 软件包管理器(如apt/yum) + 桌面环境(如GNOME/KDE) + 各种应用程序。
-
主流发行版家族:
家族 代表发行版 包管理工具 适合场景 Debian系 Ubuntu、Debian、Linux Mint apt新手入门、桌面开发 Red Hat系 RHEL、Fedora、CentOS Stream dnf/yum企业服务器、生产环境 SUSE系 openSUSE、SLES zypper欧洲企业常用 独立系 Arch Linux、Gentoo pacman/源码编译极客定制、深入学习 新手建议:从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的学习曲线确实陡峭,但每当你掌握一个新概念,对计算机世界的理解就会加深一层。我的建议是:
-
不要死记命令:多用
man和--help,理解了逻辑自然就记住了 -
多动手实践:在自己的虚拟机或云服务器上折腾,把服务搞崩再修好,学得最快
-
遇到问题先查日志:
/var/log/下的日志文件是你最好的朋友 -
参与开源社区:阅读优秀的开源项目代码,学习他们是如何组织脚本和配置的
这条路没有终点,但沿途的风景值得你为之付出。祝你在Linux的世界里探索愉快!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)