-
Menonaktifkan swap ketika Anda sudah tahu bahwa sistem Anda dapat mencapai titik ketika tidak memiliki cukup memori adalah ide yang buruk . Tepat pada saat kernel tidak memiliki memori untuk mengalokasikan sistem Anda mungkin akan sangat-sangat tidak responsif atau hang sehingga Anda harus mem-boot ulang. Hang dapat menyebabkan kehilangan data, terkadang kerusakan sistem file. Bergantung pada sistem file, ini dapat diperbaiki secara otomatis (keluarga ext*, keluarga gemuk, btrfs, dan beberapa lainnya), tetapi tidak semua FS mendukung fitur ini. Saya yakin Anda mungkin tidak ingin menjalankan
fsck
dalam mode pengguna tunggal setiap kali Anda mengalami korupsi... -
Kernel tidak sebodoh itu untuk hanya menulis semua yang diinginkannya ke SSD Anda, ia berperilaku berbeda dibandingkan dengan HDD dan mencoba membuat penulisan sesedikit mungkin menggunakan hal-hal seperti TRIM. Tidak banyak bahaya pada drive Anda seperti yang mungkin Anda pikirkan.
-
Hibernasi adalah bawaan subsistem kernel yang beroperasi pada level rendah. Itu masih harus memiliki partisi terpisah dengan ukuran ≥ ukuran RAM yang memungkinkannya untuk membuat snapshot penuh dari memori Anda. Di sini Anda dapat membaca bagaimana linux mengelola hibernasi. Jika tidak ada tempat untuk menyimpan gambar memori secara permanen, hibernasi tidak mungkin berfungsi. Anda tidak dapat menyimpan data di udara. Tidak ada penyimpanan fisik permanen =tidak ada hibernasi. Jadi itu juga jawaban atas pertanyaan Anda:Anda tidak dapat menggunakan hibernasi tanpa swap di linux .
Jadi, poin saya adalah Anda tentu saja dapat hidup tanpa swap dan mengaktifkannya hanya untuk hibernasi, tetapi hanya jika Anda yakin bahwa 99,9% dari sistem waktu yang ada memiliki cukup memori untuk semuanya. Jika itu bukan kasus Anda, Anda harus menggunakan swap.
Sekarang ke solusi yang mungkin:
Saat Anda menjalankan systemctl hibernate
systemd memulai layanan yang disebut systemd-hibernate.service . File unit yang biasanya terletak di /usr/lib/systemd/system/ direktori
Di Debian tampilannya seperti ini:
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target
After=sleep.target
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate
Seperti yang Anda lihat, ada Persyaratan dan Setelah pilihan. Kita dapat menulis unit lain yang akan mengaktifkan swap dan menambahkan namanya ke bidang ini. Kami akan menyebutnya swap-on.service dan letakkan di /etc/systemd/system/ direktori
File kita akan terlihat seperti ini:
# Unit filed is not required in our case so you can skip it
[Unit]
Description=Enable swap partition
[Service]
# This line means that service will be executed just once and immediately stop when
# swapon enables swap on /dev/sda3
Type=oneshot
# Change /dev/sda3 with device named after your swap partition
# like /dev/sdb3 or /dev/nvme0n1p3
# Use lsblk to determine your swap partition (partition with [SWAP] as mountpoint)
# Of course you can think of a more complex solution like running external script
# that determines your swap partition automatically every time service is executed
# but for now I'll go with simple /dev/sda3
ExecStart=/sbin/swapon /dev/sda3
Sekarang kita harus memodifikasi systemd-hibernate.service sistem kita :
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target swap-on.service <--
After=sleep.target swap-on.service <--
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate
Kami menduplikasi swap-on.service di After untuk memastikan bahwa systemd memulai hibernasi setelah swap aktif dan bukan sebaliknya dan di Diperlukan untuk memastikan bahwa systemd tidak akan mencoba untuk hibernasi jika swap-on.service gagal.
Sekarang saat kita menjalankan systemctl hibernate
systemd menjalankan systemd-hibernate.service kami yang telah dimodifikasi yang menjalankan swap-on.service yang memungkinkan swap. Saat swap diaktifkan dan bidang Wajib dan Setelah terpenuhi, systemd akhirnya dapat membuat sistem kita hibernasi.
Untuk membuat systemd menonaktifkan swap setelah melanjutkan dari hibernasi, kita tidak perlu membuat file layanan lain bernama swap-off.service yang akan melakukan hal yang sama seperti swap-on.service kami , letakkan di direktori yang sama dengan layanan "on" (/etc/systemd/system/). Satu-satunya perbedaan adalah bahwa layanan ini akan menjalankan swapoff bukannya swapon :
[Unit]
Description=Disable swap partition
[Service]
Type=oneshot
# again, change /dev/sda3 to your swap partition /dev file
ExecStart=/sbin/swapoff /dev/sda3 <--
Langkah selanjutnya adalah memodifikasi file layanan bernama [email protected] terletak di /usr/lib/systemd/system yang sama direktori:
[Unit]
Description=Resume from hibernation using device %f
Documentation=man:[email protected](8)
DefaultDependencies=no
BindsTo=%i.device
Wants=local-fs-pre.target
After=%i.device
Before=local-fs-pre.target
ConditionPathExists=/etc/initrd-release
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-hibernate-resume %f
Kita perlu mengubah Sebelum lapangan sekarang. Tambahkan swap-off.service di sebelah local-fs-pre.target :
...
After=%i.device
Before=local-fs-pre.target swap-off.service <--
ConditionPathExists=/etc/initrd-release
...
Sekarang ketika Anda melanjutkan dari sistem hibernasi akan menjalankan swap-off.service setelah gambar swap dimuat di memori (sebenarnya nanti, tapi itu tidak masalah bagi kami)
Perlu diingat bahwa ini adalah solusi yang sepenuhnya teoretis, saya belum mencobanya, tetapi berdasarkan apa yang saya ketahui tentang systemd, ini seharusnya berhasil. Karena UPower meminta systemd untuk hibernasi yang seperti yang saya jelaskan menjalankan systemd-hibernate.service, ini mungkin yang Anda cari