ไฮเบอร์เนตและดำเนินการต่อจากไฟล์ swap


23

ฉันได้กำหนดค่าการติดตั้ง Ubuntu ใหม่ใน Notebook เพื่อใช้ไฟล์ swap แทนการใช้ swap partition

โดยค่าเริ่มต้นเป็นไปไม่ได้ที่จะให้ Ubuntu จำศีลโดยใช้ไฟล์ swap ดังนั้นฉันจึงลองใช้บทช่วยสอนนี้แต่เฉพาะgrub1และตอนนี้ใช้อูบุนตูgrub2

ไม่มีใครรู้วิธีการทำเช่นนี้?

คำตอบ:


21

ไฮเบอร์เนตกับไฟล์ Swap โดยใช้ uswusp

แม้ว่ามันจะเป็นไปได้ที่จะจำศีลในการสลับไฟล์และมันควรจะทำงานกับ systemd hibernate โดยการตั้งค่าพารามิเตอร์เคอร์เนล อย่างไรก็ตามฉันไม่สามารถกลับมาใช้งานได้อีกต่อไปดังนั้นให้เปลี่ยนไปใช้uswsusp แทน (ระงับซอฟต์แวร์ของผู้ใช้)ระงับ) นี่คือขั้นตอนที่ฉันใช้กับ Ubuntu 17.04 / 17.10

สร้างไฟล์ Swap

คำสั่งเพื่อสร้างไฟล์สลับ 4GiB ที่จัดรูปแบบแล้วติดตั้งและเพิ่มลงใน/etc/fstab:

sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

ตรวจสอบการสลับพาร์ติชันไฟล์

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

ติดตั้งซอฟแวร์ Userspace ระงับ(uswsusp)

sudo apt install uswsusp

กำหนดค่า uswsusp

วิธีสร้าง/etc/uswsusp.confและสร้างใหม่initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • Yesเป็น ' ดำเนินการต่อโดยไม่มีพื้นที่สว็อปที่ถูกต้องหรือไม่ ' (ตัวช่วยสร้างยังไม่ได้ตั้งค่าไฟล์สลับ)
  • เลือกพาร์ติชันที่มีไฟล์ swap อยู่อ้างอิงไขว้พร้อมรายละเอียดจากfindmntด้านบน ( หมายเหตุ: ไม่ใช่ไฟล์ swap เอง )

หมายเหตุ: การเปลี่ยนแปลงใด ๆ ที่ทำด้วยตนเอง/etc/uswsusp.confจะต้องสร้างใหม่initramfsภายหลังด้วยคำสั่งนี้:

sudo update-initramfs -u

ทดสอบโหมดไฮเบอร์เนต

sudo s2disk

ควรมีsnapshotข้อความบนหน้าจอไฮเบอร์เนตและดำเนินการต่อ

ใช้ s2disk กับ systemd hibernate

โดยค่าเริ่มต้น systemd จะใช้คำสั่งจำศีลของตัวเองดังนั้นแทนที่ด้วยคำสั่ง uswusp โดยการแทนที่systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

ในเท็กซ์เอดิเตอร์ที่เปิดให้ใส่ข้อความต่อไปนี้ (จำเป็นต้องมี ExecStart ที่ว่าง) จากนั้นบันทึกและออก:

[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk 
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep

สิ่งนี้จะสร้าง/etc/systemd/system/systemd-hibernate.service.d/override.confไฟล์ที่มีรายละเอียดการแทนที่

ทดสอบ systemd hibernate:

systemctl hibernate 

หมายเหตุ: ในการตรวจสอบว่า systemd override.confถูกสร้างขึ้นให้โหลดและไม่มีข้อผิดพลาดให้รัน:

systemctl status systemd-hibernate.service

อ้างอิง:


คำแนะนำนี้ดูเหมือนว่าจะใช้งานได้ แต่การไฮเบอร์เนตของระบบไม่ทำงานสำหรับฉัน คุณได้ทดสอบสิ่งนี้ด้วยตัวเองหรือไม่? ควรExceStart=run-parts -a post /lib/systemd/system-sleepเป็นเช่นนี้ExceStartPost=run-parts -a post /lib/systemd/system-sleep
JoaquínAramendía

มันได้รับการทดสอบและทำงานได้ แต่อาจจำเป็นต้องมีการเพิ่ม ฉันได้อัพเดตคำตอบแล้ว
Cas

สิ่งนี้ดูไม่ถูกต้องนัก enableตัวเลือกในการsystemctl symlinks จากไป/etc/systemd/system/ /lib/systemd/system/คุณไม่ควรคัดลอกโดยตรงไปยัง/etc/systemd/system/
Auspex

1
ฉันไม่ได้จัดการทำงานนี้😞 ฉันตั้งค่า swapfile ติดตั้งและกำหนดค่า uswsusp แต่sudo s2diskบันทึกเท่านั้นSaving snapshotกว่าปิดจอแสดงผลแฮงค์เป็นเวลา ~ 5 นาทีแล้วปิดคอมพิวเตอร์ อย่างไรก็ตามหลังจากที่ฉันเปิดเครื่องมันจะบู๊ตตามปกติเหมือนไม่มีการจำศีล
m93a

1
ฉันคิดว่าบรรทัดนี้sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swapควรเปลี่ยนเป็นsudo findmnt -no SOURCE,UUID -T /swapfile
user1915011

12

นี่คือสิ่งที่ฉันทำเพื่อให้ทำงานกับ Ubuntu 18.04

  • ทำให้/swapfileRAM ของคุณมีขนาดอย่างน้อย

    sudo swapoff /swapfile
    sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | grep MemTotal | grep -oh '[0-9]*') count=1024 conv=notrun
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  • จดบันทึก UUID ของพาร์ติชันที่ประกอบด้วย/swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • กำหนดค่าแพคเกจใหม่uswsuspเพื่อให้ใช้ swapfile ได้อย่างถูกต้อง:

    sudo dpkg-reconfigure -pmedium uswsusp
    # Answer "Yes" to continue without swap space
    # Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
    # Encrypt: "No"
    
  • แก้ไขบริการ SystemD hibernate โดยใช้sudo systemctl edit systemd-hibernate.serviceและเติมด้วยเนื้อหาต่อไปนี้:

    [Service]
    ExecStart=
    ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
    ExecStart=/usr/sbin/s2disk
    ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep
    
  • โปรดทราบประวัติย่อของคุณ/swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • กำหนดค่า Grub เพื่อดำเนินการต่อจาก swapfile โดยแก้ไข/etc/default/grubและแก้ไขบรรทัดต่อไปนี้:

    GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
    
  • อัพเดทด้วง:

    sudo update-grub
    
  • สร้างสิ่งต่อไปนี้/etc/initramfs-tools/conf.d/resume:

    RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
    
  • อัปเดต initramfs:

    sudo update-initramfs -u -k all
    

sudo systemctl hibernateตอนนี้คุณสามารถจำศีลด้วย

ท่านสามารถสร้างสคริปต์เหล่านี้ได้:

    sudo tee /usr/local/bin/gotosleep <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo /usr/sbin/s2both
    EOF
    sudo chmod +x /usr/local/bin/gotosleep
    sudo tee /usr/local/bin/gotohibernation <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo systemctl hibernate
    EOF
    sudo chmod +x /usr/local/bin/gotohibernation

เพื่อให้คุณสามารถนอนกับหรือจำศีลด้วยgotosleepgotohibernation

คุณจะต้องสามารถที่จะดำเนินการsudo s2both, sudo s2ramและsudo systemctl hibernateโดยไม่ต้องใส่รหัสผ่านของคุณสำหรับสคริปต์ก่อนหน้านี้ในการทำงาน

คุณสามารถทำเช่นนั้นได้โดยการสร้างpowerdevกลุ่มเพิ่มผู้ใช้ปัจจุบันของคุณลงไปและกำหนดค่า sudoers config ดังต่อไปนี้ (แก้ไขด้วยsudo visudo -f /etc/sudoers.d/powerdev):

     %powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate

เอกสารที่ใช้:


ขอบคุณสำหรับสิ่งนี้! ฉันได้พยายามหลายวิธี แต่คุณทำงานสำหรับฉันบน Ubuntu 18.04 :)
jirislav

สิ่งนี้ทำให้ฉันรู้สึกอยากลองจำศีลอีกครั้ง - ฉันมีปัญหากับการทุจริตในดิสก์เป็นครั้งคราวซึ่งเห็นได้ชัดว่าเกี่ยวข้องกับกระบวนการไฮเบอร์เนต คุณเจออะไรแบบนั้นมั้ย
ชาร์ลส์กรีน

ขอบคุณ @ แอนโทนี่! ฉันพยายามหลายสิ่งหลายอย่างเพื่อให้ได้จำศีลในการทำงาน คุณเป็นทางออกสุดท้ายที่ทำ ดูเหมือนว่าแปลกมากสำหรับฉันที่ไม่ได้ติดตั้งอย่างถูกต้องทันที :(
Mike Williamson

ขอบคุณสำหรับคำแนะนำนี้ หลังจากทำตามขั้นตอนแล้วพยายามจำศีลโดยใช้ $ sudo systemctl hibernate แล็ปท็อปของฉันตื่นขึ้นสองสามวินาทีหลังจากพยายามจำศีล / var / log / syslog แสดงข้อผิดพลาดมากมาย แต่สิ่งเหล่านี้ดูเหมือนว่าเกี่ยวข้องมากที่สุด: - ล้มเหลวในการตั้งค่าโหมดประหยัดพลังงานสำหรับเอาท์พุท eDP-1: ปฏิเสธการอนุญาต ... - วัตถุ. Gjs_AppIndicatorIconActor__1 (0x561c60a4d150) แล้ว ไม่สามารถตั้งค่าคุณสมบัติใด ๆ ได้ ... - s2disk: ไม่สามารถใช้อุปกรณ์ดำเนินการต่อ (ลอง swapon -a) เหตุผล: ไม่มีอุปกรณ์ดังกล่าว - systemd-hibernate.service: ออกจากกระบวนการหลักแล้วโค้ด = ออก, ...
Jelani Nelson

1
นี่เป็นทางออกเดียวที่ได้ผลสำหรับฉัน ลงชื่อเข้าใช้เพียงเพื่อโหวตคำตอบนี้ ขอบคุณ
dpetrini

8

ฉันได้อ่านบทแนะนำอย่างรวดเร็วและถ้าฉันเข้าใจถูกต้องคุณต้องระบุresumeตัวเลือกในบรรทัดคำสั่ง Linux ด้วย Grub2 นั้นง่ายมากและการเปลี่ยนแปลงของคุณจะถูกเก็บไว้เสมอ คุณต้องแก้ไข/etc/default/grubไฟล์โดยเฉพาะบรรทัดนี้:

GRUB_CMDLINE_LINUX="resume=... resume_offset=..."

หลังจากนั้นเรียกใช้sudo update-grubเพื่อให้การเปลี่ยนแปลงมีผล

การเปลี่ยนแปลงGRUB_CMDLINE_LINUXจะไม่ส่งผลต่อการติดตั้ง Linux อื่น ๆ ที่คุณมี (เพราะ/etc/grub.d/30_os-proberไม่ได้ใช้ตัวแปรนี้)

เกี่ยวกับปัญหาที่คุณมี: พาร์ติชั่นของ swapfile นั้นถูกเข้ารหัสหรือไม่? ถ้าเป็นเช่นนั้นการไฮเบอร์เนตจะไม่ทำงาน ถ้าไม่เช่นนั้นผลลัพธ์ของfilefrag -v /swapfileอาจมีประโยชน์


ขอบคุณ! ฉันจะพยายาม. แต่ฉันคิดว่ามันกำหนดค่ารายการ linux ทั้งหมดในด้วงกับบรรทัดนี้
tfmoraes

อย่าลืม: หลังจากเปลี่ยนคุณจำเป็นต้องใช้/etc/default/grub update-grub
JanC

@tfmoraes: ทำไมคุณไม่ต้องการเพิ่มสิ่งนี้ลงในรายการ linux ทั้งหมด?
JanC

@JanC: เพราะฉันอาจติดตั้งลีนุกซ์รุ่นอื่นอยู่
tfmoraes

1
@ didi_X8 ความคิดเห็นถูกเขียนเมื่อ 8 ปีที่แล้ว เป็นไปได้ว่าทุกอย่างเปลี่ยนไปตั้งแต่นั้นมา ขอบคุณสำหรับการแบ่งปัน.
Andrea Corbellini
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.