目录

第一部分:操作系统发展史与 Linux 概述

1. 操作系统的发展

2. Minix 没有火起来的原因

3. Linux 的崛起

4. Linux 内核 & 发行版

5. 类 Unix 系统目录结构

第二部分:命令行基本操作

1. 命令使用方法

第三部分:文件与权限管理

1. 列出目录内容:ls

2. 显示 inode 内容:stat

3. 文件访问权限

4. 修改文件权限:chmod

5. 修改文件所有者:chown

6. 修改文件所属组:chgrp

第四部分:文件内容查看与管理

1. 文件内容查看

2. 文件管理

第五部分:用户和用户组管理

1. 用户管理

2. 用户组管理

第六部分:系统管理

1. 时间与日历

2. 进程管理

3. 关机重启

4. 磁盘空间管理

5. 网络管理

第七部分:Linux 磁盘管理 (进阶)

1. df 与 du

2. fdisk (或 parted, gdisk)

3. 磁盘格式化

4. 磁盘检验

5. 磁盘挂载与卸除

第八部分:Linux 管道命令 (文本处理利器)

第九部分:Shell 编程入门

1. 运行 Shell 脚本

2. 编写 Shell 脚本

3. echo 命令

4. printf 命令

5. Shell 注释

6. Shell 变量

7. Shell 函数

8. 文件包含

9. Shell 数据类型

10. Shell 传递参数

11. Shell 基本运算符

12. test 命令

13. Shell 流程控制

14. Shell 输入/输出重定向

15. 实例

第十部分:文本编辑命令 (进阶处理)

1. cut 命令

2. sed 命令 (流编辑器)

3. awk 命令 (文本分析工具)

第十一部分:Vim 全套笔记

1. 什么是 vim?

2. Vim 的三种模式

3. Vim 基础操作 (命令模式下)

4. 底行命令模式的常用操作

5. 可视模式 (Visual mode)

第十二部分:Linux 系统启动过程

第十三部分:Linux 关机

第十四部分:计算机启动的流程 (深入)

第十五部分:故障恢复模式

第十六部分:虚拟机网络模式

第十七部分:常见问题

第十八部分:特殊权限

chattr 权限

掩码 umask

第十九部分:Linux 软件安装

1. Ubuntu 软件安装与卸载

2. yum 安装命令 (RHEL/CentOS/Fedora)

3. rpm 命令

第二十部分:Linux 的基本配置

第二十一部分:Shell 编程 (补充数据类型和实例)

第二十二部分:文本编辑命令 (补充 sed 和 awk)

第二十三部分:Vim 全套笔记 (补充模式切换和多行编辑)

第二十四部分:Linux 系统启动过程 (补充)

第二十五部分:Linux 关机

第二十六部分:计算机启动的流程 (深入)

第二十七部分:故障恢复模式

第二十八部分:虚拟机网络模式

第二十九部分:常见问题

Shell 编程补充

文本编辑命令补充

Vim 多行编辑操作

Linux 系统启动流程

关机命令

计算机启动流程深入

故障恢复模式

虚拟机网络模式

常见问题解决


深入探索 Linux 操作系统:从基础到进阶

摘要: 本文旨在为读者提供一个全面且深入的 Linux 操作系统学习指南。内容涵盖操作系统发展简史、Linux 核心概念、常用命令行操作、系统管理、Shell 编程、Vim 编辑器、软件安装配置以及高级主题如特殊权限、系统启动流程和故障排除等。无论您是初学者还是希望巩固知识的开发者,都能从中获益。


第一部分:操作系统发展史与 Linux 概述

1. 操作系统的发展

现代操作系统的演进经历了多个重要阶段。早期的 Unix 系统(诞生于 1969 年贝尔实验室)因其强大的多用户、多任务处理能力和可移植性,奠定了现代操作系统的基础。随后出现的 Minix(由 Andrew S. Tanenbaum 教授开发)是一个面向教学的类 Unix 操作系统,以其简洁的微内核架构闻名。

2. Minix 没有火起来的原因

尽管 Minix 设计精良且适合教学,但其主要定位是教学和学术研究,而非商业化或大规模应用。同时,其源代码的早期分发策略限制了社区的广泛参与和发展,导致其影响力远不及后来的 Linux。

3. Linux 的崛起

1991 年,芬兰大学生 Linus Torvalds 出于个人兴趣开发了一个类 Unix 的内核,并将其命名为 Linux。Linux 继承了 Unix 的优良特性(如稳定性、安全性、多用户),并因其开源(GPL 协议)社区驱动的开发模式而迅速蓬勃发展。全球开发者可以自由使用、修改和分发 Linux,使其功能日益强大,应用范围极广(服务器、桌面、嵌入式、云计算等)。

4. Linux 内核 & 发行版

  • Linux 内核: 这是操作系统的核心,负责管理硬件资源(CPU、内存、设备)、进程调度、文件系统、网络通信等。它是所有 Linux 发行版共有的基础。
  • Linux 发行版: 由 Linux 内核 + GNU 工具 + 软件包管理系统 + 桌面环境 + 应用软件等组合而成的一个完整操作系统。常见发行版有:
    • Debian 系:Debian, Ubuntu
    • Red Hat 系:Red Hat Enterprise Linux (RHEL), Fedora, CentOS (曾是)
    • SUSE 系:openSUSE, SUSE Linux Enterprise
    • 其他:Arch Linux, Gentoo 等。
  • Linux 内核版本: 遵循 主版本.次版本.修订版本[-稳定/长期支持] 的命名规则(如 5.4.0)。次版本为奇数表示开发版,偶数为稳定版。
  • Linux 发行版本: 发行版有自己的版本号(如 Ubuntu 20.04 LTS),它们会选择特定的内核版本并集成大量软件。

5. 类 Unix 系统目录结构

Linux 继承了 Unix 的 Filesystem Hierarchy Standard (FHS) 目录结构,主要目录及其作用如下:

  • /:根目录
  • /bin:存放基本用户命令(二进制可执行文件)
  • /boot:存放启动相关的文件(如内核、引导程序)
  • /dev:存放设备文件
  • /etc:存放系统和应用程序的配置文件
  • /home:用户的家目录,每个用户通常有一个子目录(如 /home/username
  • /lib, /lib64:存放系统共享库文件
  • /mnt:临时挂载点(如光盘、U盘)
  • /opt:存放可选的第三方大型应用程序
  • /proc:虚拟文件系统,映射进程和内核信息
  • /root:超级管理员 root 的家目录
  • /run:存放运行时文件(如 PID 文件、套接字)
  • /sbin:存放系统管理员使用的命令
  • /tmp:存放临时文件
  • /usr:存放用户安装的软件、库、文档等(“Unix System Resources”)
  • /var:存放经常变化的文件(如日志、邮件、数据库文件)
  • 用户目录: 通常位于 /home/username,是用户登录后的默认工作目录,拥有个人文件和配置(如 ~/.bashrc)。

第二部分:命令行基本操作

1. 命令使用方法

  • 基本格式:命令 [选项] [参数]。选项通常以 --- 开头,用于改变命令行为;参数通常是命令操作的对象(如文件名)。
  • 查看帮助文档:
    • 命令 --help:快速查看命令的常用选项和参数。
    • man 命令:查看命令的详细手册页(manual page),包含语法、选项、示例、描述等。按 q 退出。
  • tab 键自动补全: 输入命令、文件名、目录名的前几个字母后按 Tab 键,系统会自动补全或列出可能的选项。
  • history 游览历史:history 命令列出最近执行过的命令历史记录。可以用 !n(n 为历史编号)或 !命令前缀 快速执行历史命令。
  • 命令行中的 ctrl 组合键:
    • Ctrl + C:终止当前正在运行的前台进程。
    • Ctrl + Z:暂停当前前台进程(放入后台),可用 fg 恢复或 bg 后台继续运行。
    • Ctrl + D:表示输入结束(EOF),或退出当前 shell(如退出 sussh)。
    • Ctrl + Lclear:清屏。

第三部分:文件与权限管理

1. 列出目录内容:ls

  • ls:列出当前目录内容。
  • ls -l:长格式显示,包含文件权限、所有者、大小、修改时间等。
  • ls -a:显示所有文件,包括隐藏文件(以 . 开头)。
  • ls -lh:以更易读的方式(如 K, M, G)显示文件大小 (-h 常与 -l 连用)。

2. 显示 inode 内容:stat

stat 文件名 显示文件的详细信息,包括 inode 号、权限、大小、链接数、所有者、所属组、访问/修改/变更时间等。

3. 文件访问权限

Linux 文件权限分为三类:

  • 用户 (User/u):文件的所有者。
  • 组 (Group/g):文件所属的用户组。
  • 其他 (Other/o):既不是所有者,也不是所属组成员的用户。 每种身份对应三种权限:
  • 读 (r):查看文件内容或列出目录内容。
  • 写 (w):修改文件内容或在目录中创建/删除文件。
  • 执行 (x):运行程序文件或进入目录。 权限用 9 个字符表示(如 rwxr-xr--),也可以用八进制数字(0-7)表示(如 755 对应 rwxr-xr-x)。

4. 修改文件权限:chmod

  • 符号模式:chmod [ugoa][+-=][rwx] 文件名
    • u(用户), g(组), o(其他), a(所有)
    • +(添加), -(移除), =(设置)
    • r, w, x
    • 例如:chmod u+x script.sh (给所有者添加执行权限), chmod go-rw file.txt (移除组和其他用户的读写权限)。
  • 数字模式:chmod 权限值 文件名
    • 权限值 = (用户权限 * 100) + (组权限 * 10) + (其他权限 * 1)
    • 权限值:r=4, w=2, x=1 (无权限=0)
    • 例如:chmod 755 script.sh (用户:rwx, 组:r-x, 其他:r-x), chmod 644 file.txt (用户:rw-, 组:r--, 其他:r--)。

5. 修改文件所有者:chown

chown 新所有者[:新组] 文件名 修改文件的所有者(和所属组)。 例如:chown user1 file.txt (将所有者改为 user1), chown user1:group1 file.txt (同时修改所有者和所属组)。

6. 修改文件所属组:chgrp

chgrp 新组 文件名 修改文件的所属组。 例如:chgrp developers project/


第四部分:文件内容查看与管理

1. 文件内容查看

  • 基本显示:
    • cat 文件名:连接文件并打印到标准输出(一次性显示全部内容)。
    • tac 文件名:反向显示文件内容(最后一行先显示)。
  • 显示行号:
    • nl 文件名:显示文件内容并添加行号(默认显示空行)。
  • 分屏显示:
    • more 文件名:分页显示文件内容,按 Enter 下一行,Space 下一页,q 退出。不能向前翻页
    • less 文件名:比 more 更强大,支持向前(b)和向后翻页,搜索(/),跳转(g/G)等。推荐使用。
  • 取首尾 n 行:
    • head [-n 行数] 文件名:显示文件开头若干行(默认 10 行)。
    • tail [-n 行数] 文件名:显示文件末尾若干行(默认 10 行)。tail -f 文件名 实时追踪文件新增内容(常用于查看日志)。

2. 文件管理

  • 输出重定向:>
    • 命令 > 文件:将命令的标准输出覆盖写入到指定文件(文件不存在则创建)。
    • 命令 >> 文件:将命令的标准输出追加写入到指定文件。
    • 命令 2> 文件:将命令的标准错误输出覆盖写入文件。
    • 命令 &> 文件命令 > 文件 2>&1:将标准输出和标准错误都覆盖写入文件。
  • 管道:|命令1 | 命令2:将命令1的标准输出作为命令2的标准输入。例如:ls -l | grep "txt" (列出长格式结果中所有包含 "txt" 的行), ps aux | less (分页查看进程列表)。
  • 清屏:clearCtrl + L
  • 切换工作目录:cd
    • cdcd ~:进入当前用户的家目录。
    • cd /path/to/dir:切换到绝对路径指定的目录。
    • cd ..:切换到上一级目录。
    • cd -:切换到上一次所在的目录。
  • 显示当前路径:pwd
  • 创建目录:mkdir
    • mkdir dirname:创建单个目录。
    • mkdir -p parent/child:创建嵌套目录(父目录不存在则一起创建)。
  • 删除文件:rm
    • rm file:删除文件。
    • rm -r directory:递归删除目录及其所有内容(谨慎使用!)。
    • rm -f file:强制删除,不提示确认。
  • 建立链接文件:ln
    • ln -s 源文件 链接文件:创建软链接(符号链接),类似于 Windows 的快捷方式。删除源文件,软链接失效。
    • ln 源文件 链接文件:创建硬链接,指向同一个 inode。删除源文件,只要还有硬链接存在,文件内容不会被删除。硬链接不能跨分区,不能对目录创建(通常)。
  • 文本搜索:grepgrep [选项] "模式" 文件... 在文件中搜索包含指定模式(字符串或正则表达式)的行。
    • -i:忽略大小写。
    • -v:反向匹配,显示不包含模式的行。
    • -n:显示匹配行及其行号。
    • -r:递归搜索目录。
    • 例如:grep "error" /var/log/syslog (在系统日志中找 "error"), ps aux | grep "nginx" (查找 nginx 进程)。
  • 查找文件:findfind [路径] [选项] [操作] 在指定目录树中查找满足条件的文件。
    • -name "pattern":按文件名查找(支持通配符 *, ?)。
    • -type f/d:查找文件(f)/目录(d)。
    • -size [+|-]n[bcwkMG]:按大小查找(如 +10M 表示大于 10MB)。
    • -mtime n:按修改时间查找(-n n天内, +n n天前)。
    • -exec 命令 {} \;:对找到的文件执行命令({} 代表找到的文件)。
    • 例如:find /home -name "*.txt" (在 /home 下找所有 .txt 文件), find /var/log -mtime -7 -exec ls -l {} \; (查找 /var/log 下 7 天内修改过的文件并列出详细信息)。
  • 拷贝文件:cp
    • cp 源文件 目标文件:拷贝文件。
    • cp 源文件 目标目录:拷贝文件到目录。
    • cp -r 源目录 目标目录:递归拷贝目录。
    • cp -i:覆盖前提示确认。
  • 移动文件:mvmv 源文件 目标文件mv 源文件 目标目录mv 源目录 目标目录。功能是移动文件/目录,也可用于重命名(源和目标在同一目录时)。
  • 归档管理:tartar [选项] 归档文件.tar [文件/目录...] 用于打包文件(不压缩)或解包。
    • -c:创建归档文件。
    • -x:解开归档文件。
    • -v:显示详细过程。
    • -f 文件名:指定归档文件名。
    • -t:列出归档文件内容。
    • 例如:tar -cvf project.tar project/ (将 project 目录打包成 project.tar), tar -xvf project.tar (解包 project.tar)。
  • 文件压缩解压
    • gzip 文件名:压缩文件(生成 .gz 后缀),gunzip 文件名.gzgzip -d 文件名.gz 解压。
    • bzip2 文件名:压缩文件(生成 .bz2 后缀),bunzip2 文件名.bz2bzip2 -d 文件名.bz2 解压。
    • 结合 tar
      • tar -czvf project.tar.gz project/ (打包并用 gzip 压缩)
      • tar -xzvf project.tar.gz (解压 gzip 压缩的 tar 包)
      • tar -cjvf project.tar.bz2 project/ (打包并用 bzip2 压缩)
      • tar -xjvf project.tar.bz2 (解压 bzip2 压缩的 tar 包)
    • zip 归档名.zip 文件/目录...:创建 zip 归档(兼容 Windows),unzip 归档名.zip 解压。
  • 查看命令位置:whichwhich 命令 显示命令的完整路径(在 PATH 环境变量中查找)。例如:which ls 可能显示 /usr/bin/ls

第五部分:用户和用户组管理

1. 用户管理

  • 查看当前用户:whoami
  • 查看登录用户:whow (更详细,显示用户正在做什么)
  • 退出登录账户:exitlogout
  • 添加用户账号:useradd
    • sudo useradd -m 用户名:创建用户并创建其家目录(/home/用户名)。通常需要 sudo 权限。
  • 修改用户:usermodsudo usermod [选项] 用户名。常用选项:-l 新用户名 (改用户名), -d 新家目录 (改家目录), -g 新主组 (改主组), -aG 附加组 (添加附加组)。
  • 设置用户密码:passwd
    • sudo passwd 用户名:管理员设置其他用户密码。
    • passwd:普通用户修改自己的密码。
  • 删除用户:userdel
    • sudo userdel 用户名:删除用户(保留家目录)。
    • sudo userdel -r 用户名:删除用户并同时删除其家目录和邮件目录。
  • 切换用户:su
    • su -su - root:切换到 root 用户(需要 root 密码),- 表示加载目标用户的环境变量。
    • su username:切换到指定用户(需要该用户密码)。
  • 以 root 身份执行指令:sudosudo 命令。允许被授权的用户(在 /etc/sudoers 文件中配置)以 root 权限执行命令。执行时需要输入当前用户的密码(而非 root 密码)。配置需谨慎。

2. 用户组管理

  • 添加、删除组账号:groupadd, groupdelsudo groupadd 组名, sudo groupdel 组名
  • 用户组管理:groupmodsudo groupmod -n 新组名 旧组名:修改组名。

第六部分:系统管理

1. 时间与日历

  • 查看当前日历:cal (显示当月日历), cal 年份 (显示整年日历), cal 月份 年份 (显示指定年月)。
  • 显示或设置时间:date
    • date:显示当前日期和时间。
    • date "格式化字符串":按指定格式显示时间(如 date "+%Y-%m-%d %H:%M:%S")。
    • sudo date -s "YYYY-MM-DD HH:MM:SS":设置系统时间(需要 root 权限)。

2. 进程管理

  • 查看进程信息:ps
    • ps aux:查看系统中所有用户的进程详细信息(常用组合)。
    • ps -ef:类似 aux,格式略有不同。
    • ps -l:查看当前登录 shell 启动的进程。
  • 以树状图显示进程关系:pstree 直观显示进程间的父子关系。
  • 动态显示进程:tophtop (更友好) 实时显示系统进程状态和资源占用(CPU、内存等),按 q 退出。
  • 终止进程:kill
    • kill PID:向指定 PID 的进程发送默认的 SIGTERM (15) 信号,请求其终止。
    • kill -9 PID:发送 SIGKILL (9) 信号,强制立即终止进程(无法被捕获或忽略)。
    • killall 进程名:终止所有同名进程。
    • pkill 进程名:根据进程名终止进程。

3. 关机重启

  • reboot:重启系统。
  • shutdown [选项] [时间] [消息]:安排关机或重启。
    • shutdown -h now:立即关机。
    • shutdown -r +10 "系统将重启":10 分钟后重启,并广播消息。
  • init 0:关机 (运行级别 0)。
  • init 6:重启 (运行级别 6)。

4. 磁盘空间管理

  • 检测磁盘空间:dfdf -h:以易读格式显示所有已挂载文件系统的磁盘空间使用情况(总大小、已用、可用、使用率、挂载点)。
  • 检测目录所占磁盘空间:dudu -sh [目录名]:以易读格式显示指定目录的总大小 (-s 只显示总计, -h 易读)。

5. 网络管理

  • 查看网络状态:netstatnetstat -tuln:查看正在监听的 TCP (-t) 和 UDP (-u) 端口 (-l 监听, -n 显示数字地址)。常用参数组合 -tulnp 可显示关联的进程 PID/名称。
  • 查看或配置网卡信息:ifconfig (传统命令,逐渐被 ip 取代) 或 ip addr show (显示 IP 地址)。
  • 测试远程主机连通性:pingping 主机名或IP地址:向目标主机发送 ICMP Echo 请求包,测试网络连通性和延迟。按 Ctrl + C 停止。

第七部分:Linux 磁盘管理 (进阶)

1. dfdu

如前所述,用于查看文件系统使用情况和目录大小。

2. fdisk (或 parted, gdisk)

用于磁盘分区管理的命令行工具。可以查看 (fdisk -l)、创建、删除、修改磁盘分区。操作需谨慎,通常需要 root 权限。

3. 磁盘格式化

使用 mkfs 命令在分区上创建文件系统:

  • sudo mkfs -t ext4 /dev/sdb1:在分区 /dev/sdb1 上创建 ext4 文件系统。
  • 其他常见类型:ext3, xfs, btrfs, vfat (FAT32) 等。

4. 磁盘检验

  • fsck:检查和修复文件系统错误。通常在文件系统未挂载时运行(如使用 Live CD 或挂载为只读)。例如:sudo fsck /dev/sda1

5. 磁盘挂载与卸除

  • 挂载:mount [-t 类型] 设备 挂载点
    • sudo mount /dev/sdb1 /mnt/data:将分区 /dev/sdb1 挂载到目录 /mnt/data
    • 系统启动时自动挂载:在 /etc/fstab 文件中配置。
  • 卸除:umount 设备或挂载点
    • sudo umount /mnt/datasudo umount /dev/sdb1

第八部分:Linux 管道命令 (文本处理利器)

管道 | 允许将前一个命令的输出作为后一个命令的输入,常用于文本处理流水线。

  • wc - 统计字数wc [选项] 文件:统计行数、单词数、字节数。
    • -l:只统计行数。
    • -w:只统计单词数。
    • -c:只统计字节数。
    • 例如:cat file.txt | wc -l (统计文件行数)。
  • cut - 列选取命令cut [选项] [文件]:从文件的每一行中剪切指定的列(字段)。
    • -d '分隔符':指定字段分隔符(默认是 tab)。
    • -f n:指定要提取的第 n 个字段(如 -f 1 第一个字段,-f 1,3 第一和第三)。
    • 例如:cut -d ':' -f 1 /etc/passwd (提取所有用户名)。
  • grep - 行选取命令 如前所述,用于搜索包含模式的行。
  • sort - 排序sort [选项] [文件]:对文本行进行排序。
    • -n:按数值排序(而非字符串)。
    • -r:逆序排序。
    • -k n:按第 n 个字段排序(需配合 -t)。
    • -t '分隔符':指定字段分隔符。
    • 例如:sort -t ':' -k 3 -n /etc/passwd (按用户 ID 排序)。
  • uniq - 去重uniq [选项] [输入文件 [输出文件]]:报告或忽略重复的行(通常需要先 sort)。
    • -c:在每行前加上该行重复出现的次数。
    • -d:仅显示重复的行。
    • -u:仅显示不重复的行。
    • 例如:sort names.txt | uniq -c (统计每个名字出现的次数)。
  • tee - 同时输出多个文件命令 | tee [选项] 文件:读取标准输入,同时将内容写入标准输出和一个或多个文件。常用于需要查看中间结果并保存时。
    • -a:追加到文件而非覆盖。
  • tr - 替换指定的字符tr [选项] 字符集1 字符集2:从标准输入进行字符替换、删除或压缩。
    • tr 'a-z' 'A-Z':将所有小写字母转换为大写。
    • tr -d '\n':删除所有换行符。
  • join - 文件按行连接join [选项] 文件1 文件2:基于两个文件中共同的字段(默认为第一个字段)连接行。类似 SQL 的 JOIN。
  • paste - 将多个文件对应行链接在一起paste [选项] 文件1 文件2 ...:将多个文件按行合并,默认用 tab 分隔。
    • -d '分隔符':指定分隔符。
  • split - 文件切割split [选项] 输入文件 [输出文件前缀]:将大文件切割成小文件。
    • -l 行数:按行数切割。
    • -b 大小:按字节数切割(如 -b 10M)。
  • xargs - 参数代换命令 | xargs [选项] [命令]:从标准输入读取参数,并构建命令行来执行后续命令。解决 find -exec 参数过多或命令不支持管道输入的问题。
    • -I {}:指定替换字符串(如 find . -name "*.bak" | xargs -I {} rm {})。
    • -n 数量:每次执行命令时使用的最大参数数量。

第九部分:Shell 编程入门

Shell 脚本本质上是包含一系列 Shell 命令的文本文件,可以自动化任务。

1. 运行 Shell 脚本

  • 给脚本添加可执行权限:chmod +x myscript.sh
  • 运行:
    • 指定解释器:bash myscript.sh
    • 直接运行:./myscript.sh (需要可执行权限和正确的 #!/bin/bash Shebang)

2. 编写 Shell 脚本

  • 第一行通常是 Shebang#!/bin/bash (指定使用 bash 解释器)。
  • 使用文本编辑器(如 Vim, Nano)编写命令。
  • 一个快捷创建 shell 脚本的命令:cat > myscript.sh << 'EOF' ... EOF 或直接使用编辑器。

3. echo 命令

  • 输出文本到屏幕。
  • 显示换行:echo -e "Line1\nLine2" (-e 启用转义)。
  • 显示不换行:echo -n "Text without newline"

4. printf 命令

提供更精细的格式化输出控制(类似 C 语言的 printf)。

5. Shell 注释

  • 单行注释:以 # 开头。
  • 多行注释:可以用 : << 'COMMENT' ... COMMENT<< 'EOF' ... EOF (但需注意避免嵌套)。

6. Shell 变量

  • 定义变量:变量名=值 (等号两边不能有空格!),如 name="Alice"
  • 使用变量:$变量名${变量名},如 echo $name
  • 只读变量:readonly 变量名declare -r 变量名,之后不能修改。
  • 删除变量:unset 变量名
  • 变量类型: Shell 变量通常默认为字符串。整数运算需特殊处理(如 $((表达式)))。
  • 环境变量: 使用 export 变量名 将当前 shell 的变量导出为环境变量,使其对子进程可见(如 export PATH=/new/path:$PATH)。
  • 查看环境变量:printenvenv

7. Shell 函数

  • 定义:
    function_name() {
        # 函数体
        commands
    }

    function function_name {
        commands
    }

  • 调用:function_name [参数1] [参数2] ...
  • 函数内部使用 $1, $2... 获取参数,$0 是脚本名,$# 是参数个数,$@ 是所有参数列表。

8. 文件包含

在脚本中使用 source. (点) 命令包含其他脚本:

  • source other_script.sh
  • . other_script.sh 被包含脚本中的变量和函数在当前脚本中可用。

9. Shell 数据类型

  • 字符串: 主要类型。可用单引号 ' (强引用,不解释变量和转义) 或双引号 " (弱引用,解释变量和部分转义)。
  • 数组:
    • 定义数组:array_name=(value1 value2 value3 ...)
    • 读取数组:${array_name[index]}
    • 获取数组的长度:${#array_name[@]}${#array_name[*]} (元素个数)

10. Shell 传递参数

脚本内部通过特殊变量获取命令行参数:

  • $0:脚本名称。
  • $1, $2, ... $9:第 1 到第 9 个参数。
  • $#:参数个数。
  • $@:所有参数的列表(每个参数是独立的字符串)。
  • $*:所有参数构成的单个字符串。
  • $$:当前脚本的进程 ID (PID)。
  • $?:上一条命令的退出状态(0 通常表示成功)。

11. Shell 基本运算符

  • 算术运算符:+, -, *, /, % (取模)。运算需放在 $(( )) 中,如 result=$((a + b))
  • 关系运算符:-eq (等于), -ne (不等于), -gt (大于), -lt (小于), -ge (大于等于), -le (小于等于)。用于数字比较。
  • 布尔运算符:! (非), -o (或), -a (与)。用于连接测试条件。
  • 逻辑运算符:&& (逻辑与), || (逻辑或)。用于连接命令(基于上条命令的退出状态 $?)。
  • 字符串运算符:= (相等), != (不等), -z (长度为零), -n (长度非零)。
  • 文件测试运算符:-e (存在), -f (普通文件), -d (目录), -r (可读), -w (可写), -x (可执行), -s (非空文件) 等。

12. test 命令

test 命令或 [ ] (方括号) 用于条件判断(运算符在 test 内部使用)。

  • 数值测试:[ $a -eq $b ]
  • 字符串测试:[ "$str1" = "$str2" ]
  • 文件测试:[ -f "file.txt" ]

13. Shell 流程控制

  • if else 判断语句:
    if [ condition ]; then
        commands
    elif [ other_condition ]; then
        other_commands
    else
        else_commands
    fi

  • for 循环:
    for var in list; do
        commands
    done

    for (( i=0; i<10; i++ )); do
        commands
    done

  • while 循环:
    while [ condition ]; do
        commands
    done

  • 无限循环:while :; do ... donewhile true; do ... done
  • until 循环:while 相反,条件为假时执行。
    until [ condition ]; do
        commands
    done

  • case 多分支选择:
    case $variable in
        pattern1)
            commands1 ;;
        pattern2)
            commands2 ;;
        *)
            default_commands ;;
    esac

  • 跳出循环:
    • break:跳出当前循环。
    • break n:跳出 n 层循环。
    • continue:跳过本次循环剩余部分,进入下一次迭代。

14. Shell 输入/输出重定向

如前所述,>, >>, <, |。还支持:

  • Here Document:命令 << 标记 ... 标记 将标记之间的文本作为命令的标准输入。
  • /dev/null 文件: 特殊设备文件,写入它的内容会被丢弃,读取它立即得到 EOF。常用于屏蔽输出或输入(如 command > /dev/null 2>&1 屏蔽所有输出)。

15. 实例

  • 杨辉三角: 使用双重循环和数组计算输出。
  • sum() & max() 编写函数计算数组元素和或最大值。
  • 99 乘法表: 使用双重循环打印。

第十部分:文本编辑命令 (进阶处理)

1. cut 命令

如前所述,用于列提取。

2. sed 命令 (流编辑器)

sed [选项] '命令' 文件sed [选项] -e '命令1' -e '命令2' ... 文件。非交互式流编辑器,用于文本替换、删除、插入等。

  • 元字符集: 支持正则表达式。
  • 基本编辑命令:
    • a\文本:在当前行追加一行或多行文本。
    • i\文本:在当前行插入一行或多行文本。
    • d:删除模式空间中的行(不输出)。
    • c\文本:用指定的文本替换选定的行。
    • p:打印模式空间中的行(通常与 -n 选项连用,只显示处理过的行)。
    • s/模式/替换字符串/[标志]:字符串替换(最常用)。标志:g (全局替换), i (忽略大小写)。
    • y/源字符集/目标字符集/:字符转换(类似 tr)。
  • 地址: 指定操作的行范围(行号或模式匹配)。如 1,5d (删除 1-5 行), /pattern/d (删除匹配行)。
  • 模式空间 & 保持空间:sed 有两个缓冲区。常用命令 h, H (复制/追加模式空间到保持空间), g, G (复制/追加保持空间到模式空间), x (交换)。
  • 选项:
    • -n:抑制默认输出。
    • -e '脚本':指定多个编辑命令。
    • -f 脚本文件:从文件读取 sed 脚本。
    • -i[后缀]:直接修改文件内容(危险!建议先测试)。可指定备份后缀(如 -i.bak)。

3. awk 命令 (文本分析工具)

awk [选项] '模式 {动作}' 文件awk -f 脚本文件 文件。功能强大的文本处理和数据提取语言。

  • 基本用法: 逐行扫描文件,对符合模式的行执行动作。默认按空格或 tab 分割字段。
    • {print $0}:打印整行。
    • {print $1}:打印第一个字段。
    • {print $1, $3}:打印第一和第三字段(用空格分隔)。
    • {print NR, $0}:打印行号和整行。
  • -F 指定分割字符:awk -F':' '{print $1}' /etc/passwd (按冒号分割)。
  • -v 设置变量:awk -v name="value" '...'
  • -f 指定 awk 脚本:awk 程序保存在文件中使用。
  • AWK 工作原理: 自动将输入分割成记录(通常是行)和字段(列)。内置变量:
    • NR:当前已读的记录数(行号)。
    • NF:当前记录的字段数。
    • FS:输入字段分隔符(默认空格)。
    • OFS:输出字段分隔符(默认空格)。
    • RS:输入记录分隔符(默认换行)。
    • ORS:输出记录分隔符(默认换行)。
    • FILENAME:当前处理的文件名。
  • 运算符: 支持算术、关系、逻辑、赋值、条件等运算符。
  • 输出:
    • 顺序号 NR, 匹配文本行号:awk '/pattern/ {print NR, $0}' file
    • 指定输出分割符:awk 'BEGIN {OFS=","} {print $1, $2}' file
    • 忽略大小写:awk 'BEGIN{IGNORECASE=1} /pattern/' file (GNU awk)。
  • 正则字符串匹配: 模式中可使用正则表达式 /regex/
  • 实例:
    • 统计日志中不同状态码出现次数:awk '{count[$9]++} END {for (code in count) print code, count[code]}' access.log
    • 计算文件每行数字的平均值:awk '{sum=0; for (i=1; i<=NF; i++) sum+=$i; print sum/NF}' data.txt
  • AWK 编程:
    • 条件语句:if (condition) action1 [else action2]
    • 循环语句:
      • for (initialization; condition; increment) action
      • while (condition) action
    • 数组: 支持关联数组(下标可以是字符串)。array[index] = value, for (key in array) ...
    • 用户自定义函数:function name(parameter-list) { statements }
    • 内置函数:
      • 算数函数:int(), rand(), srand(), sin(), cos(), ...
      • 字符串函数:length(), index(), substr(), split(), gsub(), match(), ...
      • 时间函数:systime(), strftime()
      • 位操作函数:and(), or(), xor(), lshift(), rshift()
      • 其他函数:system() (执行外部命令), getline (读取下一行)。

第十一部分:Vim 全套笔记

1. 什么是 vim?

Vim (Vi IMproved) 是 vi 文本编辑器的增强版,功能强大,可高度定制。以其模式化编辑和键盘操作为核心,学习曲线陡峭但效率极高。

2. Vim 的三种模式

  • 命令模式 (Normal mode):启动 Vim 后的默认模式。用于移动光标、删除、复制、粘贴、搜索等操作。ESC 键可从其他模式退回命令模式
  • 输入模式 (Insert mode):用于输入文本。从命令模式进入:
    • i:在当前光标处插入。
    • I:在当前行首插入。
    • a:在当前光标后插入。
    • A:在当前行尾插入。
    • o:在当前行下方新开一行插入。
    • O:在当前行上方新开一行插入。
  • 底行模式 (Last line mode 或 Ex mode):在命令模式下: 冒号进入。用于保存 (:w)、退出 (:q)、强制操作 (:q!)、查找替换 (:s)、设置选项 (:set) 等。

3. Vim 基础操作 (命令模式下)

  • 移动光标:
    • h (左), j (下), k (上), l (右)。
    • w (下一个单词词首), e (单词词尾), b (上一个单词词首)。
    • 0 (行首), $ (行尾)。
    • gg (文件首行), G (文件尾行), nG (跳转到第 n 行)。
    • Ctrl + f (下一页), Ctrl + b (上一页)。
  • 删除操作:
    • x:删除光标处字符。
    • dw:删除光标到词尾。
    • d$D:删除光标到行尾。
    • dd:删除当前行。
    • ndd:删除从当前行开始的 n 行。
  • 撤销 & 复原 & 重复:
    • u:撤销上一次操作。
    • Ctrl + r:重做(恢复被撤销的操作)。
    • . (点):重复上一次操作。
  • 复制 & 粘贴:
    • yy:复制 (yank) 当前行。
    • yw:复制当前单词。
    • p:粘贴到光标后。
    • P:粘贴到光标前。
  • 合成行:J:将当前行与下一行合并为一行。
  • 搜索替换:
    • /模式:向下搜索模式(正则)。
    • ?模式:向上搜索模式。
    • n:查找下一个匹配项。
    • N:查找上一个匹配项。
    • :s/old/new/g:替换当前行所有 oldnew
    • :%s/old/new/g:替换整个文件所有 oldnew
    • :%s/old/new/gc:替换前确认。

4. 底行命令模式的常用操作

  • :w:保存文件。
  • :w 文件名:另存为。
  • :q:退出(未修改时)。
  • :q!:强制退出,不保存修改。
  • :wq:x:保存并退出。
  • :set nu:显示行号。
  • :set nonu:隐藏行号。
  • :set hlsearch:高亮显示搜索结果。
  • :noh:临时关闭搜索结果高亮。
  • :vsp 文件名:垂直分割窗口打开文件。
  • :sp 文件名:水平分割窗口打开文件。
  • Ctrl + w w:在窗口间切换。
  • :e 文件名:在当前窗口打开新文件。

5. 可视模式 (Visual mode)

在命令模式下按 v (字符可视), V (行可视), Ctrl + v (块可视) 进入。用于选择文本区域,然后执行操作(如删除 d, 复制 y, 缩进 >/< 等)。


第十二部分:Linux 系统启动过程

  1. 加载内核: BIOS/UEFI 完成自检后,将引导控制权交给引导加载程序(如 GRUB)。引导加载程序加载 Linux 内核(通常为 vmlinuz-*)和初始 RAM 磁盘 (initrdinitramfs) 到内存,并启动内核。内核初始化硬件、检测设备、挂载根文件系统。
  2. 启动初始化进程: 内核启动第一个用户空间进程,通常是 init (SysV init) 或 systemd (现代发行版)。它们的 PID 为 1。
  3. 确定运行级别 (SysV) 或目标 (systemd):
    • SysV init:读取 /etc/inittab 确定运行级别 (runlevel)。常见级别:0 (关机), 1 (单用户), 3 (多用户文本), 5 (多用户图形), 6 (重启)。
    • systemd:有预定义的 target (如 multi-user.target, graphical.target),相当于运行级别。
  4. 加载开机启动程序:
    • SysV init:运行 /etc/rc.d/rcX.d/ (X 为运行级别) 目录下的脚本(S 开头启动,K 开头停止)。
    • systemd:并行启动其 unit 文件(.service, .target 等)定义的依赖服务。
  5. 用户登录: 启动登录管理器(如 gdm, lightdm 用于图形登录,getty 用于文本登录)。用户输入凭证后,启动登录 shell (如 bash) 和桌面环境 (图形模式)。
  6. 图形模式与文字模式的切换方式:
    • Ctrl + Alt + F1F6:切换到虚拟控制台 (tty1-tty6),通常是文本界面。
    • Ctrl + Alt + F7F8:通常切换回图形界面 (X server 所在的 tty)。
    • startx:在文本控制台启动图形界面(如果配置允许)。

第十三部分:Linux 关机

如前所述,使用 shutdown, halt, poweroff, reboot 命令,或发送运行级别 init 0 (关机), init 6 (重启)。


第十四部分:计算机启动的流程 (深入)

  1. 第一阶段:BIOS/UEFI
    • 开机自检 (POST)。
    • 初始化硬件。
    • 查找可引导设备(按 BIOS 设置的顺序)。
    • 加载并执行主引导记录 (MBR) 或 GPT 分区表的引导代码 (UEFI 加载 EFI 应用)。
  2. 第二阶段:主引导记录 (MBR)
    • BIOS 将 MBR (磁盘的第一个扇区) 加载到内存并执行。
    • MBR 中的代码很小 (512 字节),主要任务是找到活动分区并将该分区的 引导扇区 (Volume Boot Record, VBR) 加载到内存并执行。
  3. 第三阶段:硬盘启动
    • VBR 通常包含一个更强大的引导加载程序(如 GRUB 的第一阶段)的代码,它负责加载引导加载程序的剩余部分(第二阶段)。
  4. 第四阶段:操作系统
    • 引导加载程序(如 GRUB)显示菜单(如有),加载选定的操作系统内核和 initramfs 到内存,并将控制权交给内核。

第十五部分:故障恢复模式

  • 单用户模式 (SysV): 在 GRUB 菜单选择内核时按 e 编辑,在内核行末尾添加 single1,然后按 Ctrl + X 启动。以 root 权限进入最小系统环境,用于修复(如修改 root 密码)。
  • 修改 CentOS/Ubuntu 系统 root 密码: 利用单用户模式或恢复模式 (Recovery mode) 进入 shell,运行 passwd root 设置新密码。
  • 救援模式: 使用安装光盘或 USB 启动,选择“Rescue”选项。将根文件系统挂载到 /mnt/sysimage 等目录,然后 chroot 进入进行修复。

第十六部分:虚拟机网络模式

  • 桥接模式 (Bridged): 虚拟机通过宿主机的物理网卡直接连接到外部网络,拥有独立的 IP 地址,如同物理机一样。
  • NAT 模式 (Network Address Translation): 虚拟机共享宿主机的 IP 地址。宿主机充当路由器,虚拟机通过 NAT 访问外网。外网无法直接访问虚拟机。
  • 仅主机模式 (Host-Only): 虚拟机只能和宿主机及其他同模式虚拟机通信,无法访问外网。

第十七部分:常见问题

  • 修改静态地址后发现无法 ping 外网: 检查 IP 地址、子网掩码、网关、DNS 配置是否正确;检查防火墙 (firewalld, iptables) 是否阻止;检查路由 (route -n)。
  • 虚拟机克隆后 eth0 消失 (CentOS 6 / Ubuntu 早期): 克隆导致网卡 MAC 地址和 UUID 冲突。解决方法:删除 /etc/udev/rules.d/70-persistent-net.rules (CentOS 6) 或修改 /etc/network/interfaces (Ubuntu) 中的 MAC 地址,或使用 systemd.link 文件重命名网卡 (现代发行版)。重启网络服务或系统。

第十八部分:特殊权限

除了基本的 rwx 权限,Linux 还有三种特殊权限位:

  1. SetUID (suid): 设置在可执行文件的用户权限位 (s 代替 x)。当普通用户执行此文件时,进程将获得文件所有者的权限(而非执行者的)。例如:/usr/bin/passwd (允许用户修改自己的密码,需要写 /etc/shadow 的权限)。风险: 如果可执行文件有漏洞,可能被利用提权。
  2. SetGID (sgid):
    • 设置在可执行文件的组权限位 (s 代替 x)。当执行此文件时,进程将获得文件所属组的权限。
    • 设置在目录上:在该目录下新建的文件或子目录,其所属组将继承该目录的所属组(而非创建者的主组)。常用于协作目录。
  3. Sticky Bit (sbit) / 粘滞位: 设置在目录的其他权限位 (t 代替 x)。在具有粘滞位的目录中,只有文件的所有者、目录的所有者或 root 用户才能删除或重命名文件。即使其他用户有写权限也不行。例如:/tmp 目录。防止用户随意删除他人文件。
  • 设置: 使用 chmod 的数字模式:suid=4, sgid=2, sticky=1。例如:chmod 4755 file (设置 suid), chmod 2770 directory (设置 sgid 到目录), chmod 1777 /tmp (设置粘滞位到 /tmp)。
  • 查看:ls -l 查看权限位是否有 st

chattr 权限

  • lsattr:查看特殊权限lsattr [文件] 查看文件的扩展属性。
  • chattr:设置特殊权限chattr [选项] 属性 文件。常用属性:
    • +i:文件不可修改(不可删除、改名、更改内容、添加链接)。root 用户可设置。
    • +a:文件只能追加内容(不能修改已有内容或删除)。
    • +A:不更新文件的访问时间 atime。

掩码 umask

  • umask 的作用: 决定新建文件或目录时的默认权限。它是一个八进制数字,表示需要从默认权限中屏蔽掉的权限位。
  • umask 是如何改变新文件的权限:
    • 文件默认权限:666 - umask (如果结果有执行位,则自动去掉)。
    • 目录默认权限:777 - umask
    • 例如:umask 022
      • 文件:666 - 022 = 644 (rw-r--r--)
      • 目录:777 - 022 = 755 (rwxr-xr-x)
  • 查看当前 umask:umask
  • 临时修改 umask:umask 新值(如 umask 027)。
  • 永久修改 umask:umask 值 添加到用户的 shell 配置文件(如 ~/.bashrc, ~/.profile)或全局配置文件(如 /etc/profile, /etc/bash.bashrc)。

第十九部分:Linux 软件安装

1. Ubuntu 软件安装与卸载

  • 更新 Ubuntu 软件下载地址: 修改 /etc/apt/sources.list 文件,选择更快的软件源镜像。
  • Ubuntu 软件操作的相关命令:
    • sudo apt update:更新软件包索引。
    • sudo apt upgrade:升级所有可升级的软件包。
    • sudo apt install 包名:安装软件包。
    • sudo apt remove 包名:卸载软件包(保留配置文件)。
    • sudo apt purge 包名:卸载软件包并删除配置文件。
    • sudo apt autoremove:自动删除不再需要的依赖包。
    • apt search 关键字:搜索软件包。
    • apt show 包名:显示软件包详细信息。

2. yum 安装命令 (RHEL/CentOS/Fedora)

  • 更新国内 yum 源: 替换 /etc/yum.repos.d/ 目录下的 repo 文件为国内镜像源(如阿里云、清华源)。
  • yum 常用命令:
    • sudo yum makecache:建立缓存。
    • sudo yum update:更新所有包(升级系统)。
    • sudo yum install 包名:安装软件包。
    • sudo yum remove 包名:卸载软件包。
    • sudo yum search 关键字:搜索软件包。
    • sudo yum info 包名:查看软件包信息。
    • sudo yum groupinstall "组名":安装软件包组。
  • yum 在线安装 MySQL 5.7:
    • 添加 MySQL 官方 yum 仓库。
    • sudo yum install mysql-community-server
    • sudo systemctl start mysqld
    • sudo systemctl enable mysqld
    • 获取临时 root 密码:sudo grep 'temporary password' /var/log/mysqld.log
    • mysql_secure_installation 进行安全设置。

3. rpm 命令

用于安装、查询、验证、升级和删除 .rpm 软件包。

  • sudo rpm -ivh package.rpm:安装 RPM 包。
  • rpm -q 包名:查询包是否安装。
  • rpm -qi 包名:查询已安装包的详细信息。
  • rpm -ql 包名:查询包安装的文件列表。
  • sudo rpm -e 包名:卸载包。
  • sudo rpm -Uvh package.rpm:升级包。

第二十部分:Linux 的基本配置

  • 安装 JDK:
    1. 下载 JDK .tar.gz 包。
    2. tar -zxvf jdk-*.tar.gz 解压。
    3. 移动到合适目录(如 /usr/local/jdk)。
    4. 配置环境变量:在 /etc/profile~/.bashrc 中添加:
      export JAVA_HOME=/usr/local/jdk
      export PATH=$JAVA_HOME/bin:$PATH

    5. source /etc/profile 生效。
  • 制作本地 YUM 源:
    1. 将 RPM 包放入一个目录(如 /yum/repo)。
    2. 安装 createrepo 工具。
    3. createrepo /yum/repo 创建仓库元数据。
    4. 创建 repo 文件 /etc/yum.repos.d/local.repo
      [local]
      name=Local YUM Repo
      baseurl=file:///yum/repo
      enabled=1
      gpgcheck=0

  • 修改主机名 & IP 地址:
    • 主机名: 修改 /etc/hostname 文件并重启,或使用 hostnamectl set-hostname 新主机名 (systemd)。
    • IP 地址 (静态):
      • CentOS/RHEL 7+:修改 /etc/sysconfig/network-scripts/ifcfg-网卡名 或使用 nmcli
      • Ubuntu:修改 /etc/netplan/*.yaml 文件。
  • mount 挂载: 如前所述,手动挂载或配置 /etc/fstab 自动挂载。
  • ssh 免密登陆:
    1. 本地生成密钥对:ssh-keygen -t rsa (默认保存在 ~/.ssh/id_rsa~/.ssh/id_rsa.pub)。
    2. 将公钥 id_rsa.pub 内容复制到远程服务器的 ~/.ssh/authorized_keys 文件中。
  • 批量添加用户: 编写脚本循环调用 useradd 或使用 newusers 命令(从文件批量创建)。
  • 与用户账号有关的系统文件:
    • /etc/passwd:用户账号信息。
    • /etc/shadow:用户密码信息(加密)。
    • /etc/group:用户组信息。
    • /etc/gshadow:组密码信息。
  • crontab 的使用:
    • crontab -e:编辑当前用户的 cron 计划任务。
    • crontab -l:列出当前用户的 cron 任务。
    • crontab -r:删除当前用户的 cron 任务。
    • 格式:分钟 小时 日期 月份 星期 命令。例如:0 2 * * * /path/to/backup.sh (每天凌晨 2 点执行备份)。
  • locate 查找: 快速文件查找工具。使用前需更新数据库:sudo updatedb
  • which 命令: 如前所述,查看命令位置。
  • echo 输出文本。
  • 设置或显示环境变量:export 如前所述。
  • 修改主机名 & IP 地址: 如前所述。
  • mount 挂载: 如前所述。
  • ssh 免密登陆: 如前所述。
  • 批量添加用户: 如前所述。
  • 与用户账号有关的系统文件: 如前所述。
  • 实操 crontab 的使用: 如前所述。
  • 特殊权限: 如前所述(suid, sgid, sticky bit)。
  • chattr 权限: 如前所述。
  • 掩码 umask 如前所述。
  • linux 软件安装: 如前所述(apt, yum, rpm)。
  • Linux 的基本配置: 如前所述(JDK, YUM 源, 主机名, IP, SSH, 用户, cron)。

第二十一部分:Shell 编程 (补充数据类型和实例)

如前所述,包括字符串、数组、函数、参数传递、运算符、流程控制、I/O、实例(杨辉三角、求和、最大值、99乘法表)。


第二十二部分:文本编辑命令 (补充 sed 和 awk)

如前所述,详细讲解了 sedawk 的强大功能和应用场景。


第二十三部分:Vim 全套笔记 (补充模式切换和多行编辑)

如前所述,完整介绍了 Vim 的三种模式、基础操作、命令、底行模式、可视模式。多行编辑,vim 支持,vi 不支持:在可视块模式 (Ctrl + v) 下选择多行,然后按 I 插入或 c 修改,输入内容后按 ESC,修改会应用到所有选中的行。


第二十四部分:Linux 系统启动过程 (补充)

如前所述,详细说明了从 BIOS 到用户登录的完整流程。


第二十五部分:Linux 关机

如前所述。


第二十六部分:计算机启动的流程 (深入)

如前所述,分阶段讲解了 BIOS/UEFI、MBR/GPT、引导加载程序、内核加载的过程。


第二十七部分:故障恢复模式

如前所述,介绍了单用户模式、救援模式以及修改 root 密码的方法。


第二十八部分:虚拟机网络模式

如前所述,解释了桥接、NAT、仅主机三种模式的区别。


第二十九部分:常见问题

如前所述,提供了修改静态 IP 无法上网和虚拟机克隆后网卡消失的解决方案。

Shell 编程补充

字符串处理
字符串拼接直接通过变量连接,无需特殊符号:

str1="Hello"
str2="World"
result=$str1$str2  # 输出 HelloWorld

数组操作
定义数组并遍历元素:

arr=("apple" "banana" "cherry")
for fruit in ${arr[@]}; do
    echo $fruit
done

函数与参数传递
函数通过位置参数接收参数,$1表示第一个参数:

function greet {
    echo "Hello, $1"
}
greet "Alice"  # 输出 Hello, Alice

运算符示例
算术运算使用$(( ))

sum=$((3 + 5))  # 结果为8

流程控制
case语句匹配多条件:

case $1 in
    "start") echo "Starting...";;
    "stop") echo "Stopping...";;
    *) echo "Unknown command";;
esac

杨辉三角实例
生成5行杨辉三角:

n=5
for ((i=0; i


文本编辑命令补充

sed 高级应用
替换文件中的文本并备份原文件:

sed -i.bak 's/old/new/g' file.txt

awk 数据处理
统计文件的行数和列数:

awk '{print NF " fields in line " NR}' file.txt


Vim 多行编辑操作

可视块模式

  1. Ctrl + v进入可视块模式。
  2. 用方向键选择多行。
  3. I插入文本或c修改文本。
  4. 输入内容后按ESC,更改将应用到所有选中行。

模式切换快捷键

  • i:插入模式
  • v:可视模式
  • ::底行命令模式

Linux 系统启动流程

  1. BIOS/UEFI:硬件自检并加载引导程序。
  2. MBR/GPT:读取分区表找到引导加载程序(如GRUB)。
  3. 内核加载:加载内核镜像并初始化进程(systemd或init)。
  4. 用户登录:启动登录管理器(如GDM或LightDM)。

关机命令

立即关机:

shutdown -h now

重启:

reboot


计算机启动流程深入

UEFI 阶段

  • 替代传统BIOS,支持GPT分区表。
  • 直接从EFI分区加载引导程序(如grubx64.efi)。

内核初始化

  • 挂载根文件系统。
  • 启动第一个用户态进程(PID 1)。

故障恢复模式

单用户模式

  1. 在GRUB菜单选择内核并按e编辑。
  2. linux行末尾添加singleinit=/bin/bash
  3. Ctrl + x启动进入单用户模式。

修改root密码
在救援模式下执行:

passwd root


虚拟机网络模式

桥接模式
虚拟机直接使用物理网络,独立IP,可被局域网访问。

NAT模式
虚拟机共享主机IP,外部无法直接访问虚拟机。

仅主机模式
虚拟机与主机私有网络通信,隔离外部网络。


常见问题解决

静态IP无法上网
检查网关和DNS配置:

ip route show  # 验证网关
cat /etc/resolv.conf  # 检查DNS

克隆虚拟机后网卡消失
删除旧网卡配置并重新生成MAC地址:

rm -f /etc/udev/rules.d/70-persistent-net.rules


结语: Linux 是一个庞大而强大的操作系统生态系统。本文提纲挈领地介绍了从历史背景、基础操作、系统管理到高级 Shell 编程和文本处理的核心知识。掌握这些内容将为您的 Linux 之旅打下坚实基础。实践是学习 Linux 的最佳途径,建议在安全的环境(如虚拟机)中多加练习。祝您学习愉快!