Ubuntu22.04 & Win11 双系统hibernate热切换实现 - NeoNexus
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.
Ubuntu22.04 & Win11 双系统hibernate热切换实现
使用命令 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
nvme1n1
的 nvme1n1p2
503G的分区存储了windos的资料,无法压缩出来可用空间,目前系统的分区nvme1n1p4
也无法压缩,通过软件Gparted可以查看当前分区可以分割出来的大小,没办法只能使用另一块硬盘nvme0n1
分出来了64G的空间nvme0n1p7
来作为交换空间,分割出来没有进行格式化的空间以后,使用Gparted软件格式化成linuxswap分区格式,效果如下:
有了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等。
如下图所示,最后一行是系统默认的缓存文件我们按照一样的格式,将我们的盘添加进去:
修改最后一行:
修改以后保存一下试一试。
经过hibernate测试之后发现了问题,就是重启之后会影响对应硬盘的符号,这个问题很致命,盘符号变更之后系统无法正确识别对应的缓冲区,应使用UUID来识别对应的缓冲分区,修改之后如下:
UUID=4047d76b-15e4-4513-8b79-f0f5d0c32b47 none swap sw 0 0
获取对应硬盘的UUID
我们同样可以通过命令:
sudo lsblk -o name,mountpoint,size,uuid
效果如下:
快速获取对应的硬盘的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/zero
到var/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
对于前几步为了保证教程的完整,我复制了过来,作为参考:
-
Install
pm-utils
andhibernate
:sudo apt install pm-utils hibernate
-
Then:
cat /sys/power/state
-
You should see:
freeze mem disk
-
Then run one of the following lines:
grep swap /etc/fstab blkid | grep swap
-
获取对应的SWAP分区的UUID,保存下来。
-
修改grub的配置文件:
sudo nano /etc/default/grub
-
修改对应行内容如下:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=<YOUR_COPIED_UUID>"
-
更新grub设置:
sudo update-grub
-
启动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
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK