超详细!Linux 内存交换机制 + 系统启动过程实战

超详细!Linux 内存交换机制 + 系统启动过程实战 摘要本文详解Linux交换空间Swap原理、大小规划、分区创建/激活/持久化实战同时梳理CentOS7系统启动全流程、运行级别与target配置适合运维新手入门与进阶。目录一、Linux 交换空间管理计算机存储器的层次结构计算机存储器的工作原理物理内存Swap空间二、Linux 系统启动原理CentOS 7 启动过程系统target系统启动级别设置系统运行目标一、Linux 交换空间管理计算机存储器的层次结构计算机存储器速度越快成本较高。 为了获得好的性能/价格比计算机中各种存储器组成一个层状的塔式结构取长补短协调工作。CPU 寄存器是 CPU 内部用来存放数据的一些小型存储区域用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。CPU 高速缓存也就是CPU Cache是一种容量小、速度快的高缓冲存储器由SRAM组成直接制作在CPU芯片内速度几乎与CPU一样快。在金字塔式存储体系中它位于自顶向下的第二层仅次于CPU寄存器。其容量远小于内存但速度却可以接近处理器的频率。主存储器Main memory简称主存或内存其作用是存放指令和数据并能由中央处理器CPU直接随机存取。主存储器速度比CPU高速缓存慢但存储容器却大的多。主存储器的速度一般用存取时间衡量即每次与CPU间数据处理耗费的时间以纳秒(ns)为单位。大多数SDRAM内存芯片的存取时间为5、6、7、8或10ns。主存储器的带宽计算公式带宽频率*位宽8。例如DDR4 内存频率是3600 MHz在64位系统双通道位宽为128以此类推1B8bit,单通道 DDR4-36003600MHz * 64bit / 828800MB/S双通道 DDR4-36003600MHz * 64bit * 2 / 857600MB/S辅助存储器速度慢的多优点是容量大可持久化存储。计算机存储器的工作原理CPU运行程序时先从寄存器中读取数据。如果在寄存器中可以找到数据则直接从寄存器中读取。如果在寄存器中找不到数据则从CPU Cache中读取数据并将数据缓存在CPU Cache中。如果在CPU cache中可以找到数据则直接从CPU Cache中读取。如果在CPU cache中找不到数据则从主存储器内存中读取数据将数据缓存在主存储器中。如果在内存中可以找到数据则直接从内存中读取。如果在内存中找不到数据则从辅助存储器中读取数据例如机械磁盘、光盘、U盘等并将数据缓存在内存中。物理内存计算机系统将内存划分为固定大小的块称为page标准page 大小为 4 KiB。进程并不直接对物理内存寻址每个进程具有虚拟地址空间virtual address space。当进程请求内存时MMU 将进程获得的虚拟地址VAVirtual Address 映射到物理地址PAPhysical Address 。MMU是Memory Management Unit的缩写即内存管理单元它是CPU中用来管理虚拟存储器、物理存储器的控制线路负责将虚拟地址映射为物理地址以及提供硬件机制的内存访问授权。**思考**为什么CPU不直接访问物理地址虚拟内存的容量是物理内存和交换空间的总和而虚拟地址负责映射到物理内存地址和交换空间地址。进程使用内存的过程中希望内存是连续的。如果进程直接访问物理地址则内核很难保证进程获得的物理地址空间是连续的因为进程存在着运行和退出就会出现内存碎片化。进程的虚拟地址在虚拟内存中是连续的达到了内存连续的目的而 MMU 会将进程的虚拟地址映射到物理地址。Swap 空间Swap意思是“交换”、“实物交易”。Linux Swap交换空间是受Linux内核内存子系统控制的磁盘区域。功能1当内存使用量超过定义的限制时内核寻找已分配给进程但空闲的内存页将该空闲的内存页写入到交换空间并向其他进程重新分配RAM页面。功能2如果某个程序需要访问磁盘上的页面则内核会找到另一个空闲的内存页 将其写入到磁盘然后从交换区重新调用所需的页面。功能3如果某个程序需要访问数据访问的数据存放在交换空间则该程序直接从交换空间读取数据而不需要从磁盘原始位置读取进而提高速度。简单地说Linux Swap 空间就是在内存不够的情况下操作系统先把内存中暂时不用的数据存到硬盘的交换空间腾出内存来让别的程序运行和Windows的虚拟内存pagefile.sys的作用是一样的。**交换空间只是临时的解决办法。**虽然交换空间能够作为虚拟内存使用但由于交换区位于磁盘上它的速度比物理内存慢的多因此如果需要更快的速度的话最好的办法仍然是加大物理内存。查看内存# 默认单位是KiB使用-m选项以MiB为单位[rootserver ~18:06:04]# freetotal usedfreeshared buff/cache available Mem:40261161569323761776117321074083688984Swap:406322804063228输出说明Memtotal物理内存空间大小。used使用的内存 (total - free - buffers - cache)。free未使用的内存空间大小(真正的空闲未被任何程序占用)。shared多个进程共享的内存空间大小。cached从磁盘读取的数据占用的内存空间大小待以后使用数据没有被修改。buffers被更改但未写回磁盘的数据占用的内存空间大小。Swap:total交换空间大小。used使用的交换空间大小。free未使用交换空间大小。Swap 空间大小管理员应根据系统的内存工作负载来调整交换空间大小。应用供应商有时会提供这方面的建议。根据物理内存总量下表提供了一些指导。物理内存(RAM)交换空间允许HIBERNATE时的交换空间2GiB或以下两倍的RAM三倍的RAM2GiB和8GiB之间同等的RAM两倍的RAM8GiB和64GiB之间至少4GiB1.5倍的RAM64GiB以上至少4GiB不建议Hibernate笔记本电脑和台式机的Hibernate功能会在关闭系统电源之前使用交换空间来保存RAM内容。重新打开系统时 内核将从交换空间恢复RAM内容无需完全启动。 对于这些系统而言交换空间需要超过RAM量。插播分析操作系统自带的 LVM 结构[rootserver~18:10:12]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda8:00200G0disk ├─sda18:101G0part/boot └─sda28:20199G0part ├─centos-root253:0050G0lvm/├─centos-swap253:103.9G0lvm[SWAP]└─centos-home253:20145.1G0lvm/home sr011:011024M0rom[rootserver~18:10:23]# pvsPV VG Fmt Attr PSize PFree/dev/sda2 centos lvm2 a--199.00g4.00m# sda2作为pv使用剩余所有空间归属卷组centos# 在centos卷组中创建各种lv提供不同的存储空间例如/、/home、swap.思考如何从centos卷组中分配4G空间出来给新的swap使用[rootserver~18:10:41]# df -hT |grep -v tmpfs文件系统 类型 容量 已用 可用 已用%挂载点/dev/mapper/centos-root xfs 50G1.6G 49G4%//dev/mapper/centos-home xfs 146G 33M 146G1%/home/dev/sda1 xfs 1014M 139M 876M14%/boot发现/home文件系统系统空间很大但是使用空间非常少。缩减/home空间给其他应用使用。/home文件系统是xfs不支持缩减。可以备份数据后再缩减空间。# 备份数据[rootserver~18:12:11]# mkdir /backup[rootserver~18:12:24]# cp -a /home/czr/ /backup/# 缩减逻辑卷[rootserver~18:12:40]# umount /home[rootserver~18:13:15]# lvreduce -L 46G /dev/centos/homeWARNING:Reducing active logical volume to46.00GiB.THIS MAY DESTROY YOUR DATA(filesystem etc.)Do you really want toreducecentos/home?[y/n]:y Size of logical volume centos/home changedfrom145.12GiB(37150extents)to46.00GiB(11776extents).Logical volume centos/home successfully resized.# 空间释放到卷组中[rootserver~18:13:40]# vgsVG#PV #LV #SN Attr VSize VFreecentos130wz--n-199.00g99.12g# 重新格式化并挂载[rootserver~18:13:58]# mkfs.xfs -f /dev/centos/home[rootserver~18:14:12]# grep home /etc/fstab/dev/mapper/centos-home/home xfs defaults00[rootserver~18:14:18]# mount -a[rootserver~18:14:23]# df /home/文件系统 1K-块 已用 可用 已用%挂载点/dev/mapper/centos-home4821094432992481779521%/home# 恢复数据[rootserver~18:14:47]# cp -a /backup/czr/ /home/# 验证用户登录[rootserver~18:14:55]# su - czr创建交换空间# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap[rootserver ~18:15:15]# parted /dev/sdb mklabel gpt[rootserver ~18:15:40]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 2049[rootserver ~18:15:56]# parted /dev/sdb unit MiB print# 格式化swap空间[rootserver ~18:16:13]# mkswap /dev/sdb1Setting up swapspace version1, size2097148KiB no label,UUID2bf4e179-3648-4412-9495-3b278df4acd6激活 swap 空间# 激活swap空间[rootserver ~18:18:03]# swapon /dev/sdb1# 查看swap设备列表[rootserver ~18:18:15]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3默认情况下多个交换空间具有相同的优先级时系统会按顺序使用交换空间即内核先使用第一个已激活交换空间直至其空间已满然后开始使用第二个交换空间。在激活交换分区的时候可以为每个交换空间定义一个优先级从而强制按该顺序使用交换空间。swapon 命令使用-p选项指定优先级优先级介于-1和32767之间值越大优先级越高。示例[rootserver ~18:18:26]# swapon -p 4 /dev/sdb1取消 swap 空间激活[rootserver ~18:19:02]# swapoff /dev/sdb1[rootserver ~18:19:09]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2持久化激活 swap 空间修改/etc/fstab文件添加如下类似记录UUID2bf4e179-3648-4412-9495-3b278df4acd6 swap swap pri4 0 0使用命令swapon -a激活/etc/fstab中所有交换设备。使用命令swapoff -a取消/etc/fstab中所有交换设备激活。[rootserver ~18:25:15]# swapon -a[rootserver ~18:25:20]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3[rootserver ~18:25:44]# swapoff -a[rootserver ~18:25:52]# swapon -s二、Linux 系统启动原理CentOS 7 启动过程现代计算机系统是硬件与软件的复杂组合。从加电状态开始到拥有登录提示符的运行中系统这需要大量的硬件和软件配合工作。以下列表从较高层面概述了 CentOS7 启动过程。计算机接通电源。系统固件现代UEFI或更旧的BIOS)运行开机自检(POST)并开始初始化硬件。配置在系统启动早期通过按特定的组合键例如F2配置系统固件。系统固件搜索启动设备根据固件配置的顺序搜索启动磁盘上的主启动记录(MBR)。系统固件从磁盘读取boot loader然后将系统控制权交给boot loaderboot loader是GRand Unified Bootloader version 2(GRUB2)。配置使用 grub2-install 命令进行配置它将安装 GRUB2 作为磁盘上的启动加载器。GRUB2从/boot/grub2/grub.cfg文件加载配置并显示一个操作系统菜单可以从中选择要启动的系统。配置使用 /etc/grub.d/ 目录、/etc/default/grub 文件和 grub2-mkconfig 命令进行配置以生成 /boot/grub2/grub.cfg 文件。boot loader根据选定条目的配置从磁盘中加载kernel和initramfs并将它们放入内存中。initramfs是一个存档其中包含启动时所有必要硬件的内核模块、初始化脚本等等。boot loader将控制权交给kernel并同时将启动项的内核参数、initramfs在内存中的位置传递给kernel。内核在initramfs中找到所有硬件驱动程序并初始化这些硬件。配置使用 /etc/dracut.conf.d/ 用录、dracut 命令和 lsinitrd 命令进行配置以检查 initramfs 文件。initramfs 执行/sbin/init作为PID 1。在CentOS中/sbin/init是一个指向systemd的链接。配置使用内核参数initcommand配置系统初始化程序。随后systemd会加载从内核命令行传递的target或者加载系统配置的default.target该目标通常启动一个基于文本的登录或图形登录屏幕。**配置**使用systemctl设置默认target。default.target依赖sysinit.targetsysinit.target用于初始化系统例如读取/etc/fstab挂载文件系统激活systemd-journald等。**配置**使用/etc/fstab配置文件系统开机自动挂载。default.target还会激活开机启动的单元。**配置**使用systemctl设置开机启用服务。default.target还会激活getty.target该target将打开tty1终端用于用户登录。系统 target普通文件和目录之间关系普通文件用来存储数据例如MP3、mp4、fstab、passwd目录用来组织文件系统分层结构白话用来分组文件。systemd使用类型为target的单元来分组不同单元例如multi-user.target包涵chronyd.service、crond.service、firewalld.service等服务。target还可以包涵其他target例如graphical.target包涵multi-user.targetmulti-user.target包涵basic.targetbasic.target包涵sysinit.target。使用以下命令查看target之间依赖关系[rootserver ~18:30:05]# systemctl list-dependencies graphical.targetgraphical.target ● ├─accounts-daemon.service ● ├─gdm.service ● ├─initial-setup-reconfiguration.service ● ├─network.service ● ├─rtkit-daemon.service ● ├─systemd-readahead-collect.service ● ├─systemd-readahead-replay.service ● ├─systemd-update-utmp-runlevel.service ● ├─udisks2.service ● └─multi-user.target......# 查看反向依赖[rootserver ~18:30:20]# systemctl list-dependencies sshd.service --reversesshd.service ● └─multi-user.target ● └─graphical.target系统启动级别传统的 SysVinit 系统定义了 7 个运行级别0-6每个级别有特定的作用具体如下运行级别target作用描述0关机halt系统终止所有进程并关闭电源对应命令shutdown -h now。1emergency.target rescue.target单用户模式single user mode仅 root 用户可登录无网络服务用于系统修复如密码找回。2多用户模式无 NFS支持多用户登录但不启动网络文件系统NFS部分发行版如 Debian默认此级别功能与级别 3 相同。3multi-user.target完全多用户模式文本界面启动所有网络服务用户通过命令行登录无图形界面。4预留级别默认未使用可由用户自定义用途。5graphical.target图形化多用户模式在级别 3 的基础上启动图形界面如 GNOME、KDE用户通过图形登录界面访问系统。6重启reboot系统终止所有进程并重启对应命令shutdown -r now。设置系统运行目标/etc/inittab文件是CentOS 6之前版本初始化系统使用的配置文件。# 部分内容如下# Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)## 设置运行级别为5也就是图形化方式启动。id:5:initdefault:设置系统当前运行 target# 设置系统当前运行target为multi-user.target[rootserver ~18:35:03]# systemctl isolate multi-user.target# 等效与[rootserver ~]# init 3# 设置系统当前运行target为graphical.target[rootserver ~18:35:25]# systemctl isolate graphical.target# 等效与[rootserver ~]# init 5设置系统开机默认运行 target# 查看系统开机默认运行target[rootserver ~18:35:42]# systemctl get-defaultgraphical.target# 设置系统开机默认运行target[rootserver ~18:35:55]# systemctl set-default multi-user.target# 重启验证在系统启动时选择其它目标要在启动时选择其他目标将 systemd.unittarget.target 参数附加到内核命令行。该配置是临时生效的经常用于系统启动过程中故障排除。要使用这种选择其他目标的方法请执行以下步骤启动或重新启动系统。按任意键中断启动加载器菜单倒计时Enter除外它用于执行正常启动。将光标移至第一个内核条目按e编辑当前条目。将光标移至以linux16开头的行末尾附加systemd.unittarget.target。例如systemd.unitmulti-user.target。按 Ctrlx 使用这些更改进行启动。总结1、Swap 是内存不足时的应急手段规划好大小别过度依赖。2、LVM 灵活扩容缩容xfs 缩容需备份重建。3、CentOS7 由 systemd 管理启动核心是 target 依赖链。4、运行级别简化为 3文本、5图形用 systemctl 配置。