diff --git a/bin/dib-lint b/bin/dib-lint
index 407390c28..8ecfb7605 100755
--- a/bin/dib-lint
+++ b/bin/dib-lint
@@ -94,7 +94,8 @@ for i in $(find elements -type f); do
         fi
     fi
 
-    # Check that all scripts are set -eu -o pipefail
+    # Check that all scripts are set -eu -o pipefail and look for
+    # DIB_DEBUG_TRACE
     # NOTE(bnemec): This doesn't verify that the set call occurs high
     # enough in the file to be useful, but hopefully nobody will be
     # sticking set calls at the end of their file to trick us.  And if
@@ -119,6 +120,11 @@ for i in $(find elements -type f); do
                 error "$i is not set -o pipefail"
             fi
         fi
+        if ! excluded dibdebugtrace; then
+            if [ -z "$(grep "DIB_DEBUG_TRACE" $i)" ]; then
+                error "$i does not follow DIB_DEBUG_TRACE"
+            fi
+        fi
     fi
 done
 
diff --git a/bin/disk-image-create b/bin/disk-image-create
index d706d4dc3..db218b864 100755
--- a/bin/disk-image-create
+++ b/bin/disk-image-create
@@ -106,7 +106,7 @@ while true ; do
         -o) export IMAGE_NAME=$2; shift 2 ;;
         -t) IFS="," read -a IMAGE_TYPES <<< "$2"; export IMAGE_TYPES ; shift 2 ;;
         -h|--help) show_options; exit 0;;
-        -x) shift; set -x;;
+        -x) shift; export DIB_DEBUG_TRACE=$(( $DIB_DEBUG_TRACE + 1 )); set -x;;
         -u) shift; export COMPRESS_IMAGE="";;
         -c) shift ; export CLEAR_ENV=1;;
         -n) shift; export SKIP_BASE="1";;
diff --git a/elements/apt-conf/extra-data.d/99-override-default-apt-conf b/elements/apt-conf/extra-data.d/99-override-default-apt-conf
index 02df80cea..aa6bf0da3 100755
--- a/elements/apt-conf/extra-data.d/99-override-default-apt-conf
+++ b/elements/apt-conf/extra-data.d/99-override-default-apt-conf
@@ -1,7 +1,10 @@
 #!/bin/bash
 # Override the default /etc/apt/apt.conf with $DIB_APT_CONF
 
-set -ue
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 # exit directly if DIB_APT_CONF is not defined properly
diff --git a/elements/apt-preferences/extra-data.d/99-set-apt-package-pins b/elements/apt-preferences/extra-data.d/99-set-apt-package-pins
index 537d24571..9fc56665b 100755
--- a/elements/apt-preferences/extra-data.d/99-set-apt-package-pins
+++ b/elements/apt-preferences/extra-data.d/99-set-apt-package-pins
@@ -14,6 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/apt-sources/extra-data.d/99-override-default-apt-sources b/elements/apt-sources/extra-data.d/99-override-default-apt-sources
index 0c8ae1854..66b535c62 100755
--- a/elements/apt-sources/extra-data.d/99-override-default-apt-sources
+++ b/elements/apt-sources/extra-data.d/99-override-default-apt-sources
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Override the default /etc/apt/sources.list with $DIB_APT_SOURCES
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/architecture-emulation-binaries/cleanup.d/01-cleanbinary b/elements/architecture-emulation-binaries/cleanup.d/01-cleanbinary
index 72ec8d144..76568bce8 100755
--- a/elements/architecture-emulation-binaries/cleanup.d/01-cleanbinary
+++ b/elements/architecture-emulation-binaries/cleanup.d/01-cleanbinary
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 if [ -x "$TMP_MOUNT_PATH/tmp/clean_up_qemu_binary" ] ; then
diff --git a/elements/architecture-emulation-binaries/extra-data.d/01-copy-binary b/elements/architecture-emulation-binaries/extra-data.d/01-copy-binary
index e5f205081..014099063 100755
--- a/elements/architecture-emulation-binaries/extra-data.d/01-copy-binary
+++ b/elements/architecture-emulation-binaries/extra-data.d/01-copy-binary
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 function clean_up_arch_emulation {
diff --git a/elements/baremetal/cleanup.d/99-extract-kernel-and-ramdisk b/elements/baremetal/cleanup.d/99-extract-kernel-and-ramdisk
index 2f3bd5a53..9433feed9 100755
--- a/elements/baremetal/cleanup.d/99-extract-kernel-and-ramdisk
+++ b/elements/baremetal/cleanup.d/99-extract-kernel-and-ramdisk
@@ -14,6 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/cleanup.d/01-ccache b/elements/base/cleanup.d/01-ccache
index 543736e15..396d1a4a6 100755
--- a/elements/base/cleanup.d/01-ccache
+++ b/elements/base/cleanup.d/01-ccache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/cleanup.d/99-tidy-logs b/elements/base/cleanup.d/99-tidy-logs
index 421a62b2c..9274a7b0b 100755
--- a/elements/base/cleanup.d/99-tidy-logs
+++ b/elements/base/cleanup.d/99-tidy-logs
@@ -16,7 +16,10 @@
 # under the License.
 #
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 # Truncate /var/log files in preparation for first boot
diff --git a/elements/base/dib-init-system b/elements/base/dib-init-system
index 3338f87e8..1596fe71b 100755
--- a/elements/base/dib-init-system
+++ b/elements/base/dib-init-system
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/extra-data.d/50-store-build-settings b/elements/base/extra-data.d/50-store-build-settings
index 20b50a3eb..4ddd8d68b 100755
--- a/elements/base/extra-data.d/50-store-build-settings
+++ b/elements/base/extra-data.d/50-store-build-settings
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Store the build-time environment and command line arguments
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/extra-data.d/99-enable-install-types b/elements/base/extra-data.d/99-enable-install-types
index 71b916742..143426ae5 100755
--- a/elements/base/extra-data.d/99-enable-install-types
+++ b/elements/base/extra-data.d/99-enable-install-types
@@ -13,8 +13,10 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 declare -a SPECIFIED_ELEMS
diff --git a/elements/base/install.d/00-baseline-environment b/elements/base/install.d/00-baseline-environment
index 706537a27..9a02dbe05 100755
--- a/elements/base/install.d/00-baseline-environment
+++ b/elements/base/install.d/00-baseline-environment
@@ -1,6 +1,9 @@
 #!/bin/bash
 # These are useful, or at worst not harmful, for all images we build.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/install.d/10-cloud-init b/elements/base/install.d/10-cloud-init
index 9411bad59..c931d0b2b 100755
--- a/elements/base/install.d/10-cloud-init
+++ b/elements/base/install.d/10-cloud-init
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Tweak the stock ubuntu cloud-init config
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/install.d/50-store-build-settings b/elements/base/install.d/50-store-build-settings
index 8da0c06a7..8a25b53f4 100755
--- a/elements/base/install.d/50-store-build-settings
+++ b/elements/base/install.d/50-store-build-settings
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Store build-time environment and command line arguments
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/install.d/99-dkms b/elements/base/install.d/99-dkms
index cbffab9dc..b9e1b0d7c 100755
--- a/elements/base/install.d/99-dkms
+++ b/elements/base/install.d/99-dkms
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/install.d/99-up-to-date b/elements/base/install.d/99-up-to-date
index 06231fd75..d2b45d745 100755
--- a/elements/base/install.d/99-up-to-date
+++ b/elements/base/install.d/99-up-to-date
@@ -2,6 +2,9 @@
 # Fully upgrade everything on the system (if the package manager knows how to
 # do it).
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/pre-install.d/03-baseline-tools b/elements/base/pre-install.d/03-baseline-tools
index e111f5bf1..f292fb742 100755
--- a/elements/base/pre-install.d/03-baseline-tools
+++ b/elements/base/pre-install.d/03-baseline-tools
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Install baseline packages and tools.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/pre-install.d/04-dib-init-system b/elements/base/pre-install.d/04-dib-init-system
index aea564b28..8e63fcd26 100755
--- a/elements/base/pre-install.d/04-dib-init-system
+++ b/elements/base/pre-install.d/04-dib-init-system
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/base/root.d/01-ccache b/elements/base/root.d/01-ccache
index 0bb2cd251..0a61603cc 100755
--- a/elements/base/root.d/01-ccache
+++ b/elements/base/root.d/01-ccache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/cache-url/bin/cache-url b/elements/cache-url/bin/cache-url
index 67f2b5685..121debcb4 100755
--- a/elements/cache-url/bin/cache-url
+++ b/elements/cache-url/bin/cache-url
@@ -15,6 +15,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/centos-minimal/root.d/08-rinse b/elements/centos-minimal/root.d/08-rinse
index d2d59c902..df74e3081 100755
--- a/elements/centos-minimal/root.d/08-rinse
+++ b/elements/centos-minimal/root.d/08-rinse
@@ -14,6 +14,10 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/centos7/pre-install.d/01-yum-repos b/elements/centos7/pre-install.d/01-yum-repos
index e8ac67027..4b0ab4f70 100755
--- a/elements/centos7/pre-install.d/01-yum-repos
+++ b/elements/centos7/pre-install.d/01-yum-repos
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/centos7/root.d/10-centos7-cloud-image b/elements/centos7/root.d/10-centos7-cloud-image
index 2d5c3b2b6..041b33210 100755
--- a/elements/centos7/root.d/10-centos7-cloud-image
+++ b/elements/centos7/root.d/10-centos7-cloud-image
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/cleanup-kernel-initrd/cleanup.d/99-cleanup-kernel-initrd b/elements/cleanup-kernel-initrd/cleanup.d/99-cleanup-kernel-initrd
index 6623c4697..95e37c865 100755
--- a/elements/cleanup-kernel-initrd/cleanup.d/99-cleanup-kernel-initrd
+++ b/elements/cleanup-kernel-initrd/cleanup.d/99-cleanup-kernel-initrd
@@ -15,7 +15,10 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 source $_LIB/img-functions
diff --git a/elements/cloud-init-datasources/install.d/05-set-cloud-init-sources b/elements/cloud-init-datasources/install.d/05-set-cloud-init-sources
index ad4d5b202..0f3d66625 100755
--- a/elements/cloud-init-datasources/install.d/05-set-cloud-init-sources
+++ b/elements/cloud-init-datasources/install.d/05-set-cloud-init-sources
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/cloud-init-nocloud/install.d/05-inject-local-source-data b/elements/cloud-init-nocloud/install.d/05-inject-local-source-data
index 527dee667..755489392 100755
--- a/elements/cloud-init-nocloud/install.d/05-inject-local-source-data
+++ b/elements/cloud-init-nocloud/install.d/05-inject-local-source-data
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/debian-systemd/root.d/05-debian-systemd b/elements/debian-systemd/root.d/05-debian-systemd
index 3cafeb104..077c0f025 100755
--- a/elements/debian-systemd/root.d/05-debian-systemd
+++ b/elements/debian-systemd/root.d/05-debian-systemd
@@ -1,6 +1,11 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
+
 cat > ${TARGET_ROOT}/.extra_settings << EOF
 DIB_DEBIAN_ALT_INIT_PACKAGE=systemd-sysv
 EOF
diff --git a/elements/debian-upstart/root.d/05-debian-upstart b/elements/debian-upstart/root.d/05-debian-upstart
index e400af32a..040045304 100755
--- a/elements/debian-upstart/root.d/05-debian-upstart
+++ b/elements/debian-upstart/root.d/05-debian-upstart
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 cat > ${TARGET_ROOT}/.extra_settings << EOF
diff --git a/elements/debian-upstart/root.d/20-debian-fix-upstart-jobs b/elements/debian-upstart/root.d/20-debian-fix-upstart-jobs
index 877a7c14f..fa0b1a8df 100755
--- a/elements/debian-upstart/root.d/20-debian-fix-upstart-jobs
+++ b/elements/debian-upstart/root.d/20-debian-fix-upstart-jobs
@@ -1,6 +1,11 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
+
 # Working around bug in Debian cloud-init packages with upstart
 # where startpar will wait forever for these because they are tasks
 # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=735204
diff --git a/elements/debian/bin/map-services b/elements/debian/bin/map-services
index 1c76303c4..5389ff298 100755
--- a/elements/debian/bin/map-services
+++ b/elements/debian/bin/map-services
@@ -1,4 +1,8 @@
 #!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/debian/root.d/08-debootstrap b/elements/debian/root.d/08-debootstrap
index 946dd61eb..0d97e2fd7 100755
--- a/elements/debian/root.d/08-debootstrap
+++ b/elements/debian/root.d/08-debootstrap
@@ -14,8 +14,13 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
+
 if [ -f ${TARGET_ROOT}/.extra_settings ] ; then
     . ${TARGET_ROOT}/.extra_settings
 fi
diff --git a/elements/dhcp-all-interfaces/install.d/50-dhcp-all-interfaces b/elements/dhcp-all-interfaces/install.d/50-dhcp-all-interfaces
index 65aabdd7a..7b58e04f7 100755
--- a/elements/dhcp-all-interfaces/install.d/50-dhcp-all-interfaces
+++ b/elements/dhcp-all-interfaces/install.d/50-dhcp-all-interfaces
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 SCRIPTDIR=$(dirname $0)
diff --git a/elements/dhcp-all-interfaces/install.d/60-remove-cloud-image-interfaces b/elements/dhcp-all-interfaces/install.d/60-remove-cloud-image-interfaces
index fbd2d4249..6d2cc6213 100755
--- a/elements/dhcp-all-interfaces/install.d/60-remove-cloud-image-interfaces
+++ b/elements/dhcp-all-interfaces/install.d/60-remove-cloud-image-interfaces
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dhcp-all-interfaces/install.d/dhcp-all-interfaces.sh b/elements/dhcp-all-interfaces/install.d/dhcp-all-interfaces.sh
index c09bbbd36..bd094a62f 100755
--- a/elements/dhcp-all-interfaces/install.d/dhcp-all-interfaces.sh
+++ b/elements/dhcp-all-interfaces/install.d/dhcp-all-interfaces.sh
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dib-run-parts/root.d/90-base-dib-run-parts b/elements/dib-run-parts/root.d/90-base-dib-run-parts
index 27819e6c2..fb4c4594f 100755
--- a/elements/dib-run-parts/root.d/90-base-dib-run-parts
+++ b/elements/dib-run-parts/root.d/90-base-dib-run-parts
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/disable-selinux/post-install.d/15-disable-selinux b/elements/disable-selinux/post-install.d/15-disable-selinux
index 6851e689c..1a6102153 100755
--- a/elements/disable-selinux/post-install.d/15-disable-selinux
+++ b/elements/disable-selinux/post-install.d/15-disable-selinux
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dkms/post-install.d/99-dkms b/elements/dkms/post-install.d/99-dkms
index d462ce27a..9c54220be 100755
--- a/elements/dkms/post-install.d/99-dkms
+++ b/elements/dkms/post-install.d/99-dkms
@@ -2,6 +2,9 @@
 # Trigger a run of dkms for all the modules installed
 # to ensure we have valid modules build for all.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/bin/install-packages b/elements/dpkg/bin/install-packages
index 219ff87b7..6de4a68af 100755
--- a/elements/dpkg/bin/install-packages
+++ b/elements/dpkg/bin/install-packages
@@ -14,6 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/cleanup.d/40-unblock-daemons b/elements/dpkg/cleanup.d/40-unblock-daemons
index b60960e78..ecc2bda30 100755
--- a/elements/dpkg/cleanup.d/40-unblock-daemons
+++ b/elements/dpkg/cleanup.d/40-unblock-daemons
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/cleanup.d/50-remove-img-build-proxy b/elements/dpkg/cleanup.d/50-remove-img-build-proxy
index 096b13eae..c8f84d9b3 100755
--- a/elements/dpkg/cleanup.d/50-remove-img-build-proxy
+++ b/elements/dpkg/cleanup.d/50-remove-img-build-proxy
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/cleanup.d/60-untrim-dpkg b/elements/dpkg/cleanup.d/60-untrim-dpkg
index 98984eab8..ff29d3f99 100755
--- a/elements/dpkg/cleanup.d/60-untrim-dpkg
+++ b/elements/dpkg/cleanup.d/60-untrim-dpkg
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/extra-data.d/01-copy-apt-keys b/elements/dpkg/extra-data.d/01-copy-apt-keys
index 89f1c13c8..668135c7f 100755
--- a/elements/dpkg/extra-data.d/01-copy-apt-keys
+++ b/elements/dpkg/extra-data.d/01-copy-apt-keys
@@ -14,6 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/finalise.d/99-clean-up-cache b/elements/dpkg/finalise.d/99-clean-up-cache
index 8046c8a0e..4ba86564c 100755
--- a/elements/dpkg/finalise.d/99-clean-up-cache
+++ b/elements/dpkg/finalise.d/99-clean-up-cache
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Do an apt-get clean. This will free some space.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/finalise.d/99-write-dpkg-manifest b/elements/dpkg/finalise.d/99-write-dpkg-manifest
index 6750e63d5..d80809359 100755
--- a/elements/dpkg/finalise.d/99-write-dpkg-manifest
+++ b/elements/dpkg/finalise.d/99-write-dpkg-manifest
@@ -14,7 +14,11 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 DPKG_MANIFEST_NAME=dib-manifest-dpkg-$(basename ${IMAGE_NAME})
diff --git a/elements/dpkg/pre-install.d/00-disable-apt-recommends b/elements/dpkg/pre-install.d/00-disable-apt-recommends
index 08188b01b..e680ed09f 100755
--- a/elements/dpkg/pre-install.d/00-disable-apt-recommends
+++ b/elements/dpkg/pre-install.d/00-disable-apt-recommends
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Prevent apt from installing recommended packages
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/pre-install.d/01-dpkg-install-bin b/elements/dpkg/pre-install.d/01-dpkg-install-bin
index 196b8daa1..59b38a01e 100755
--- a/elements/dpkg/pre-install.d/01-dpkg-install-bin
+++ b/elements/dpkg/pre-install.d/01-dpkg-install-bin
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/pre-install.d/02-add-apt-keys b/elements/dpkg/pre-install.d/02-add-apt-keys
index df9313551..34cfc8f18 100755
--- a/elements/dpkg/pre-install.d/02-add-apt-keys
+++ b/elements/dpkg/pre-install.d/02-add-apt-keys
@@ -14,6 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/pre-install.d/99-apt-get-update b/elements/dpkg/pre-install.d/99-apt-get-update
index ab846154a..78b2ef588 100755
--- a/elements/dpkg/pre-install.d/99-apt-get-update
+++ b/elements/dpkg/pre-install.d/99-apt-get-update
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Do an apt-get update, so that packages can be installed.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/root.d/50-build-with-http-cache b/elements/dpkg/root.d/50-build-with-http-cache
index 5ba1e889c..e2e68bd3e 100755
--- a/elements/dpkg/root.d/50-build-with-http-cache
+++ b/elements/dpkg/root.d/50-build-with-http-cache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/root.d/60-block-apt-translations b/elements/dpkg/root.d/60-block-apt-translations
index 6298cadd4..3949725e5 100755
--- a/elements/dpkg/root.d/60-block-apt-translations
+++ b/elements/dpkg/root.d/60-block-apt-translations
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/root.d/99-block-daemons b/elements/dpkg/root.d/99-block-daemons
index adb673d97..8ec2111a5 100755
--- a/elements/dpkg/root.d/99-block-daemons
+++ b/elements/dpkg/root.d/99-block-daemons
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/root.d/99-shared_apt_cache b/elements/dpkg/root.d/99-shared_apt_cache
index 1ad03d9c5..cc8d30269 100755
--- a/elements/dpkg/root.d/99-shared_apt_cache
+++ b/elements/dpkg/root.d/99-shared_apt_cache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dpkg/root.d/99-trim-dpkg b/elements/dpkg/root.d/99-trim-dpkg
index 3f6ca977c..276318a36 100755
--- a/elements/dpkg/root.d/99-trim-dpkg
+++ b/elements/dpkg/root.d/99-trim-dpkg
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dracut-network/finalise.d/98-regenerate-initramfs b/elements/dracut-network/finalise.d/98-regenerate-initramfs
index 9d6645616..a227e28ee 100755
--- a/elements/dracut-network/finalise.d/98-regenerate-initramfs
+++ b/elements/dracut-network/finalise.d/98-regenerate-initramfs
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dracut-network/install.d/11-patch-dracut b/elements/dracut-network/install.d/11-patch-dracut
index 1fc9deef9..0576c6236 100755
--- a/elements/dracut-network/install.d/11-patch-dracut
+++ b/elements/dracut-network/install.d/11-patch-dracut
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh b/elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh
index 2089f0f53..fe3f9c4a2 100755
--- a/elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh
+++ b/elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # NOTE(bnemec): Dracut doesn't like it if we enable these
-# dib-lint: disable=setu sete setpipefail
+# dib-lint: disable=setu sete setpipefail dibdebugtrace
 
 # We never let Dracut boot off the specified root anyway, so all
 # we need is a value it will accept.
diff --git a/elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh b/elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh
index 694e8d427..daf37bcaa 100755
--- a/elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh
+++ b/elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # Dracut is bash too, and it doesn't play nicely with our usual sets
-# dib-lint: disable=setu sete setpipefail
+# dib-lint: disable=setu sete setpipefail dibdebugtrace
 
 check() {
     return 0
diff --git a/elements/dracut-ramdisk/install.d/20-install-dracut-deps b/elements/dracut-ramdisk/install.d/20-install-dracut-deps
index 8621d893f..2a6dd0c84 100755
--- a/elements/dracut-ramdisk/install.d/20-install-dracut-deps
+++ b/elements/dracut-ramdisk/install.d/20-install-dracut-deps
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 DRACUT_NETWORK="dracut-network"
diff --git a/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk b/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk
index 66fb3f5ca..8033ac357 100755
--- a/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk
+++ b/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk
@@ -1,8 +1,12 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
+
 _LIB="/tmp/ramdisk-build"
 
 source "$_LIB/common-defaults"
diff --git a/elements/element-manifest/extra-data.d/75-inject-element-manifest b/elements/element-manifest/extra-data.d/75-inject-element-manifest
index a16f5be76..54f5cf4e6 100755
--- a/elements/element-manifest/extra-data.d/75-inject-element-manifest
+++ b/elements/element-manifest/extra-data.d/75-inject-element-manifest
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 DIB_ELEMENT_MANIFEST_PATH=${DIB_ELEMENT_MANIFEST_PATH:-"$DIB_MANIFEST_IMAGE_DIR/dib-element-manifest"}
diff --git a/elements/enable-serial-console/install.d/20-stty b/elements/enable-serial-console/install.d/20-stty
index cd69811da..8e20b4034 100755
--- a/elements/enable-serial-console/install.d/20-stty
+++ b/elements/enable-serial-console/install.d/20-stty
@@ -1,6 +1,11 @@
 #!/bin/bash
-set -uex
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
+
 SCRIPTDIR=$(dirname $0)
 
 DIB_INIT_SYSTEM=$(dib-init-system)
diff --git a/elements/epel/pre-install.d/05-rpm-epel-release b/elements/epel/pre-install.d/05-rpm-epel-release
index 0c218a801..99ecb76a9 100755
--- a/elements/epel/pre-install.d/05-rpm-epel-release
+++ b/elements/epel/pre-install.d/05-rpm-epel-release
@@ -1,4 +1,8 @@
 #!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/fedora/pre-install.d/01-set-fedora-mirror b/elements/fedora/pre-install.d/01-set-fedora-mirror
index 3cafda035..180263bbd 100755
--- a/elements/fedora/pre-install.d/01-set-fedora-mirror
+++ b/elements/fedora/pre-install.d/01-set-fedora-mirror
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/fedora/root.d/10-fedora-cloud-image b/elements/fedora/root.d/10-fedora-cloud-image
index 22f675106..0a2a8a22a 100755
--- a/elements/fedora/root.d/10-fedora-cloud-image
+++ b/elements/fedora/root.d/10-fedora-cloud-image
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ilo/extra-data.d/50-ilo-firmware b/elements/ilo/extra-data.d/50-ilo-firmware
index aa8c4784b..16965da09 100755
--- a/elements/ilo/extra-data.d/50-ilo-firmware
+++ b/elements/ilo/extra-data.d/50-ilo-firmware
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ilo/ramdisk-install.d/50-ilo-firmware b/elements/ilo/ramdisk-install.d/50-ilo-firmware
index 24117bc4f..f2f09425f 100755
--- a/elements/ilo/ramdisk-install.d/50-ilo-firmware
+++ b/elements/ilo/ramdisk-install.d/50-ilo-firmware
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/install-static/install.d/10-install-static-files b/elements/install-static/install.d/10-install-static-files
index bef537ce9..223cfdbc1 100755
--- a/elements/install-static/install.d/10-install-static-files
+++ b/elements/install-static/install.d/10-install-static-files
@@ -2,7 +2,11 @@
 # Note that this relies on the detail that all elements share one dir inside
 # the chroot. This will copy all the files that elements have added to
 # element/static into the image. Mode, symlinks etc will be respected.
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 STATIC_SOURCE="$(dirname $0)/../static"
diff --git a/elements/ironic-agent/cleanup.d/99-ramdisk-create b/elements/ironic-agent/cleanup.d/99-ramdisk-create
index 560de151d..dd86c7308 100755
--- a/elements/ironic-agent/cleanup.d/99-ramdisk-create
+++ b/elements/ironic-agent/cleanup.d/99-ramdisk-create
@@ -1,8 +1,12 @@
 #!/bin/bash
 
+if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
+
 [ -n "$TARGET_ROOT" ]
 
 source $_LIB/img-functions
diff --git a/elements/ironic-agent/install.d/60-ironic-agent-install b/elements/ironic-agent/install.d/60-ironic-agent-install
index b1f6d04eb..c3c73c6dc 100755
--- a/elements/ironic-agent/install.d/60-ironic-agent-install
+++ b/elements/ironic-agent/install.d/60-ironic-agent-install
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ironic-agent/post-install.d/80-ironic-agent b/elements/ironic-agent/post-install.d/80-ironic-agent
index 7f4064979..6a3b8b003 100755
--- a/elements/ironic-agent/post-install.d/80-ironic-agent
+++ b/elements/ironic-agent/post-install.d/80-ironic-agent
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/iso/cleanup.d/100-build-iso b/elements/iso/cleanup.d/100-build-iso
index 414c5420a..668aa6fe3 100755
--- a/elements/iso/cleanup.d/100-build-iso
+++ b/elements/iso/cleanup.d/100-build-iso
@@ -14,7 +14,10 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 function build_efiboot_img() {
diff --git a/elements/local-config/extra-data.d/62-ssh-key b/elements/local-config/extra-data.d/62-ssh-key
index 87a2f135d..1254513ab 100755
--- a/elements/local-config/extra-data.d/62-ssh-key
+++ b/elements/local-config/extra-data.d/62-ssh-key
@@ -2,6 +2,9 @@
 # Save user SSH public key if available.
 # (Obviously not suitable for downloadable images).
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/local-config/install.d/62-ssh-key b/elements/local-config/install.d/62-ssh-key
index 6d5714e7e..c66328a55 100755
--- a/elements/local-config/install.d/62-ssh-key
+++ b/elements/local-config/install.d/62-ssh-key
@@ -2,6 +2,9 @@
 # Save user SSH public key if available.
 # XXX: Obviously not suitable for downloadable images.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/local-config/pre-install.d/02-proxy-settings b/elements/local-config/pre-install.d/02-proxy-settings
index 6e7ae8341..0fe4b9a82 100755
--- a/elements/local-config/pre-install.d/02-proxy-settings
+++ b/elements/local-config/pre-install.d/02-proxy-settings
@@ -2,9 +2,11 @@
 # Save the HTTP/[S] and noproxy settings if available.
 # XXX: Obviously not suitable for downloadable images.
 
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
-set -o xtrace
 
 have_apt=
 have_yum=
diff --git a/elements/manifests/cleanup.d/01-copy-manifests-dir b/elements/manifests/cleanup.d/01-copy-manifests-dir
index a805bb3c6..6248e829f 100755
--- a/elements/manifests/cleanup.d/01-copy-manifests-dir
+++ b/elements/manifests/cleanup.d/01-copy-manifests-dir
@@ -14,7 +14,11 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 if [ -d $TMP_MOUNT_PATH/${DIB_MANIFEST_IMAGE_DIR} ]; then
diff --git a/elements/manifests/environment.d/14-manifests b/elements/manifests/environment.d/14-manifests
index 89b817e8a..c2ae96dc9 100755
--- a/elements/manifests/environment.d/14-manifests
+++ b/elements/manifests/environment.d/14-manifests
@@ -14,6 +14,10 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/manifests/extra-data.d/20-manifest-dir b/elements/manifests/extra-data.d/20-manifest-dir
index d40f0b6a1..fcff64d43 100755
--- a/elements/manifests/extra-data.d/20-manifest-dir
+++ b/elements/manifests/extra-data.d/20-manifest-dir
@@ -14,7 +14,11 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 sudo mkdir -p $TMP_MOUNT_PATH/${DIB_MANIFEST_IMAGE_DIR}
diff --git a/elements/mellanox/install.d/65-mellanox b/elements/mellanox/install.d/65-mellanox
index 1df3ea77c..ddf0c6206 100755
--- a/elements/mellanox/install.d/65-mellanox
+++ b/elements/mellanox/install.d/65-mellanox
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Ensure we load the mellanox driver somehow
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/modprobe-blacklist/install.d/80-modprobe-blacklist b/elements/modprobe-blacklist/install.d/80-modprobe-blacklist
index 3a844420e..6493726f8 100755
--- a/elements/modprobe-blacklist/install.d/80-modprobe-blacklist
+++ b/elements/modprobe-blacklist/install.d/80-modprobe-blacklist
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 MODULES_LIST=${DIB_MODPROBE_BLACKLIST:?"Please set DIB_MODPROBE_BLACKLIST."}
diff --git a/elements/opensuse/bin/install-packages b/elements/opensuse/bin/install-packages
index 6fec6c1b5..0460ce21e 100755
--- a/elements/opensuse/bin/install-packages
+++ b/elements/opensuse/bin/install-packages
@@ -14,6 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/opensuse/extra-data.d/01-inject-defaults b/elements/opensuse/extra-data.d/01-inject-defaults
index 12247d867..eab6628a3 100755
--- a/elements/opensuse/extra-data.d/01-inject-defaults
+++ b/elements/opensuse/extra-data.d/01-inject-defaults
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 export OPENSUSE_EXTRAS_PATH="$TMP_MOUNT_PATH/tmp/opensuse-extras"
diff --git a/elements/opensuse/install.d/01-ccache-symlinks b/elements/opensuse/install.d/01-ccache-symlinks
index c58839888..9ed6cfe42 100755
--- a/elements/opensuse/install.d/01-ccache-symlinks
+++ b/elements/opensuse/install.d/01-ccache-symlinks
@@ -1,4 +1,8 @@
 #!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/opensuse/install.d/01-login-defs b/elements/opensuse/install.d/01-login-defs
index 90329bd8b..4e9ffc8c1 100755
--- a/elements/opensuse/install.d/01-login-defs
+++ b/elements/opensuse/install.d/01-login-defs
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/opensuse/post-install.d/10-mkinitrd b/elements/opensuse/post-install.d/10-mkinitrd
index e59d2b385..b764c48e8 100755
--- a/elements/opensuse/post-install.d/10-mkinitrd
+++ b/elements/opensuse/post-install.d/10-mkinitrd
@@ -1,7 +1,10 @@
 #!/bin/bash
 # The base image created by kiwi does not contain an initrd so create one
-# here. 
+# here.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/opensuse/pre-install.d/00-opensuse-setup b/elements/opensuse/pre-install.d/00-opensuse-setup
index c0e73626b..ecc7efc29 100755
--- a/elements/opensuse/pre-install.d/00-opensuse-setup
+++ b/elements/opensuse/pre-install.d/00-opensuse-setup
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Setup repo required for dkms package.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/opensuse/pre-install.d/01-opensuse-install-bin b/elements/opensuse/pre-install.d/01-opensuse-install-bin
index 196b8daa1..59b38a01e 100755
--- a/elements/opensuse/pre-install.d/01-opensuse-install-bin
+++ b/elements/opensuse/pre-install.d/01-opensuse-install-bin
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/opensuse/root.d/10-opensuse-cloud-image b/elements/opensuse/root.d/10-opensuse-cloud-image
index 7733aa18b..48391d636 100755
--- a/elements/opensuse/root.d/10-opensuse-cloud-image
+++ b/elements/opensuse/root.d/10-opensuse-cloud-image
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/package-installs/bin/package-installs b/elements/package-installs/bin/package-installs
index 74eca24af..77899885f 100755
--- a/elements/package-installs/bin/package-installs
+++ b/elements/package-installs/bin/package-installs
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 SCRIPTNAME=$(basename $0)
diff --git a/elements/package-installs/bin/package-uninstalls b/elements/package-installs/bin/package-uninstalls
index 2ca474d87..3440585b5 100755
--- a/elements/package-installs/bin/package-uninstalls
+++ b/elements/package-installs/bin/package-uninstalls
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 SCRIPTNAME=$(basename $0)
diff --git a/elements/package-installs/extra-data.d/99-squash-package-install b/elements/package-installs/extra-data.d/99-squash-package-install
index 8bfa34867..c86113f64 100755
--- a/elements/package-installs/extra-data.d/99-squash-package-install
+++ b/elements/package-installs/extra-data.d/99-squash-package-install
@@ -1,5 +1,8 @@
 #!/bin/bash
-set -eux
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 sudo -E $(dirname $0)/../bin/package-installs-squash --elements="$IMAGE_ELEMENT" --path=$ELEMENTS_PATH $TMP_MOUNT_PATH/tmp/package-installs.json
diff --git a/elements/package-installs/install.d/00-package-installs b/elements/package-installs/install.d/00-package-installs
index 9b8cc696a..e64cbc718 100755
--- a/elements/package-installs/install.d/00-package-installs
+++ b/elements/package-installs/install.d/00-package-installs
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 package-installs -d $(dirname $0)
diff --git a/elements/package-installs/install.d/99-package-uninstalls b/elements/package-installs/install.d/99-package-uninstalls
index afedd382d..9f2d7a6fe 100755
--- a/elements/package-installs/install.d/99-package-uninstalls
+++ b/elements/package-installs/install.d/99-package-uninstalls
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 package-uninstalls -d $(dirname $0)
diff --git a/elements/package-installs/post-install.d/00-package-installs b/elements/package-installs/post-install.d/00-package-installs
index 3251f8e1f..847e9765a 100755
--- a/elements/package-installs/post-install.d/00-package-installs
+++ b/elements/package-installs/post-install.d/00-package-installs
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 package-installs -d $(dirname $0)
diff --git a/elements/package-installs/post-install.d/99-package-uninstalls b/elements/package-installs/post-install.d/99-package-uninstalls
index dec560eec..e6123da3f 100755
--- a/elements/package-installs/post-install.d/99-package-uninstalls
+++ b/elements/package-installs/post-install.d/99-package-uninstalls
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 package-uninstalls -d $(dirname $0)
diff --git a/elements/package-installs/pre-install.d/02-package-installs b/elements/package-installs/pre-install.d/02-package-installs
index 36d5ba224..5865e552b 100755
--- a/elements/package-installs/pre-install.d/02-package-installs
+++ b/elements/package-installs/pre-install.d/02-package-installs
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 package-installs -d $(dirname $0)
diff --git a/elements/package-installs/pre-install.d/99-package-uninstalls b/elements/package-installs/pre-install.d/99-package-uninstalls
index c96a9314c..849433e46 100755
--- a/elements/package-installs/pre-install.d/99-package-uninstalls
+++ b/elements/package-installs/pre-install.d/99-package-uninstalls
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 package-uninstalls -d $(dirname $0)
diff --git a/elements/pip-cache/root.d/01-pip-cache b/elements/pip-cache/root.d/01-pip-cache
index fcb29f911..195386cc8 100755
--- a/elements/pip-cache/root.d/01-pip-cache
+++ b/elements/pip-cache/root.d/01-pip-cache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/pkg-map/extra-data.d/10-create-pkg-map-dir b/elements/pkg-map/extra-data.d/10-create-pkg-map-dir
index cb9b0467c..b3b5d9315 100755
--- a/elements/pkg-map/extra-data.d/10-create-pkg-map-dir
+++ b/elements/pkg-map/extra-data.d/10-create-pkg-map-dir
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 sudo mkdir -p $TMP_MOUNT_PATH/usr/share/pkg-map/
diff --git a/elements/pypi/extra-data.d/00-mount-pypi-mirror b/elements/pypi/extra-data.d/00-mount-pypi-mirror
index 74c0f27e2..7d2923f4e 100755
--- a/elements/pypi/extra-data.d/00-mount-pypi-mirror
+++ b/elements/pypi/extra-data.d/00-mount-pypi-mirror
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/pypi/post-install.d/00-unconfigure-pypi-mirror b/elements/pypi/post-install.d/00-unconfigure-pypi-mirror
index e0289d454..c32c3662c 100755
--- a/elements/pypi/post-install.d/00-unconfigure-pypi-mirror
+++ b/elements/pypi/post-install.d/00-unconfigure-pypi-mirror
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ramdisk-base/cleanup.d/99-extract-ramdisk-files b/elements/ramdisk-base/cleanup.d/99-extract-ramdisk-files
index c03291206..8fb812206 100755
--- a/elements/ramdisk-base/cleanup.d/99-extract-ramdisk-files
+++ b/elements/ramdisk-base/cleanup.d/99-extract-ramdisk-files
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 IMAGE_NAME=${IMAGE_NAME:-'image'}
diff --git a/elements/ramdisk-base/extra-data.d/01-inject-ramdisk-build-files b/elements/ramdisk-base/extra-data.d/01-inject-ramdisk-build-files
index 773c45475..9edb2f45a 100755
--- a/elements/ramdisk-base/extra-data.d/01-inject-ramdisk-build-files
+++ b/elements/ramdisk-base/extra-data.d/01-inject-ramdisk-build-files
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 export RAMDISK_BUILD_PATH="$TMP_MOUNT_PATH/tmp/ramdisk-build"
diff --git a/elements/ramdisk-base/extra-data.d/scripts/init b/elements/ramdisk-base/extra-data.d/scripts/init
index f5ca79a56..5f6d106fc 100755
--- a/elements/ramdisk-base/extra-data.d/scripts/init
+++ b/elements/ramdisk-base/extra-data.d/scripts/init
@@ -18,7 +18,7 @@
 
 # NOTE(bnemec): We don't want this script to exit on failures because if init
 # dies then we get a kernel panic on ramdisk boot.
-# dib-lint: disable=sete setu setpipefail
+# dib-lint: disable=sete setu setpipefail dibdebugtrace
 
 echo "init"
 
diff --git a/elements/ramdisk-base/post-install.d/01-ensure-binaries b/elements/ramdisk-base/post-install.d/01-ensure-binaries
index 41ff4d285..82c29f66b 100755
--- a/elements/ramdisk-base/post-install.d/01-ensure-binaries
+++ b/elements/ramdisk-base/post-install.d/01-ensure-binaries
@@ -1,7 +1,10 @@
 #!/bin/bash
 # Ensure that all binaries listed in ramdisk elements, exist
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 export TARGET_DIR="/tmp/in_target.d/"
diff --git a/elements/ramdisk/install.d/20-install-dhcp-client b/elements/ramdisk/install.d/20-install-dhcp-client
index f65ef3bfb..202e8eccf 100755
--- a/elements/ramdisk/install.d/20-install-dhcp-client
+++ b/elements/ramdisk/install.d/20-install-dhcp-client
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 DHCP_CLIENT=$(pkg-map --element ramdisk dhcp_client)
diff --git a/elements/ramdisk/install.d/52-ramdisk-install-busybox b/elements/ramdisk/install.d/52-ramdisk-install-busybox
index f50b56c26..6a1f56c80 100755
--- a/elements/ramdisk/install.d/52-ramdisk-install-busybox
+++ b/elements/ramdisk/install.d/52-ramdisk-install-busybox
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ramdisk/post-install.d/99-build-ramdisk b/elements/ramdisk/post-install.d/99-build-ramdisk
index e78bc025d..4fc187b3e 100755
--- a/elements/ramdisk/post-install.d/99-build-ramdisk
+++ b/elements/ramdisk/post-install.d/99-build-ramdisk
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 _LIB="/tmp/ramdisk-build"
diff --git a/elements/rax-nova-agent/install.d/05-xen-tools b/elements/rax-nova-agent/install.d/05-xen-tools
index 19513bbfb..818932678 100755
--- a/elements/rax-nova-agent/install.d/05-xen-tools
+++ b/elements/rax-nova-agent/install.d/05-xen-tools
@@ -15,6 +15,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rax-nova-agent/install.d/10-nova-agent b/elements/rax-nova-agent/install.d/10-nova-agent
index b80391c91..918e13881 100755
--- a/elements/rax-nova-agent/install.d/10-nova-agent
+++ b/elements/rax-nova-agent/install.d/10-nova-agent
@@ -15,6 +15,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/redhat-common/bin/extract-image b/elements/redhat-common/bin/extract-image
index 64b4d7d6f..cb9d4cf8f 100755
--- a/elements/redhat-common/bin/extract-image
+++ b/elements/redhat-common/bin/extract-image
@@ -3,6 +3,9 @@
 # Intended to be called from the root.d cloud-image script as follows:
 # $TMP_HOOKS_PATH/bin/extract-image $BASE_IMAGE_FILE $BASE_IMAGE_TAR $IMAGE_LOCATION $CACHED_IMAGE
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/redhat-common/finalise.d/01-clean-old-kernels.sh b/elements/redhat-common/finalise.d/01-clean-old-kernels.sh
index 5b8a9a26e..1e1e71c98 100755
--- a/elements/redhat-common/finalise.d/01-clean-old-kernels.sh
+++ b/elements/redhat-common/finalise.d/01-clean-old-kernels.sh
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/redhat-common/finalise.d/99-cleanup-tmp-grub b/elements/redhat-common/finalise.d/99-cleanup-tmp-grub
index ace72f09a..6a7909117 100755
--- a/elements/redhat-common/finalise.d/99-cleanup-tmp-grub
+++ b/elements/redhat-common/finalise.d/99-cleanup-tmp-grub
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 rm -rf /tmp/grub
diff --git a/elements/redhat-common/pre-install.d/15-remove-grub b/elements/redhat-common/pre-install.d/15-remove-grub
index d0fcafb01..c5bd935d8 100755
--- a/elements/redhat-common/pre-install.d/15-remove-grub
+++ b/elements/redhat-common/pre-install.d/15-remove-grub
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rhel-common/finalise.d/99-unregister b/elements/rhel-common/finalise.d/99-unregister
index 39c02ad1d..7c56fc3f3 100755
--- a/elements/rhel-common/finalise.d/99-unregister
+++ b/elements/rhel-common/finalise.d/99-unregister
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ "${DIB_DEBUG_TRACE:-1}" -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 # When building an image with diskimage-builder, you will need to register
diff --git a/elements/rhel-common/install.d/10-openstack-selinux-rhel b/elements/rhel-common/install.d/10-openstack-selinux-rhel
index 1e3d242b3..2c31db071 100755
--- a/elements/rhel-common/install.d/10-openstack-selinux-rhel
+++ b/elements/rhel-common/install.d/10-openstack-selinux-rhel
@@ -1,7 +1,11 @@
 #!/bin/bash
 # Install openstack-selinux if it is available
 # dib-lint: disable=sete
-set -ux
+
+if [ "${DIB_DEBUG_TRACE:-1}" -gt 0 ]; then
+    set -x
+fi
+set -u
 set -o pipefail
 
 HAS_PACKAGE=$(yum list | grep openstack-selinux)
diff --git a/elements/rhel-common/os-refresh-config/pre-configure.d/06-rhel-registration b/elements/rhel-common/os-refresh-config/pre-configure.d/06-rhel-registration
index f905c9d85..2211a28cd 100755
--- a/elements/rhel-common/os-refresh-config/pre-configure.d/06-rhel-registration
+++ b/elements/rhel-common/os-refresh-config/pre-configure.d/06-rhel-registration
@@ -1,4 +1,7 @@
 #!/bin/bash
+
+# dib-lint: disable=setu sete setpipefail dibdebugtrace
+
 set -eu
 set -o pipefail
 
diff --git a/elements/rhel-common/pre-install.d/00-rhel-registration b/elements/rhel-common/pre-install.d/00-rhel-registration
index bd30cfc6e..a5ed2d513 100755
--- a/elements/rhel-common/pre-install.d/00-rhel-registration
+++ b/elements/rhel-common/pre-install.d/00-rhel-registration
@@ -1,4 +1,8 @@
 #!/bin/bash
+
+if [ "${DIB_DEBUG_TRACE:-1}" -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rhel-common/pre-install.d/00-rhsm b/elements/rhel-common/pre-install.d/00-rhsm
index 235d583bc..fb475c2bc 100755
--- a/elements/rhel-common/pre-install.d/00-rhsm
+++ b/elements/rhel-common/pre-install.d/00-rhsm
@@ -2,6 +2,10 @@
 # This script is for RHEL6 use only.  For RHEL7, please see the readme for
 # documentation on which scripts are used for registration and the variables
 # needed to enable the registration process.
+
+if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rhel-common/pre-install.d/10-rhel-blacklist b/elements/rhel-common/pre-install.d/10-rhel-blacklist
index ff80a8ad2..6c1c19111 100755
--- a/elements/rhel-common/pre-install.d/10-rhel-blacklist
+++ b/elements/rhel-common/pre-install.d/10-rhel-blacklist
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rhel/finalise.d/60-rhsm-unregister b/elements/rhel/finalise.d/60-rhsm-unregister
index 3d3b2ec1e..1efdae873 100755
--- a/elements/rhel/finalise.d/60-rhsm-unregister
+++ b/elements/rhel/finalise.d/60-rhsm-unregister
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rhel/root.d/10-rhel-cloud-image b/elements/rhel/root.d/10-rhel-cloud-image
index 862ee2da0..90771df94 100755
--- a/elements/rhel/root.d/10-rhel-cloud-image
+++ b/elements/rhel/root.d/10-rhel-cloud-image
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rhel7/root.d/10-rhel7-cloud-image b/elements/rhel7/root.d/10-rhel7-cloud-image
index 53b33a11f..e4fc11226 100755
--- a/elements/rhel7/root.d/10-rhel7-cloud-image
+++ b/elements/rhel7/root.d/10-rhel7-cloud-image
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rpm-distro/finalise.d/11-selinux-fixfiles-restore b/elements/rpm-distro/finalise.d/11-selinux-fixfiles-restore
index 8e8adf2fa..cfc669745 100755
--- a/elements/rpm-distro/finalise.d/11-selinux-fixfiles-restore
+++ b/elements/rpm-distro/finalise.d/11-selinux-fixfiles-restore
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 if [ -e /etc/selinux/targeted/contexts/files/file_contexts -a -x /usr/sbin/setfiles ]; then
diff --git a/elements/rpm-distro/post-install.d/05-fstab-rootfs-label b/elements/rpm-distro/post-install.d/05-fstab-rootfs-label
index 8ab4e03e8..bf3e1595c 100755
--- a/elements/rpm-distro/post-install.d/05-fstab-rootfs-label
+++ b/elements/rpm-distro/post-install.d/05-fstab-rootfs-label
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rpm-distro/post-install.d/06-network-config-nonzeroconf b/elements/rpm-distro/post-install.d/06-network-config-nonzeroconf
index 9bd409dd5..c00b0572a 100755
--- a/elements/rpm-distro/post-install.d/06-network-config-nonzeroconf
+++ b/elements/rpm-distro/post-install.d/06-network-config-nonzeroconf
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rpm-distro/pre-install.d/00-fix-requiretty b/elements/rpm-distro/pre-install.d/00-fix-requiretty
index be7e105b6..4ebeb28dc 100755
--- a/elements/rpm-distro/pre-install.d/00-fix-requiretty
+++ b/elements/rpm-distro/pre-install.d/00-fix-requiretty
@@ -1,4 +1,8 @@
 #!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rpm-distro/pre-install.d/00-usr-local-bin-secure-path b/elements/rpm-distro/pre-install.d/00-usr-local-bin-secure-path
index 67e7a03c3..1b13e70a2 100755
--- a/elements/rpm-distro/pre-install.d/00-usr-local-bin-secure-path
+++ b/elements/rpm-distro/pre-install.d/00-usr-local-bin-secure-path
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/rpm-distro/pre-install.d/01-override-yum-arch b/elements/rpm-distro/pre-install.d/01-override-yum-arch
index 07ce3b19f..25763e542 100755
--- a/elements/rpm-distro/pre-install.d/01-override-yum-arch
+++ b/elements/rpm-distro/pre-install.d/01-override-yum-arch
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/select-boot-kernel-initrd/bin/select-boot-kernel-initrd b/elements/select-boot-kernel-initrd/bin/select-boot-kernel-initrd
index d00857d0b..5a9e6b717 100755
--- a/elements/select-boot-kernel-initrd/bin/select-boot-kernel-initrd
+++ b/elements/select-boot-kernel-initrd/bin/select-boot-kernel-initrd
@@ -15,6 +15,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/select-boot-kernel-initrd/cleanup.d/99-remove-dib-img-functions b/elements/select-boot-kernel-initrd/cleanup.d/99-remove-dib-img-functions
index 8630719bc..80bfa38c1 100755
--- a/elements/select-boot-kernel-initrd/cleanup.d/99-remove-dib-img-functions
+++ b/elements/select-boot-kernel-initrd/cleanup.d/99-remove-dib-img-functions
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/select-boot-kernel-initrd/extra-data.d/99-copy-dib-img-functions b/elements/select-boot-kernel-initrd/extra-data.d/99-copy-dib-img-functions
index fec53c3cf..670e97ae8 100755
--- a/elements/select-boot-kernel-initrd/extra-data.d/99-copy-dib-img-functions
+++ b/elements/select-boot-kernel-initrd/extra-data.d/99-copy-dib-img-functions
@@ -1,6 +1,9 @@
 #!/bin/bash
 # Copy elements-functions into chroot so we can access the get_kernel_image function
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/selinux-permissive/install.d/11-selinux-permissive b/elements/selinux-permissive/install.d/11-selinux-permissive
index 8b074c168..6fea4a8a9 100755
--- a/elements/selinux-permissive/install.d/11-selinux-permissive
+++ b/elements/selinux-permissive/install.d/11-selinux-permissive
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/serial-console/extra-data.d/20-stty b/elements/serial-console/extra-data.d/20-stty
index 9eee4748e..11503e4e0 100755
--- a/elements/serial-console/extra-data.d/20-stty
+++ b/elements/serial-console/extra-data.d/20-stty
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -uex
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 echo "Use of serial-console element is deprecated, please use enable-serial-console instead."
diff --git a/elements/source-repositories/extra-data.d/98-source-repositories b/elements/source-repositories/extra-data.d/98-source-repositories
index 680422fa1..8121f0865 100755
--- a/elements/source-repositories/extra-data.d/98-source-repositories
+++ b/elements/source-repositories/extra-data.d/98-source-repositories
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/stable-interface-names/install.d/02-stable-interface-names b/elements/stable-interface-names/install.d/02-stable-interface-names
index ba16b8a34..393bf8147 100755
--- a/elements/stable-interface-names/install.d/02-stable-interface-names
+++ b/elements/stable-interface-names/install.d/02-stable-interface-names
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/svc-map/extra-data.d/11-copy-svc-map-file b/elements/svc-map/extra-data.d/11-copy-svc-map-file
index 5fb5f1184..5c1478d00 100755
--- a/elements/svc-map/extra-data.d/11-copy-svc-map-file
+++ b/elements/svc-map/extra-data.d/11-copy-svc-map-file
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ "${DIB_DEBUG_TRACE:-1}" -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 sudo install -D -o root -g root -m 0644 /tmp/svc-map-services "$TMP_MOUNT_PATH/usr/share/svc-map/services"
diff --git a/elements/uboot/cleanup.d/98-uboot b/elements/uboot/cleanup.d/98-uboot
index 698805709..6cb1a653e 100755
--- a/elements/uboot/cleanup.d/98-uboot
+++ b/elements/uboot/cleanup.d/98-uboot
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 function post_process()
diff --git a/elements/ubuntu-core/root.d/10-cache-ubuntu-image b/elements/ubuntu-core/root.d/10-cache-ubuntu-image
index 6b63dd73c..ea7062317 100755
--- a/elements/ubuntu-core/root.d/10-cache-ubuntu-image
+++ b/elements/ubuntu-core/root.d/10-cache-ubuntu-image
@@ -1,7 +1,10 @@
 #!/bin/bash
 # These are useful, or at worst not harmful, for all images we build.
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 [ -n "$ARCH" ]
diff --git a/elements/ubuntu-minimal/pre-install.d/05-apt-update b/elements/ubuntu-minimal/pre-install.d/05-apt-update
index 6511e2334..3861d7b09 100755
--- a/elements/ubuntu-minimal/pre-install.d/05-apt-update
+++ b/elements/ubuntu-minimal/pre-install.d/05-apt-update
@@ -15,6 +15,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ubuntu-minimal/root.d/08-debootstrap-ubuntu b/elements/ubuntu-minimal/root.d/08-debootstrap-ubuntu
index eb6552a12..411675ac5 100755
--- a/elements/ubuntu-minimal/root.d/08-debootstrap-ubuntu
+++ b/elements/ubuntu-minimal/root.d/08-debootstrap-ubuntu
@@ -14,8 +14,12 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
+
 if [ -f ${TARGET_ROOT}/.extra_settings ] ; then
     . ${TARGET_ROOT}/.extra_settings
 fi
diff --git a/elements/ubuntu/bin/map-services b/elements/ubuntu/bin/map-services
index 1a81bb520..b9da874d2 100755
--- a/elements/ubuntu/bin/map-services
+++ b/elements/ubuntu/bin/map-services
@@ -1,4 +1,8 @@
 #!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ubuntu/install.d/99-autoremove b/elements/ubuntu/install.d/99-autoremove
index 53a19511a..e04006dab 100755
--- a/elements/ubuntu/install.d/99-autoremove
+++ b/elements/ubuntu/install.d/99-autoremove
@@ -1,5 +1,9 @@
 #!/bin/bash
-set -eux
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 apt-get -y autoremove
diff --git a/elements/ubuntu/pre-install.d/00-remove-apt-xapian-index b/elements/ubuntu/pre-install.d/00-remove-apt-xapian-index
index bc039d4e3..9d04ccd9d 100755
--- a/elements/ubuntu/pre-install.d/00-remove-apt-xapian-index
+++ b/elements/ubuntu/pre-install.d/00-remove-apt-xapian-index
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ubuntu/pre-install.d/00-remove-grub b/elements/ubuntu/pre-install.d/00-remove-grub
index 446a9581b..094a3f798 100755
--- a/elements/ubuntu/pre-install.d/00-remove-grub
+++ b/elements/ubuntu/pre-install.d/00-remove-grub
@@ -3,6 +3,9 @@
 # found (as happens in a chroot).
 # Temporarily remove grub, to avoid that confusion.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ubuntu/pre-install.d/01-set-ubuntu-mirror b/elements/ubuntu/pre-install.d/01-set-ubuntu-mirror
index 5c1c7546d..cc07297bf 100755
--- a/elements/ubuntu/pre-install.d/01-set-ubuntu-mirror
+++ b/elements/ubuntu/pre-install.d/01-set-ubuntu-mirror
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/ubuntu/root.d/10-cache-ubuntu-tarball b/elements/ubuntu/root.d/10-cache-ubuntu-tarball
index 3bc9c3ff8..a6ece7680 100755
--- a/elements/ubuntu/root.d/10-cache-ubuntu-tarball
+++ b/elements/ubuntu/root.d/10-cache-ubuntu-tarball
@@ -1,7 +1,10 @@
 #!/bin/bash
 # These are useful, or at worst not harmful, for all images we build.
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 [ -n "$ARCH" ]
diff --git a/elements/vm/block-device.d/10-partition b/elements/vm/block-device.d/10-partition
index b09fa7a2d..2b5baba5a 100755
--- a/elements/vm/block-device.d/10-partition
+++ b/elements/vm/block-device.d/10-partition
@@ -1,7 +1,11 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
+
 source $_LIB/die
 [ -n "$IMAGE_BLOCK_DEVICE" ] || die "Image block device not set"
 
diff --git a/elements/vm/cleanup.d/51-bootloader b/elements/vm/cleanup.d/51-bootloader
index ece373666..40a3b1ad4 100755
--- a/elements/vm/cleanup.d/51-bootloader
+++ b/elements/vm/cleanup.d/51-bootloader
@@ -15,7 +15,10 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 [ -n "$TARGET_ROOT" ]
diff --git a/elements/vm/finalise.d/50-remove-bogus-udev-links b/elements/vm/finalise.d/50-remove-bogus-udev-links
index a0cd6cef1..535e31e1f 100755
--- a/elements/vm/finalise.d/50-remove-bogus-udev-links
+++ b/elements/vm/finalise.d/50-remove-bogus-udev-links
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 if [ "openSUSE project" = "$(lsb_release -is)" ]; then
diff --git a/elements/vm/finalise.d/51-bootloader b/elements/vm/finalise.d/51-bootloader
index a53221ec9..e99b18e88 100755
--- a/elements/vm/finalise.d/51-bootloader
+++ b/elements/vm/finalise.d/51-bootloader
@@ -3,7 +3,10 @@
 # Configure grub. Note that the various conditionals here are to handle
 # different distributions gracefully.
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 # FIXME:
diff --git a/elements/yum/bin/install-packages b/elements/yum/bin/install-packages
index b5b71e0d8..e67ab55f6 100755
--- a/elements/yum/bin/install-packages
+++ b/elements/yum/bin/install-packages
@@ -14,6 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/yum/cleanup.d/99-remove-yum-repo-conf b/elements/yum/cleanup.d/99-remove-yum-repo-conf
index 887aa4f67..aa2f62f31 100755
--- a/elements/yum/cleanup.d/99-remove-yum-repo-conf
+++ b/elements/yum/cleanup.d/99-remove-yum-repo-conf
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 sudo rm -f $TMP_MOUNT_PATH/etc/yum.repos.d/dib-yum-repo-conf.repo
diff --git a/elements/yum/extra-data.d/99-yum-repo-conf b/elements/yum/extra-data.d/99-yum-repo-conf
index f0dde92b2..5d8556a17 100755
--- a/elements/yum/extra-data.d/99-yum-repo-conf
+++ b/elements/yum/extra-data.d/99-yum-repo-conf
@@ -1,7 +1,10 @@
 #!/bin/bash
 # Add an additional yum repo configuration with $DIB_YUM_REPO_CONF
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 # exit directly if DIB_YUM_REPO_CONF is not defined properly
diff --git a/elements/yum/post-install.d/99-reset-yum-conf b/elements/yum/post-install.d/99-reset-yum-conf
index 6957c66ec..23ac30f5e 100755
--- a/elements/yum/post-install.d/99-reset-yum-conf
+++ b/elements/yum/post-install.d/99-reset-yum-conf
@@ -1,6 +1,9 @@
 #!/bin/bash
 
-set -eux
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+    set -x
+fi
+set -eu
 set -o pipefail
 
 sed -i 's/keepcache=1/keepcache=0/' /etc/yum.conf
diff --git a/elements/yum/pre-install.d/01-yum-install-bin b/elements/yum/pre-install.d/01-yum-install-bin
index 196b8daa1..59b38a01e 100755
--- a/elements/yum/pre-install.d/01-yum-install-bin
+++ b/elements/yum/pre-install.d/01-yum-install-bin
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/yum/pre-install.d/01-yum-keepcache b/elements/yum/pre-install.d/01-yum-keepcache
index dbff551aa..5386faf99 100755
--- a/elements/yum/pre-install.d/01-yum-keepcache
+++ b/elements/yum/pre-install.d/01-yum-keepcache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/yum/root.d/50-yum-cache b/elements/yum/root.d/50-yum-cache
index 9281b95e2..542a87f23 100755
--- a/elements/yum/root.d/50-yum-cache
+++ b/elements/yum/root.d/50-yum-cache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/zypper/post-install.d/99-zypper-no-keep-packages b/elements/zypper/post-install.d/99-zypper-no-keep-packages
index 675275b6c..4e64618aa 100755
--- a/elements/zypper/post-install.d/99-zypper-no-keep-packages
+++ b/elements/zypper/post-install.d/99-zypper-no-keep-packages
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/zypper/pre-install.d/01-zypper-keep-packages b/elements/zypper/pre-install.d/01-zypper-keep-packages
index ad861bcb7..3f4928c65 100755
--- a/elements/zypper/pre-install.d/01-zypper-keep-packages
+++ b/elements/zypper/pre-install.d/01-zypper-keep-packages
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail
 
diff --git a/elements/zypper/root.d/50-zypper-cache b/elements/zypper/root.d/50-zypper-cache
index 4cf6948d4..0d8e66e3b 100755
--- a/elements/zypper/root.d/50-zypper-cache
+++ b/elements/zypper/root.d/50-zypper-cache
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
+    set -x
+fi
 set -eu
 set -o pipefail