Ubuntu22.04 & Win11 双系统hibernate热切换实现
目录
- [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
nvme1n1
的 nvme1n1p2
503G的分区存储了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/zero
到var/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
对于前几步为了保证教程的完整,我复制了过来,作为参考:
-
Install
pm-utils
andhibernate
:bashsudo apt install pm-utils hibernate
-
Then:
bashcat /sys/power/state
-
You should see:
bashfreeze mem disk
-
Then run one of the following lines:
grep swap /etc/fstab blkid | grep swap
-
获取对应的SWAP分区的UUID,保存下来。
-
修改grub的配置文件:
bashsudo nano /etc/default/grub
-
修改对应行内容如下:
texGRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=<YOUR_COPIED_UUID>"
-
更新grub设置:
bashsudo update-grub
-
启动hibernate模式
shellsudo 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