run created unremovable file and workdir cleanup tracebacks
I have file I am not able to remove in `/var/tmp/tmt/run-034` which was created by test's `rlFileBackup /etc`  call.

So when I do `tmt run -ddd -vvv -f --id run-034 report`
```python
Clean up workdir '/var/tmp/tmt/run-034'.
Traceback (most recent call last):
  File "/usr/bin/tmt", line 10, in <module>
    tmt.cli.main()
  File "/usr/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.8/site-packages/click/core.py", line 1268, in invoke
    Command.invoke(self, ctx)
  File "/usr/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3.8/site-packages/click/decorators.py", line 21, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/lib/python3.8/site-packages/tmt/cli.py", line 189, in run
    run = tmt.Run(id_, context.obj.tree, context=context)
  File "/usr/lib/python3.8/site-packages/tmt/base.py", line 745, in __init__
    super().__init__(workdir=id_ or True, context=context)
  File "/usr/lib/python3.8/site-packages/tmt/utils.py", line 113, in __init__
    self._workdir_init(workdir)
  File "/usr/lib/python3.8/site-packages/tmt/utils.py", line 390, in _workdir_init
    self._workdir_cleanup(workdir)
  File "/usr/lib/python3.8/site-packages/tmt/utils.py", line 409, in _workdir_cleanup
    shutil.rmtree(directory)
  File "/usr/lib64/python3.8/shutil.py", line 715, in rmtree
    _rmtree_safe_fd(fd, path, onerror)
  File "/usr/lib64/python3.8/shutil.py", line 652, in _rmtree_safe_fd
    _rmtree_safe_fd(dirfd, fullname, onerror)
  File "/usr/lib64/python3.8/shutil.py", line 652, in _rmtree_safe_fd
    _rmtree_safe_fd(dirfd, fullname, onerror)
  File "/usr/lib64/python3.8/shutil.py", line 652, in _rmtree_safe_fd
    _rmtree_safe_fd(dirfd, fullname, onerror)
  [Previous line repeated 4 more times]
  File "/usr/lib64/python3.8/shutil.py", line 656, in _rmtree_safe_fd
    onerror(os.rmdir, fullname, sys.exc_info())
  File "/usr/lib64/python3.8/shutil.py", line 654, in _rmtree_safe_fd
    os.rmdir(entry.name, dir_fd=topfd)
PermissionError: [Errno 13] Permission denied: 'etc'
```
`
I see this as two (or three) issues
a) Why tmt creates files it cannot remove on _my_ disk
b) Tracebeck itself
c) (maybe) Why is `tmt run -f report` different from `tmt run report -f`
diff --git a/tests/pull/results/data/test.fmf b/tests/pull/results/data/test.fmf
index ac2a2fa1..d938a6c1 100644
--- a/tests/pull/results/data/test.fmf
+++ b/tests/pull/results/data/test.fmf
@@ -9,3 +9,12 @@
         echo extra bad > $TMT_TEST_DATA/extra.log
         echo common bad >> $TMT_PLAN_DATA/log.txt
         /bin/false
+/beakerlib:
+    framework: beakerlib
+    test: |
+        . /usr/share/beakerlib/beakerlib.sh || exit 1
+        rlJournalStart
+            rlPhaseStartSetup
+                rlFileBackup "test.fmf" # backup this file
+            rlPhaseEnd
+        rlJournalEnd
diff --git a/tests/pull/results/test.sh b/tests/pull/results/test.sh
index d8b88468..f2c297bc 100755
--- a/tests/pull/results/test.sh
+++ b/tests/pull/results/test.sh
@@ -11,7 +11,7 @@ rlJournalStart
         rlPhaseStartTest "Test $method"
             # Run the plan, check for expected results
             rlRun -s "tmt run -av --scratch --id $run provision -h $method" 1
-            rlAssertGrep "1 test passed and 1 test failed" $rlRun_LOG
+            rlAssertGrep "2 tests passed and 1 test failed" $rlRun_LOG
 
             # Check output and extra logs in the test data directory
             data="$run/plan/execute/data"
@@ -26,7 +26,16 @@ rlJournalStart
 
             # Check report of the last run for correct results
             rlRun -s "tmt run --last report" 1
-            rlAssertGrep "1 test passed and 1 test failed" $rlRun_LOG
+            rlAssertGrep "2 tests passed and 1 test failed" $rlRun_LOG
+
+            # Check beakerlib's backup directory pull
+            if [[ "$method" =~ local|container ]]; then
+                # No pull happened so it shoud be present
+                rlAssertExists "$data/test/beakerlib/backup"
+            else
+                # Should be ignored
+                rlAssertNotExists "$data/test/beakerlib/backup"
+            fi
         rlPhaseEnd
     done
 
diff --git a/tmt/steps/execute/internal.py b/tmt/steps/execute/internal.py
index e73bf62f..67fdadfc 100644
--- a/tmt/steps/execute/internal.py
+++ b/tmt/steps/execute/internal.py
@@ -338,7 +338,19 @@ class ExecuteInternal(tmt.steps.execute.ExecutePlugin):
                 self.execute(
                     test, guest, progress=f"{index + 1}/{len(tests)}",
                     extra_environment=extra_environment)
-                guest.pull(source=self.data_path(test, full=True))
+
+                # Pull test logs from the guest, exclude beakerlib backups
+                if test.framework == "beakerlib":
+                    exclude = [
+                        "--exclude",
+                        self.data_path(test, "backup", full=True)]
+                else:
+                    exclude = None
+                guest.pull(
+                    source=self.data_path(test, full=True),
+                    extend_options=exclude)
+
+                # Handle reboot, check results
                 if self._handle_reboot(test, guest):
                     continue
                 self._results.append(self.check(test))
diff --git a/tmt/steps/provision/__init__.py b/tmt/steps/provision/__init__.py
index 9a4c0d4a..0c9770ea 100644
--- a/tmt/steps/provision/__init__.py
+++ b/tmt/steps/provision/__init__.py
@@ -439,7 +439,12 @@ class Guest(tmt.utils.Common):
 
         raise NotImplementedError()
 
-    def pull(self, source=None, destination=None, options=None):
+    def pull(
+            self,
+            source=None,
+            destination=None,
+            options=None,
+            extend_options=None):
         """
         Pull files from the guest
         """
@@ -733,18 +738,26 @@ class GuestSsh(Guest):
                     f"that login as '{self.user}' to the guest does not work.")
                 raise
 
-    def pull(self, source=None, destination=None, options=None):
+    def pull(
+            self,
+            source=None,
+            destination=None,
+            options=None,
+            extend_options=None):
         """
         Pull files from the guest
 
         By default the whole plan workdir is synced from the same
         location on the guest. Use the 'source' and 'destination' to
-        sync custom location and the 'options' parametr to modify
-        default options '-Rrz --links --safe-links --protect-args'.
+        sync custom location, the 'options' parameter to modify
+        default options '-Rrz --links --safe-links --protect-args'
+        and 'extend_options' to extend them (e.g. by exclude).
         """
         # Prepare options and the pull command
         if options is None:
             options = "-Rrz --links --safe-links --protect-args".split()
+        if extend_options is not None:
+            options.extend(extend_options)
         if destination is None:
             destination = "/"
         if source is None:
diff --git a/tmt/steps/provision/local.py b/tmt/steps/provision/local.py
index b19a9089..25cbb579 100644
--- a/tmt/steps/provision/local.py
+++ b/tmt/steps/provision/local.py
@@ -86,5 +86,10 @@ class GuestLocal(tmt.Guest):
     def push(self, source=None, destination=None, options=None):
         """ Nothing to be done to push workdir """
 
-    def pull(self, source=None, destination=None, options=None):
+    def pull(
+            self,
+            source=None,
+            destination=None,
+            options=None,
+            extend_options=None):
         """ Nothing to be done to pull workdir """
diff --git a/tmt/steps/provision/podman.py b/tmt/steps/provision/podman.py
index 2c8257b9..9cfffe83 100644
--- a/tmt/steps/provision/podman.py
+++ b/tmt/steps/provision/podman.py
@@ -210,7 +210,12 @@ class GuestContainer(tmt.Guest):
             ["chcon", "--recursive", "--type=container_file_t",
              self.parent.plan.workdir], shell=False)
 
-    def pull(self, source=None, destination=None, options=None):
+    def pull(
+            self,
+            source=None,
+            destination=None,
+            options=None,
+            extend_options=None):
         """ Nothing to be done to pull workdir """
 
     def stop(self):
['tmt/steps/provision/local.py', 'tmt/steps/provision/__init__.py', 'tests/pull/results/data/test.fmf', 'tests/pull/results/test.sh', 'tmt/steps/provision/podman.py', 'tmt/steps/execute/internal.py']