summaryrefslogtreecommitdiff
path: root/src/utils/ecryptfs-setup-swap
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/ecryptfs-setup-swap')
-rwxr-xr-xsrc/utils/ecryptfs-setup-swap181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/utils/ecryptfs-setup-swap b/src/utils/ecryptfs-setup-swap
new file mode 100755
index 0000000..042c743
--- /dev/null
+++ b/src/utils/ecryptfs-setup-swap
@@ -0,0 +1,181 @@
+#!/bin/sh -e
+# ecryptfs-setup-swap
+# Copyright (C) 2008 Canonical Ltd.
+#
+# Authors: Dustin Kirkland <kirkland@ubuntu.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# The cryptswap setup used here follows a guide published at:
+# * http://ubuntumagnet.com/2007/11/creating-encrypted-swap-file-ubuntu-using-cryptsetup
+
+TEXTDOMAIN="ecryptfs-utils"
+
+error() {
+ echo `gettext "ERROR:"` "$@" 1>&2
+ exit 1
+}
+
+info() {
+ echo `gettext "INFO:"` "$@"
+}
+
+warn() {
+ echo `gettext "WARNING:"` "$@" 1>&2
+}
+
+usage() {
+ echo
+ echo `gettext "Usage:"`
+ echo " $0 [-f|--force] [-n|--no-reload]"
+ echo
+ exit 1
+}
+
+# Handle command line options
+FORCE=0
+while [ ! -z "$1" ]; do
+ case "$1" in
+ -f|--force)
+ FORCE=1
+ shift 1
+ ;;
+ -n|--no-reload)
+ NO_RELOAD=1
+ shift 1
+ ;;
+ *)
+ usage
+ ;;
+ esac
+done
+
+# Ensure that cryptsetup is available
+[ -x /sbin/cryptsetup ] || error `gettext "Please install"` "'cryptsetup'"
+
+# Ensure that we're running with root privileges
+[ -w /etc/passwd ] || error `gettext "This program must be run with 'sudo', or as root"`
+
+# Count swap spaces available
+if [ $(grep -c "^/" /proc/swaps) -eq 0 ]; then
+ mem=$(grep "^MemTotal:" /proc/meminfo | awk '{print $2}')
+ swapsize=$((4*$mem))
+ info "You do not currently have any swap space defined."
+ echo
+ echo `gettext "You can create a swap file by doing:"`
+ echo " $ sudo dd if=/dev/zero of=/swapfile count=$swapsize"
+ echo " $ sudo mkswap /swapfile"
+ echo " $ sudo swapon /swapfile"
+ echo
+ echo `gettext "And then re-run"` "$0"
+ echo
+ exit 0
+fi
+
+swaps=$(grep "^/" /proc/swaps | awk '{print $1}')
+
+filtered_swaps=$(
+for swap in $swaps; do
+ # Make sure this is swap space
+ if [ "$(blkid -o value -s TYPE $swap)" != "swap" ]; then
+ warn "[$swap]" `gettext "does not appear to be swap space, skipping."`
+ continue
+ fi
+
+ if [ "${swap#/dev/ram}" != "$swap" ] || [ "${swap#/dev/zram}" != "$swap" ]; then
+ warn "[$swap]" `gettext "is a RAM device, skipping."`
+ continue
+ fi
+
+ # Check if this swap space is already setup for encryption
+ if /sbin/dmsetup table "$swap" 2>/dev/null | grep -qs " crypt "; then
+ warn "[$swap]" `gettext "already appears to be encrypted, skipping."`
+ continue
+ fi
+
+ base=$(basename "$swap")
+ if grep -qs "^$base.*swap.*cipher" /etc/crypttab 2>/dev/null; then
+ warn "[$swap]" `gettext "already has an entry in /etc/crypttab, skipping."`
+ continue
+ fi
+ if grep -qs "$swap" /etc/initramfs-tools/conf.d/cryptroot 2>/dev/null; then
+ warn "[$swap]" `gettext "already has an entry in /etc/crypttab, skipping."`
+ continue
+ fi
+
+ echo $swap
+done
+)
+swaps="$filtered_swaps"
+if [ -z "$swaps" ]; then
+ warn "There were no usable swap devices to be encrypted. Exiting."
+ exit 0
+fi
+##########################################################################
+# Warn the user about breaking hibernate mode
+if [ "$FORCE" != 1 ]; then
+ echo
+ echo `gettext "WARNING:"`
+ echo `gettext "An encrypted swap is required to help ensure that encrypted files are not leaked to disk in an unencrypted format."`
+ echo
+ echo `gettext "HOWEVER, THE SWAP ENCRYPTION CONFIGURATION PRODUCED BY THIS PROGRAM WILL BREAK HIBERNATE/RESUME ON THIS SYSTEM!"`
+ echo
+ echo `gettext "NOTE: Your suspend/resume capabilities will not be affected."`
+ echo
+ echo -n `gettext "Do you want to proceed with encrypting your swap?"` "[y/N]: "
+ CONFIRM=`head -n1`
+ echo
+ if [ "$CONFIRM" != "y" -a "$CONFIRM" != "Y" ]; then
+ echo
+ info `gettext "Aborting."`
+ echo
+ exit 0
+ fi
+fi
+##########################################################################
+
+
+i=0
+for swap in $swaps; do
+ info `gettext "Setting up swap:"` "[$swap]"
+ uuid=$(blkid -o value -s UUID $swap)
+ for target in "UUID=$uuid" $swap; do
+ if [ -n "$target" ] && grep -qs "^$target " /etc/fstab; then
+ sed -i "s:^$target :\#$target :" /etc/fstab
+ warn "Commented out your unencrypted swap from /etc/fstab"
+ fi
+ done
+
+ while :; do
+ i=$((i+1))
+ [ -e "/dev/mapper/cryptswap$i" ] || break
+ done
+ # Add crypttab entry
+ echo "cryptswap$i UUID=$uuid /dev/urandom swap,cipher=aes-cbc-essiv:sha256" >> /etc/crypttab
+
+ # Add fstab entry
+ echo "/dev/mapper/cryptswap$i none swap sw 0 0" >> /etc/fstab
+done
+
+if [ "$NO_RELOAD" != 1 ]; then
+ # Turn swap off
+ swapoff -a
+
+ # Restart cryptdisks
+ /etc/init.d/cryptdisks restart
+
+ # Turn the swap on
+ swapon -a
+fi
+
+info `gettext "Successfully setup encrypted swap!"`