op-packages/mergerfs/files/mergerfs.init
github-actions[bot] 32600acc60 🌴 Sync 2026-03-05 23:51:42
2026-03-05 23:51:42 +08:00

95 lines
2.2 KiB
Bash
Executable File

#!/bin/sh /etc/rc.common
# mergerfs -f -o category.create=epmfs,minfreespace=100M,fsname=mergerfs:/mnt/merged /mnt/n2:/mnt/n3:/mnt/n4 /mnt/merged
START=98
USE_PROCD=1
start_service() {
config_load mergerfs
config_foreach start_pool pool
}
start_pool() {
local section="$1"
local enabled mountpoint paths createpolicy minfreespace options
config_get_bool enabled "$section" enabled 0
[ "$enabled" -eq 1 ] || return 0
config_get mountpoint "$section" mountpoint
config_get paths "$section" paths
config_get createpolicy "$section" createpolicy "epmfs"
config_get minfreespace "$section" minfreespace "4G"
config_get options "$section" options
# 检查 mountpoint 是否已设置
[ -z "$mountpoint" ] && {
logger -t "mergerfs" "mountpoint not set for $section"
return 1
}
# (
printf "%s\n" "$paths" | while IFS= read -r p; do
case "$p" in
/*)
if [ ! -d "$p" ]; then
logger -t "mergerfs" "source path $p does not exist for $mountpoint"
return 1
fi
;;
esac
done || return 1
# 只保留以 / 开头的路径,拼接为冒号分隔的字符串
srcs=$(
# (
printf "%s\n" "$paths" | while IFS= read -r p; do
case "$p" in
/*) printf ':%s' "$p" ;;
esac
done
)
srcs="${srcs#:}"
[ -z "$srcs" ] && {
logger -t "mergerfs" "no valid source paths for $mountpoint"
return 1
}
local opts
opts="category.create=${createpolicy},minfreespace=${minfreespace},fsname=mergerfs:${mountpoint}"
[ -n "$options" ] && opts="${opts},${options}"
mkdir -p "$mountpoint"
# mountpoint -q "$mountpoint" && umount "$mountpoint"
logger -t "mergerfs" "mergerfs -o $opts \"$srcs\" \"$mountpoint\""
procd_open_instance "$section"
procd_set_param command /usr/bin/mergerfs -f -o "$opts" "$srcs" "$mountpoint"
procd_close_instance
# close flock fd, or the script will hangs next time it runs
# ( exec 1000>&- ; mergerfs -o "$opts" "$srcs" "$mountpoint" )
}
stop_service() {
config_load mergerfs
config_foreach stop_pool pool
}
stop_pool() {
local section="$1"
local mountpoint
config_get mountpoint "$section" mountpoint
[ -n "$mountpoint" ] && umount "$mountpoint"
}
service_triggers() {
procd_add_reload_trigger "mergerfs"
}
reload_service() {
restart
}