通过休眠在 Linux 和 windows 之间无缝切换

发布时间 - 2025-04-19 00:00:00    点击率:

前言

在 Linux 电脑上运行 Windows 虚拟机时,有些任务依然需要真机支持,比如运行大型独占软件或备份某些社交软件的聊天记录。虽然备份可以在虚拟机中进行,但通过手机热点连接的速度太慢,实在耗不起时间。

很多时候,用户可能刚在 Linux 上工作或刚在 Windows 上玩游戏,突然需要在 Windows 上运行某些程序或切换到 Linux 进行办公。此时,我不希望关闭 Linux 或 Windows 系统,因为任务并不复杂,很快就能完成。此外,电脑布局可能比较多,开机后再逐一打开程序会很耗时。

这时可以选择休眠,休眠会保存系统的运行状态,直到下次开机时恢复。这就是本文的主要内容:如何在 Windows 和 Linux 系统中设置休眠,保存系统状态。

设置休眠电脑系统存在多种挂起方案,其中比较重要的是:

Suspend to RAM, suspend. 挂起,通常是电脑进入的熄屏状态,它将状态保存到 RAM(随机存取内存)。Suspend to disk, hibernate. 休眠,休眠后会关机,它将状态保存到硬盘,实际上是交换空间(swap space),即交换分区(swap partition)。这个状态一般不会自动进行,且由于状态保存到交换分区,电脑开机后可以恢复到关机前的状态。Linux 休眠在安装时会进行分区,一般包括根分区(root)、家分区(home)和交换分区(swap)三个分区。根分区通常占总空间的三分之一,交换分区是电脑内存的一倍到两倍,剩余空间分配给家分区。这里的电脑内存指的是 RAM,通常称为运存。比如我的电脑内存是 8G,那么交换分区可以设置为 8G 或 16G。

有人可能会问,现在还用交换分区做什么?交换分区最初是为了解决内存不足的问题,但现在也可以用于其他用途,比如休眠。一般来说,交换分区应该设为内存的两倍,这样在休眠时,交换分区刚好可以保存运行状态的所有数据,并且还有盈余,体现了宁缺勿滥的原则。

但我遇到了麻烦,我后来给电脑加了一条内存条,内存变成了 16G,而我的交换分区只有 8G。不过不用担心,一般来说问题不大,因为还是有机会的。我一直正常使用也没出现问题。

配置根文件系统Linux 启动涉及到比较复杂的过程,其中大部分需要使用到一个较小的、完整的系统,叫做 initramfs(初始 RAM 文件系统),即根文件系统。如果我们需要在开机时恢复上次关机前的电脑状态,那就需要在这里给根文件系统添加任务。

首先打开 /etc/mkinitcpio.conf,找到 HOOKS 一行,添加 resume 钩子:

$ vim /etc/mkinitcpio.conf
...
# HOOKS=(base udev autodetect modconf kms keyboard keymap block filesystems fsck)
HOOKS=(base udev autodetect modconf kms keyboard keymap block filesystems resume fsck)
...

我将原来的钩子注释掉,然后添加一行,这样避免出错无法还原。resume 需要在 udev 后面,因为这些钩子是按顺序调用的,交换分区需要 udev 检查。如果在调用 udev 之前使用 resume,系统就找不到交换分区了,必须先让 udev 找到交换分区。

我在 resume 放在 fsck(文件检查)之前,udev 之后,不知道有什么深意,但我忘了。不过不重要,只需要记住在 udev 之后即可。

配置完成后,需要重新生成 initramfs,即在命令行上调用 sudo mkinitcpio -P。命令会产生很多输出,但这不重要。

$ sudo mkinitcpio -P

设置内核参数initramfs 配置的是钩子,也就是 resume 后需要处理的东西,我们需要在内核参数(kernel parameters)上告诉系统从哪里恢复上次的状态。

首先确认自己的交换分区是哪个分区,一个简单的办法是使用 sudo fdisk -l

$ sudo fdisk -l
...
Device         Start        End    Sectors   Size Type
/dev/sda1       2048  275800063  275798016 131.5G Microsoft basic data
/dev/sda2  292577280  502292479  209715200   100G Linux filesystem
/dev/sda3  502292480 1953525134 1451232655   692G Linux filesystem
/dev/sda4  275800064  292577279   16777216     8G Linux swap
...

可以看到,有个 Type 写的是 Linux Swap,这就是交换分区,即 /dev/sda4 分区。

也可以使用 cat /etc/fstab 查看:

$ cat /etc/fstab
#      
...
# /dev/sda4 LABEL=ArchLinuxSwap
UUID=92b7f976-98c5-4eef-9fc7-ba037fd8552e       none            swap            defaults        0 0
...

也可以看到注释上写的 /dev/sda4 就是交换分区。

用编辑器打开 /etc/default/grub,找到 GRUB_CMDLINE_LINUX 一行,如果没有就自己添加一行,在这行的末尾引号内添加 resume=你的交换分区。我的是 /dev/sda4 所以写 resume=/dev/sda4,也可以用 UUID 替代,也就是 resume=UUID=92b7f976-98c5-4eef-9fc7-ba037fd8552e

$ vim /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"
GRUB_CMDLINE_LINUX="nvidia_drm.modeset=1 resume=/dev/sda4"
...

保存退出后,需要重新生成 grub 文件,即在命令行输入:

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

同样也有一堆输出。

尝试 Linux 休眠配置好之后,Linux 休眠可以通过 systemctl 来启动。在命令行上输入:

$ sudo systemctl hibernate

然后电脑就会进行休眠,等到屏幕和键盘灯都灭了就可以开机进入 Windows 进行休眠设置了。

Windows 系统休眠启动 Windows 系统,打开搜索,搜索电源选项,然后选择“选择电源按钮的功能”,将电源按钮的功能改为“休眠”。下面是 Windows7 的演示:

搜索电源选项

将电源按钮的功能改为“休眠”

Windows10 和 Windows11 的设置方法也类似,只是可以设置的选项可能更多,例如接通电源如何、使用电池如何、睡眠按钮如何、关闭盖子如何,可以根据自己的需求进行设置。

Windows 配置好之后,不要关闭控制面板,直接按电源键进行休眠。休眠后重新启动进入 Linux,看看是不是保留着原本的工作状态,如果是,可以再休眠进入 Windows 看自己的控制面板还在不在。

对于 Windows,如果将电源键改成了休眠,该如何真的关机?可以直接使用快捷键 alt+f4,然后选择关机或者重启即可。

后语一篇文章控制在 2000 字左右差不多了,后面的计划是写在 Linux 上使用 Nvidia 显卡。GNOME 桌面对 Nvidia 显卡的支持更好一点,而且我也没在 KDE 上试过 —— 我更喜欢 GNOME 桌面,所以后面的设置主要针对的是 GNOME 的显示管理器 GDM(GNOME Display Manager)。


# linux  # windows  # 电脑  # 电脑系统  # windows7  # 热点  # asic  # hibernate  #   # default  # display  # 的是  # 自己的  # 文件系统  # 命令行  # 这就是  # 可以看到  # 不重要  # 它将  # 两倍  # 即在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 零基础网站服务器架设实战:轻量应用与域名解析配置指南  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  高端云建站费用究竟需要多少预算?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel API资源类怎么用_Laravel API Resource数据转换  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  详解Android——蓝牙技术 带你实现终端间数据传输  北京网站制作公司哪家好一点,北京租房网站有哪些?  nodejs redis 发布订阅机制封装实现方法及实例代码  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Android仿QQ列表左滑删除操作  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何获取PHP WAP自助建站系统源码?  Swift开发中switch语句值绑定模式  免费视频制作网站,更新又快又好的免费电影网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  高防服务器租用首荐平台,企业级优惠套餐快速部署  动图在线制作网站有哪些,滑动动图图集怎么做?  JS经典正则表达式笔试题汇总  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel Session怎么存储_Laravel Session驱动配置详解  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  想要更高端的建设网站,这些原则一定要坚持!  如何破解联通资金短缺导致的基站建设难题?  php485函数参数是什么意思_php485各参数详细说明【介绍】  如何用wdcp快速搭建高效网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  韩国服务器如何优化跨境访问实现高效连接?  如何在香港免费服务器上快速搭建网站?  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  香港服务器建站指南:免备案优势与SEO优化技巧全解析  JavaScript常见的五种数组去重的方式  如何在IIS中配置站点IP、端口及主机头?  Linux系统命令中tree命令详解  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置