我想在 Ubuntu 17.10 上存储我的会话或休眠,以避免总是必须重新打开相同的应用程序。
我怎样才能做到这一点?
答案1
这个答案的主要来源(除了我自己的经验)是Arch Linux wiki 上的此页面。
在这个答案中我使用sudoedit
root 权限对文件进行更改。如果您愿意,您可以直接使用 root 权限调用您最喜欢的文本编辑器,但如果您想使用 GUI 编辑器并使用 Wayland,请参阅为什么 gksu/gksudo 或使用 sudo 启动图形应用程序不能与 Wayland 一起使用?)。
如果您无法休眠,请注意,您仍然可以(可能)通过使用挂起状态来节省电量,此时 RAM 的状态保持不变。对此的 systemd 命令是systemctl suspend
,它比休眠更有可能起作用。
应该说,休眠并不能保证一定有效;这就是为什么默认情况下禁用通过 GUI 启动休眠的原因。即使你做对了所有事情,你仍然可能会遇到问题。你的系统可能会崩溃,你的机器状态可能无法恢复(例如,你可能会丢失未保存的工作),你可能会发现自己处于按住电源按钮很长时间的悲惨境地。我建议只在保存所有工作后尝试测试休眠,并且只打开一些空闲的应用程序(例如不执行任何操作的终端仿真器)。
休眠涉及将 RAM 的状态写入磁盘的某个区域。交换空间用于此目的。无论是文件还是分区,它都应该以相同的方式工作。Arch Wiki 表示,如果您的交换空间至少为 RAM 大小的 2/5,您应该能够休眠。Redhat 提供有关休眠所需交换大小的指导这与 Arch Wiki 完全矛盾!但我建议在尝试增加交换空间大小之前先进行其他调试步骤。
如果你使用 Btrfs你可能无法冬眠根据 Arch Wiki,Btrfs 不支持交换文件。Ubuntu 17.10(以及所有其他当前支持的版本)上主分区的默认格式是 ext4,而不是 Btrfs,因此大多数用户无需担心这一点。
NirajW 的回答在这里解释如何测试并启用休眠功能(如果有效)。它建议的命令是
sudo pm-hibernate
无论我做了什么其他调整,这对我来说都失败了(我的系统立即挂起并且再也没有恢复)。相反,我使用
sudo systemctl hibernate
您也可以尝试
echo disk | sudo tee /sys/power/state
休眠是最低的功耗状态 (ACPI S4)。应该发生的是系统关闭,机器关闭并且可以无限期地保持关闭状态,当您重新打开它时,您无需进行干净启动,而是登录并恢复会话。
如果您在尝试休眠时获得了干净启动,那么首先要尝试设置一个启动参数,以便 GRUB 知道在哪里找到机器状态以便在恢复时将其加载回 RAM(至少,这是我理解该过程的方式。如果不准确,请纠正我)。
设置恢复的启动参数
Ubuntu 17.04 和 17.10 的全新安装有一个交换文件。如果您从较早的安装升级,您仍将有一个交换分区。如果您有交换文件,则设置恢复参数的过程会有所不同。通过运行检查您的配置
grep swap /etc/fstab
如果您有一个交换分区,输出将显示分区标签,例如
# swap was on /dev/sda3 during installation
如果没有输出,则运行
ls /
并寻找/swapfile
。
如果你有一个交换分区
要添加 resume 参数,您可以运行
sudoedit /etc/default/grub
找到以 开头的行GRUB_CMDLINE_LINUX_DEFAULT=
,并将 添加到双引号之间的参数中resume=/Your/Swap/Partition
,/Your/Swap/Partition
用 中找到的设备文件路径替换/etc/fstab
。在我给出的示例中,完整的行可能是(取决于正在使用的其他参数 -quiet
并且splash
是桌面 Ubuntu 安装中的默认参数):
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/sda3"
编辑此文件后,您必须运行
sudo update-grub
将配置写入 GRUB 在启动时读取的文件。如果您忘记执行此操作,您的更改将无效;)还建议您在尝试休眠之前重新启动。
如果你有交换文件
您需要设置从休眠状态恢复的参数。您的/swapfile
应该位于根分区中,因此请设置启动参数, resume=/Your/Root/Partition
其中/Your/Root/Partition
是根分区的设备文件路径,例如/dev/sda2
。如果您不确定,请检查 的内容/etc/fstab
以查看哪个分区被挂载/
您还需要为抵消交换文件。您可以通过运行命令来找到此参数的值sudo filefrag -v /swapfile
。以下是此命令在我的系统上的输出开头(它与我在 17.04 上得到的输出完全相同,但我现在使用的是 Ubuntu MATE 17.10):
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
...
偏移参数的数字是physical_offset
列中的第一个数字。在我的示例中,它是34816
。这意味着我设置的启动参数将是resume_offset=34816
。
要添加两个启动参数,请编辑 GRUB 的配置文件:
sudoedit /etc/default/grub
找到开头的行GRUB_CMDLINE_LINUX_DEFAULT=
并添加两个启动参数,修改后,该行内容如下
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/sda2 resume_offset=34816"
但请用您的系统的值替换/dev/sda2
和。34816
保存文件,退出并运行
sudo update-grub
将配置写入 GRUB 加载时读取的文件中。重新启动,然后再次尝试休眠。
如果你还是无法冬眠,尝试禁用安全启动在您的 UEFI(或 BIOS)设置中,如果尚未完成。
如果你仍然无法休眠,您可以尝试通过设置一些额外的启动参数来调试该过程,详细说明这篇关于调试睡眠状态的文章。再次编辑/etc/default/grub
,删除参数quiet
和splash
并添加您想要尝试的调试参数(例如,我使用initctl_debug
和no_console_suspend
),运行sudo update-grub
,重新启动,然后重试。
调试参数提供的信息可能会帮助您找出问题所在,并可能帮助您找到解决方案。我使用自己的系统作为案例研究我对另一个关于冬眠的问题的回答。就我而言,问题始终是驱动程序错误。在我使用过的每个 Ubuntu 版本中,我都需要在brcmfmac
休眠前从内核卸载模块,并在恢复时重新插入。如果需要卸载更重要的模块,我会使用一种脚本(使用 运行sudo bash filename
)进行休眠(替换list of buggy modules
为需要拉出的实际模块的名称):
modprobe -r list of buggy modules &&
echo disk > /sys/power/state
modprobe list of buggy modules
我使用&&
操作符,这样如果卸载因某种原因失败,就不会尝试休眠。如果恢复成功,模块会立即重新加载到内核中,因此系统应该保持运行。
您可能会发现您的特定系统需要不同的步骤。
答案2
所有这些对于我来说都非常适合休眠文件,感谢您的指导!就我而言,我还必须获取最新的稳定内核才能使休眠工作,即 Ubuntu 17.10 和戴尔 xps 9370,我必须将内核升级到 4.16.0rc
答案3
就我而言,这个过程并没有按描述的那样进行。
我必须更换/dev/sda二十以及 /dev/sdaXX 的 UUID。它的 UUID 是
d2175d30-aee3-418b-8c3f-d4ae61d13b3f
因此 GRUB2 中的 editid 行如下所示:
GRUB_CMDLINE_LINUX_DEFAULT="安静启动恢复=UUID=d2175d30-aee3-418b-8c3f-d4ae61d13b3f恢复偏移量=2367488”
之后它就起作用了。