nextcloudpi icon indicating copy to clipboard operation
nextcloudpi copied to clipboard

Restoring from BTRFS snapshot results in "ERROR: Not a Btrfs subvolume: Invalid argument"

Open Dimitar-Boychev opened this issue 2 years ago • 0 comments

Hello, I think that there is an error in the nc-restore-snapshot.sh script. This script tries to delete the data directory, not the mount point on witch the data directory lives. The issue is pretty much the same as #1508

Steps to reproduce:

  • I installed NextCloudPi_RaspberryPi_v1.52.2.zip on a RaspberryPi 4 8Gb.
  • Inserted a usb flash drive and formated it via the web interface's nc-format-USB page with a label of "myCloudDrive"
  • Moved the nextcloud data dir to "/media/USBdrive/ncdata" (the default) via the web interface's nc-datadir page. This made a symlink of "/media/USBdrive" pointing to "/media/myCloudDrive"

root@nextcloudpi:/media# ls -la total 24 drwxr-xr-x 3 root root 4096 Sep 22 22:32 . drwxr-xr-x 18 root root 4096 Sep 24 11:22 .. drwxr-xr-x 1 root root 58 Sep 24 13:35 myCloudDrive lrwxrwxrwx 1 root root 19 Sep 22 22:32 USBdrive -> /media/myCloudDrive

  • Moved NextCloud's data dir via web interface's nc-datadir to "/media/USBdrive/ncdata"
  • Moved MariaDB's datadir via web interface's nc-database to "/media/USBdrive/ncdatabase" Warning this has nothing to do with the issue, but just sharing all steps.
  • Uploaded a few files in nextcloud
  • Created a BTRFS snapshot via web interface's nc-snapshot. This created a snapshot "manual_2023-09-22_215641" in "/media/myCloudDrive/ncp-snapshots"

root@nextcloudpi:/media/myCloudDrive/ncp-snapshots# btrfs subvolume show /media/myCloudDrive/ncp-snapshots/manual_2023-09-22_215641 ncp-snapshots/manual_2023-09-22_215641 Name: manual_2023-09-22_215641 UUID: ec88b6d6-02c8-7d40-b036-38bb4f598407 Parent UUID: 7ca578b9-c2b7-9b48-a88f-9323daf7e379 Received UUID: - Creation time: 2023-09-22 21:56:41 +0100 Subvolume ID: 259 Generation: 192 Gen at creation: 105 Parent ID: 5 Top level ID: 5 Flags: readonly Snapshot(s): ncdata

root@nextcloudpi:/media/myCloudDrive/ncp-snapshots# btrfs subvolume list /media/myCloudDrive ID 259 gen 192 top level 5 path ncp-snapshots/manual_2023-09-22_215641 ID 260 gen 118 top level 5 path ncp-snapshots/autobackup_2023-09-22_220414 ID 261 gen 121 top level 5 path ncp-snapshots/autobackup_2023-09-22_220636 ID 262 gen 126 top level 5 path ncp-snapshots/autobackup_2023-09-22_221342 ID 263 gen 130 top level 5 path ncp-snapshots/autobackup_2023-09-22_221748 ID 264 gen 131 top level 5 path ncp-snapshots/autobackup_2023-09-22_221843 ID 265 gen 132 top level 5 path ncp-snapshots/autobackup_2023-09-22_221903 ID 266 gen 145 top level 5 path ncp-snapshots/autobackup_2023-09-24_111504 ID 267 gen 149 top level 5 path ncp-snapshots/autobackup_2023-09-24_112121 ID 268 gen 156 top level 5 path ncp-snapshots/autobackup_2023-09-24_120049 ID 269 gen 161 top level 5 path ncp-snapshots/autobackup_2023-09-24_121324 ID 270 gen 164 top level 5 path ncp-snapshots/autobackup_2023-09-24_121658 ID 271 gen 169 top level 5 path ncp-snapshots/autobackup_2023-09-24_130026 ID 272 gen 170 top level 5 path ncp-snapshots/autobackup_2023-09-24_130027 ID 273 gen 174 top level 5 path ncp-snapshots/autobackup_2023-09-24_130412 ID 274 gen 177 top level 5 path ncp-snapshots/autobackup_2023-09-24_132620 ID 276 gen 191 top level 5 path ncp-snapshots/autobackup_2023-09-24_133514 ID 277 gen 204 top level 5 path ncdata

  • Then deleted all files from nextcloud and proceeded with restoring from the manual snapshot.
  • If you open the web interface and try "nc-restore-snapshot" with a snapshot path of "/media/myCloudDrive/ncp-snapshots/manual_2023-09-22_215641" The nc-restore-snapshot.sh script will fail with "ERROR: Not a Btrfs subvolume: Invalid argument"

This happens because on line 40 https://github.com/nextcloud/nextcloudpi/blob/master/bin/ncp/BACKUPS/nc-restore-snapshot.sh#L40 the "btrfs subvolume delete" is issued against $datadir instead of what I believe to be correct $mountpoint.

On line 19 the script get NextCloud's data dir with a debug of the php script it takes it via: sudo -u www-data php -r 'include("/var/www/nextcloud/config/config.php"); echo($CONFIG["datadirectory"]);'

Same could be done via ncc config:system:get datadirectory

root@nextcloudpi:/media/myCloudDrive/ncp-snapshots# ncc config:system:get datadirectory /media/myCloudDrive/ncdata/data root@nextcloudpi:/media/myCloudDrive/ncp-snapshots# sudo -u www-data php -r 'include("/var/www/nextcloud/config/config.php"); echo($CONFIG["datadirectory"]);' /media/myCloudDrive/ncdata/data root@nextcloudpi:/media/myCloudDrive/ncp-snapshots#

Then on line 25 it proceeds to determine the data dir's mount point and this correctly returns and stores "/media/myCloudDrive/ncdata" inside the mountpoint variable.

root@nextcloudpi:/media/myCloudDrive/ncp-snapshots# stat -c "%m" "/media/myCloudDrive/ncdata/data" /media/myCloudDrive/ncdata

The automatic snapshot generation on line 37 passes correctly. And then the problem comes.

btrfs subvolume delete "$datadir"

Tries to delete "/media/myCloudDrive/ncdata/data" and this is NOT a BTRFS volume and it throws the error. Instead the BTRFS volume is "/media/myCloudDrive/ncdata" that contains a "data" folder inside.

Modifying lines 40 and 41 of the script to state:

btrfs subvolume delete "$mountpoint" || return 1 btrfs subvolume snapshot "$SNAPSHOT" "$mountpoint"

Fixes this problem and now restoring from a manual and automatic snapshots works as expected.

Dimitar-Boychev avatar Sep 24 '23 13:09 Dimitar-Boychev