如何使用 systemd 从休眠状态恢复后挂载分区

如何使用 systemd 从休眠状态恢复后挂载分区

我在双启动设置中从 Linux (Pop_OS) 休眠,并且两个系统之间共享一个分区。我使用确保首先卸载共享分区的脚本进行休眠:

#!/bin/bash
# ~/bin/hibernate

shared=ABCDE12345 # partition UUID
device=$(blkid -U "$shared")

if ! df | grep -q $device || sudo umount UUID=$shared ; then
    # unmount the shared partition unless already unmounted
    sudo systemctl hibernate
    exit 0
fi

exit 1

然后我在 中有以下内容/usr/lib/systemd/system-sleep,它在从休眠状态恢复时运行。

#!/bin/bash
# /usr/lib/systemd/system-sleep/hibernate

shared=ABCDE12345
device=$(blkid -U "$shared")
logfile=/var/log/hibernate.log

if [ $2 == "hibernate" ] ; then
    if [ $1 == "post" ] ; then
        if ! df | grep -q $device ; then
            echo "shared drive not mounted..." >> $logfile
            cat /proc/partitions &>> $logfile

            # tried adding a sleep delay after mount failed without
            sleep 5

            echo "mounting..." >> $logfile
            /usr/bin/mount UUID=$shared &>> $logfile
        fi
    fi
fi

我可以确认(通过日志文件)/usr/lib/systemd/system-sleep/hibernate从休眠状态恢复时,所有内容都可以运行。cat /proc/partitions甚至列出了共享分区。但是,恢复后分区仍未挂载,并且命令mount不会向日志文件输出任何内容。我也尝试过mount使用设备路径运行,但mount --all没有成功。恢复后,我可以使用或 GUI 手动重新挂载共享分区,mount没有任何问题。

为什么这不起作用?我还能尝试其他什么方法在休眠后自动重新挂载此分区吗?

更新

该问题似乎与该驱动器被格式化为 NTFS 文件系统有关。我已使用上述方法创建了一个可以可靠挂载的测试 exFAT 分区。从休眠状态恢复时,我还在系统日志中发现了以下内容:

ntfs-3g[822185]: Version 2021.8.22 integrated FUSE 28
ntfs-3g[822185]: Mounted /dev/nvme0n1p4 (Read-Write, label "Shared", NTFS 3.1)
ntfs-3g[822185]: Cmdline options: rw,nosuid,nodev,nofail
ntfs-3g[822185]: Mount options: nosuid,nodev,nofail,allow_other,nonempty,relatime,rw,fsname=/dev/nvme0n1p4,blkdev,blksize=4096
ntfs-3g[822185]: Ownership and permissions disabled, configuration type 7
ntfs-3g[822185]: Unmounting /dev/nvme0n1p4 (Shared)

该分区在启动时挂载后似乎会悄悄卸载,原因不明。这可能与这个 systemd 问题,该问题已在尚未进入 Pop_OS 的版本中进行了修补。这也可能是 ntfs-3g 的问题,但我尚未发现任何有用的信息。

答案1

可能是以mount不稳定的方式执行的,即它在脚本进程终止时收到终止信号并自动“重新卸载”。不确定,因为您声明不会将mount任何内容输出到日志中。无论哪种方式,更可靠的方法是使用Systemd Service。也许有点(太晚了?)但试试这个:

  1. bash在您的主目录中创建一个脚本并将其命名为“remount.sh”(例如~/bin/remount.sh)。向其中添加以下命令:
#!/bin/bash

shared=ABCDE12345 # ***YOUR*** filesystem UUID
device=$(blkid -U "$shared")

# mount the shared partition unless already mounted
if ! df | grep -q $device ; then
    if mount UUID=$shared ; then
        exit 0
    fi
    exit 1
fi
exit 0
  1. 使上述脚本可执行:chmod u+x ~/bin/remount.sh

  2. 在您的主目录中的某个位置创建一个纯文本文件,并将其命名为“remount.service”(例如~/bin/remount.service)。向其中添加以下指令:

[Unit]
Description=Remount partition on resume from hibernate or hybrid-sleep
After=hybrid-sleep.target
After=hibernate.target
#After=suspend.target

[Service]
KillMode=process
ExecStart=~/bin/remount.sh

[Install]
WantedBy=hybrid-sleep.target
WantedBy=hibernate.target
#WantedBy=suspend.target
  1. 从终端运行以下命令:
sudo mv ~/bin/remount.service /etc/systemd/system/
systemctl enable remount.service

就是这样。现在,每次从休眠或混合睡眠模式恢复时,您的分区都应重新挂载。

相关内容