启动时,如果是X,则挂载A,否则挂载B

启动时,如果是X,则挂载A,否则挂载B

上下文如下这另一个问题我的。 TL,DR:我的大部分主文件夹都位于我随身携带的外部驱动器上,并安装在我的各个工作场所和家里。

unionfs /HomeLocal=RW:/mnt/external_drive/HomeRoaming=RW /home通过以下行完成安装fstab

/HomeLocal=RW:/mnt/external_drive/HomeRoaming=RW /home fuse.unionfs auto,suid,exec,nonempty,max_files=32768,allow_other,x-systemd.requires=/mnt/external_drive

(/HomeLocal 保存我的本地配置文件和本地用户的家庭。)

这个效果很好当我不在时,本地用户无法使用计算机,因为当 external_drive 不存在时,unionfs 会失败。所以我想编写一个SystemD挂载单元来实现这一点:

  • 如果存在 external_drive,则安装它,然后按照说明安装 unionfs
  • 如果没有,只需(绑定)在 /home 上挂载 /HomeLocal

我不知道 SystemD 本身是否具备建立这种分支所需的能力。如果没有,我想我可以求助于安装单元调用的脚本,但随后我需要有关如何编写正确的单元文件来实现此目的的建议。

答案1

你可以用系统生成器;让生成器根据可用的设备创建适当的安装单元。以下示例演示了总体思路:

  1. 我们检查目标设备 ( /dev/disk/by-uuid/7057c04d-e1c8-4b95-8338-ff0c3e5b14f8) 是否可用:

    • 如果是的话,我们会使用它。
    • 如果不是,我们将使用/dev/disk/by-uuid/cad0b488-1ac0-4725-806d-1df5aff03391它。
  2. 现在我们知道要使用哪个设备,我们生成适当的安装单元。

  3. 最后,我们激活安装单元以便安装设备。

我创建了以下脚本并将其命名为/etc/systemd/system-generators/home-mount-generator

#!/bin/bash

DISK1=/dev/disk/by-uuid/7057c04d-e1c8-4b95-8338-ff0c3e5b14f8
DISK2=/dev/disk/by-uuid/cad0b488-1ac0-4725-806d-1df5aff03391

normal_dir=$1
early_dir=${2:-$normal_dir}
late_dir=${3:-$normal_dir}

if [[ -b $DISK1 ]]; then
        DEVICE=$DISK1
else
        DEVICE=$DISK2
fi

cat > $normal_dir/home.mount <<EOF
# Created by $0

[Unit]
Description=Home directories

[Mount]
What=$DEVICE
Where=/home
Type=ext4

[Install]
WantedBy=local-fs.target
EOF

mkdir -p $normal_dir/local-fs.target.requires
ln -sf ../home.mount $normal_dir/local-fs.target.requires

确保文件可执行:

chmod 755 /etc/systemd/system-generators/home-mount-generator

现在重新启动系统,根据连接的设备,您会发现其中一个或另一个已安装。

相关内容