Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package profile-sync-daemon for
openSUSE:Factory checked in at 2026-09-14 16:21:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/profile-sync-daemon (Old)
and /work/SRC/openSUSE:Factory/.profile-sync-daemon.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "profile-sync-daemon"
Mon Sep 14 16:21:54 2026 rev:4 rq:1377689 version:7.04
Changes:
--------
--- /work/SRC/openSUSE:Factory/profile-sync-daemon/profile-sync-daemon.changes
2024-04-29 17:57:48.886211266 +0200
+++
/work/SRC/openSUSE:Factory/.profile-sync-daemon.new.1265/profile-sync-daemon.changes
2026-09-14 16:22:02.103693346 +0200
@@ -1,0 +2,17 @@
+Sun Sep 13 12:03:18 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to version 7.04:
+ * Overlayfs mode now uses fuse-overlayfs instead of the dropped
+ sudo helper psd-overlay-helper (binary and man page removed);
+ overlayfs mode requires fuse-overlayfs and fuse3
+ * Firefox: follow new profile location, honor XDG_CONFIG_HOME,
+ add Firefox Flatpak support
+ * New contrib browser profiles: floorp, thorium, zen,
+ helium-browser, firefox-flatpak{,-cache}
+ * psd-resync.timer reworked to OnCalendar scheduling
+ * Assign psd to the background systemd slice, reduce crash-recovery I/O
+ * Fix lingering gdbus process, fix bug in enforce()
+- Capitalize zsh-completion subpackage summary (rpmlint
+ summary-not-capitalized)
+
+-------------------------------------------------------------------
Old:
----
profile-sync-daemon-6.50.tar.gz
New:
----
profile-sync-daemon-7.04.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ profile-sync-daemon.spec ++++++
--- /var/tmp/diff_new_pack.1i2QnI/_old 2026-09-14 16:22:03.235740871 +0200
+++ /var/tmp/diff_new_pack.1i2QnI/_new 2026-09-14 16:22:03.237740955 +0200
@@ -1,7 +1,7 @@
#
# spec file for package profile-sync-daemon
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
# Copyright (c) 2013-2020 Artem Polishchuk & Christopher Meng
#
# All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
%global shortname psd
Name: profile-sync-daemon
-Version: 6.50
+Version: 7.04
Release: 0
Summary: Symlinks and syncs browser profile dirs to RAM thus reducing
HDD/SDD calls
License: MIT
@@ -30,6 +30,10 @@
BuildRequires: systemd-rpm-macros
BuildRequires: zsh
Requires: rsync
+# overlayfs mode needs fuse-overlayfs + fusermount3 (fuse3); soft dep
+# since the default sync mode works without them
+Recommends: fuse-overlayfs
+Recommends: fuse3
BuildArch: noarch
%description
@@ -40,7 +44,7 @@
the major design goals of psd is a completely transparent user experience.
%package zsh-completion
-Summary: zsh completion for %{name}
+Summary: Zsh completion for %{name}
Requires: %{name} = %{version}
Supplements: (%{name} and zsh)
@@ -71,7 +75,6 @@
%license MIT LICENSE
%{_bindir}/%{name}
%{_bindir}/%{shortname}
-%{_bindir}/%{shortname}-overlay-helper
%{_bindir}/%{shortname}-suspend-sync
%{_datadir}/%{shortname}/
%{_mandir}/man1/*.1%{?ext_man}
++++++ profile-sync-daemon-6.50.tar.gz -> profile-sync-daemon-7.04.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/INSTALL
new/profile-sync-daemon-7.04/INSTALL
--- old/profile-sync-daemon-6.50/INSTALL 2023-10-02 09:51:14.000000000
+0200
+++ new/profile-sync-daemon-7.04/INSTALL 2026-07-03 13:01:30.000000000
+0200
@@ -2,6 +2,8 @@
bash >=4.0
coreutils
findutils
+ fuse3
+ fuse-overlayfs
glib2 (optional for suspend-sync support via gdbus)
kmod
rsync
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/MIT
new/profile-sync-daemon-7.04/MIT
--- old/profile-sync-daemon-6.50/MIT 2023-10-02 09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/MIT 2026-07-03 13:01:30.000000000 +0200
@@ -1,4 +1,4 @@
-Copyright (c) 2013-2023 graysky
+Copyright (c) 2013-2026 graysky
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/Makefile
new/profile-sync-daemon-7.04/Makefile
--- old/profile-sync-daemon-6.50/Makefile 2023-10-02 09:51:14.000000000
+0200
+++ new/profile-sync-daemon-7.04/Makefile 2026-07-03 13:01:30.000000000
+0200
@@ -1,4 +1,4 @@
-VERSION = 6.50
+VERSION = 7.04
PN = profile-sync-daemon
PREFIX ?= /usr
@@ -27,7 +27,6 @@
$(Q)echo -e '\033[1;32mInstalling main script...\033[0m'
$(INSTALL_DIR) "$(DESTDIR)$(BINDIR)"
$(INSTALL_PROGRAM) common/$(PN) "$(DESTDIR)$(BINDIR)/$(PN)"
- $(INSTALL_PROGRAM) common/psd-overlay-helper
"$(DESTDIR)$(BINDIR)/psd-overlay-helper"
$(INSTALL_PROGRAM) common/psd-suspend-sync
"$(DESTDIR)$(BINDIR)/psd-suspend-sync"
ln -sf $(PN) "$(DESTDIR)$(BINDIR)/psd"
$(INSTALL_DIR) "$(DESTDIR)$(ZSHDIR)"
@@ -42,7 +41,6 @@
$(Q)echo -e '\033[1;32mInstalling manpage...\033[0m'
$(INSTALL_DIR) "$(DESTDIR)$(MANDIR)"
$(INSTALL_DATA) doc/psd.1 "$(DESTDIR)$(MANDIR)/psd.1"
- $(INSTALL_DATA) doc/psd-overlay-helper.1
"$(DESTDIR)$(MANDIR)/psd-overlay-helper.1"
ln -sf psd.1 "$(DESTDIR)$(MANDIR)/$(PN).1"
install-systemd:
@@ -58,7 +56,6 @@
$(RM) "$(DESTDIR)$(BINDIR)/$(PN)"
$(RM) "$(DESTDIR)$(BINDIR)/psd"
$(RM) "$(DESTDIR)$(ZSHDIR)/_psd"
- $(RM) "$(DESTDIR)$(BINDIR)/psd-overlay-helper"
$(RM) "$(DESTDIR)$(BINDIR)/psd-suspend-sync"
$(RM) "$(DESTDIR)$(SHAREDIR)/psd.conf"
$(RM) -rf "$(DESTDIR)$(SHAREDIR)/browsers"
@@ -68,7 +65,6 @@
uninstall-man:
$(RM) -f "$(DESTDIR)$(MANDIR)/$(PN).1"
$(RM) -f "$(DESTDIR)$(MANDIR)/psd.1"
- $(RM) -f "$(DESTDIR)$(MANDIR)/psd-overlay-helper.1"
uninstall-systemd:
$(RM) "$(DESTDIR)$(INITDIR_SYSTEMD)/psd.service"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/README.md
new/profile-sync-daemon-7.04/README.md
--- old/profile-sync-daemon-6.50/README.md 2023-10-02 09:51:14.000000000
+0200
+++ new/profile-sync-daemon-7.04/README.md 2026-07-03 13:01:30.000000000
+0200
@@ -11,7 +11,8 @@
* Chromium
* Conkeror
* Epiphany
-* Firefox (stable, beta, and aurora)
+* Firefox (version 147 and above use freedesktop.org XDG base dir specs others
use legacy `~/.mozilla`)
+* Firefox flatpak (run `flatpak override --user org.mozilla.firefox
--filesystem=/run/user/$UID/psd` once to give required access)
* Firefox-trunk (this is an Ubuntu-only browser:
http://www.webupd8.org/2011/05/install-firefox-nightly-from-ubuntu-ppa.html)
* Google Chrome (stable, beta, and dev)
* Heftig's version of Aurora (this is an Arch Linux-only browser:
https://bbs.archlinux.org/viewtopic.php?id=117157)
@@ -41,7 +42,6 @@
* Arch: in the extra
[repo](https://archlinux.org/packages/extra/any/profile-sync-daemon/).
* Debian: in the official
[repos](https://packages.debian.org/unstable/profile-sync-daemon).
* Exherbo: in the official
[repos](http://git.exherbo.org/summer/packages/net-www/profile-sync-daemon).
-* Fedora: in the official
[repos](https://src.fedoraproject.org/rpms/profile-sync-daemon).
* Gentoo: in the official
[repos](http://packages.gentoo.org/package/www-misc/profile-sync-daemon).
* NixOS: in the official
[repo](https://search.nixos.org/packages?channel=22.11&from=0&size=50&sort=relevance&type=packages&query=profile-sync).
* Ubuntu: in Universe
[repo](https://packages.ubuntu.com/search?keywords=profile-sync-daemon).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/common/browsers/firefox
new/profile-sync-daemon-7.04/common/browsers/firefox
--- old/profile-sync-daemon-6.50/common/browsers/firefox 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/common/browsers/firefox 2026-07-03
13:01:30.000000000 +0200
@@ -1,3 +1,21 @@
+if [[ -d "$XDG_CONFIG_HOME/mozilla/firefox" ]]; then
+ index=0
+ PSNAME="$browser"
+ while read -r profileItem; do
+ if [[ $(echo "$profileItem" | cut -c1) = "/" ]]; then
+ # path is not relative
+ DIRArr[$index]="$profileItem"
+ else
+ # we need to append the default path to give a
+ # fully qualified path
+ DIRArr[$index]="$XDG_CONFIG_HOME/mozilla/firefox/$profileItem"
+ fi
+ (( index=index+1 ))
+ done < <(grep '^[Pp]ath=' "$XDG_CONFIG_HOME/mozilla/firefox/profiles.ini"
| sed 's/[Pp]ath=//')
+fi
+
+check_suffix=1
+
if [[ -d "$HOME"/.mozilla/firefox ]]; then
index=0
PSNAME="$browser"
@@ -11,7 +29,8 @@
DIRArr[$index]="$HOME/.mozilla/firefox/$profileItem"
fi
(( index=index+1 ))
- done < <(grep '[Pp]'ath= "$HOME"/.mozilla/firefox/profiles.ini | sed
's/[Pp]ath=//')
+ done < <(grep '^[Pp]ath=' "$HOME"/.mozilla/firefox/profiles.ini | sed
's/[Pp]ath=//')
fi
-check_suffix=1
\ No newline at end of file
+check_suffix=1
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/profile-sync-daemon-6.50/common/profile-sync-daemon.in
new/profile-sync-daemon-7.04/common/profile-sync-daemon.in
--- old/profile-sync-daemon-6.50/common/profile-sync-daemon.in 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/common/profile-sync-daemon.in 2026-07-03
13:01:30.000000000 +0200
@@ -121,7 +121,7 @@
if [[ -f "$PID_FILE" ]]; then
if [[ -f "$PSDCONFDIR/.psd.conf" ]]; then
PSDCONF="$PSDCONFDIR/.psd.conf"
- unset USE_OVERLAYFS USE_SUSPSYNC BROWSERS USE_BACKUPS BACKUP_LIMIT
+ unset USE_SUSPSYNC BROWSERS USE_BACKUPS BACKUP_LIMIT
. "$PSDCONF"
# defining VOLATILE in the config is deprecated since v6.16
VOLATILE="$XDG_RUNTIME_DIR/psd"
@@ -157,16 +157,6 @@
readarray -t BROWSERS < <(printf '%s\n' "${BROWSERS[@]}" | awk '!x[$0]++')
# simple function to determine user intent rather than using a null value
-case "${USE_OVERLAYFS,,}" in
- y|yes|true|t|on|1|enabled|enable|use)
- OLFS=1
- ;;
- *)
- OLFS=0
- ;;
-esac
-
-# simple function to determine user intent rather than using a null value
case "${USE_SUSPSYNC,,}" in
y|yes|true|t|on|1|enabled|enable|use)
SUSPSYNC=1
@@ -188,28 +178,6 @@
;;
esac
-# determine if we are using overlayfs (v22 and below) or overlay (v23 and
above)
-# since mount should call modprobe on invocation, check to see if either
-# module is in the tree using modinfo
-
-if [[ $OLFS -eq 1 ]]; then
- # first check to see if either is hardcoded into the kernel
- # and of course prefer version 23
- [[ $(grep -ciE "overlayfs$" /proc/filesystems) -eq 1 ]] && OLFSVER=22
- [[ $(grep -ciE "overlay$" /proc/filesystems) -eq 1 ]] && OLFSVER=23
-fi
-
-if [[ -z $OLFSVER ]]; then
- # if neither is hardcoded, see if either module is available
- if modinfo overlayfs &>/dev/null; then
- OLFSVER=22
- fi
-
- if modinfo overlay &>/dev/null; then
- OLFSVER=23
- fi
-fi
-
header() {
echo -e "${BLD}Profile-sync-daemon v$VERS${NRM}"
echo
@@ -235,14 +203,6 @@
exit 1
fi
fi
- if [[ $OLFS -eq 1 ]]; then
- [[ $OLFSVER -ge 22 ]] || {
- echo -e " ${BLD}Your kernel requires either the
${BLU}overlay${NRM}${BLD} or ${BLU}overlayfs${NRM}${BLD} module to use${NRM}"
- echo -e " ${BLD}to use psd's in overlay mode. Cannot find either in
your kernel so compile it in and${NRM}"
- echo -e " ${BLD}try again or remove the option from
${BLU}$PSDCONF${NRM}${BLD}. ${RED}Aborting!${NRM}" >&2
- exit 1
- }
- fi
if [[ -f /etc/psd.conf ]]; then
echo -e "${BLD} This version of psd does not support /etc/psd.conf since
it runs as your user.${NRM}"
@@ -253,22 +213,13 @@
}
config_check() {
- if [[ $OLFS -eq 1 ]]; then
- # user must have sudo rights to call /usr/bin/mount
- # and /usr/bin/umount to use overlay mode
-
- if ! sudo -kn psd-overlay-helper &>/dev/null; then
- FAILCODE=1
- fi
-
- if [[ $FAILCODE -ne 0 ]]; then
- echo -e "${BLD}${RED} ERROR!${NRM}${BLD} To use overlayfs mode, $user
needs sudo access to ${BLU}/usr/bin/psd-overlay-helper${NRM}${BLD}${NRM}"
- echo
- echo -e " ${BLD}Add the following line to the end of
${BLU}/etc/sudoers${NRM}${BLD} to enable this functionality:${NRM}"
- echo -e " ${BLD}$user ALL=(ALL) NOPASSWD:
/usr/bin/psd-overlay-helper${NRM}"
+ # fuse3 is a depends of fuse-overlayfs but there are static builds floating
around so to protect data, check for both
+ for _bin in fuse-overlayfs fusermount3; do
+ if ! command -v "$_bin" >/dev/null 2>&1; then
+ echo -e "${BLD}${RED} ERROR!${NRM}${BLD} To use overlayfs mode, install
fuse-overlayfs and fuse3${NRM}${BLD}${NRM}"
exit 1
fi
- fi
+ done
for browser in "${BROWSERS[@]}"; do
if [[ ! -f "$SHAREDIR/browsers/$browser" ]]; then
@@ -306,8 +257,6 @@
else
echo "Ungraceful state detected for $DIR so fixing"
unlink "$DIR"
- # refuse to start browser while recovery
- ln -s /dev/null "$DIR"
fi
fi
@@ -336,7 +285,6 @@
cp -a --reflink=auto "$TARGETTOKEEP" "$BACKUP-crashrecovery-$NOW"
fi
- unlink "$DIR"
mv --no-target-directory "$TARGETTOKEEP" "$DIR"
rm -rf "$BACKUP"
else
@@ -346,14 +294,10 @@
if [[ $CRRE -eq 1 ]]; then
cp -a --reflink=auto "$BACKUP" "$BACKUP-crashrecovery-$NOW"
- unlink "$DIR"
mv --no-target-directory "$BACKUP" "$DIR"
fi
fi
fi
-
- # if overlayfs was active but is no longer, remove $BACK_OVFS
- [[ $OLFS -eq 1 ]] || rm -rf "$BACK_OVFS"
done
done
}
@@ -368,7 +312,7 @@
local CRASHArr=()
while IFS= read -d '' -r backup; do
CRASHArr=("${CRASHArr[@]}" "$backup")
- done < <(find "${DIR%/*}" -type d -name '*crashrecovery*' -print0 | sort
-r -z)
+ done < <(find "${DIR%/*}" -maxdepth 1 -type d -name
"${DIR##*/}-backup-crashrecovery-*" -print0 | sort -r -z)
if [[ ${#CRASHArr[@]} -gt 0 ]]; then
echo -e "${BLD}Deleting ${#CRASHArr[@]} crashrecovery dir(s) for
profile ${BLU}$DIR${NRM}"
@@ -499,48 +443,52 @@
PREFIXP=$(stat -c %a "$DIR")
[[ -r "$TMP" ]] || install -dm"$PREFIXP" --owner="$user"
--group="$group" "$TMP"
- if [[ $OLFS -eq 1 ]]; then
- if [[ $OLFSVER -eq 23 ]]; then
- [[ -r "$UPPER" ]] || install -dm"$PREFIXP" --owner="$user"
--group="$group" "$UPPER"
- [[ -r "$WORK" ]] || install -dm"$PREFIXP" --owner="$user"
--group="$group" "$WORK"
- elif [[ $OLFSVER -eq 22 ]]; then
- [[ -r "$UPPER" ]] || install -dm"$PREFIXP" --owner="$user"
--group="$group" "$UPPER"
- fi
+ if [[ ! -r "$UPPER" ]]; then
+ install -dm"$PREFIXP" --owner="$user" --group="$group" "$UPPER" ||
exit 2
+ fi
+ if [[ ! -r "$WORK" ]]; then
+ install -dm"$PREFIXP" --owner="$user" --group="$group" "$WORK" || exit
2
fi
# backup target and link to tmpfs container
if [[ $(readlink "$DIR") != "$TMP" ]]; then
mv --no-target-directory "$DIR" "$BACKUP"
- # refuse to start browser while initial sync
- ln -s /dev/null "$DIR"
fi
# sync the tmpfs targets to the disc
if [[ -e "$DIR"/.flagged ]]; then
REPORT="resync"
- if [[ $OLFS -eq 1 ]]; then
- rsync -aX --delete-after --inplace --no-whole-file --exclude
.flagged "$DIR/" "$BACK_OVFS/"
- else
- rsync -aX --delete-after --inplace --no-whole-file --exclude
.flagged "$DIR/" "$BACKUP/"
+ if ! rsync -aX --delete-after --inplace --no-whole-file --exclude
.flagged "$DIR/" "$BACK_OVFS/"; then
+ echo -e "${RED}Error: Failed to resync $DIR to $BACK_OVFS${NRM}" >&2
+ exit 2
fi
else
# initial sync
REPORT="sync"
- if [[ $OLFS -eq 1 ]]; then
- if ! sudo psd-overlay-helper -v "$OLFSVER" -l "$BACKUP" -u "$UPPER"
-w "$WORK" -d "$TMP" mountup; then
- echo -e "Error in trying to mount $TMP - this should not happen!"
- exit 1
+ if ! mountpoint -q "$TMP"; then
+ overlay_opts="lowerdir=$BACKUP,upperdir=$UPPER,workdir=$WORK"
+ if [[ $FIREJAIL -eq 1 ]]; then
+ overlay_opts="allow_root,$overlay_opts"
+ fi
+ fuse-overlayfs -o "$overlay_opts" "$TMP"
+ if ! mountpoint -q "$TMP"; then
+ exit 2
fi
- else
- # keep user from launching browser while rsync is active
- rsync -aX --inplace --no-whole-file "$BACKUP/" "$TMP"
fi
- # now browser can start
- [[ $(readlink "$DIR") = "/dev/null" ]] && unlink "$DIR"
+ [[ -h "$DIR" ]] && unlink "$DIR"
ln -s "$TMP" "$DIR"
+
chown -h "$user":"$group" "$DIR"
touch "$DIR/.flagged"
+
+ # create $BACK_OVFS directory for storing resync data
+ if [[ ! -d "$BACK_OVFS" ]]; then
+ install -dm"$PREFIXP" --owner="$user" --group="$group" "$BACK_OVFS"
|| {
+ echo -e "${RED}Error: Failed to create $BACK_OVFS${NRM}" >&2
+ exit 2
+ }
+ fi
fi
echo -e "${BLD}$browser $REPORT successful${NRM}"
else
@@ -569,7 +517,6 @@
echo "# Any edits to the live config: $PSDCONFDIR/psd.conf"
echo "# will be applied the _next_ time psd is activated."
echo "#"
- echo "USE_OVERLAYFS=\"$USE_OVERLAYFS\""
echo "USE_SUSPSYNC=\"$USE_SUSPSYNC\""
echo "BROWSERS=\"${BROWSERS[*]}\""
echo "USE_BACKUPS=\"$USE_BACKUPS\""
@@ -587,10 +534,12 @@
enforce() {
local browser
for browser in "${BROWSERS[@]}"; do
+ load_env_for "$browser"
+ for DIR in "${DIRArr[@]}"; do
local CRASHArr=()
while IFS= read -d '' -r backup; do
CRASHArr=("${CRASHArr[@]}" "$backup")
- done < <(find "${DIR%/*}" -type d -name '*crashrecovery*' -print0 | sort
-r -z)
+ done < <(find "${DIR%/*}" -maxdepth 1 -type d -name
"${DIR##*/}-backup-crashrecovery-*" -print0 | sort -r -z)
if [[ ${#CRASHArr[@]} -gt $BACKUP_LIMIT ]]; then
for remove in "${CRASHArr[@]:$BACKUP_LIMIT}"; do
@@ -598,6 +547,7 @@
done
fi
done
+ done
}
do_unsync() {
@@ -620,15 +570,37 @@
# check if user has browser profile
if [[ -h "$DIR" ]]; then
unlink "$DIR"
- # this assumes that the backup is always updated so
- # be sure to invoke a sync before an unsync
- #
- # restore original dirtree
- [[ -d "$BACKUP" ]] && mv --no-target-directory "$BACKUP" "$DIR"
- if [[ $OLFS -eq 1 ]] && mountpoint -q "$TMP"; then
- rsync -aX --delete-after --inplace --no-whole-file --exclude
.flagged "$BACK_OVFS/" "$DIR/"
- sudo psd-overlay-helper -d "$TMP" -w "$WORK" mountdown && rm -rf
"$TMP" "$UPPER"
+
+ # unmount overlayfs FIRST while BACKUP still exists at original
location
+ # moving BACKUP before unmounting breaks the overlayfs mount (lowerdir
path disappears)
+ if mountpoint -q "$TMP"; then
+ # sync latest changes from overlayfs to BACK_OVFS, then to BACKUP
before unmounting
+ # always update BACK_OVFS from live overlayfs first to capture
latest changes
+ if [[ -d "$BACK_OVFS" ]]; then
+ # Update BACK_OVFS with latest changes from live overlayfs
+ if ! rsync -aX --delete-after --inplace --no-whole-file --exclude
.flagged "$TMP/" "$BACK_OVFS/"; then
+ echo -e "${RED}Error: Failed to sync $TMP to $BACK_OVFS during
unsync${NRM}" >&2
+ exit 2
+ fi
+ # sync BACK_OVFS to BACKUP
+ if ! rsync -aX --delete-after --inplace --no-whole-file --exclude
.flagged "$BACK_OVFS/" "$BACKUP/"; then
+ echo -e "${RED}Error: Failed to sync $BACK_OVFS to $BACKUP
during unsync${NRM}" >&2
+ exit 2
+ fi
+ else
+ # BACK_OVFS doesn't exist, sync directly from TMP to BACKUP
+ if ! rsync -aX --delete-after --inplace --no-whole-file --exclude
.flagged "$TMP/" "$BACKUP/"; then
+ echo -e "${RED}Error: Failed to sync $TMP to $BACKUP during
unsync${NRM}" >&2
+ exit 2
+ fi
+ fi
+ # unmount (before moving BACKUP)
+ fusermount3 -u "$TMP"
+ rm -rf "$TMP" "$UPPER" "$WORK"
fi
+
+ # restore BACKUP (which now has the changes merged in)
+ [[ -d "$BACKUP" ]] && mv --no-target-directory "$BACKUP" "$DIR"
[[ -d "$TMP" ]] && rm -rf "$TMP"
echo -e "${BLD}$browser unsync successful${NRM}"
else
@@ -650,13 +622,6 @@
else
psss_state="disabled"
fi
- if [[ $OLFS -eq 1 ]]; then
- olfs_color="${GRN}"
- ofls_state="enabled"
- else
- olfs_color="${RED}"
- ofls_state="disabled"
- fi
[[ "$psd_state" = "active" ]] && psd_color="${GRN}" || psd_color="${RED}"
[[ "$resync_state" = "active" ]] && resync_color="${GRN}" ||
resync_color="${RED}"
[[ "$psd_suspend_sync_state" != 0 ]] && psss_color="${GRN}" ||
psss_color="${RED}"
@@ -666,8 +631,6 @@
echo -e "$(tput cr)$(tput cuf 17)
${resync_color}$resync_state${NRM}${BLD}${NRM}"
echo -en " ${BLD}sync on sleep:"
echo -e "$(tput cr)$(tput cuf 17) ${psss_color}$psss_state${NRM}${BLD}${NRM}"
- echo -en " ${BLD}use overlayfs:"
- echo -e "$(tput cr)$(tput cuf 17) ${olfs_color}$ofls_state${NRM}${BLD}${NRM}"
echo
echo -e "${BLD}Psd will manage the following per
${BLU}${PSDCONF}${NRM}${BLD}:${NRM}"
echo
@@ -686,7 +649,7 @@
local CRASHArr=()
while IFS= read -d '' -r backup; do
CRASHArr=("${CRASHArr[@]}" "$backup")
- done < <(find "${DIR%/*}" -type d -name '*crashrecovery*' -print0 |
sort -r -z)
+ done < <(find "${DIR%/*}" -maxdepth 1 -type d -name
"${DIR##*/}-backup-crashrecovery-*" -print0 | sort -r -z)
# get permissions on profile dir and be smart about it since symlinks
are all 777
[[ -f $PID_FILE ]] && TRUEP=$(stat -c %a "$BACKUP") || TRUEP=$(stat -c
%a "$DIR")
@@ -714,7 +677,7 @@
echo -e "$(tput cr)$(tput cuf 17)
${GRN}$VOLATILE/$user-$browser$suffix${NRM}"
echo -en " ${BLD}profile size:"
echo -e "$(tput cr)$(tput cuf 17) $psize${NRM}"
- if [[ $OLFS -eq 1 ]]; then
+ if [[ -f $PID_FILE ]]; then
rwsize=$(du -Dh --max-depth=0 "$UPPER" 2>/dev/null | awk '{ print $1
}')
echo -en " ${BLD}overlayfs size:"
echo -e "$(tput cr)$(tput cuf 17) $rwsize${NRM}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/common/psd-overlay-helper
new/profile-sync-daemon-7.04/common/psd-overlay-helper
--- old/profile-sync-daemon-6.50/common/psd-overlay-helper 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/common/psd-overlay-helper 1970-01-01
01:00:00.000000000 +0100
@@ -1,60 +0,0 @@
-#!/bin/bash
-readonly PATH=/usr/bin:/bin
-readonly IFS=$' \t\n'
-
-while getopts :v:l:u:w:d: OPT; do
- case $OPT in
- v)
- declare -ir OLFSVER=$OPTARG
- ;;
- l)
- readonly BACKUP=$OPTARG
- ;;
- u)
- readonly UPPER=$OPTARG
- ;;
- w)
- readonly WORK=$OPTARG
- ;;
- d)
- readonly TMP=$OPTARG
- ;;
- *)
- exit 1
- ;;
- esac
-done
-shift $(( OPTIND - 1 ))
-OPTIND=1
-
-## TODO - pass error codes back to psd so it can break if the mount command
fails
-case "$1" in
- mountup)
- # write access to upper/workdir is required or do not overlay lowerdirs
- user=$(stat -c %U "$TMP")
- if ! sudo -u "$user" test -w "$BACKUP"; then
- echo "User $user has no write permissions for $BACKUP. Aborting..." >&2
- exit 1
- fi
-
- user=$(stat -c %U "$UPPER")
- if ! sudo -u "$user" test -w "$BACKUP"; then
- echo "User $user has no write permissions for $BACKUP. Aborting..." >&2
- exit 1
- fi
- if [[ $OLFSVER -eq 23 ]]; then
- mount -o nosuid,nodev -t overlay overlaid
-olowerdir="$BACKUP",upperdir="$UPPER",workdir="$WORK" "$TMP"
- elif [[ $OLFSVER -eq 22 ]]; then
- mount -o nosuid,nodev -t overlayfs overlaid
-olowerdir="$BACKUP",upperdir="$UPPER" "$TMP"
- fi
- ;;
- mountdown)
- umount "$TMP" && rm -rf "$WORK"
- ;;
- *)
- echo "Do not call this script directly; psd will do so for you. Thank you,
come again."
- exit 0
- ;;
-esac
-
-# vim:set ts=2 sw=2 et:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/common/psd-suspend-sync
new/profile-sync-daemon-7.04/common/psd-suspend-sync
--- old/profile-sync-daemon-6.50/common/psd-suspend-sync 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/common/psd-suspend-sync 2026-07-03
13:01:30.000000000 +0200
@@ -27,19 +27,18 @@
done
}
-coproc bus (
+exec {gdbus_fd}< <(gdbus monitor --system --dest "$dbus_interface")
+gdbus_PID=$!
+trap 'exec {gdbus_fd}<&-; kill "$gdbus_PID"' EXIT
+
+{
+ # delay sleep until browser profiles are written to disk
systemd-inhibit --mode="delay" --what="sleep" \
--who="profile-sync-daemon" --why="psd resync on suspend" \
- gdbus monitor --system --dest "$dbus_interface"
-)
-
-# keeps the inhibitor running until the system is about to sleep
-dbus_process_sleep <& "${bus[0]}"
-
-# starts running before the system goes to sleep
-dbus_process_sleep < <(gdbus monitor --system --dest "$dbus_interface") &
+ cat | dbus_process_sleep
-# kill the inhibitor so that the system can sleep
-[ -n "$bus_PID" ] && kill "$bus_PID"
+ # detect resume and restart the entire process
+ dbus_process_sleep
+} <&$gdbus_fd
# vim:set ts=2 sw=2 et:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/common/psd.conf
new/profile-sync-daemon-7.04/common/psd.conf
--- old/profile-sync-daemon-6.50/common/psd.conf 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/common/psd.conf 2026-07-03
13:01:30.000000000 +0200
@@ -8,12 +8,6 @@
## To protect data from corruption, in the event that you do make an edit while
## psd is active, any changes made will be applied the next time you start psd.
-# Uncomment and set to "yes" to use overlayfs instead of a full copy to reduce
-# the memory costs and to improve sync/unsync operations. Note that your kernel
-# MUST have this module available in order to use this mode.
-#
-#USE_OVERLAYFS="no"
-
# Uncomment and set to "yes" to resync on suspend to reduce potential data
loss.
# Note that your system MUST have gdbus from glib2 installed to use this mode.
#
@@ -22,6 +16,9 @@
# List any browsers in the array below to have managed by psd. Useful if you do
# not wish to have all possible browser profiles managed which is the default
if
# this array is left commented.
+# Note: If you want to use firefox-flatpak and firefox-flatpak-cache, you have
+# to add the psd-directory as an override:
+# flatpak override --user org.mozilla.firefox --filesystem=/run/user/$UID/psd
#
# Possible values:
# chromium
@@ -30,6 +27,8 @@
# epiphany
# falkon
# firefox
+# firefox-flatpak
+# firefox-flatpak-cache
# firefox-trunk
# google-chrome
# google-chrome-beta
@@ -68,3 +67,11 @@
#
# The default is to save the most recent 5 crash recovery snapshots.
#BACKUP_LIMIT=5
+
+# IMPORTANT to enable the following option, you must edit /etc/fuse.conf
+# uncommenting: user_allow_other
+# Failure to do that will result in a failure to start psd!
+#
+# Uncomment the following if you are a using Firejail with psd to allow
compatible
+# use of fuse-overlayfs mount
+#FIREJAIL=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/contrib/firefox-flatpak
new/profile-sync-daemon-7.04/contrib/firefox-flatpak
--- old/profile-sync-daemon-6.50/contrib/firefox-flatpak 1970-01-01
01:00:00.000000000 +0100
+++ new/profile-sync-daemon-7.04/contrib/firefox-flatpak 2026-07-03
13:01:30.000000000 +0200
@@ -0,0 +1,21 @@
+if ! flatpak override --user --show org.mozilla.firefox | grep -q
"/run/user/$UID/psd"; then
+ flatpak override --user org.mozilla.firefox --filesystem=/run/user/$UID/psd
+fi
+
+if [[ -d "$HOME"/.var/app/org.mozilla.firefox/.mozilla/firefox ]]; then
+ index=0
+ PSNAME="$browser"
+ while read -r profileItem; do
+ if [[ $(echo "$profileItem" | cut -c1) = "/" ]]; then
+ # path is not relative
+ DIRArr[$index]="$profileItem"
+ else
+ # we need to append the default path to give a
+ # fully qualified path
+
DIRArr[$index]="$HOME/.var/app/org.mozilla.firefox/.mozilla/firefox/$profileItem"
+ fi
+ (( index=index+1 ))
+ done < <(grep '[Pp]'ath=
"$HOME"/.var/app/org.mozilla.firefox/.mozilla/firefox/profiles.ini | sed
's/[Pp]ath=//')
+fi
+
+check_suffix=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/profile-sync-daemon-6.50/contrib/firefox-flatpak-cache
new/profile-sync-daemon-7.04/contrib/firefox-flatpak-cache
--- old/profile-sync-daemon-6.50/contrib/firefox-flatpak-cache 1970-01-01
01:00:00.000000000 +0100
+++ new/profile-sync-daemon-7.04/contrib/firefox-flatpak-cache 2026-07-03
13:01:30.000000000 +0200
@@ -0,0 +1,22 @@
+if ! flatpak override --user --show org.mozilla.firefox | grep -q
"/run/user/$UID/psd"; then
+ flatpak override --user org.mozilla.firefox --filesystem=/run/user/$UID/psd
+fi
+
+if [[ -d "$HOME"/.var/app/org.mozilla.firefox/.mozilla/firefox ]] && [[ -d
"$HOME"/.var/app/org.mozilla.firefox/cache/mozilla/firefox ]]; then
+ index=0
+ PSNAME="$browser"
+ while read -r profileItem; do
+ if [[ $(echo "$profileItem" | cut -c1) = "/" ]]; then
+ # path is not relative, so we have to use basename
+ profileName=$(basename "$profileItem")
+
DIRArr[$index]="$HOME/.var/app/org.mozilla.firefox/cache/mozilla/firefox/$profileName"
+ else
+ # we need to append the default path to give a
+ # fully qualified path
+
DIRArr[$index]="$HOME/.var/app/org.mozilla.firefox/cache/mozilla/firefox/$profileItem"
+ fi
+ (( index=index+1 ))
+ done < <(grep '[Pp]'ath=
"$HOME"/.var/app/org.mozilla.firefox/.mozilla/firefox/profiles.ini | sed
's/[Pp]ath=//')
+fi
+
+check_suffix=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/contrib/floorp
new/profile-sync-daemon-7.04/contrib/floorp
--- old/profile-sync-daemon-6.50/contrib/floorp 1970-01-01 01:00:00.000000000
+0100
+++ new/profile-sync-daemon-7.04/contrib/floorp 2026-07-03 13:01:30.000000000
+0200
@@ -0,0 +1,17 @@
+if [[ -d "$HOME"/.floorp ]]; then
+ index=0
+ PSNAME="$browser"
+ while read -r profileItem; do
+ if [[ $(echo "$profileItem" | cut -c1) = "/" ]]; then
+ # path is not relative
+ DIRArr[$index]="$profileItem"
+ else
+ # we need to append the default path to give a
+ # fully qualified path
+ DIRArr[$index]="$HOME/.floorp/$profileItem"
+ fi
+ (( index=index+1 ))
+ done < <(grep '[Pp]'ath= "$HOME"/.floorp/profiles.ini | sed 's/[Pp]ath=//')
+fi
+
+check_suffix=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/contrib/helium-browser
new/profile-sync-daemon-7.04/contrib/helium-browser
--- old/profile-sync-daemon-6.50/contrib/helium-browser 1970-01-01
01:00:00.000000000 +0100
+++ new/profile-sync-daemon-7.04/contrib/helium-browser 2026-07-03
13:01:30.000000000 +0200
@@ -0,0 +1,2 @@
+DIRArr[0]="$XDG_CONFIG_HOME/net.imput.helium"
+PSNAME="helium"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/contrib/thorium
new/profile-sync-daemon-7.04/contrib/thorium
--- old/profile-sync-daemon-6.50/contrib/thorium 1970-01-01
01:00:00.000000000 +0100
+++ new/profile-sync-daemon-7.04/contrib/thorium 2026-07-03
13:01:30.000000000 +0200
@@ -0,0 +1,2 @@
+DIRArr[0]="$XDG_CONFIG_HOME/$browser"
+PSNAME="$browser"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/contrib/zen
new/profile-sync-daemon-7.04/contrib/zen
--- old/profile-sync-daemon-6.50/contrib/zen 1970-01-01 01:00:00.000000000
+0100
+++ new/profile-sync-daemon-7.04/contrib/zen 2026-07-03 13:01:30.000000000
+0200
@@ -0,0 +1,17 @@
+if [[ -d "$HOME"/.zen ]]; then
+ index=0
+ PSNAME="$browser"
+ while read -r profileItem; do
+ if [[ $(echo "$profileItem" | cut -c1) = "/" ]]; then
+ # path is not relative
+ DIRArr[$index]="$profileItem"
+ else
+ # we need to append the default path to give a
+ # fully qualified path
+ DIRArr[$index]="$HOME/.zen/$profileItem"
+ fi
+ (( index=index+1 ))
+ done < <(grep '^[Pp]'ath= "$HOME"/.zen/profiles.ini | sed 's/^[Pp]ath=//')
+fi
+
+check_suffix=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/doc/psd-overlay-helper.1
new/profile-sync-daemon-7.04/doc/psd-overlay-helper.1
--- old/profile-sync-daemon-6.50/doc/psd-overlay-helper.1 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/doc/psd-overlay-helper.1 1970-01-01
01:00:00.000000000 +0100
@@ -1,17 +0,0 @@
-.TH psd-overlay-helper 1 "13 June 2016" "" ""
-.SH NAME
-\fBpsd-overlay-helper \fP- Script to use overlay file system for
profile-sync-daemon.
-\fB
-.SH DESCRIPTION
-Profile-sync-daemon (psd) is a tiny pseudo-daemon designed to manage browser
profile/profiles in tmpfs and to periodically sync back to the physical disc
(HDD/SSD). This is accomplished by an innovative use of rsync to maintain
synchronization between a tmpfs copy and media-bound backup of the browser
profile/profiles. Additionally, psd features several crash recovery features.
-
-The psd-overlay-helper script is used internally to enable the usage of the
overlay file system. It should not be called by the user directly.
-.SH CONTRIBUTE
-Users wishing to contribute to this project should fork it and send a pull
request. Source is freely available on the project page linked below.
-.SH ONLINE
-.IP \(bu 3
-Project page: https://github.com/graysky2/profile-sync-daemon
-.IP \(bu 3
-Wiki page: https://wiki.archlinux.org/index.php/Profile-sync-daemon
-.SH AUTHOR
-graysky (graysky AT archlinux DOT us)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/doc/psd.1
new/profile-sync-daemon-7.04/doc/psd.1
--- old/profile-sync-daemon-6.50/doc/psd.1 2023-10-02 09:51:14.000000000
+0200
+++ new/profile-sync-daemon-7.04/doc/psd.1 2026-07-03 13:01:30.000000000
+0200
@@ -1,33 +1,29 @@
.\" Text automatically generated by txt2man
-.TH profile-sync-daemon 1 "02 October 2023" "" ""
+.TH profile-sync-daemon 1 "22 March 2026" "" ""
.SH NAME
-\fBprofile-sync-daemon \fP- Symlinks and syncs browser profiles to RAM (tmpfs)
thus reducing HDD/SSD calls and speeding up browsers.
+\fBProfile-sync-daemon \fP- Symlinks and syncs browser profiles to RAM (tmpfs)
thus reducing HDD/SSD calls and speeding up browsers.
\fB
.SH DESCRIPTION
-Profile-sync-daemon (psd) is a tiny pseudo-daemon designed to manage browser
profile/profiles in tmpfs and to periodically sync back to the physical disc
(HDD/SSD). This is accomplished by an innovative use of rsync to maintain
synchronization between a tmpfs copy and media-bound backup of the browser
profile/profiles. Additionally, psd features several crash-recovery features.
+Profile-sync-daemon (psd) is a tiny pseudo-daemon designed to manage browser
profile/profiles in tmpfs and to periodically sync back to the physical disk
(HDD/SSD). This is accomplished by an innovative use of rsync to maintain
synchronization between a tmpfs copy and media-bound backup of the browser
profile/profiles. Additionally, psd features several crash-recovery features.
.PP
Design goals of psd:
.RS
.IP \(bu 3
Completely transparent user experience.
.IP \(bu 3
-Reduced wear to physical discs (particularly SSDs).
-.IP \(bu 3
Speed.
.RE
.PP
-Since the profile/profiles, browser cache*, etc. are relocated into tmpfs (RAM
disk), the corresponding I/O associated with using the browser is also
redirected from the physical disc to the RAM, thus reducing wear to the
physical disc and improving browser responsiveness.
+Since the profile/profiles, browser cache*, etc. are relocated into tmpfs (RAM
disk), the corresponding I/O associated with using the browser is also
redirected from the physical disk to the RAM, thus improving browser
responsiveness during read/writes to profiles.
.PP
-*Note that some browsers such as Chrome/Chromium, Firefox (since v21), Midori,
and Rekonq actually keep their cache directories separate from their browser
profile directory. It is not within the scope of profile-sync-daemon to modify
this behavior; users wishing to relocate this directory, may refer to the
following url for several work-arounds:
https://wiki.archlinux.org/index.php/Chromium_Tips_and_Tweaks#Cache_in_tmpfs
+*Note that some browsers such as Chrome/Chromium, Firefox, Midori, and Rekonq
actually keep their cache directories separate from their browser profile
directory. It is not within the scope of Profile-sync-daemon to modify this
behavior; users wishing to relocate this directory, may refer to the following
url for several work-arounds:
https://wiki.archlinux.org/index.php/Chromium_Tips_and_Tweaks#Cache_in_tmpfs
.SH SETUP
$XDG_CONFIG_HOME/psd/psd.conf (referred to hereafter as "the config file")
contains all user managed settings.
.PP
NOTE: edits made to the config file while psd is active will be applied only
after the service has been restarted.
.RS
.IP \(bu 3
-Optionally enable the use of overlayfs to improve sync speed and to use a
smaller memory footprint. Do this in the USE_OVERLAYFS variable. The user will
require no password sudo rights to /usr/bin/psd-overlay-helper to use this
option and the kernel must support overlayfs version 22 or higher. See the FAQ
below for additional details.
-.IP \(bu 3
-Optionally have psd resync to the filesystem prior to a sleep call. This can
help in the event that the system does not properly wake up. Do this in the
USE_SUSPSYNC variable.
+With the release of v7.00 of psd overlayfs mode is the only supported option.
It improve sync speed and offers a smaller memory footprint.
.IP \(bu 3
Optionally define which browsers are to be managed in the BROWSERS array. If
none are defined, the default is all detected browsers.
.IP \(bu 3
@@ -41,66 +37,70 @@
.SS PREVIEW MODE
The preview option can be called to show users exactly what psd will do/is
doing based on the entries in the config file. It will also provide useful
information such as profile size, paths, and if any recovery snapshots have
been created.
.PP
+% Profile-sync-daemon v7.00
+.PP
.nf
.fam C
- $ psd p
-
- Profile-sync-daemon v6.39
-
systemd service: active
resync-timer: active
- sync on sleep: enabled
- use overlayfs: enabled
- Psd will manage the following per /home/facade/.config/psd/.psd.conf settings:
+ Psd will manage the following per /home/facade/.config/psd/.psd.conf:
- browser/psname: chromium/chromium
- owner/group id: facade/100
- sync target: /home/facade/.config/chromium
- tmpfs dir: /run/user/1000/facade-chromium
- profile size: 93M
- overlayfs size: 39M
- recovery dirs: 2 <- delete with the c option
- dir path/size:
/home/facade/.config/chromium-backup-crashrecovery-20200423_171359 (92M)
- dir path/size:
/home/facade/.config/chromium-backup-crashrecovery-20200424_112204 (93M)
-
- browser/psname: firefox/firefox
- owner/group id: facade/100
- sync target: /home/facade/.mozilla/firefox/f8cv8bfu.default
- tmpfs dir: /run/user/1000/facade-firefox-f8cv8bfu.default
-
- profile size: 145M
- overlayfs size: 13M
- recovery dirs: none
+ browser/psname: chromium/chromium
+ owner/group id: facade/100
+ sync target: /home/facade/.config/chromium
+ tmpfs dir: /run/user/1000/psd/facade-chromium
+ profile size: 110M
+ overlayfs size: 64M
+ recovery dirs: none
+
+ browser/psname: firefox/firefox
+ owner/group id: facade/100
+ sync target: /home/facade/.config/mozilla/firefox/z0pauair.default
+ tmpfs dir: /run/user/1000/psd/facade-firefox-z0pauair.default
+ profile size: 4.0K
+ overlayfs size: 0
+ recovery dirs: none
+
+ browser/psname: firefox/firefox
+ owner/group id: facade/100
+ sync target: /home/facade/.config/mozilla/firefox/kgtk05jp.default-release
+ tmpfs dir: /run/user/1000/psd/facade-firefox-kgtk05jp.default-release
+ profile size: 20M
+ overlayfs size: 19M
+ recovery dirs: none
.fam T
.fi
.SS START AND STOP PSD
-Psd ships with a systemd user service to start or stop it (psd.service).
Additionally, a provided resync-timer will run an hourly resync from tmpfs back
to the disk. The resync-timer is started automatically with psd.service so
there is no need to start the timer; only start psd.service.
+Psd ships with a systemd user service to start or stop it (psd.service).
+.PP
+Additionally, a provided resync-timer will run an hourly resync from tmpfs
back to the disk. The resync-timer is started automatically with psd.service so
there is no need to start the timer; only start psd.service.
+.PP
+Of course, the frequency of the resync can be adjusted with a systemd drop-in.
For example, to trigger the resync every 15 minutes:
.PP
.nf
.fam C
- $ systemctl --user [option] psd.service
+ % systemctl --user edit psd-resync.timer
+ [Timer]
+ OnCalendar=*:0/15
+
+ % systemctl --user [option] psd.service
.fam T
.fi
-Available options:
-start
-stop
-enable
-disable
.SS CLEAN MODE
The clean mode will delete ALL recovery snapshots that have accumulated. Only
run it when sure these are no longer needed.
.PP
.nf
.fam C
- $ psd c
+ % psd c
- Profile-sync-daemon v6.39
+ Profile-sync-daemon v7.00
Deleting 2 crashrecovery dirs for profile /home/facade/.config/chromium
- /home/facade/.config/chromium-backup-crashrecovery-20200423_171359
- /home/facade/.config/chromium-backup-crashrecovery-20200424_112204
+ /home/facade/.config/chromium-backup-crashrecovery-20260209_171359
+ /home/facade/.config/chromium-backup-crashrecovery-20260209_112204
.fam T
.fi
@@ -114,7 +114,7 @@
.IP \(bu 3
Falkon
.IP \(bu 3
-Firefox (stable, beta, and aurora)
+Firefox (version 147 and above use freedesktop.org XDG base dir specs others
use legacy ~/.mozilla)
.IP \(bu 3
Firefox-trunk (this is an Ubuntu-only browser:
http://www.webupd8.org/2011/05/install-firefox-nightly-from-ubuntu-ppa.html)
.IP \(bu 3
@@ -157,7 +157,7 @@
.PP
.nf
.fam C
- $ ls -l ~/.mozilla/firefox
+ % ls -l ~/.mozilla/firefox
lrwxrwxrwx 1 facade users 26 Oct 1 17:02 f8cv8bfu.default ->
/foo/bar/f8cv8bfu.default
.fam T
@@ -166,7 +166,7 @@
.PP
.nf
.fam C
- $ psd p
+ % psd p
Warning!
/home/facade/.mozilla/firefox/f8cv8bfu.default appears to be a symlink but
these are not supported.
@@ -189,43 +189,25 @@
.SH SUPPORTED DISTROS
Since psd is just a bash script with a systemd service, it should run on any
flavor of Linux running systemd. Several distros provide an official package or
user-maintained option to install psd. One can also build psd from source. See
the official website for available packages, dependencies, and installation
instructions
.SH FAQ
-Q1: What is overlayfs mode?
-.PP
-A1: Overlayfs is a simple union filesystem mainlined in the Linux kernel
version 3.18.0. When used with psd, a reduced memory footprint and faster sync
operations can be realized. The magic is in how the overlay mount only writes
out data that has changed rather than the entire profile. The same recovery
features psd uses in its default mode are also active when running in overlayfs
mode.
-.PP
-See the example in the PREVIEW MODE section above which shows a system using
overlayfs to illustrate the typical memory savings. Note the "overlayfs size"
report compared to the total "profile size" report for each profile. Be aware
that these numbers will change depending on just how much new data is written
to the profile, but in common use cases, the overlayfs size will always be less
than the profile size.
-.PP
-Q2: How do I enable overlayfs mode?
-.PP
-A2: First, be sure psd is not active or else any changes to the config file
will be ignored until it is restarted. Overlayfs mode is enabled with the
USE_OVERLAYFS= variable which should be set to "yes" in the config file. Psd
will automatically detect the overlayfs version available to the kernel if it
is configured to use one of them. It is recommended to run psd in preview mode
to verify that the system can in fact use overlayfs.
-.PP
-Users wanting to use overlayfs mode MUST have sudo rights without password
prompt to /usr/bin/psd-overlay-helper or global sudo rights without password
prompt. If the user does not have global rights, add the following line to
/etc/sudoers after any other lines defining sudo access. It is recommended to
use /usr/bin/visudo as root to set this up:
-.PP
-.nf
-.fam C
- foo ALL=(ALL) NOPASSWD: /usr/bin/psd-overlay-helper
-
-.fam T
-.fi
-Q3: Why do I have another browser profile directory "foo-back-ovfs" when I
enable overlayfs?
+Q1: Why do I have another browser profile directory "foo-back-ovfs" when I
enable overlayfs?
.PP
-A3: The way overlayfs works is to mount a read-only base copy (so-called lower
dir) of the profile, and manage the new data on top of that. In order to avoid
resyncing to the read-only filesystem, a copy is used instead. So using
overlayfs is a trade-off: faster initial sync times and less memory usage vs.
disk space in the home dir.
+A1: The way overlayfs works is to mount a read-only base copy (so-called lower
dir) of the profile, and manage the new data on top of that. In order to avoid
resyncing to the read-only filesystem, a copy is used instead. So using
overlayfs is a trade-off: faster initial sync times and less memory usage vs.
disk space in the home dir.
.PP
-Q4: I need more memory to accommodate my profile/profiles in /run/user/xxxx.
How can I allocate more?
+Q2: I need more memory to accommodate my profile/profiles in /run/user/xxxx.
How can I allocate more?
.PP
-A4: The standard way of controlling the size of /run/user/ is the
RuntimeDirectorySize directive in logind.conf (see the man page for logind.conf
for more). By default, 10% of physical memory is used but one can increase it
safely. Remember that tmpfs only consumes what is actually used; the number
specified here is just a maximum allowed.
+A2: The standard way of controlling the size of /run/user/ is the
RuntimeDirectorySize directive in logind.conf (see the man page for logind.conf
for more). By default, 10% of physical memory is used but one can increase it
safely. Remember that tmpfs only consumes what is actually used; the number
specified here is just a maximum allowed.
.PP
-Q5: My system crashed for some reason and psd didn't sync back. What do I do?
+Q3: My system crashed for some reason and psd didn't sync back. What do I do?
.PP
-A5: The "last good" backup of the browser profile/profiles should be the
filesystem. Upon restarting psd (on a reboot for example), a check is performed
to see if the symlink to the tmpfs copy of the profile is invalid. If it is
invalid, psd will snapshot the "last good" backup before it rotates it back
into place. This is more for a sanity check that psd did no harm and that any
data loss was a function of something else.
+A3: The "last good" backup of the browser profile/profiles should be the
filesystem. Upon restarting psd (on a reboot for example), a check is performed
to see if the symlink to the tmpfs copy of the profile is invalid. If it is
invalid, psd will snapshot the "last good" backup before it rotates it back
into place. This is more for a sanity check that psd did no harm and that any
data loss was a function of something else.
.PP
-Q6: Where can I find this snapshot?
+Q4: Where can I find this snapshot?
.PP
-A6: It depends on the browser. The snapshot will be located in the same
directory as the browser profile and it will contain a date-time-stamp that
corresponds to the time at which the recovery took place. For example, a
chromium snapshot will be
~/.config/chromium-backup-crashrecovery-20130912_153310 -- of course, the
date_time suffix will be different.
+A4: It depends on the browser. The snapshot will be located in the same
directory as the browser profile and it will contain a date-time-stamp that
corresponds to the time at which the recovery took place. For example, a
chromium snapshot will be
~/.config/chromium-backup-crashrecovery-20130912_153310 -- of course, the
date_time suffix will be different.
.PP
-Q7: How can I restore the snapshot?
+Q5: How can I restore the snapshot?
.PP
-A7: Follow these steps:
+A5: Follow these steps:
.RS
.IP 1. 4
Stop psd.
@@ -245,9 +227,9 @@
.PP
At this point, launch chromium which will use the backup snapshot just copied
into place. If all is well, it is safe to delete ~/.config/chromium-bad and the
snapshot. Remember, to start psd, no browsers must be open (or psd will refuse
to start).
.PP
-Q8: Can psd delete the snapshots automatically?
+Q6: Can psd delete the snapshots automatically?
.PP
-A8: Yes, run psd with the "clean" switch to delete snapshots.
+A6: Yes, run psd with the "clean" switch to delete snapshots.
.SH CONTRIBUTE
Users wishing to contribute to this project, should fork it and send a pull
request. Source is freely available on github.
.SH BUGS
@@ -261,4 +243,4 @@
.IP \(bu 3
Wiki page: https://wiki.archlinux.org/index.php/Profile-sync-daemon
.SH AUTHOR
-graysky (graysky AT archlinux DOT us)
+graysky (therealgraysky AT proton DOT me)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/init/psd-resync.service
new/profile-sync-daemon-7.04/init/psd-resync.service
--- old/profile-sync-daemon-6.50/init/psd-resync.service 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/init/psd-resync.service 2026-07-03
13:01:30.000000000 +0200
@@ -1,13 +1,10 @@
[Unit]
Description=Timed resync
After=psd.service
-Wants=psd-resync.timer
BindsTo=psd.service
[Service]
+Slice=background.slice
Type=oneshot
ExecStart=/usr/bin/profile-sync-daemon resync
Environment=LAUNCHED_BY_SYSTEMD=1
-
-[Install]
-WantedBy=default.target
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/init/psd-resync.timer
new/profile-sync-daemon-7.04/init/psd-resync.timer
--- old/profile-sync-daemon-6.50/init/psd-resync.timer 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/init/psd-resync.timer 2026-07-03
13:01:30.000000000 +0200
@@ -3,4 +3,4 @@
BindsTo=psd.service
[Timer]
-OnUnitActiveSec=1h
+OnCalendar=hourly
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/profile-sync-daemon-6.50/init/psd.service
new/profile-sync-daemon-7.04/init/psd.service
--- old/profile-sync-daemon-6.50/init/psd.service 2023-10-02
09:51:14.000000000 +0200
+++ new/profile-sync-daemon-7.04/init/psd.service 2026-07-03
13:01:30.000000000 +0200
@@ -2,14 +2,16 @@
Description=Profile-sync-daemon
Documentation=man:psd(1) man:profile-sync-daemon(1)
Documentation=https://wiki.archlinux.org/index.php/Profile-sync-daemon
-Wants=psd-resync.service
+Wants=psd-resync.timer
RequiresMountsFor=/home/
After=winbindd.service
[Service]
+Slice=background.slice
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/profile-sync-daemon startup
+ExecStartPost=/usr/bin/profile-sync-daemon resync
ExecStop=/usr/bin/profile-sync-daemon unsync
Environment=LAUNCHED_BY_SYSTEMD=1