
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为单位[rootcentos7 ~]# freetotal usedfreeshared buff/cache available Mem:40261563304603528844121361668523485576Swap: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量。创建交换空间# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap[rootcentos7 ~]# parted /dev/sdb mklabel gpt[rootcentos7 ~]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 2049[rootcentos7 ~]# parted /dev/sdb unit MiB print# 格式化swap空间[rootcentos7 ~]# mkswap /dev/sdb1Setting up swapspace version1, size2097148KiB no label,UUID2bf4e179-3648-4412-9495-3b278df4acd6激活 swap 空间# 激活swap空间[rootcentos7 ~]# swapon /dev/sdb1# 查看swap设备列表[rootcentos7 ~]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3默认情况下多个交换空间具有相同的优先级时系统会按顺序使用交换空间即内核先使用第一个已激活交换空间直至其空间已满然后开始使用第二个交换空间。在激活交换分区的时候可以为每个交换空间定义一个优先级从而强制按该顺序使用交换空间。swapon 命令使用-p选项指定优先级优先级介于-1和32767之间值越大优先级越高。示例[rootcentos7 ~]# swapon -p 4 /dev/sdb1取消 swap 空间激活[rootcentos7 ~]# swapoff /dev/sdb1[rootcentos7 ~]# 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中所有交换设备激活。[rootcentos7 ~]# swapon -a[rootcentos7 ~]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3[rootcentos7 ~]# swapoff -a[rootcentos7 ~]# swapon -sLinux 系统启动原理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终端用于用户登录。系统 targetsystemd使用类型为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之间依赖关系[rootcentos7 ~]# 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......# 查看反向依赖[rootcentos7 ~]# 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[rootcentos7 ~]# systemctl isolate multi-user.target# 设置系统当前运行target为graphical.target[rootcentos7 ~]# systemctl isolate graphical.target设置系统开机默认运行 target# 查看系统开机默认运行target[rootcentos7 ~]# systemctl get-defaultgraphical.target# 设置系统开机默认运行target[rootcentos7 ~]# systemctl set-default multi-user.target# 重启验证在系统启动时选择其它目标要在启动时选择其他目标将 systemd.unittarget.target 参数附加到内核命令行。该配置是临时生效的经常用于系统启动过程中故障排除。要使用这种选择其他目标的方法请执行以下步骤启动或重新启动系统。按任意键中断启动加载器菜单倒计时Enter除外它用于执行正常启动。将光标移至第一个内核条目按e编辑当前条目。将光标移至以linux16开头的行末尾附加systemd.unittarget.target。例如systemd.unitmulti-user.target。按 Ctrlx 使用这些更改进行启动。重置 ROOT 密码以下几种方法可用于设置新的root密码。例如系统管理员可以使用Live CD启动系统挂载根文件系统然后编辑/etc/shadow删除root账户密码字段使用已知密码字段替换root密码字段在CentOS 7之后版本中可以让initramfs运行的脚本在某些点暂停以提供root身份的shell然后在该shell中重置root密码。方法1rd.break重新启动系统。按任意键Enter除外中断启动加载器倒计时。将光标移至第一个内核条目按e编辑当前条目。将光标移至以linux16开头的行末尾附加rd.break。利用该选项在系统从initramfs向实际系统移交控制权前系统将会中断。按Ctrlx进行启动。此时系统会显示root shell且磁盘上的实际根文件系统以只读方式挂载在/sysroot。以读/写形式重新挂载/sysroot。switch_root:/# mount -o remount,rw /sysroot切换root位置把/sysroot做为文件系统树的根。switch_root:/# chroot /sysroot设置新root密码。sh-4.2# echo password | passwd --stdin root提示password 是用户自定义密码。如果系统开启了 SELinux 功能则需要确保所有未标记的文件包括此时的/etc/shadow)在启动过程中都会重新获得标记。sh-4.2# touch /.autorelabel执行以下命令系统将继续启动。如果系统开启了SELinux功能还需要执行完整的 SELinux 重新标记然后再次重新启动。sh-4.2# exit switch_root:/# exit登录验证。方法2init/bin/bash重新启动系统。按任意键Enter除外中断启动加载器倒计时。将光标移至第一个内核条目按e编辑当前条目。将光标移至以linux16开头的行末尾附加init/bin/bash。利用该选项在系统从initramfs向实际系统移交控制权前系统将会中断请开启一个root shell。按Ctrlx使用这些更改进行启动。此时系统会显示root shell且磁盘上的实际根文件系统以只读方式挂载在/。以读/写形式重新挂载/。bash-4.2# mount -o remount,rw /使用以下命令删除root密码等进入系统后再重新设置root密码。sh-4.2# passwd -d root此时还可以使用vi编辑器直接编辑/etc/shadow文件复制已知用户的密码记录替换root密码。如果系统开启了 SELinux 功能则需要确保所有未标记的文件包括此时的/etc/shadow)在启动过程中都会重新获得标记。sh-4.2# touch /.autorelabel执行以下命令系统将继续启动。如果系统开启了SELinux功能还需要执行完整的 SELinux 重新标记然后再次重新启动。sh-4.2# exec /usr/lib/systemd/systemd使用root登录此时不需要密码。/etc/fstab 引起的系统启动问题环境准备# 设置磁盘分区管理方案[rootcentos7 ~]# parted /dev/sdb mklabel msdos# 创建分区[rootcentos7 ~]# parted /dev/sdb unit MiB mkpart primary 1 10241# 格式化为xfs文件系统[rootcentos7 ~]# mkfs.xfs /dev/sdb1# 创建挂载点[rootcentos7 ~]# mkdir /data01# 设置持久化挂载[rootcentos7 ~]# echo /dev/sdb1 /data01 xfs defaults 0 0 /etc/fstab# 挂载并验证[rootcentos7 ~]# mount -a[rootcentos7 ~]# df -h /data01文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb1 10G 33M 10G1% /data01故障1挂载点不存在环境准备[rootcentos7 ~]# umount /data01[rootcentos7 ~]# rmdir /data01重启系统验证# 可以正常进入系统挂载点会被自动创建[rootcentos7 ~]# df -h /data01文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb1 10G 33M 10G1% /data01故障2设备名称写错或者找不到设备环境准备[rootcentos7 ~]# vim /etc/fstab# 将原先的sdb1修改为sdb2/dev/sdb2 /data01 xfs defaults00重启系统验证启动过程中找不到该设备。1分30秒超时后进入emergency模式进行修复。修改为正确的值或者注释该条目确保系统正常启动。然后输入exit继续启动。故障3破坏文件系统环境准备[rootcentos7 ~]# dd if/dev/zero of/dev/sdb1 bs1M count1重启系统验证系统启动过程中尝试修复文件系统修复失败后提示进入 emergency 模式修复。输入root 密码进入emergency 模式。# 执行以下命令修复 [rootcentos7 ~]# xfs_repair /dev/sdb1修复完成后输入 exit 正常启动系统。grub2 配置grub2 配置文件grub2 的主要配置文件如下/boot/grub2grub2的主要配置文件所在目录例如grub.cfg、grubenv、user.cfg。/etc/grub2.cfg/etc/grub2.cfg 是指向 /boot/grub2/grub.cfg的软连接。不要直接修改/etc/grub2.cfg文件该文件由系统自动生成。如果需要自定义这个文件可以通过修改/etc/grub.d/中脚本和/etc/default/grub文件然后通过grub2-mkconfig命令生成。使用efi启动方式的grub2配置文件是/etc/grub2-efi.cfg。/etc/grub.d/该目录下存放多个数字开头的脚本按照从小到大的顺序执行。例如00_header会调用/etc/default/grub配置文件来实现最基本的开机界面配置。/etc/default/grub定义grub启动部分变量信息例如grub启动菜单选择条目的超时时间内核参数等。/boot/grub2/grubenv设定默认启动条目。grub 菜单超时时间[rootcentos7 ~]# vim /etc/default/grub# 修改GRUB_TIMEOUT为10GRUB_TIMEOUT10# 生效grub2.cfg配置文件[rootcentos7 ~]# grub2-mkconfig -o /etc/grub2.cfgGenerating grub configurationfile...done# 重启[rootcentos7 ~]# rebootkernel 启动参数[rootcentos7 ~]# vim /etc/default/grub# 修改GRUB_CMDLINE_LINUX例如在最后添加参数consolettyS0导致不显示启动过程GRUB_CMDLINE_LINUXrd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet consolettyS0# consolettyS0: 启动过程信息显示到 ttyS0 终端导致启动过程是tty1上不显示启动消息。# rhgb启用图形化启动界面Red Hat Graphical Boot。# quiet减少启动过程中的日志输出只显示重要信息 debug 开启调试模式显示详细启动日志# 生成grub2.cfg配置文件重启验证[rootcentos7 ~]# grub2-mkconfig -o /etc/grub2.cfg[rootcentos7 ~]# reboot效果如下查看内核启动参数所有内核参数的详细说明可参考 Linux 内核文档CentOS 7 中可通过安装kernel-doc包获取yuminstallkernel-doc-y文档路径/usr/share/doc/kernel-doc-版本/Documentation/admin-guide/kernel-parameters.txt查看方式less/usr/share/doc/kernel-doc-3.10.0/Documentation/admin-guide/kernel-parameters.txt注意替换版本为实际内核版本可通过uname -r查看常用参数说明除了rhgb和quiet常见参数包括ro只读挂载根文件系统启动后由系统自动切换为读写rw直接以读写方式挂载根文件系统root指定根文件系统的设备如root/dev/sda1crashkernelauto预留内存用于内核崩溃时的转储net.ifnames0禁用网络接口的 “一致性命名规则”如ens33强制使用传统命名如eth0便于脚本或传统工具兼容。biosdevname0配合net.ifnames0使用彻底禁用基于 BIOS 的设备命名规则。grub 菜单加密# 查看/etc/grub.d/01_users脚本[rootcentos7 ~]# cat /etc/grub.d/01_users#!/bin/sh -ecatEOF if [ -f \${prefix}/user.cfg ]; then source \${prefix}/user.cfg if [ -n \${GRUB2_PASSWORD} ]; then set superusersroot export superusers password_pbkdf2 root \${GRUB2_PASSWORD}fi fi EOF# 生成grub2密码[rootcentos7 ~]# grub2-mkpasswd-pbkdf2Enter password:redhatReenter password:redhatPBKDF2hashof your password is grub.pbkdf2.sha512.10000.649DDB2FE50D7D3A0DF829A21887FFD9FB7CC14F0E750B993CFB08B86D0E99AE33D7E121DEC82DD71FF69B2653D9446ED777ADAFB5DAE051685C7B85C3A3A276.8DC92452B738F2007F7254BC884AF34B3C149E62D2054BB09DA970B931AF329BE772648AA0FE15DC8196AED48545F5BF84AAF9EB989CCCD168604B8050988FF0# 创建文件[rootcentos7 ~]# vim /boot/grub2/user.cfgGRUB2_PASSWORDgrub.pbkdf2.sha512.10000.649DDB2FE50D7D3A0DF829A21887FFD9FB7CC14F0E750B993CFB08B86D0E99AE33D7E121DEC82DD71FF69B2653D9446ED777ADAFB5DAE051685C7B85C3A3A276.8DC92452B738F2007F7254BC884AF34B3C149E62D2054BB09DA970B931AF329BE772648AA0FE15DC8196AED48545F5BF84AAF9EB989CCCD168604B8050988FF0# 生成grub2.cfg配置文件重启验证[rootcentos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg[rootcentos7 ~]# reboot效果如下启动菜单界面按e编辑。输入用户名root密码redhat。弹出如下菜单可以编辑了。思考如何解除 grub 菜单加密默认启动条目# 查看启动条目有哪些[rootcentos7 ~]# # grep -o ^menu.*CentOS L.*Core) /etc/grub2.cfgmenuentryCentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)menuentryCentOS Linux (0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2) 7 (Core)# 修改默认启动条目[rootcentos7 ~]# vim /boot/grub2/grubenv# 修改saved_entry为相应条目saved_entryCentOS Linux(0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2)7(Core)......# 生成grub2.cfg配置文件重启验证[rootcentos7 ~]# grub2-mkconfig -o /etc/grub2.cfg[rootcentos7 ~]# rebootgrub2 故障处理MBR 组成回顾主引导扇区由三个部分组成引导程序占446个字节硬盘启动时将系统控制权转给分区表中的某个操作系统。磁盘分区表项DPTDisk Partition Table)由四个分区表项构成每个16个字节。结束标志占2个字节其值为AA55十六进制。故障1grub 引导程序故障环境准备[rootcentos7 ~]# dd if/dev/zero of/dev/sda bs1 count446效果如下:系统无法从硬盘启动则会尝试使用其他设备启动。解决思路:使用光盘启动并重新安装引导程序。解决过程开机从光盘启动并选择Troubleshooting。选择Rescue a CentOS system稍等片刻进入选择界面选择1。搜索到系统后提示系统已经挂载在/mnt/sysimage按回车继续。切换root目录并确保root文件系统是读写挂载。sh-4.2# chroot /mnt/sysimage bash-4.2# mount | grep root /dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota )确认系统启动分区所在磁盘。安装引导程序。bash-4.2# grub2-install /dev/sda Installing for i386-pc platform. Installation finished. No error reported.输入exit两次重启系统第一次exit退出chroot环境第二次exit退出系统。bash-4.2# exit sh-4.2# exit故障2引导文件丢失环境准备[rootcentos7 ~]# mv /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64{,.ori}[rootcentos7 ~]# reboot效果如下:系统无法启动提示/vmlinuz-4.18.0-553.el8_10.x86_64文件找不到。解决思路:使用光盘启动并从起位置恢复相应文件。解决过程参考 ** grub 引导程序故障 **处理流程获取root权限shell。恢复文件。从其他系统复制过来从rpm包提取等输入exit两次继续启动系统。故障处理总结通过光盘启动的目的是将硬盘上的系统挂载到内存中并进行修复。我们也可以通过U盘启动盘启动或者将故障磁盘拔下来挂载到其他系统。