目录
Linux:
Linux是一种免费且开源的类Unix操作系统,由Linus Torvalds于1991年首次发布。Linux操作系统的核心部分被称为“内核”,它是操作系统的主要组件,负责管理硬件资源和提供基本服务,如内存管理、进程调度、文件系统管理和网络功能等。除了内核之外,Linux系统还包括各种工具、库、应用程序和服务,这些通常由GNU项目和其他开源软件项目提供,共同构成了完整的Linux操作系统环境。
Linux的特点
-
开源性:Linux的源代码是开放的,任何人都可以查看、修改和分发其源代码,这使得Linux能够得到全球开发者的持续改进和优化。
-
稳定性与安全性:Linux以其高稳定性和安全性著称,这使得它在服务器市场中占据主导地位,尤其是在Web服务器、数据库服务器和超级计算机等领域。
-
灵活性:Linux支持多种硬件架构,从嵌入式设备到大型机,几乎可以在任何类型的硬件上运行。此外,用户可以根据需要定制自己的Linux系统。
-
丰富的软件生态系统:由于其开源特性,Linux拥有庞大的软件生态系统,包括办公软件、图形界面、游戏、编程工具等各种应用,许多软件都是免费提供的。
-
社区支持:Linux有一个庞大的社区,包括开发者、用户和技术支持人员,他们共同维护和改进Linux系统,为用户提供技术支持和解决方案。
查看系统版本信息
查看Ubuntu版本
- 使用
lsb_release -a
命令来查看详细的Ubuntu版本信息。 - 使用
cat /etc/issue
命令也可以查看Ubuntu版本信息,这是系统启动时显示的发行版信息。
查看内核版本
- 使用
uname -r
命令查看当前正在运行的内核版本。 - 使用
cat /proc/version
命令可以获取更详细的内核版本信息。
其他uname
命令选项
uname -a
显示系统的所有信息,包括系统名称、节点名、内核版本、操作系统版本、体系结构等。uname -v
显示内核编译器的版本信息。
Linux的分层结构
Linux系统大致可以分为以下几层:
- 应用层:包括各种应用程序和命令,用户直接与之交互。
- 内核层:这是操作系统的核心,负责协调硬件和软件资源,主要功能包括:
- 进程管理:处理进程的创建、调度和终止。
- 设备管理:管理硬件设备,如I/O设备。
- 内存管理:管理物理内存和虚拟内存。
- 网络管理:处理网络通信。
- 文件系统管理:管理文件和目录。
- 驱动层:包含对硬件设备的直接访问接口,如字符设备驱动、块设备驱动和网络设备驱动。
- 硬件层:包括所有物理设备,如CPU、内存、硬盘、键盘、鼠标等。
系统控制命令
-
关机
sudo shutdown -h now
:立即关机。sudo shutdown -h 时间 "提示语句"
:定义关机时间,并显示提示语句。
-
重启
sudo shutdown -r now
:立即重启。sudo reboot
:这也是立即重启的命令。sudo shutdown -r 时间 "提示语句"
:定义重启时间,并显示提示语句。
-
取消定时操作
sudo shutdown -c
:取消正在进行的定时关机或重启操作。
Linux 软件包安装与管理
2.1 软件包的安装管理
2.1.1 不同Linux发行版的软件包管理机制
- Debian系列: 使用
.deb
软件包格式,管理工具为dpkg
和apt
。 - Red Hat系列: 使用
rpm
软件包管理机制(Red Hat Package Manager)。 - CentOs系列: 使用
rpm
软件包管理机制(Red Hat Package Manager),管理工具为yum。
2.1.2 软件包分类
- 二进制软件包:通常为
.deb
或.rpm
格式,可以直接安装而无需编译。 - 源码包:包含源代码,需要编译后才能安装,文件扩展名可能为
.dsc
或.tar.gz
等。
2.1.3 软件管理工具概览
在Debian系的Linux发行版中,主要使用dpkg
和apt
两种工具进行软件包管理。
dpkg
: 主要用于离线安装本地软件包,不检查依赖关系。apt
: 在线安装工具,可以从远程仓库下载软件包,自动解决依赖关系。yum
: 在线安装工具,类似于apt。
2.2 dpkg工具详解
-
安装软件:
Bash1sudo dpkg -i 软件包全名.deb
-
显示软件安装状态:
Bash1sudo dpkg -s 软件包名
-
显示软件安装路径:
Bash1sudo dpkg -L 软件包名
-
卸载软件:
Bash1sudo dpkg -r 软件包名
-
完全卸载软件(包括配置文件):
Bash1sudo dpkg --purge 软件包名
2.3 apt工具详解
-
安装软件:
Bash1sudo apt-get install 软件包名
-
卸载软件:
Bash1sudo apt-get remove 软件包名
-
更新软件包列表:
Bash1sudo apt-get update
-
升级已安装的软件包:
Bash1sudo apt-get upgrade
-
列出可用的软件仓库:
Bash1cat /etc/apt/sources.list
-
默认下载包的存放路径:
/var/cache/apt/archives/
2.4 yum工具详解
1. 更新软件包
- 更新所有已安装的软件包:
Bashsudo yum update
- 更新特定的软件包:
Bashsudo yum update package-name
2. 安装软件包
- 安装软件包:
Bashsudo yum install package-name
3. 删除软件包
- 删除软件包:
Bashsudo yum remove package-name
4. 搜索软件包
- 搜索软件包:
Bashsudo yum search keyword
5. 列出可用的软件包
- 列出所有可用的软件包:
Bashsudo yum list available
- 列出已安装的软件包:
Bashsudo yum list installed
6. 清理缓存
- 清理yum缓存:
Bashsudo yum clean all
7. 检查更新
- 检查是否有软件包更新:
Bashsudo yum check-update
8. 信息查询
- 显示软件包的详细信息:
Bashsudo yum info package-name
9. 配置YUM源
- 编辑YUM源配置文件:
Bash
在这里可以添加或修改仓库的URL,以指向不同的软件包镜像站点。vi /etc/yum.repos.d/CentOS-Base.repo
10. 安装YUM插件
- 安装YUM插件:
Bashsudo yum install yum-plugin-*
Shell基础知识
3.1.1 概念
Shell,字面意思是“壳”,在Linux中扮演着关键的桥梁角色。它作为用户与操作系统之间的交互界面,负责解释用户输入的命令,并将其转化为操作系统可以理解的形式,再将执行结果呈现给用户。形象地说,Shell就像一道墙,保护着系统的核心部分不受用户误操作的影响,同时提供友好的命令行界面供用户使用。
3.1.2 命令执行流程
当用户在命令行输入指令时,Shell接收并解析该命令,将其转换为操作系统(内核)能够识别的指令,传递给硬件执行。硬件的响应结果再次通过Shell转换,最终以用户可理解的形式展示出来。
3.1.3 Shell分类
-
Bourne Shell(sh)
开发者:S.R. Bourne
特点:Unix的第一个Shell,行业标准,但作业控制功能较弱,不支持别名和历史记录,常作为应急Shell使用。 -
C Shell(csh)
开发机构:加州大学伯克利分校
特点:改进Bourne Shell的不足,编程风格类似C语言,受C程序员欢迎,但健壮性不及Bourne Shell。 -
Korn Shell(ksh)
开发者:David Korn
特点:解决Bourne Shell的用户交互问题,避免C Shell的脚本编程缺陷,需许可证,应用范围受限。 -
Bourne Again Shell(bash)
开发机构:AT&T贝尔实验室
特点:Bourne Shell的增强版,融合了Bourne Shell、Korn Shell的功能,并引入C Shell的部分特性,具备环境变量配置、历史记录、内置算术运算、通配符支持等功能,是最流行的Shell之一。
3.2 历史记录命令
-
.bash_history
:位于用户主目录下的隐藏文件,存储用户的历史命令记录,默认最多保存2000条。 -
.bashrc
:包含环境变量和函数定义的脚本,其中包括HISTSIZE
(默认显示历史记录数量)和HISTFILESIZE
(.bash_history
文件的最大记录数量)的设置。 -
history
:显示历史命令,默认显示数量由HISTSIZE
决定。history n
:显示最近的n
条历史记录。
-
修改历史记录设置:
HISTSIZE=500
:临时改变显示历史记录的数量。- 修改
.bashrc
文件中的HISTSIZE
和HISTFILESIZE
值,然后退出并重新登录终端,实现永久更改。 echo $HISTSIZE
:显示当前HISTSIZE
的值。
3.3 别名命令
alias
:查看已定义的命令别名。- 设置别名:
alias 新名='原命令'
:为命令创建别名。
- 取消别名:
unalias 新名
:移除命令的别名。
3.4 Linux特殊字符
3.4.1 通配符
*
:匹配任意数量的任意字符。?
:匹配单个任意字符。[...]
:匹配括号内任何一个字符。[-]
:匹配括号内指定范围内的字符。[^]
:匹配除括号内字符以外的任何字符。
3.4.2 管道符 |
- 格式:
command1 | command2
。 - 功能:将前一个命令的输出作为后一个命令的输入。
3.4.3 输入输出重定向
>
:覆盖模式输出到文件。>>
:追加模式输出到文件。2>
:仅重定向错误输出到文件。&>
:重定向所有输出(包括错误)到文件。<
:从文件读取输入。
3.4.4 命令替换
- 格式:
command1 $(command2)
或command1 \
command2`` - 功能:将
command2
的输出结果替换到command1
中。
3.5 echo
命令
- 功能:向终端输出指定内容。
- 选项:
-n
:输出时不自动换行。- 使用双引号
"
保持原样输出。
3.6 date
命令
- 功能:显示或修改系统日期和时间。
- 格式:
date
:显示当前日期和时间。sudo date -s 'YYYY-MM-DD'
:设置日期。sudo date -s 'HH:MM:SS'
:设置时间。
系统维护与用户管理命令
4.1 man
命令
- 功能:查看命令的手册页。
- 使用示例:
man man
:查看man
命令的帮助文档。
- 手册页分类:
- 1:可执行程序或shell命令。
- 2:系统调用(内核提供的函数)。
- 3:库函数(程序库中的函数)。
4.2 su
命令
- 功能:切换用户身份。
- 使用示例:
sudo su root
:切换到root用户。sudo su 用户名
:切换到指定的普通用户。
- 退出:使用
exit
命令退出当前用户回到原用户。
4.3 sudo
命令
- 功能:以管理员权限执行命令,需要输入密码。
4.4 df
命令
- 功能:查看磁盘分区的使用情况。
- 使用示例:
df -Th
:以人类易读的格式显示磁盘使用情况,包括文件系统类型。
4.5 mount
命令
- 功能:挂载文件系统。
- 使用示例:
sudo mount -t 设备类型 设备名称 挂载点
:挂载设备。sudo umount 挂载点
:卸载设备。
- 注意事项:卸载时应确保挂载点无正在运行的进程依赖。
用户管理命令
- 增加/删除用户:
sudo adduser 用户名
:创建新用户。sudo deluser --remove-home 用户名
:删除用户及其家目录。
6.1 ps
命令
ps aux
:显示系统中所有进程的详细信息。ps ef
:显示系统中所有进程的信息,包括父进程ID(PPID)。
进程状态代码:
- D:不可中断的睡眠状态(通常为I/O操作)。
- R:运行或可运行状态(在运行队列中)。
- S:可中断的睡眠状态(等待事件完成)。
- T:被作业控制信号停止。
- t:因调试而暂停。
- X:已死状态(不应出现)。
- Z:僵尸状态,进程已终止但未被父进程回收。
- <:高优先级(对其他用户不友好)。
- N:低优先级(对其他用户友好)。
- L:有页面锁定在内存中(实时或自定义I/O)。
- s:会话领导者。
- l:多线程(使用CLONE_THREAD,如NPTL线程)。
- +:在前台进程组中。
6.2 top
命令
- 功能:实时显示系统中各个进程的资源占用状况。
- 快捷键:
- Shift + >:向下翻页。
- Shift + <:向上翻页。
- 列说明:
- PR:进程优先级。
- VIRT:虚拟内存大小。
- SHR:共享内存大小。
6.3 调整进程优先级
renice
:改变正在运行的进程的优先级。sudo renice NI PID
:调整指定进程的优先级。
nice
:以指定优先级运行新进程。sudo nice -n NI值 进程
:以指定的优先级运行进程。
6.4 文本搜索命令 grep
- 基本用法:
grep "查找的字符串" 文件名
:在文件中搜索字符串。grep "\<要查找的字符串\>" 文件名
:精确匹配整个单词。grep -r "查找的字符串" 路径/目录
:递归搜索目录下的文件。
- 文件查找:
find 路径 -name "文件名"
:查找路径下符合条件的文件。
6.5 kill
命令
- 功能:向进程发送信号。
- 查看信号列表:
kill -l
:列出系统定义的所有信号。
- 常用信号:
- 2:SIGINT(Ctrl+C),终止进程。
- 3:SIGQUIT(Ctrl+\),终止进程。
- 9:SIGKILL,强制杀死进程。
- 15:SIGTERM(默认信号),请求进程终止。
- 18:SIGCONT,继续暂停的进程。
- 20:SIGTSTP(Ctrl+Z),暂停进程。
- 发送信号:
kill -num PID
:向PID指定的进程发送信号。
6.6 前后台进程切换
- 步骤:
- 运行进程。
- Ctrl + Z:将进程暂停并送入后台。
- bg 编号:将暂停的进程置于后台继续执行。
- jobs:查看当前终端中后台运行的进程。
- fg 编号:将后台进程切换到前台继续执行。
7.1 网络命令
ifconfig
:在Linux系统中用于查看网络接口的IP地址和配置信息。ipconfig
:在Windows系统中用于查看网络配置信息,包括IP地址。- Ping测试:
ping 域名/IP地址
:测试与远程主机的网络连通性。- Windows下,
ping -n 包数 域名/IP地址
:发送指定数量的数据包进行测试。
特殊情况处理
- 如果虚拟机无法ping通宿主机(Windows),尝试反向ping(宿主机ping虚拟机),若成功,则可能是虚拟机的防火墙设置问题,需要检查并可能禁用防火墙。
- 解决虚拟机网络配置问题的步骤:
- 卸载虚拟机软件。
- 安装系统清理工具,如CCleaner,清理注册表。
- 关闭防火墙和杀毒软件。
- 以管理员身份重新安装虚拟机软件(如VMware)。
7.2 Ubuntu网络配置
7.2.1 桥接模式
- 设置步骤:
- 打开虚拟机软件,进入虚拟网络编辑器。
- 选择
vmnet0
网络适配器。 - 更改为桥接模式。
- 选择桥接到宿主机的网络适配器(通常是物理网络接口)。
7.2.2 NAT 模式
设置步骤:
-
打开虚拟机软件,进入“虚拟网络编辑器”。
- 选择
vmnet8
网络适配器。 - 更改为
NAT
模式。 - 点击“确定”完成设置。
- 选择
-
进入虚拟机设置。
- 选择“网络适配器”。
- 设置模式为
NAT
。
文件系统命令
8.1 文件系统分类
- 磁盘文件系统:本地主机上可访问的文件系统,如硬盘、CD-ROM、USB存储器等。
- 格式:Ext2, Ext3, Ext4, VFAT等。
- 网络文件系统:允许远程访问的文件系统。
- 格式:NFS, Samba (SMB/CIFS)等。
- 专有/虚拟文件系统:非磁盘驻留的文件系统。
- 格式:TMPFS, PROCFS, LOOPBACKFS等。
8.2 根文件系统结构
目录 | 含义 |
---|---|
/bin | 最常用命令的二进制文件 |
/sbin | 系统管理和目录查询的二进制文件 |
/boot | 内核和系统启动文件 |
/opt | 非系统相关应用的安装目录 |
/etc | 系统配置文件 |
/dev | 设备文件 |
/lib | 共享库文件 |
/mnt | 文件系统的挂载点 |
/proc | 进程和系统信息 |
/usr | 用户相关的文件和目录 |
8.3 显示文件内容
cat 文件
:显示文件内容。head -n 文件名
:显示前n行。tail -n 文件名
:显示后n行。
8.4 连接文件
- 硬链接:基于inode的链接。
- 软链接:基于路径的链接。
命令:
ln 源文件 链接文件名
:创建硬链接。ln -s 源文件 链接文件名
:创建软链接。
8.5 文件压缩解压
- zip: 压缩多个文件至单个压缩文件。
- unzip: 解压.zip文件。
- gzip: 单文件压缩,后缀.gz。
- gunzip: 解压.gz文件。
- bzip2: 类似gzip,后缀.bz2。
选项:
-x
: 解压。-c
: 压缩。-v
: 显示过程信息。-f
: 强制。-j
: 生成.bz2压缩文件。-z
: 生成.gz压缩文件。
组合命令:
tar -cjf
: bz2格式压缩。tar -czf
: gz格式压缩。tar -xvf
: 解压压缩包。
数据类型与分文件编程概览
10.1 存储类型
10.1.1 extern
- 用途:声明外部定义的函数或变量,表明其定义位于其他源文件中。
10.1.2 register
- 描述:建议编译器将变量存储在寄存器中以优化访问速度。但实际效果取决于编译器优化。
10.1.3 static
- 作用域:
- 函数内部:局部作用域,但生存期贯穿整个程序。
- 全局变量:限于当前源文件。
- 存储位置:全局区(静态区)。
- 初始化:默认初始化为0,初始化状态保存于
.data
区,未初始化的存于.bss
区。
10.1.4 auto
- 默认类型:局部变量默认类型,位于栈区。
10.2 数据类型总结
- 基本数据类型:不可分解的类型,如
char
,int
,float
等。 - 构造数据类型:通过基本类型构造而成,包括
struct
,union
,enum
和数组。 - 指针类型:存储变量地址的特殊类型。
- 空类型
void
:用于定义无类型指针和无返回值的函数。
11. 分文件编程
11.1 头文件(.h
)
- 内容:宏定义、
typedef
、结构体、联合体、枚举和函数声明。 - 避免:通常不直接定义全局变量。
11.2 源文件(.c
)
- 包含:
main
函数和子函数的定义。
示例
- 创建头文件
head.h
,用于声明函数。 - 编写函数源文件
add.c
,定义函数。 - 编写主源文件
main.c
,引入头文件并调用函数。 - 编译:将多个
.c
文件编译链接成可执行文件。
特别注意:记住需要同时编译两个文件!!!
12.1 GCC 编译工具
GCC(GNU Compiler Collection)是广泛使用的开源编译器集合,用于C、C++等多种语言的编译工作。GCC的编译过程分为四个主要阶段:
-
预处理 (
gcc -E
):- 展开所有
#include
指令,合并头文件内容。 - 替换所有的宏定义。
- 删除所有的注释。
- 预处理器不进行语法检查,输出文件扩展名为
.i
。
- 展开所有
-
编译 (
gcc -S
):- 进行语法和词法检查,将预处理后的文件转换为汇编代码。
- 输出文件扩展名为
.s
。
-
汇编 (
gcc -c
):- 将汇编代码转换为机器码,生成目标文件。
- 输出文件扩展名为
.o
。
-
链接 (
gcc
):- 链接库文件,将多个目标文件组合成可执行文件。
- 默认输出文件名为
a.out
,可以通过-o
指定其他名称。
12.2 GDB 调试工具
GDB(GNU Debugger)是功能强大的调试工具,用于动态调试GCC编译的程序。
-
启动调试:
- 使用
gcc -g
编译源代码,生成包含调试信息的可执行文件。 - 运行
gdb a.out
启动GDB调试器,加载可执行文件。
- 使用
-
常用命令:
r
: 运行程序直到遇到断点或正常结束。l
: 查看源代码。b 行号或函数名
: 设置断点。info b
: 显示所有断点信息。d 断点编号
: 删除指定断点。p 变量名
: 打印变量的当前值。s
: 单步进入函数内部执行。n
: 单步执行,但不会进入函数调用。help
: 显示帮助信息。q
: 退出GDB。
注意: 当遇到printf
等函数时,使用s
命令可能被嵌入到系统库的内部实现中,此时使用n
命令可以避免进入库函数内部。
12.3 make 编译工具
12.3.1 定义
make
是一个自动化构建工具,用于管理项目中多个文件的编译与链接。通过解析 Makefile
文件,make
能够追踪文件的修改时间,仅对更新的源文件进行重新编译,从而节省时间和资源。
12.3.2 Makefile 格式
基本结构遵循以下模式:
Make
1目标 : 依赖
2 命令
- 目标:通常指的是需要构建的对象,如可执行文件。
- 依赖:目标构建所必需的文件,通常是源代码文件或其他目标文件。
- 命令:用于构建目标的具体指令。
12.3.3 用 make 管理多个文件
示例:
Make
1main: main.o fun.o
2 gcc main.o fun.o -o main
3
4main.o: main.c
5 gcc -c main.c -o main.o
6
7fun.o: fun.c
8 gcc -c fun.c -o fun.o
9
10.PHONY: clean
11clean:
12 rm -rf *.o main
- PHONY 目标:
clean
是一个伪目标,它不会产生任何文件,仅用于执行清理操作。
12.3.4 Makefile 变量
- 自定义变量:用户可以定义变量,通过
$()
来引用它们。=
:递归展开变量。:=
:直接赋值。+=
:追加新值。?=
:如果未定义,则赋值。
示例:
Make
1VAR = hello
2SUM := $(VAR) world
3
4all:
5 echo $(VAR)
6 echo $(SUM)
7
8SUM += 456
9SUM ?= 789
条件编译
在 Makefile
中,条件编译基于宏的定义与否:
Make
1ifdef MACRO_NAME
2 # 如果宏已定义,则执行此段代码
3else
4 # 否则,执行此段代码
5endif
此外,条件编译也用于防止头文件的重复包含:
Cpp
1#ifndef __HEAD_H__
2#define __HEAD_H__
3
4// 头文件内容
5
6#endif // __HEAD_H__