712866
From db1e692c13290fba4d1c9a5e81b7374c677cb421 Mon Sep 17 00:00:00 2001
712866
From: Fabian Deutsch <fabiand@fedoraproject.org>
712866
Date: Wed, 18 Feb 2015 14:31:40 +0100
712866
Subject: [PATCH] dmsquash: Add rd.live.overlay.thin
712866
712866
This option changes the underlying mechanism for the overlay in the
712866
dmsquash module.
712866
Instead of a plain dm snapshot a dm thin snapshot is used. The advantage
712866
of the thin snapshot is, that the TRIM command is recognized, which
712866
means that at runtime, only the occupied blocks will be claimed from
712866
memory, and freed blocks will really be freed in ram.
712866
712866
Signed-off-by: Fabian Deutsch <fabiand@fedoraproject.org>
712866
(cherry picked from commit d6e34d362a05cda61baaf8e231ad3f0e8665a9cc)
712866
---
712866
 dracut.cmdline.7.asc                            |  7 +++++++
712866
 modules.d/90dmsquash-live/dmsquash-live-root.sh | 27 ++++++++++++++++++++++++-
712866
 2 files changed, 33 insertions(+), 1 deletion(-)
712866
712866
diff --git a/dracut.cmdline.7.asc b/dracut.cmdline.7.asc
5c6c2a
index 0493dcd8..0c3bc295 100644
712866
--- a/dracut.cmdline.7.asc
712866
+++ b/dracut.cmdline.7.asc
712866
@@ -802,6 +802,13 @@ Enables debug output from the live boot process.
712866
 Specifies the directory within the squashfs where the ext3fs.img or rootfs.img
712866
 can be found.  By default, this is __LiveOS__.
712866
 
712866
+**rd.live.overlay.thin=**1::
712866
+Enables the usage of thin snapshots instead of classic dm snapshots.
712866
+The advantage of thin snapshots is, that they support discards, and will free
712866
+blocks which are not claimed by the filesystem. In this use case this means,
712866
+that memory is given back to the kernel, when the filesystem does not claim it
712866
+anymore.
712866
+
712866
 **rd.writable.fsimg=**1::
712866
 Enables writable filesystem support.  The system will boot with a fully 
712866
 writable filesystem without snapshots __(see notes above about available live boot options)__.
712866
diff --git a/modules.d/90dmsquash-live/dmsquash-live-root.sh b/modules.d/90dmsquash-live/dmsquash-live-root.sh
5c6c2a
index c6c02c74..0645a0bd 100755
712866
--- a/modules.d/90dmsquash-live/dmsquash-live-root.sh
712866
+++ b/modules.d/90dmsquash-live/dmsquash-live-root.sh
712866
@@ -30,6 +30,8 @@ getargbool 0 rd.live.overlay.readonly -d -y readonly_overlay && readonly_overlay
712866
 overlay=$(getarg rd.live.overlay -d overlay)
712866
 getargbool 0 rd.writable.fsimg -d -y writable_fsimg && writable_fsimg="yes"
712866
 
712866
+getargbool 0 rd.live.overlay.thin && thin_snapshot="yes"
712866
+
712866
 # CD/DVD media check
712866
 [ -b $livedev ] && fs=$(blkid -s TYPE -o value $livedev)
712866
 if [ "$fs" = "iso9660" -o "$fs" = "udf" ]; then
712866
@@ -146,7 +148,30 @@ do_live_overlay() {
712866
         base=$BASE_LOOPDEV
712866
         over=$OVERLAY_LOOPDEV
712866
     fi
712866
-    echo 0 $sz snapshot $base $over p 8 | dmsetup create live-rw
712866
+    if [ -n "$thin_snapshot" ]; then
712866
+        modprobe dm_thin_pool
712866
+        mkdir /run/initramfs/thin-overlay
712866
+
712866
+        # In block units (512b)
712866
+        thin_data_sz=$(( $overlay_size * 1024 * 1024 / 512 ))
712866
+        thin_meta_sz=$(( $thin_data_sz / 10 ))
712866
+
712866
+        # It is important to have the backing file on a tmpfs
712866
+        # this is needed to let the loopdevice support TRIM
712866
+        dd if=/dev/null of=/run/initramfs/thin-overlay/meta bs=1b count=1 seek=$((thin_meta_sz)) 2> /dev/null
712866
+        dd if=/dev/null of=/run/initramfs/thin-overlay/data bs=1b count=1 seek=$((thin_data_sz)) 2> /dev/null
712866
+
712866
+        THIN_META_LOOPDEV=$( losetup --show -f /run/initramfs/thin-overlay/meta )
712866
+        THIN_DATA_LOOPDEV=$( losetup --show -f /run/initramfs/thin-overlay/data )
712866
+
712866
+        echo 0 $thin_data_sz thin-pool $THIN_META_LOOPDEV $THIN_DATA_LOOPDEV 1024 1024 | dmsetup create live-overlay-pool
712866
+        dmsetup message /dev/mapper/live-overlay-pool 0 "create_thin 0"
712866
+
712866
+        # Create a snapshot of the base image
712866
+        echo 0 $sz thin /dev/mapper/live-overlay-pool 0 $base | dmsetup create live-rw
712866
+    else
712866
+        echo 0 $sz snapshot $base $over p 8 | dmsetup create live-rw
712866
+    fi
712866
 
712866
     # Create a device that always points to a ro base image
712866
     echo 0 $sz linear $base 0 | dmsetup create --readonly live-base