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 的设计思想,但开源且自由分发。