Linux从核心到边缘
Linux从核心到边缘
导言
今天有面试一家专注云原生产品的企业,有问到一个问题,就是你还有用过其他的Linux发行版吗,突然顿时觉得很惭愧,而且有一些基础的Linux问题居然发现我忘记了没有回答出来。而且仔细思考了一下,确实在大学期间仅仅只了解过Ubuntu偏向新手和私人开发的linux发行版,而且在命令上似乎只是停留在一些基础的操作(甚至有一些基础命令还忘记了),并没有深入的了解过Linux的内核。而且今天面试官说了一句话,就是从需求出发的科技探索更有利于我们进步。有的时候确实会把某些技术当作工具,但事实上确实是工具,作为一名希望在IT行业继续深耕的我,似乎越来越缺乏对技术美的欣赏,在大学没有多少生活压力的时期最应该体验这种美感的时候,却好像被一些保姆级教学一步步蒙蔽了眼睛。结果虽然出来了,但是可能对过程保留不多的记忆或者理解。只能说有时候学习的结果并不重要,重要的是一些有容错的过程。
内核概念
- 内核类似一个资源的管理程序,负载资源调度到需要的系统进程,我看有些理解可以把内核理解成一个库,有了一组面向系统命令,系统调用应用程序来说,就像调用普通函数一样。其实内核也可以理解成一个桥梁,能够练习硬件和上层应用点的桥梁。一涉及到底层的东西就越来越抽象,还是能够用一些比喻理解比较好。
内核的角色
- 内核是管理计算机的硬件资源的重要角色,就比如CPU,内存,存储设备和输入输出的设别。
- 内核主要威威上层提供了抽象的操作接口,让我们不需要关心硬件的细节。
- 内核维护不同程序和用户之间的安全界限,确保学习通的稳定和安全。
常见的内核参数
参数 | 说明 | 示例值 |
---|---|---|
内存管理相关参数 | ||
vm.swappiness | 控制内核将进程内存交换到交换分区的倾向 | 10 |
vm.dirty_ratio | 系统内存中可写缓存占总内存的百分比,超过该值将触发写回磁盘 | 20 |
vm.overcommit_memory | 控制内存分配策略,0表示启用内存过量使用检查,1表示允许过量使用,2表示严格模式 | 1 |
vm.min_free_kbytes | 系统保持的最小空闲内存量,防止内存完全用完导致系统崩溃 | |
网络相关参数 | ||
net.ipv4.ip_forward | 启用或禁用IP转发 | 1 |
net.ipv4.conf.all.rp_filter | 启用反向路径过滤,防止IP欺骗攻击 | |
net.ipv4.tcp_syncookies | 启用SYN cookies,防止SYN泛洪攻击 | 1 |
net.core.somaxconn | 定义系统中每个端口最大的监听队列长度 | 1024 |
net.ipv4.tcp_max_syn_backlog | 控制TCP协议栈中SYN请求的最大队列长度 | |
文件系统相关参数 | ||
fs.file-max | 系统级别的文件句柄数量限制 | 100000 |
fs.inotify.max_user_watches | 单个用户可以创建的inotify监视数量 | 524288 |
fs.aio-max-nr | 系统级别的异步I/O请求最大数量 | |
安全相关参数 | ||
kernel.randomize_va_space | 控制地址空间布局随机化(ASLR),提高系统安全性 | 2 |
kernel.sysrq | 控制SysRq键的功能,提供低级别的系统控制和调试功能 | 0 |
kernel.panic | 设置内核崩溃后重新启动系统的时间(秒) | 10 |
调度器相关参数 | ||
kernel.sched_migration_cost_ns | 定义任务迁移的代价,用于调度器的决策 | 500000 |
kernel.sched_min_granularity_ns | 定义调度器分配时间片的最小粒度 | 1000000 |
内核的主要组成部分
进程管理
进程调度:
进程通信
- 支持多种进程间通信IPC方法,包括信号,管道,消息队列,共享内存和套接字。
内存管理
- 虚拟内存:程序使用比实际物理内存更多的地址空间,通过使用分页/分段来实现
- 内存分配:内核提供多级分配框架,包括页分配器,slab分配器(说实话有够抽象的。)
- 交换空间:当物理内存不足时,内核可以将内存页移动到磁盘上的交换控件,以来释放内存。
文件系统
- 支持ext4,XFS,Btrfs,NFS和更多,以适应不同的存储需求和性能特点。
- 虚拟文件系统,VFS提供一个统一接口来访问不同文件系统
- 文件操作,内核提供系统调用,open,read,write,close。
设备驱动
- 字符设备和块设备:Linux区分字符设备,键盘鼠标和块设备硬盘驱动器。
- 模块化驱动:Linux支持动态加载和卸载设备驱动模块,这允许不重启系统的情况下添加或更新驱动程序。
网络栈
- 协议实现:内核实现了各种网络协议,IP,TCP,UDP和ICMP
- 网络接口:通过网络接口与各种网络硬件进行交互,如以太网卡,无限适配
- 网络数据处理:内核处理数据包路由,转发,过滤,支持高级网络功能,如虚拟网络,网络安全规则等。
linux防火墙
- 防火墙系统主要基于iptable,以及比较新的nftables系统,运行管理员配置规则,控制进出网络接口的数据包。
- iptables是一个广泛使用防火墙工具,使用一组表来组织规则,每个表包含多个链,链中包含具体规则,主要有 filter默认表,nat网络地址转换(处理进出接口的地址和端口转换),mangle用来修改数据包的内容,raw配置免除连接跟踪机制的数据包。
APT包管理
- 使用的是.deb包格式,通过apt源来管理和安装软件包。
- 一般是使用的linux发行版有Ubuntu,Debian,Linux Mint等
添加源
一般可以通过编辑/etc/apt/sourcer.list文件或者在sources.list.d目录下面,创建一个新的源。然后通过更新apt索引的方式。deb标识这是一个二进制的源,一般都会需要导入公钥,验证软件包的真实性,APT使用的是PGP签名,如果你源头是签名的,你需要的导入并信任该公钥,通常,源提供者会提供公钥和相应的导入命令。一般都是会直接把源echo进去,比较快捷。
sources.list文件结构
type uri suite {component} |
- type:源的类型,通常是
deb
用于二进制包,或deb-src
用于源代码包 - uri:源的URI
- suite:发行版的代号,buster,bullseye,focal,bionic
- component:可选,指定源中的区域或分区
YUM,DNF包管理
- 基于RPM的Linux发行版,使用.repo文件来定义软件仓库。
- 一般是使用的linux发行版有Fedora,CentOS和RHEL等
添加源
一般添加源可以创建一个新的文件或者编辑指定现有文件,这个和apt包管理的添源方式类似。但是他们的文件结构格式大不相同
# 仓库的唯一标识符。这个ID在 .repo 文件中必须是唯一的 |
更新方式也和apt管理不同
sudo yum(dnf) makecache fast |
结束
到这里为止,我依然觉得我还是不够了解Linux内核,总感觉没有想象的那么简单。可能过几天忙过了可以开始了解和学习一下KVM可能那里会给我一些答案。希望自己也能开始重新拾取对知识的渴望和动力吧。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Kalyan的小书房!
評論