Linux 基本工具详解

💰 软件开发的商业动机

  • 盈利模式:VIP服务、广告投放、生态建设

  • 开源战略:非完全免费,而是长期商业策略

  • 生态价值:成熟的生态系统吸引更多用户和开发者

开源软件通过提供免费基础功能来建立用户基础,然后通过企业版、技术支持、云服务等方式实现商业化盈利。

就像商场提供免费的休息区和WiFi,吸引客流后再通过店铺销售盈利




📦 Linux 软件安装方式

方式 优点 缺点 推荐度
源代码安装 完全自定义 依赖复杂,容易出错
rpm 安装 预编译,快速 需手动解决依赖关系 ⭐⭐
yum 安装 自动解决依赖,统一管理 需要网络连接 ⭐⭐⭐

yum 就像 Linux 的应用商店,让安装软件变得简单快捷。




🔍 yum 工作机制

yum 如何实现精确下载?

核心原理:yum 内置了"软件地图",包含:

  • 所有软件的精确下载地址

  • 软件之间的依赖关系

  • 版本信息和完整性校验



镜像加速机制

问题:yum 官方仓库在国外,下载慢且不稳定

解决方案:国内镜像服务器

  • 系统已预配置国内镜像源

  • 定期同步官方仓库

  • 提供高速稳定的下载

Shell 复制代码
客户端 (yum) → 软件仓库 (repository)
                  ↓ ← 网络
              镜像服务器 (国内加速)

yum 就像是Linux系统的应用商店



开源生态的智慧

为什么有人为免费系统开发软件?

答案:Linux用户主要是程序员和企业,具有更高商业价值

开源商业模式

  • 免费基础版 + 收费企业版

  • 技术支持和服务收费

  • 云服务和培训认证

生态重要性

选择操作系统时,软件生态比个人习惯更重要

因此开发者会积极建设生态来吸引用户


软件源类型

  • 官方源 (base-repo):系统默认提供(应用商店下载)

  • 扩展源 (epel-release):额外软件包(浏览器下载)

    Shell 复制代码

yum install -y epel-release # 安装扩展源

复制代码
---

---

### yum 指令详解

#### **常用操作**

  - `list`:查看软件列表

  - `install`:安装软件

  - `remove`:卸载软件

---

#### 常用选项

  - `-y`:

---

#### 操作示例

```Shell
# 查看软件库
yum list

# 搜索软件
yum list | grep [软件名]

# 安装软件
yum install [软件名.版本号]

# 卸载软件  
yum remove [软件名.版本号]

# 查看已安装
yum list installed


实用软件示例

使用rzsz实现 Linux 与 Windows 文件互传

Plain 复制代码
# 安装 rz/sz(CentOS/RedHat)
yum install lrzsz

# 从 Windows 上传文件到 Linux
rz

# 从 Linux 下载文件到 Windows
sz [文件名]

小贴士:rz/sz 是通过终端进行文件传输的简单工具,适合小文件传输。对于大文件或图形界面环境,可以考虑使用 SFTP 或共享文件夹等方式。



趣味软件示例

Shell 复制代码
yum install -y sl      # 蒸汽机车动画
Plain 复制代码
yum install -y cowsay  # 会说话的牛

软件的安装需要 root权限:

  • 使用 root身份安装

  • 使用 sudo(下面会讲如何将普通用户添加进白名单)

在Linux中,我们怎么知道需要安装那些软件呢?无他,唯手熟尔!




✏️ 文本编辑器 Vim

vim有一定学习门槛,是一款十分优雅的编辑器,会了vim,其它文本编辑器就是手到擒来



多模式设计哲学

Vim 让我们的手不用离开键盘就能完成一系列文本编辑操作



命令模式操作

1. 光标导航
Shell 复制代码
gg           " 跳到文件开头
G            " 跳到文件末尾
nG           " 跳到第n行
^            " 跳到行首
$            " 跳到行尾

nw/b         " 向前/后移动n个单词(可跨行)
nh/j/k/l     " 向左/下/上/右移动n个字符

2. 文本操作
Shell 复制代码
nyy          " 复制n行
np           " 粘贴n次  
ndd          " 删除n行

nr           " 替换光标后n个字符
R            " 批量替换

n~           " 改变光标后n个字符大小写
nx           " 删除光标后n个字符

u            " 撤销
Ctrl+r       " 重做(撤销之前的撤销操作)

*            " 查询光标处匹配项

3. 多文件编辑
Shell 复制代码
:vs filename    " 垂直分屏打开文件
Ctrl+ww         " 切换工作窗口

底行模式操作

Shell 复制代码
:wq!           " 强制保存退出
:set nu        " 显示行号
:set nonu      " 隐藏行号

:/keyword      " 搜索关键词

:!gcc file.c   " 编译文件
:!./a.out      " 运行程序

说明 :底行模式下指令开头/结尾 !表述强制执行



查看二进制文件

Plain 复制代码
vim -d [文件名]

在 vim 底行模式下输入:%!xxd

补充:文本编辑器查看二进制文件乱码,是因为它默认将二进制序列依据ASCII码翻译成了文本信息



Vim 配置

  • 配置文件位置: ~/.vimrc(没有可以自行创建)

  • 个性化配置不会影响其他用户

  • 推荐使用现成配置方案快速搭建环境

Shell 复制代码
# 将以下指令粘贴到Linux系统执行,就能一键完成Vim配置
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

**注意:**尽量不要用root身份进行配置操作,保持默认配置更安全。




🔐 权限管理 sudo

在了解sudo指令之前,我们一些的操作都要切换到root身份进行,非常的麻烦



权限控制模型

Shell 复制代码
普通的用户 → 保安检查 → 权限判断
白名单用户 → 直接放行
黑名单用户 → 直接拒绝


sudo 白名单配置方法

普通用户无法使用sudo,是因为没有访问/etc/sudoers文件的权限,但root又不可能直接修改配置文件本身的访问权限,这样相当于完全放权了(谁都能sudo),不是给自己挖坑吗?


1. 切换到 root 用户

2. 编辑/etc/sudoers文件

3. 添加白名单用户(大约在第100行左右)

说明:这样任何一个普通用户,想要进入白名单就必须经过管理员同意




🔧 编译器 GCC/G++

编译流程四阶段

Shell 复制代码
源文件 → 预处理 → 编译 → 汇编 → 链接
           ↓      ↓       ↓     ↓
        .i文件  .s文件  .o文件  可执行文件

1. 预处理
Shell 复制代码
gcc -E hello.c -o hello.i
  • 头文件展开#include内容插入

  • 宏替换:简单文本替换,无类型检查

  • 条件编译:平台适配、功能裁剪

  • 去注释:删除所有注释内容


2. 编译
Shell 复制代码
gcc -S hello.i -o hello.s
  • C代码 → 汇编代码

  • 语法分析和优化


3. 汇编
Shell 复制代码
gcc -c hello.s -o hello.o
  • 汇编代码 → 机器码

  • 生成目标文件


4. 链接
Shell 复制代码
gcc hello.o -o hello
  • 组合目标文件和库文件

  • 解析外部引用



为什么需要库?
  • 避免重复造轮子

  • 提供标准功能实现

  • 保护源代码


动态链接 vs 静态链接

动态链接(共享库)

小故事理解:你考上高中但学校禁网,学长告诉你网吧位置。当你想上网时就去网吧,其他同学也可以去同一家网吧。

特点

  • 运行时加载,多个程序共享

  • 节省磁盘、内存资源

  • 库文件缺失会影响所有依赖程序

静态链接

小故事续集:网吧被查封后,你在学长开的二手电脑店买了电脑,从此在家就能上网,不再依赖网吧。

特点

  • 编译时嵌入,独立执行
  • 程序独立运行,不依赖外部库
  • 体积较大,占用更多资源
类型 Linux Windows 特点
动态库 .so .dll 1. 运行时加载,多个程序共享
  1. 节省磁盘、内存资源
  2. 库文件缺失会影响所有依赖程序|
    |静态库|.a|.lib|编译时嵌入,独立执行|

生动的库链接比喻

动态链接

你想上网,但学校不让带电脑。学长告诉你:"学校旁边有网吧"。你需要上网时就去网吧,多个同学可以共享同一个网吧。如果网吧关门了,大家都上不了网。

静态链接

网吧关门后,你从二手市场买了台电脑放在宿舍。现在你可以随时上网,不依赖外部环境,但需要自己维护电脑。



编译器选择

  • gcc:C语言程序,链接C标准库

  • g++:C++程序,链接C++标准库(兼容C)



编译选项

Plain 复制代码
# 记忆技巧:ESC对应gcc选项
gcc -E test.c               # 只预处理
gcc -S test.c               # 编译到汇编
gcc -c test.c               # 编译到目标文件

gcc test.c -o test          # 生成可执行文件
gcc test.c -o test -static  # 静态链接
gcc test.c -o test -g       # 生成调试版本

file test                   # 查看可执行文件信息



🐛调试器 GDB

Debug vs Release 版本

Plain 复制代码
# 生成可调试版本:
gcc -g test.c -o test

# 检查是否包含调试信息:
readelf -S test | grep -i debug

注意:gcc默认编译生成的是release版本,无法直接调试



GDB 基本使用

Plain 复制代码
gdb test          # 启动调试
l                 # 查看代码(list)
b n               # 在第n行设置断点(break)
b main            # 在main函数设置断点
info b            # 查看所有断点
d n               # 删除n号断点(delete)

r                 # 运行程序(run)
s                 # 单步进入(step into)
n                 # 单步跳过(step over)
c                 # 继续运行(continue)

p variable        # 打印变量值(print)
display variable  # 持续监视变量
undisplay 1       # 取消监视

finish            # 运行到当前函数返回
until n           # 运行到第n行

q                 # 退出调试(quit)

注意:gdb会记住你上次操作,下次直接回车表示默认执行上次的指令



调试策略选择

调试不是唯一选择

  • 🖨️ 打印调试 :简单问题用 printf

  • 👀 代码审查:仔细阅读代码逻辑

  • 🔧 工具调试:复杂问题用 GDB

就像修车:小问题自己看看,大问题才用专业工具

所以不管黑猫白猫,能抓到老鼠的就是好猫,不要觉得自己的方法习惯就是不入流的




🛠️ 项目自动化构建 Makefile

什么是 Makefile?

make是命令,Makefile是配置文件,两者配合实现项目自动化构建。



基本语法

Plain 复制代码
目标文件: 依赖文件
[TAB]依赖方法


简单的 Makefile 示例

Plain 复制代码
# 构建可执行程序
mytest: test.c
	gcc -o mytest test.c

# 清理生成的文件  
clean:
	rm -f mytest

# 伪目标,不生成实际文件
.PHONY: clean


理解依赖关系

Plain 复制代码
儿子: 妈妈
[TAB]说:"妈,我没钱了"
  • 儿子: 妈妈 → 依赖关系

  • 要钱 → 依赖方法

说明:依赖方法需要建立在依赖关系的基础之上,仅有依赖关系,而没有依赖方法是没意义的



Makefile 高级特性

Plain 复制代码
# 使用特殊符号
test: test.c
	$(CC) $(CFLAGS) -o $@ $^

clean:
	rm -f test

.PHONY: clean

符号说明

  • $@:代表目标文件

  • $^:代表所有依赖文件

  • @命令:执行但不回显具体指令内容



Make 的智能机制

为什么不能连续 make?

  • Make 会比较文件时间戳

  • 如果源文件比目标文件新,才重新编译

  • 避免不必要的重复编译,从而提高编译效率

Plain 复制代码
stat [文件名]    # 查看文件时间戳
# Access: 最后访问时间
# Modify: 内容修改时间  
# Change: 属性修改时间

相关推荐
摇滚侠1 小时前
零基础小白自学 Git_Github 教程,DeskTop 进阶操作,笔记12
笔记·git·github
弘毅 失败的 mian1 小时前
Linux 编程第一个小程序:进度条
linux·经验分享·笔记·小程序·apache
星哥说事1 小时前
定时任务管理:cron / systemd-timer 自动化任务调度
运维·自动化
stars-he1 小时前
单片机转换电路学习笔记
笔记·单片机·学习
小农民壞得狠丶1 小时前
白羊座讨厌这些 。。。。。。
经验分享
wadesir1 小时前
提升系统效率的关键(Linux文件系统性能优化入门教程)
linux·网络·性能优化
n***63271 小时前
华为HuaweiCloudStack(一)介绍与架构
服务器·华为·架构
挽天java1 小时前
Arduino/EIDE/Platform IO/Linux/MRS/Keil/STM32Cubemx配置
linux·运维·stm32
金斗潼关1 小时前
Ubuntu搭建Vulhub漏洞靶场进行xstream的CVE-2021-21351漏洞利用
linux·ubuntu·java反序列化漏洞检测