7

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

 7 months ago
source link: https://www.cnblogs.com/NeoNexus/p/17999581
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

[lab.magiconch.com][福音戰士標題生成器]-1695021721029

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

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

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系统的分区无法进行压缩,也就是说无法将系统盘压缩,如下所示:

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分区格式,效果如下:

image-20240131005139221

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

neo@NeoNeuxs:/dev$ sudo swapon /dev/nvme0n1p7

挂载之后就可以看到:

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等。

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

image-20240131015521411

修改最后一行:

image-20240131015636137

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

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

UUID=4047d76b-15e4-4513-8b79-f0f5d0c32b47  none         swap    sw        0       0
image-20240131155432221

获取对应硬盘的UUID

我们同样可以通过命令:

sudo lsblk -o name,mountpoint,size,uuid

效果如下:

image-20240131161313853

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

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

修改交换文件

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

1、关闭交换文件:

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分区文件:

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文件

使用命令:

sudo mkswap /var/swapfile

结果如下:

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文件

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:

    sudo apt install pm-utils hibernate
    
  2. Then:

    cat /sys/power/state
    
  3. You should see:

    freeze mem disk
    
  4. Then run one of the following lines:

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

  6. 修改grub的配置文件:

    sudo nano /etc/default/grub	
    
  7. 修改对应行内容如下:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=<YOUR_COPIED_UUID>"
    
  8. 更新grub设置:

    sudo update-grub
    
  9. 启动hibernate模式

    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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK