#!/bin/bash # # pacman-cage # myver='3.0' dbroot=/var/lib/pacman pacmandb=${dbroot}.db tmp_mnt_point=/mnt/tmp-pacman # temporary mount point lck_file=/tmp/pacman.lck # lock file old_pacsums=/tmp/pacsums.old # old pacsums new_pacsums=/tmp/pacsums.new # new pacsums usage() { echo -e "pacman-cage $myver\nusage: $0 [pacman_db_root]\n\npacman-cage creates a loopbacked filesystem in a contigious file.\nThis will give better response times when using pacman\n"; } die() { echo "pacman-cage: $*" >&2; exit 1; } [[ "$1" != "" ]] && dbroot=$1 && [[ "$1" == "-h" || "$1" == "--h" || "$1" == "--help" || "$1" == "-help" || "$1" == "-?" ]] && usage && exit 2 [[ "$EUID" != 0 ]] && die "You must be root to cage the database" [[ -f $lck_file ]] && die "Pacman lockfile $lck_file was found. Cannot run while pacman is running." # make sure pacman isn't running [[ -f $pacmandb ]] && die "$pacmandb already exists!." # make sure pacman.db hasnt already been made [[ ! -d $dbroot ]] && die "$dbroot does not exist or is not a directory" # don't let pacman run while we do this touch $lck_file && echo "touched $lck_file: don't let pacman run while we do this" # step 1: sum the old db echo "==> md5sum'ing the old database..." find $dbroot -type f | sort | xargs md5sum >$old_pacsums echo "==> creating pacman.db loopback file..." dd if=/dev/zero of=$pacmandb bs=1M count=150 #> /dev/null 2>&1 echo "==> creating ext4 -O dir_index -b 1024 -m 0 on $pacmandb..." yes | mkfs.ext4 -O dir_index -b 1024 -m 0 $pacmandb #> /dev/null 2>&1 echo "==> creating temporary mount point $tmp_mnt_point.." mkdir -v $tmp_mnt_point echo "==> mounting pacman.db to temporary mount point..." mount -v -o loop $pacmandb $tmp_mnt_point echo "==> copying pacman database to temporary mount point..." cp -v -a ${dbroot}/. $tmp_mnt_point echo "==> unmounting temporary mount point..." umount -v $tmp_mnt_point echo "==> removing temporary mount point..." rmdir -v $tmp_mnt_point echo "==> moving old ${dbroot} to $dbroot_bak..." mv -v ${dbroot} $dbroot_bak echo "==> createing new pacman db mount point @ $dbroot..." mkdir -v $dbroot echo "==> Mounting new pacman db..." mount -v -o loop $pacmandb $dbroot echo "==> md5sum'ing the new database..." find $dbroot -type f | sort | xargs md5sum >$new_pacsums echo "==> checking integrity..." diff $old_pacsums $new_pacsums >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "# failed, move the old one back into place" umount -v $dbroot rm -vf $pacmandb mv -v $dbroot.bak $dbroot rm -vf $lck_file die "integrity check FAILED, reverting to old database" fi echo "==> Updating /etc/fstab to reflect changes..." echo "$pacmandb $dbroot ext4 loop,defaults 0 0" | tee -a /etc/fstab rm -vf $lck_file $old_pacsums $new_pacsums echo -e "\nFinished. Your pacman database has been caged!. May the speedy pacman be with you.\n" exit 0