![启动时,如果是X,则挂载A,否则挂载B](https://linux22.com/image/227800/%E5%90%AF%E5%8A%A8%E6%97%B6%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%98%AFX%EF%BC%8C%E5%88%99%E6%8C%82%E8%BD%BDA%EF%BC%8C%E5%90%A6%E5%88%99%E6%8C%82%E8%BD%BDB.png)
上下文如下这另一个问题我的。 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
你可以用系统生成器;让生成器根据可用的设备创建适当的安装单元。以下示例演示了总体思路:
我们检查目标设备 (
/dev/disk/by-uuid/7057c04d-e1c8-4b95-8338-ff0c3e5b14f8
) 是否可用:- 如果是的话,我们会使用它。
- 如果不是,我们将使用
/dev/disk/by-uuid/cad0b488-1ac0-4725-806d-1df5aff03391
它。
现在我们知道要使用哪个设备,我们生成适当的安装单元。
最后,我们激活安装单元以便安装设备。
我创建了以下脚本并将其命名为/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
现在重新启动系统,根据连接的设备,您会发现其中一个或另一个已安装。