Linux从核心到边缘

导言

今天有面试一家专注云原生产品的企业,有问到一个问题,就是你还有用过其他的Linux发行版吗,突然顿时觉得很惭愧,而且有一些基础的Linux问题居然发现我忘记了没有回答出来。而且仔细思考了一下,确实在大学期间仅仅只了解过Ubuntu偏向新手和私人开发的linux发行版,而且在命令上似乎只是停留在一些基础的操作(甚至有一些基础命令还忘记了),并没有深入的了解过Linux的内核。而且今天面试官说了一句话,就是从需求出发的科技探索更有利于我们进步。有的时候确实会把某些技术当作工具,但事实上确实是工具,作为一名希望在IT行业继续深耕的我,似乎越来越缺乏对技术美的欣赏,在大学没有多少生活压力的时期最应该体验这种美感的时候,却好像被一些保姆级教学一步步蒙蔽了眼睛。结果虽然出来了,但是可能对过程保留不多的记忆或者理解。只能说有时候学习的结果并不重要,重要的是一些有容错的过程。

内核概念

  • 内核类似一个资源的管理程序,负载资源调度到需要的系统进程,我看有些理解可以把内核理解成一个库,有了一组面向系统命令,系统调用应用程序来说,就像调用普通函数一样。其实内核也可以理解成一个桥梁,能够练习硬件和上层应用点的桥梁。一涉及到底层的东西就越来越抽象,还是能够用一些比喻理解比较好。
  • img

内核的角色

  • 内核是管理计算机的硬件资源的重要角色,就比如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

内核的主要组成部分

进程管理

进程调度:

  • Linux内核使用多种调度算法,决定那个进程获得CPU时间,确保各个进程公平使用CPU资源。

    进程同步:

  • 内核提供了多种机制,处理进程或线程之间的同步,防止数据争抢,确保线程安全。

进程通信

  • 支持多种进程间通信IPC方法,包括信号,管道,消息队列,共享内存和套接字。

内存管理

  • 虚拟内存:程序使用比实际物理内存更多的地址空间,通过使用分页/分段来实现
  • 内存分配:内核提供多级分配框架,包括页分配器,slab分配器(说实话有够抽象的。)
  • 交换空间:当物理内存不足时,内核可以将内存页移动到磁盘上的交换控件,以来释放内存。

    文件系统

  • 支持ext4,XFS,Btrfs,NFS和更多,以适应不同的存储需求和性能特点。
  • 虚拟文件系统,VFS提供一个统一接口来访问不同文件系统
  • 文件操作,内核提供系统调用,open,read,write,close。

    设备驱动

  • 字符设备和块设备:Linux区分字符设备,键盘鼠标和块设备硬盘驱动器。
  • 模块化驱动:Linux支持动态加载和卸载设备驱动模块,这允许不重启系统的情况下添加或更新驱动程序。

    网络栈

  • 协议实现:内核实现了各种网络协议,IP,TCP,UDP和ICMP
  • 网络接口:通过网络接口与各种网络硬件进行交互,如以太网卡,无限适配
  • 网络数据处理:内核处理数据包路由,转发,过滤,支持高级网络功能,如虚拟网络,网络安全规则等。

linux防火墙

  • 防火墙系统主要基于iptable,以及比较新的nftables系统,运行管理员配置规则,控制进出网络接口的数据包。
  1. 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}
deb http://us.archive.ubuntu.com/ubuntu/ focal main restricted
  • type:源的类型,通常是 deb 用于二进制包,或 deb-src 用于源代码包
  • uri:源的URI
  • suite:发行版的代号,buster,bullseye,focal,bionic
  • component:可选,指定源中的区域或分区

YUM,DNF包管理

  • 基于RPM的Linux发行版,使用.repo文件来定义软件仓库。
  • 一般是使用的linux发行版有Fedora,CentOS和RHEL等

添加源

一般添加源可以创建一个新的文件或者编辑指定现有文件,这个和apt包管理的添源方式类似。但是他们的文件结构格式大不相同

# 仓库的唯一标识符。这个ID在 .repo 文件中必须是唯一的
[docker-ce-stable]
# 仓库的描述性名称
name=Docker CE Stable - $basearch
# 仓库的基本URL,指向包含RPM包的目录
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
# 定是否启用该仓库。设置为 1 表示启用,0 表示禁用
enabled=1
# 指定是否检查GPG签名。设置为 1 表示启用GPG签名检查
gpgcheck=1
# 指向GPG公钥文件的路径,用于验证包的签名。
gpgkey=https://download.docker.com/linux/centos/gpg

更新方式也和apt管理不同

sudo yum(dnf) makecache fast

结束

到这里为止,我依然觉得我还是不够了解Linux内核,总感觉没有想象的那么简单。可能过几天忙过了可以开始了解和学习一下KVM可能那里会给我一些答案。希望自己也能开始重新拾取对知识的渴望和动力吧。