 Linux基础知识
Linux基础知识
  # Linux基础知识
# 1. Linux 简介
Linux 内核最初由芬兰程序员林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学求学期间,出于个人兴趣开发。它是一款免费开源的类 Unix 操作系统,遵循 POSIX 标准,具备多用户、多任务、多线程以及多 CPU 支持的特性。
Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。

# 2. Linux 内核
# 2.1 Linux 内核 vs. 操作系统
很多人听到“Linux”时,认为它是一个完整的操作系统,但实际上 Linux 只是操作系统的内核(Kernel),并不是一个完整的操作系统(OS)。
那么,什么是操作系统?它是由多个部分组成的,包括:
- 内核(Kernel):直接控制硬件,管理资源(CPU、内存、磁盘、网络等)。
- Shell(命令行解释器):用户和内核之间的桥梁,用户输入命令,Shell 解析后交给内核执行。
- 系统库(Libraries):提供应用程序调用系统功能的接口,如 C 标准库(glibc)。
- 系统工具(Utilities):文件管理、用户管理、网络管理等基础软件(如 ls,ps,top,vi)。
- 应用程序(Applications):用户直接使用的软件,如 Web 浏览器、数据库、编译器等。
简而言之,Linux 只是一个“引擎”,要让它跑起来,还需要油(Shell)、轮子(文件系统)、方向盘(用户交互工具)等其他组件才能形成完整的操作系统(如 Ubuntu、CentOS、Debian)。
# 2.2 内核的职责:管理计算机的核心资源
Linux 内核的主要任务是 管理计算机硬件资源,它的职责包括:
- 进程管理(Process Management) - 负责创建、调度、终止进程,决定哪个程序使用 CPU。
- 进程间通信(IPC):管道(pipe)、信号(signal)、共享内存(shm)、消息队列(message queue)。
- 进程状态:运行(Running)、就绪(Ready)、阻塞(Blocked)。
- 进程调度:采用 CFS(完全公平调度器),保证多任务并发执行。
 
- 内存管理(Memory Management) - 负责分配、回收物理内存,使用 虚拟内存(Virtual Memory) 机制管理有限的 RAM 资源。
- 提供 分页(Paging)、分段(Segmentation)、交换(Swap) 等机制,提高内存利用率。
 
- 文件系统(File System) - 通过 虚拟文件系统(VFS, Virtual File System) 层支持多种文件系统,如 ext4、XFS、Btrfs、NTFS。
- 采用 一切皆文件(Everything is a File)原则,将设备、进程、网络接口等都视为文件。
 
- 设备驱动(Device Drivers) - 负责管理硬件设备,如磁盘、网卡、USB 设备等,用户通过 /dev/访问设备文件。
- 采用 可加载内核模块(LKM, Loadable Kernel Module) 机制,允许动态添加驱动程序。
 
- 负责管理硬件设备,如磁盘、网卡、USB 设备等,用户通过 
- 网络管理(Networking) - 内核内置 TCP/IP 协议栈,支持 IPv4、IPv6、VLAN、VPN。
- 通过 Netfilter(iptables)和 eBPF 进行网络流量控制和安全过滤。
 
# 2.3 Shell:用户和内核的桥梁
Linux 内核本身不会直接和用户交互,用户必须通过 Shell(命令行解释器) 发送命令。Shell 是一个特殊的程序,运行在内核之上,它的作用是:
- 解析命令(Command Parsing),如 ls -l,然后调用系统 API 让内核执行。
- 管理进程(Process Control),如前后台运行 &、任务控制jobs、kill。
- 变量与脚本(Scripting),支持 bash,zsh,sh,可以编写 Shell 脚本自动化任务。
常见的 Shell:
- Bash(默认 Shell):大多数 Linux 发行版的默认 Shell,功能丰富。
- Zsh:比 Bash 更强大,支持自动补全、插件系统。
- Fish:易用、现代化,默认支持语法高亮。
例子:当你输入
ls -l时,Shell 解析命令,调用syscall请求内核获取目录内容,最终返回结果给用户。
# 2.4 系统调用:应用程序如何与内核通信?
应用程序无法直接访问内核,而是通过 系统调用(System Call, syscall) 请求内核提供服务。
常见的系统调用:
- read()/- write():读取和写入文件或设备。
- fork():创建新进程。
- execve():执行新程序。
- open()/- close():打开和关闭文件。
示例:C 语言调用 write() 系统调用
#include <unistd.h>
int main() {
    write(1, "Hello, Linux Kernel!\n", 21); // 调用 syscall 写入终端
    return 0;
}
2
3
4
5
执行 strace ./a.out 可以看到 write(1, "Hello, Linux Kernel!\n", 21) 触发了系统调用。
# 2.5 Linux 内核的运行模式:用户态 vs. 内核态
为了保证安全性,Linux 采用两种 CPU 运行模式:
- 用户态(User Mode):普通应用程序运行的模式,不能直接访问硬件。
- 内核态(Kernel Mode):内核和驱动运行的模式,能直接访问硬件。
当应用程序调用 syscall 时,CPU 从 用户态切换到内核态 处理请求,执行完后再返回用户态。
示例:执行 ls 命令的过程
- 用户输入 ls,Shell 解析命令并调用execve()运行ls。
- ls通过- open()读取当前目录,并调用- getdents()获取文件列表。
- ls通过- write()将结果输出到终端。
- 执行完毕,Shell 返回提示符,等待用户输入下一个命令。
# 3. Linux 目录结构详解
Linux 的目录结构采用 层次化的树状结构,所有文件和目录都从根目录 / 开始,并按功能和用途进行组织。以下是 Linux 主要的目录及其用途:

| 目录 | 作用 | 
|---|---|
| / | 根目录,所有文件和目录的起点,只有 root 用户具有完全控制权限,普通用户只能访问部分内容。 | 
| /bin | (Binary,用户二进制可执行文件) 存放基本的用户二进制命令,如 ls、cp、mv、rm、cat、echo、pwd等,这些命令是所有用户都能使用的基本工具,即使系统进入单用户模式(维护模式)也可用。 | 
| /sbin | (Superuser Binary,超级用户二进制可执行文件)  仅 root 用户使用的 系统管理命令,如 shutdown、fdisk、mkfs、iptables、ifconfig等,普通用户通常不能执行这些命令,除非使用sudo。 | 
| /etc | (Configuration,系统配置文件) 存放 系统的全局配置文件,例如: - /etc/passwd:用户信息  -/etc/shadow:加密存储的用户密码  -/etc/group:用户组信息  -/etc/fstab:自动挂载的文件系统信息  -/etc/hosts:主机名解析配置  所有程序的默认配置文件 通常也存放在/etc目录下。 | 
| /home | 每个普通用户都有一个自己的主目录,例如: - /home/alice/(Alice 用户的主目录) -/home/bob/(Bob 用户的主目录) 该目录存放用户的个人文件、配置文件等。 | 
| /root | 超级用户 root 的主目录,类似于普通用户的 /home/username,但仅 root 可访问,普通用户无法进入。 | 
| /usr | (User System Resources,用户软件资源) 存放 系统应用程序和库文件,类似于 Windows 的 C:\Program Files\,其子目录包括: -/usr/bin:普通用户可执行的程序(比/bin更丰富) -/usr/sbin:系统管理工具(比/sbin更完整) -/usr/lib:库文件(比/lib更庞大) -/usr/local:本地安装的软件(不受 Linux 发行版的包管理控制) | 
| /var | (Variable,存放动态数据) 存放 不断变化的文件(日志、缓存、临时数据等),主要子目录: - /var/log/:系统日志文件(如/var/log/syslog,/var/log/auth.log) -/var/spool/:任务队列(如邮件队列、打印任务) -/var/tmp/:长期有效的临时文件(比/tmp保留时间长) | 
| /tmp | 存放 临时文件,如临时下载文件、临时缓存数据等,重启后 /tmp中的内容会被自动删除。 | 
| /dev | 存放 设备文件(Linux 中一切皆文件),常见设备包括: - /dev/sda:磁盘  -/dev/null:丢弃数据的黑洞  -/dev/tty:终端设备  -/dev/random:随机数设备 | 
| /mnt | 用于 临时挂载文件系统,如挂载 U 盘、光盘等。 | 
| /media | 现代 Linux 发行版用来 自动挂载可移动设备(U 盘、DVD),例如: - /media/usb:U 盘  -/media/cdrom:光盘 | 
| /opt | (Optional,第三方软件) 存放 第三方软件(不受系统包管理控制的软件),例如: - /opt/google/chrome/(Google Chrome 安装目录) -/opt/zoom/(Zoom 软件) | 
| /lib、/lib64 | 存放 系统库文件,供可执行程序调用。 - /lib:用于 32 位系统库。 -/lib64:用于 64 位系统库。 | 
| /proc | (Process,进程信息) 虚拟文件系统,存放 内核和进程信息,例如: - /proc/cpuinfo:CPU 信息  -/proc/meminfo:内存信息  -/proc/1234/:进程 ID 1234 的信息 | 
| /sys | (System,内核设备信息) 另一个 虚拟文件系统,存放系统硬件信息,例如: - /sys/class/net/eth0/(网络接口信息) -/sys/block/sda/(磁盘信息) | 
| /run | 存放 运行时数据,如进程 ID(PID)、锁文件等,示例: - /run/systemd/(systemd 运行时信息) -/run/sshd.pid(SSH 服务的进程 ID) | 
# 4. 常见问题
# 4.1 文件夹区别
- /usr和- /bin有什么区别?- /bin(Binary):存放 基本系统命令,如- ls、- cp、- mv、- cat,即使系统运行在单用户模式下也必须存在。
- /usr/bin:存放 非基本用户命令,如- vim、- gcc、- wget,通常用于普通用户运行的程序。
 
- /var/tmp和- /tmp有什么区别?- /tmp:存放 临时文件,系统重启后会自动清除,适合存放短期临时数据。
- /var/tmp:也是临时存储目录,但 系统重启后文件仍然存在,适合存放需要长时间存活的临时数据。
 
- 为什么 /proc和/sys不是普通目录?- /proc和- /sys属于 虚拟文件系统,它们 不存储实际数据,而是动态提供 系统和进程信息。
- /proc:提供 进程和系统信息,如- /proc/cpuinfo(CPU 信息)、- /proc/meminfo(内存使用情况)。
- /sys:用于 设备管理,提供 硬件信息,如- /sys/class/net/(网络设备)、- /sys/block/(存储设备)。
 
# 4.2 CLI(命令行界面)和 GUI(图形界面)
- CLI(Command Line Interface)命令行界面 - 通过 键盘输入命令 进行操作,如 ls列出文件、cd切换目录。
- 优点:占用资源少、操作精确、适合服务器环境和自动化任务。
- 缺点:对新手不友好,需要记住命令。
 
- 通过 键盘输入命令 进行操作,如 
- GUI(Graphical User Interface)图形界面 - 通过 鼠标+图形窗口 进行操作,如 GNOME、KDE。
- 优点:更直观,适合普通用户。
- 缺点:占用系统资源较多,某些操作不如 CLI 灵活。
 
CLI 适合服务器、编程和运维;GUI 适合普通用户和桌面环境。
# 4.3 DOS 和 Bash 的区别
# 1. 什么是 DOS?
DOS(Disk Operating System) 是 早期的命令行操作系统,最著名的是 MS-DOS(微软 DOS),它是 1980 年代和 1990 年代初 PC 计算机的主要操作系统。
DOS 示例:
C:\> dir
C:\> cd Documents
C:\> copy file1.txt file2.txt
C:\> del file2.txt
2
3
4
由于 DOS 的 功能有限,现代 Windows 已经不再使用纯 DOS,而是采用 Windows 命令提示符(cmd.exe) 作为兼容模式,或者使用更强大的 PowerShell。
# 2. 什么是 Bash?
Bash(Bourne Again Shell) 是 Linux 和 macOS 常见的 命令行解释器(Shell),用来执行命令、运行脚本,并提供丰富的 编程能力。
Bash 示例:
$ ls
$ cd /home/user/Documents
$ cp file1.txt file2.txt
$ rm file2.txt
2
3
4
结论:
- 如果你是 Windows 用户,可能偶尔会用 DOS 进行简单文件操作。
- 如果你是 Linux 服务器管理员、开发者,你每天都会使用 Bash 进行 管理、开发、自动化任务。
- 如果你想学编程或自动化,Bash 是必学的工具之一!
# 4.4 Unix 和 Linux
- Unix - 1969 年 AT&T 贝尔实验室开发,最早的多用户、多任务系统。
- 专有系统,如 macOS、AIX、Solaris,通常需要购买许可证。
 
- Linux - 1991 年 Linus Torvalds 开发的 开源 类 Unix 系统,遵循 POSIX 标准。
- 完全免费,有多个发行版(Ubuntu、CentOS、Debian)。
 
Linux 是 Unix 的“克隆”,继承了 Unix 的设计思想,但开源且自由分发。
