Linux交换空间与系统启动原理

Linux交换空间管理

Swap 空间

简单地说,Linux Swap 空间就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。

**交换空间只是临时的解决办法。**虽然交换空间能够作为"虚拟"内存使用,但由于交换区位于磁盘上,它的速度比物理内存慢的多,因此如果需要更快的速度的话,最好的办法仍然是加大物理内存。

查看内存
# 默认单位是KiB,使用-m选项,以MiB为单位
[root@centos7 ~]# free 
             total       used       free     shared buff/cache   
available
Mem:        4026156      330460     3528844       12136      166852     
3485576
Swap:       4063228           0     4063228

输出说明:

  • Mem:

    • total:物理内存空间大小。

    • used:使用的内存 (total - free - buffers - cache)。

    • free:未使用的内存空间大小(真正的空闲,未被任何程序占用)。

    • shared:多个进程共享的内存空间大小。

    • cached:从磁盘读取的数据占用的内存空间大小,待以后使用(数据没有被修改)。

    • buffers:被更改但未写回磁盘的数据占用的内存空间大小。

  • Swap:

    • total:交换空间大小。

    • used:使用的交换空间大小。

    • free:未使用交换空间大小。

创建交换空间
# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap
[root@centos7 ~]# parted /dev/sdb mklabel gpt
[root@centos7 ~]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 
2049
[root@centos7 ~]# parted /dev/sdb unit MiB print
# 格式化swap空间
[root@centos7 ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=2bf4e179-3648-4412-9495-3b278df4acd6
激活 swap 空间
# 激活swap空间
[root@centos7 ~]# swapon /dev/sdb1
# 查看swap设备列表
[root@centos7 ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1               partition 4063228 0    -2
/dev/sdb1               partition 2097148 0    -3

默认情况下,多个交换空间具有相同的优先级时,系统会按顺序使用交换空间,即内核先使用第一个已激活交换空间,直至其空间已满,然后开始使用第二个交换空间。在激活交换分区的时候,可以为每个交换空间定义一个优先级,从而强制按该顺序使用交换空间。

swapon 命令使用-p选项指定优先级,优先级介于-1和32767之间,值越大优先级越高。

示例:

[root@centos7 ~]# swapon -p 4 /dev/sdb1
取消 swap 空间激活
[root@centos7 ~]# swapoff /dev/sdb1
[root@centos7 ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1               partition 4063228 0    -2
持久化激活 swap 空间

修改/etc/fstab文件,添加如下类似记录:

UUID=2bf4e179-3648-4412-9495-3b278df4acd6 swap swap pri=4 0 0

使用命令 swapon -a 激活/etc/fstab中所有交换设备。

使用命令 swapoff -a 取消/etc/fstab中所有交换设备激活。

[root@centos7 ~]# swapon -a
[root@centos7 ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1               partition 4063228 0    -2
/dev/sdb1               partition 2097148 0    -3
[root@centos7 ~]# swapoff -a
[root@centos7 ~]# swapon -s

Linux 系统启动原理

CentOS 7 启动过程

现代计算机系统是硬件与软件的复杂组合。从加电状态开始,到拥有登录提示符的运行中系统,这需要大量的硬件和软件配合工作。

以下列表从较高层面概述了 CentOS7 启动过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 计算机接通电源。系统固件(现代UEFI或更旧的BIOS)运行开机自检(POST),并开始初始化硬件。

配置: 在系统启动早期,通过按特定的组合键,例如F2,配置系统固件。

  1. 系统固件搜索启动设备,根据固件配置的顺序搜索启动磁盘上的主启动记录(MBR)。系统固件从磁盘读取boot loader,然后将系统控制权交给boot loader,boot loader是GRandUnified Bootloader version 2(GRUB2)。

配置: 使用 grub2-install 命令进行配置,它将安装 GRUB2 作为磁盘上的启动加载器。

  1. GRUB2从/boot/grub2/grub.cfg文件加载配置并显示一个操作系统菜单,可以从中选择要启动的系统。

配置: 使用 /etc/grub.d/ 目录、/etc/default/grub 文件和 grub2-mkconfig 命令进行配置,以生成 /boot/grub2/grub.cfg 文件。

  1. boot loader根据选定条目的配置,从磁盘中加载kernel和initramfs,并将它们放入内存中。initramfs是一个存档,其中包含启动时所有必要硬件的内核模块、初始化脚本等等。

    boot loader将控制权交给kernel,并同时将启动项的内核参数、initramfs在内存中的位置传递给kernel。内核在initramfs中找到所有硬件驱动程序,并初始化这些硬件。

配置: 使用 /etc/dracut.conf.d/ 用录、dracut 命令和 lsinitrd 命令进行配置,以检查initramfs 文件。

  1. initramfs 执行/sbin/init,作为PID 1。在CentOS中,/sbin/init是一个指向systemd的链接。

配置: 使用内核参数 init=command 配置系统初始化程序。

  1. 随后,systemd会加载从内核命令行传递的target或者加载系统配置的default.target,该目标通常启动一个基于文本的登录或图形登录屏幕。

**配置:**使用systemctl设置默认target。

  1. default.target依赖sysinit.target,sysinit.target用于初始化系统,例如读取/etc/fstab挂载文件系统,激活systemd-journald等。

**配置:**使用/etc/fstab配置文件系统开机自动挂载。

  1. default.target还会激活开机启动的单元。

**配置:**使用systemctl设置开机启用服务。

  1. default.target还会激活getty.target,该target将打开tty1终端用于用户登录。
系统 target

systemd使用类型为target的单元来分组不同单元,例如multi-user.target包涵chronyd.service、crond.service、firewalld.service等服务。

target还可以包涵其他target,例如graphical.target包涵multi-user.target,multi-user.target包涵basic.target,basic.target包涵sysinit.target。

使用以下命令查看target之间依赖关系:

[root@centos7 ~]# systemctl list-dependencies graphical.target
graphical.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
......
# 查看反向依赖
[root@centos7 ~]# systemctl list-dependencies sshd.service --reverse 
sshd.service
● └─multi-user.target
●   └─graphical.target
系统启动级别

传统的 SysVinit 系统定义了 7 个运行级别(0-6),每个级别有特定的作用,具体如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置系统运行目标

/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
[root@centos7 ~]# systemctl isolate multi-user.target
# 设置系统当前运行target为graphical.target 
[root@centos7 ~]# systemctl isolate graphical.target
设置系统开机默认运行 target
# 查看系统开机默认运行target
[root@centos7 ~]# systemctl get-default 
graphical.target
# 设置系统开机默认运行target
[root@centos7 ~]# systemctl set-default multi-user.target
# 重启验证
在系统启动时选择其它目标

要在启动时选择其他目标,将 systemd.unit=target.target 参数附加到内核命令行。该配置是临时生效的,经常用于系统启动过程中故障排除。

要使用这种选择其他目标的方法,请执行以下步骤:

  1. 启动或重新启动系统。
  2. 按任意键中断启动加载器菜单倒计时(Enter除外,它用于执行正常启动)。
  3. 将光标移至第一个内核条目,按e编辑当前条目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 将光标移至以linux16开头的行,末尾附加systemd.unit=target.target。例如,systemd.unit=multi-user.target。按 Ctrl+x 使用这些更改进行启动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重置 ROOT 密码

以下几种方法可用于设置新的root密码。例如:

  • 系统管理员可以使用Live CD启动系统,挂载根文件系统,然后编辑/etc/shadow:

    • 删除root账户密码字段

    • 使用已知密码字段替换root密码字段

  • 在CentOS 7之后版本中,可以让initramfs运行的脚本在某些点暂停,以提供root身份的shell,然后在该shell中重置root密码。

方法1:rd.break
  1. 重新启动系统。
  2. 按任意键(Enter除外)中断启动加载器倒计时。
  3. 将光标移至第一个内核条目,按e编辑当前条目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 将光标移至以 linux16 开头的行,末尾附加 rd.break。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断。按Ctrl+x进行启动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 此时,系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/sysroot。以读/写形式重新挂载/sysroot。

    switch_root:/# mount -o remount,rw /sysroot 
    
  2. 切换root位置,把/sysroot做为文件系统树的根。

    switch_root:/# chroot /sysroot 
    
  3. 设置新root密码。

    sh-4.2# echo password | passwd --stdin root
    

提示:password 是用户自定义密码。

  1. 如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。
sh-4.2# touch /.autorelabel
  1. 执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的SELinux 重新标记,然后再次重新启动。
sh-4.2# exit
switch_root:/# exit
  1. 登录验证。
方法2:init=/bin/bash
  1. 重新启动系统。

  2. 按任意键(Enter除外)中断启动加载器倒计时。

  3. 将光标移至第一个内核条目,按e编辑当前条目。

  4. 将光标移至以 linux16 开头的行,末尾附加 init=/bin/bash 。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断,请开启一个root shell。按Ctrl+x使用这些更改进行启动。

  5. 此时系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/。以读/写形式重新挂载/。

bash-4.2# mount -o remount,rw /
  1. 使用以下命令删除root密码,等进入系统后再重新设置root密码。
sh-4.2# passwd -d root

此时还可以使用vi编辑器直接编辑/etc/shadow文件,复制已知用户的密码记录替换root密码。

  1. 如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。
sh-4.2# touch /.autorelabel
  1. 执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的SELinux 重新标记,然后再次重新启动。
sh-4.2# exec /usr/lib/systemd/systemd
  1. 使用root登录,此时不需要密码。
/etc/fstab 引起的系统启动问题

环境准备

# 设置磁盘分区管理方案
[root@centos7 ~]# parted /dev/sdb mklabel msdos
# 创建分区
[root@centos7 ~]# parted /dev/sdb unit MiB mkpart primary 1 10241
# 格式化为xfs文件系统
[root@centos7 ~]# mkfs.xfs /dev/sdb1
# 创建挂载点
[root@centos7 ~]# mkdir /data01
# 设置持久化挂载
[root@centos7 ~]# echo '/dev/sdb1 /data01 xfs defaults 0 0' >> 
/etc/fstab
# 挂载并验证
[root@centos7 ~]# mount -a
[root@centos7 ~]# df -h /data01
文件系统       容量 已用 可用 已用% 挂载点
/dev/sdb1       10G   33M   10G    1% /data01
故障1:挂载点不存在

环境准备

[root@centos7 ~]# umount /data01
[root@centos7 ~]# rmdir /data01

重启系统验证

# 可以正常进入系统,挂载点会被自动创建
[root@centos7 ~]# df -h /data01
文件系统       容量 已用 可用 已用% 挂载点
/dev/sdb1       10G   33M   10G    1% /data01
故障2:设备名称写错或者找不到设备

环境准备

[root@centos7 ~]# vim /etc/fstab
# 将原先的sdb1修改为sdb2
/dev/sdb2 /data01 xfs defaults 0 0

重启系统验证

  1. 启动过程中找不到该设备。
  2. 1分30秒超时后,进入emergency模式,进行修复。

修改为正确的值或者注释该条目,确保系统正常启动。

  1. 然后输入exit,继续启动。
故障3:破坏文件系统

环境准备

[root@centos7 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1

重启系统验证

  1. 系统启动过程中尝试修复文件系统,修复失败后提示进入 emergency 模式修复。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 输入root 密码进入emergency 模式。
# 执行以下命令修复
[root@centos7 ~]# xfs_repair /dev/sdb1

**

  1. 启动过程中找不到该设备。
  2. 1分30秒超时后,进入emergency模式,进行修复。

修改为正确的值或者注释该条目,确保系统正常启动。

  1. 然后输入exit,继续启动。
故障3:破坏文件系统

环境准备

[root@centos7 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1

重启系统验证

  1. 系统启动过程中尝试修复文件系统,修复失败后提示进入 emergency 模式修复。

[外链图片转存中…(img-R4PfRLs2-1768296243194)]

  1. 输入root 密码进入emergency 模式。
# 执行以下命令修复
[root@centos7 ~]# xfs_repair /dev/sdb1

​ 修复完成后,输入 exit 正常启动系统。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐