Ubuntu22.04 & Win11 双系统hibernate热切换实现

Ubuntu22.04 & Win11 双系统hibernate热切换实现

目录

使用命令 free -m 来查看当前还剩余的内存

shell 复制代码
neo@NeoNeuxs:~$ free -m
               total        used        free      shared  buff/cache   available
Mem:           31711        4557       23753         193        3400       26519
Swap:           2047           0        2047

可以看到这台电脑,可以用内存是32GB,swap区的大小只有2G,这是不正常的,应该是安装系统的时候没有设置好,swap分区大小会影响电脑的休眠状态,即无法进入休眠状态,因为休眠的时候需要将内存的内容写入到交换分区当中。

修改交换分区或交换文件

swap分为两种分别是交换文件和交换分区,交换文件和交换分区是有所不同的,在较高版本的内核情况下,二者的差异不大,二者的差异往往是由文件系统来决定的,尤其是目前常用的都是EXT4的文件系统,据说二者的性能差异几乎可以忽略不计,这里没有测试,希望有人可以测试一下看看,不同的分区在跑代码的时候有没有区别,当然这个程序要占用内存足够大才可以测试出来。下面我们来讲一下二者的设置:

修改交换分区

如果在安装的过程中没有进行手动设置的话,你的swap类型很有可能是swpafile的形式,可以通过如下方式来查看具体类型:

命令:cat /proc/swaps

shell 复制代码
neo@NeoNeuxs:/dev$ cat /proc/swaps
Filename				Type		Size		Used		Priority
/swapfile                               file		2097148		0		-2
/dev/nvme0n1p7                          partition	67109884	0		-3

可以看到我有两个交换分区类型,一个是file一个是partition,两个大小不同,优先级不同。

/swapfile 的是系统直接给我创建的,我寻思是一点用都没有啊,默认的2G太小了,甚至无法休眠,也就没法进行系统的热切换了,遂萌生想法修改分区类型和大小。

首先如果要使用交换分区你需要有可用的硬盘空间,我是双系统多个硬盘,LINUX系统的分区无法进行压缩,也就是说无法将系统盘压缩,如下所示:

shell 复制代码
neo@NeoNeuxs:/dev$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme1n1     259:0    0 953.9G  0 disk 
├─nvme1n1p1 259:1    0    16M  0 part 
├─nvme1n1p2 259:2    0 503.9G  0 part 
├─nvme1n1p3 259:3    0   513M  0 part 
└─nvme1n1p4 259:4    0 449.5G  0 part /
nvme0n1     259:5    0 953.9G  0 disk 
├─nvme0n1p1 259:6    0   260M  0 part /boot/efi
├─nvme0n1p2 259:7    0    16M  0 part 
├─nvme0n1p3 259:8    0 864.4G  0 part 
├─nvme0n1p4 259:9    0   950M  0 part 
├─nvme0n1p5 259:10   0    24G  0 part 
├─nvme0n1p6 259:11   0   260M  0 part 
└─nvme0n1p7 259:12   0    64G  0 part 

nvme1n1nvme1n1p2503G的分区存储了windos的资料,无法压缩出来可用空间,目前系统的分区nvme1n1p4也无法压缩,通过软件Gparted可以查看当前分区可以分割出来的大小,没办法只能使用另一块硬盘nvme0n1分出来了64G的空间nvme0n1p7来作为交换空间,分割出来没有进行格式化的空间以后,使用Gparted软件格式化成linuxswap分区格式,效果如下:

有了linux-swap格式的分区之后,我们直接挂载即可:

shell 复制代码
neo@NeoNeuxs:/dev$ sudo swapon /dev/nvme0n1p7

挂载之后就可以看到:

shell 复制代码
neo@NeoNeuxs:/dev$ free -m
               total        used        free      shared  buff/cache   available
Mem:           31711        7107       21645         236        2958       23924
Swap:          67584           0       67584
neo@NeoNeuxs:/dev$ cat /proc/swaps
Filename				Type		Size		Used		Priority
/swapfile                               file		2097148		0		-2
/dev/nvme0n1p7                          partition	67109884	0		-3

为了实现开机自动挂载还需要修改一下,以下文件:

使用命令:sudo gedit /etc/fstab打开fstab,可以用其他编辑器如vim等。

如下图所示,最后一行是系统默认的缓存文件我们按照一样的格式,将我们的盘添加进去:

修改最后一行:

修改以后保存一下试一试。

经过hibernate测试之后发现了问题,就是重启之后会影响对应硬盘的符号,这个问题很致命,盘符号变更之后系统无法正确识别对应的缓冲区,应使用UUID来识别对应的缓冲分区,修改之后如下:

tex 复制代码
UUID=4047d76b-15e4-4513-8b79-f0f5d0c32b47  none         swap    sw        0       0

获取对应硬盘的UUID

我们同样可以通过命令:

shell 复制代码
sudo lsblk -o name,mountpoint,size,uuid

效果如下:

快速获取对应的硬盘的UUID,方法如下 grep后边的参数表明了要获取对应的swap分区的UUID:

shell 复制代码
blkid | grep swap
/dev/nvme1n1p7: LABEL="swaper" UUID="4047d76b-15e4-4513-8b79-f0f5d0c32b47" TYPE="swap" PARTLABEL="swaper" PARTUUID="c98d4618-281c-438f-8602-b3e34381f4fa"

修改交换文件

我们来修改一下交换文件:

1、关闭交换文件:

shell 复制代码
neo@NeoNeuxs:~$ sudo swapoff -a
neo@NeoNeuxs:~$ free -m
               total        used        free      shared  buff/cache   available
Mem:           31711        4692       23615         188        3402       26388
Swap:              0           0           0

2、创建swap分区文件:

shell 复制代码
neo@NeoNeuxs:/var$ sudo dd if=/dev/zero of=/var/swapfile bs=1M count=32768
	32768+0 records in
32768+0 records out
34359738368 bytes (34 GB, 32 GiB) copied, 15.1301 s, 2.3 GB/s

of代表输出文件(output file),这里指定的是/var/swapfile,本质上就是使用dd命令,复制一个特殊文件/dev/zerovar/swapfile/dev/zero全是0,即创建的是一个全是0的文件。

3、创建swap文件

使用命令:

shell 复制代码
sudo mkswap /var/swapfile

结果如下:

shell 复制代码
neo@NeoNeuxs:/var$ sudo mkswap /var/swapfile

mkswap: /var/swapfile: insecure permissions 0644, fix with: chmod 0600 /var/swapfile
Setting up swapspace version 1, size = 32 GiB (34359734272 bytes)
no label, UUID=ecf57d17-b84f-4002-9553-a995f6ab5839

4、修改权限并启用swap文件

shell 复制代码
neo@NeoNeuxs:/var$ sudo chmod 0600 /var/swapfile
neo@NeoNeuxs:/var$ sudo swapon /var/swapfile
neo@NeoNeuxs:/var$ free -m
               total        used        free      shared  buff/cache   available
Mem:           31711        4979         498         211       26233       26059
Swap:          32767           0       32767

使用交换文件按道理也能实现系统的热切换,但我没有具体实验,理论上应那该是可以的,设置的时候应该是相同的,设置为第3步的UUID即可,如果不行的话需要参考分区的热切换。

如何使Ubuntu进入hibernate?

实现双系统切换可以参考:

herbinate实现:https://askubuntu.com/questions/1240123/how-to-enable-the-hibernate-option-in-ubuntu-20-04

对于前几步为了保证教程的完整,我复制了过来,作为参考:

  1. Install pm-utils and hibernate:

    bash 复制代码
    sudo apt install pm-utils hibernate
  2. Then:

    bash 复制代码
    cat /sys/power/state
  3. You should see:

    bash 复制代码
    freeze mem disk
  4. Then run one of the following lines:

    复制代码
    grep swap /etc/fstab
    blkid | grep swap
  5. 获取对应的SWAP分区的UUID,保存下来。

  6. 修改grub的配置文件:

    bash 复制代码
    sudo nano /etc/default/grub	
  7. 修改对应行内容如下:

    tex 复制代码
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=<YOUR_COPIED_UUID>"
  8. 更新grub设置:

    bash 复制代码
    sudo update-grub
  9. 启动hibernate模式

    shell 复制代码
    sudo systemctl hibernate

需要注意的是,热切换系统需要grub引导的支持,如果直接通过Refind等引导Ubuntu直接启动是无法正常热切换的,也就是说需要进入到grub引导的驱动的界面引导Ubuntu启动。

参考文章

swap分区:https://www.baeldung.com/linux/swap-file-partition

swap分区实操:https://phoenixnap.com/kb/swap-partition

herbinate实现:https://askubuntu.com/questions/1240123/how-to-enable-the-hibernate-option-in-ubuntu-20-04

相关推荐
幸运小猿1 分钟前
启动项目报错,zookeeper影响的
linux·运维·服务器
liu****3 分钟前
11.字符函数和字符串函数(一)
linux·运维·c语言·开发语言·数据结构·算法
minji...29 分钟前
linux 进程控制(一) (fork进程创建,exit进程终止)
linux·运维·服务器·c++·git·算法
I · T · LUCKYBOOM32 分钟前
21.Linux网络设置
linux·运维·网络
Likeyou734 分钟前
关于Linux下的Oracle的rman备份操作指南
linux·运维·oracle
峰顶听歌的鲸鱼38 分钟前
13.docker部署
linux·运维·笔记·docker·容器·云计算
橘子编程40 分钟前
仓颉语言变量与表达式解析
java·linux·服务器·开发语言·数据库·python·mysql
虚神界熊孩儿1 小时前
linux下创建用户和用户组
linux·运维·服务器
hhwyqwqhhwy1 小时前
linux 驱动 rtc
linux·运维·实时音视频
python百炼成钢1 小时前
53.Linux regmap驱动框架
linux·运维·服务器·驱动开发