该脚本是否可以安全地为交换文件挂载(卸载)NTFS分区?

该脚本是否可以安全地为交换文件挂载(卸载)NTFS分区?

我使用的是运行 Ubuntu 18.04.3 LTS Bionic Beaver 的持久实时 USB,因为硬盘分区非常困难。玩 Steam 游戏时,我需要一个交换文件。在以下机构的帮助下@malte-skoruppa,我现在在内部硬盘上的 NTFS 分区上使用交换文件。

我现在想使用我的第一个 Bash 脚本来自动化这个过程,基于如何操作。请问您能看出这个脚本有什么缺陷吗?:

#!/bin/bash
echo "Mounting partition..."
sudo mount -U 80EA3F58EA3F49A4 /media/ubuntu/LENOVO
echo "Opening swapfile..."
sudo swapon /media/ubuntu/LENOVO/swapfile.img
steam steam://open/minigameslist
echo "Closing swapfile..."
sudo swapoff /media/ubuntu/LENOVO/swapfile.img
echo "Unmounting partition..."
sudo umount -l /media/ubuntu/LENOVO
echo "Mission accomplished!"

我特别关心这个umount -l选项。HOWTO 说一旦分区不忙,它就会卸载,但是一个旧的 Stack Overflow 答案说它强制卸载分区,这是不是我想做的事。

答案1

因为我知道您是 Ubuntu 新手,所以这里有一些一般性评论。

1. 将该分区放入/etc/fstab

首先,在您的脚本中,您使用该行sudo mount -U 80EA3F58EA3F49A4 /media/ubuntu/LENOVO来挂载您的 NTFS 分区。我建议将该分区添加到您的分区/etc/fstab并将其映射到那里的分区的 UID。由于您使用的是单用户系统,因此您可能希望在您的 中有类似这样的条目/etc/fstab

UUID=80EA3F58EA3F49A4 /media/ubuntu/LENOVO ntfs rw,exec,uid=1000,gid=1000,umask=0002,nls=utf8,noauto  0  0

最重要的是,这会告诉系统将挂载点绑定/media/ubuntu/LENOVO到 UID 80EA3F58EA3F49A4。这样,将来(因此在您的脚本中)您可以简单地使用sudo mount /media/ubuntu/LENOVO而不是sudo mount -U 80EA3F58EA3F49A4 /media/ubuntu/LENOVO。如果 UID 将来发生变化(因为您重新格式化分区),最好只有一个中心位置 来/etc/fstab编辑,而不是可能有 20 个脚本。

这还会使用 NTFS 分区的各种常见选项挂载文件系统:读写模式 ( rw)、允许执行二进制文件 ( exec)、使文件系统上的所有文件和目录属于用户 1000 和组 1000 ( uid=1000,gid=1000)(即您的普通用户)、将所有文件和目录的权限位设置为 775 ( umask=0002)、将文件名的字符集设置为 UTF-8 ( nls=utf8),并且不自动挂载分区 ( noauto)。请参阅fstab(5)安装(8)了解更多信息。我个人觉得在我的单用户系统上,无需使用 即可访问 NTFS 分区上的所有文件,这很方便sudo,但当然您的情况可能会有所不同。

您可能还想删除该选项。然后,只要运行该命令,尤其是在启动时,noauto分区就会被挂载(因此,它通常会一直挂载)。然后您甚至根本不需要在脚本中使用和命令,但我不知道您是否想要这样。mount -amountumount

2. 不要umount-l

卸载(8)

umount -l 的推荐用例是防止由于无法访问的网络共享而导致关机时挂起,而正常的 umount 会因服务器关闭或网络分区而挂起。

因此,至少在您的情况下,此选项不太常用。

umount无论是否使用运行-l,分区都不会被强制卸载(有此-f选项)。相反,当您不使用-l并且分区仍然繁忙时,卸载将失败并返回错误消息;当使用-l并且分区仍然繁忙时,它将立即从文件系统层次结构中分离(意味着您无法再访问它),但待处理的 I/O 操作将在后台默默完成。

由于运行后不应该有任何待处理的 I/O 操作swapoff,因此通过不使用,-l您至少会注意到是否有异常,因为如果分区意外地仍然很忙,那么卸载命令将输出一条错误消息。

3.添加错误处理

您按顺序执行所有命令,但不检查前一个命令是否有效。因此,例如,如果安装失败,则swapon仍将尝试执行该命令但失败,然后即使未激活交换,您的游戏也将开始。

尝试这个:

#!/bin/bash

echo "Mounting partition..."
sudo mount /media/ubuntu/LENOVO

if [ $? -ne 0 ]; then
    echo "Could not mount partition, mission aborted." >&2
    exit 1
fi

echo "Opening swapfile..."
sudo swapon /media/ubuntu/LENOVO/swapfile.img

if [ $? -ne 0 ]; then
    echo "Could not activate swap, mission aborted." >&2
    exit 1
fi

steam steam://open/minigameslist

echo "Closing swapfile..."
sudo swapoff /media/ubuntu/LENOVO/swapfile.img

echo "Unmounting partition..."
sudo umount /media/ubuntu/LENOVO

echo "Mission accomplished!"

相关内容