This commit is contained in:
teldra 2021-04-14 14:10:53 +02:00
parent f6f0bfd115
commit 6697a81c99
4 changed files with 429 additions and 64 deletions

View File

@ -12,7 +12,7 @@ setconf add "lang_console" "de-latin1-nodeadkeys"
setconf add "timezone" "Europe/Berlin"
addpkg void-repo-multilib void-repo-multilib-nonfree void-repo-nonfree lvm2 cronie socklog-void ntp xtools wireguard-tools gnupg2 progress pwgen net-tools ncdu nmap mtr iotop hdparm smartmontools htop git neovim btrbk croc
addpkg void-repo-multilib void-repo-multilib-nonfree void-repo-nonfree lvm2 cronie socklog-void ntp xtools wireguard-tools gnupg2 progress pwgen net-tools ncdu nmap mtr iotop hdparm smartmontools htop git neovim btrbk croc grub-btrfs
ignorepkg nvi gnupg
servicesenable acpid cronie socklog-unix nanoklogd uuidd agetty-tty1 agetty-tty2 agetty-tty3 agetty-tty4
servicesdisable agetty-tty6 agetty-tty5

View File

@ -25,12 +25,14 @@ sed -i 's/locale.conf/locale-user.conf/' /etc/profile.d/zz-locale-user.sh
sed -i '/^if/i [ "$(id -u)" -eq 0 ] && return' /etc/profile.d/zz-locale-user.sh
{ echo "tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0";
echo "/dev/mapper/voidvg.${diskid}-root / btrfs defaults,subvol=void-rootfs 0 0";
echo "/dev/mapper/voidvg.${diskid}-root /home btrfs defaults,subvol=home 0 0";
echo "/dev/mapper/voidvg.${diskid}-root / btrfs defaults,subvol=rootfs 0 0";
echo "/dev/mapper/voidvg.${diskid}-root /home btrfs defaults,subvol=homefs 0 0";
echo "/dev/mapper/voidvg.${diskid}-swap swap swap defaults 0 0";
echo "/dev/mapper/voidvg.${diskid}-root /var/lib/backup/quelle btrfs defaults 0 0"; } > /etc/fstab
[[ "${cfg[fde_key_store]}" == "once" ]] && echo "UUID=${cfg[bootuuid]} /boot btrfs defaults 0 0" >> /etc/fstab
echo "/dev/mapper/voidvg.${diskid}-root /var/lib/backup/quelle/rootfs btrfs defaults 0 0"; } > /etc/fstab
if [[ "${cfg[fde_key_store]}" == "once" ]]; then
{ echo "UUID=${cfg[bootuuid]} /boot btrfs defaults,subvol=boots 0 0";
echo "UUID=${cfg[bootuuid]} /var/lib/backup/quelle/bootfs btrfs defaults 0 0"; } >> /etc/fstab
fi
mkdir -p /etc/sudoers.d
{ echo 'Defaults timestamp_timeout=15';
@ -41,6 +43,7 @@ echo '%wheel ALL=(ALL) ALL';
echo 'Defaults editor = /usr/bin/nvim';
echo 'Defaults env_keep += "EDITOR"';
echo 'Defaults env_keep += "SSH_CONNECTION"'; } > /etc/sudoers.d/10-common
mkdir -p /etc/udev/rules.d/
echo 'ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"' > /etc/udev/rules.d/mount-media.rules
echo 'ACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"' > /etc/udev/rules.d/60-ioschedulers.rules
@ -55,7 +58,6 @@ echo 'echo "xu = sudo voidupdate zum updaten"';
echo 'echo "xi = sudo xbps-install -S zum installieren"';
echo 'echo "xr = sudo xbps-install -R zum deinstallieren"';
echo 'echo "xs = xbps-query -Rs zum suchen"';
echo 'echo "xk = sudo vkpurge rm all zum kernel entfernen"'; } > /etc/bash/bashrc.d/xbps-aliase.sh
echo "${cfg[hostname]}" > "${dest}/etc/hostname"
ln -sf "/usr/share/zoneinfo/${cfg[timezone]}" "${dest}/etc/localtime"
@ -82,55 +84,397 @@ if [[ ! ${cfg[fde_key_store]} == "none" ]]; then
echo "fi" >> /etc/runit/core-services/99-changepwuser.sh
fi
{ echo "transaction_log /var/log/btrbk.log";
{echo "transaction_syslog daemon";
echo "lockfile /tmp/btrbk.lock";
echo "incremental yes";
echo "btrfs_commit_delete after";
echo "timestamp_format long";
echo "noauto yes"; } > /etc/btrbk/btrbk.conf
if [[ ! ${cfg[fde_key_store]} == "once" ]]; then
{ echo "volume /var/lib/backup/quelle/boot";
echo " group snapshot all";
echo " snapshot_dir snapshot";
echo " snapshot_preserve_min 4h";
echo " snapshot_preserve no";
echo " subvolume void"; } >> /etc/btrbk/btrbk.conf
fi
{ echo "volume /var/lib/backup/quelle/rootfs";
echo " group snapshot all";
echo "noauto yes";
echo "backend btrfs-progs-sudo";
echo "";
echo "volume /var/lib/backup/quelle/rootfs";
echo " group snapshotrootfs";
echo " snapshot_dir snapshot";
echo " snapshot_preserve_min 4h";
echo " snapshot_preserve no ";
echo " subvolume void-rootfs";
echo " subvolume home"; } >> /etc/btrbk/btrbk.conf
echo " subvolume rootfs";
echo " subvolume homefs";
echo "";
echo "volume /var/lib/backup/quelle/rootfs";
echo " group backuprootfs";
echo " snapshot_dir backup";
echo " snapshot_preserve_min 4h";
echo " snapshot_preserve no";
echo " target_preserve_min latest";
echo " target_preserve no";
echo " subvolume rootfs";
echo " target send-receive /var/lib/backup/ziel/void/rootfs";
echo " subvolume homefs";
echo " target send-receive /var/lib/backup/ziel/void/homefs";
echo "";} > /etc/btrbk/btrbk.conf
if [[ ! ${cfg[fde_key_store]} == "once" ]]; then
{ echo "volume /var/lib/backup/quelle/boot";
echo " group backup all";
echo " snapshot_dir backup";
echo " snapshot_preserve_min 4h";
echo " snapshot_preserve no";
echo " target_preserve_min latest";
echo " target_preserve 20d 10w 2m";
echo " subvolume void";
echo " target send-receive /var/lib/backup/ziel/void/boot"; } >> /etc/btrbk/btrbk.conf
{echo "volume /var/lib/backup/quelle/bootfs";
echo " group snapshotboot";
echo " snapshot_dir snapshot";
echo " snapshot_preserve_min 4h";
echo " snapshot_preserve no";
echo " subvolume bootfs";
echo "";
echo "volume /var/lib/backup/quelle/bootfs";
echo " group backupboot";
echo " snapshot_dir backup";
echo " snapshot_preserve_min 4h";
echo " snapshot_preserve no";
echo " target_preserve_min latest";
echo " target_preserve 20d 10w 2m";
echo " subvolume bootfs";
echo " target send-receive /var/lib/backup/ziel/void/bootfs";
echo "";} >> /etc/btrbk/btrbk.conf
fi
{ echo "volume /var/lib/backup/quelle/rootfs";
echo " group backup all";
echo " snapshot_dir backup";
echo " snapshot_preserve_min 4h";
echo " snapshot_preserve no";
echo " target_preserve_min latest";
echo " target_preserve 20d 10w 2m";
echo " subvolume rootfs";
echo " target send-receive /var/lib/backup/ziel/void/rootfs";
echo " subvolume home";
echo " target send-receive /var/lib/backup/ziel/void/homefs"; } >> /etc/btrbk/btrbk.conf
mkdir -p /var/spool/cron/
echo "0 */2 * * * /usr/bin/btrbk -q run snapshot" >> /var/spool/cron/root
cat << 'EOF' > /usr/local/bin/voidupdate
cat <<'EOF' > /usr/bin/joinvpn
#!/bin/bash
basewgfolder="/etc/wireguard"
if [ $UID -ne 0 ]; then
echo "Keine Rootrechte"
exit 1
fi
umask 0077
mkdir -p "${basewgfolder}/wg0"
cd "${basewgfolder}/wg0"
if [[ -f "${basewgfolder}/wg0/privkey" ]]; then
read -p "Address: " ADDRESS
read -p "PublicKey: " PUBKEY_SERVER
read -p "Endpoint: " ENDPOINT
read -p "Port: " PORT
{ echo "[Interface]";
echo "Address = ${ADDRESS}";
echo "PostUp = wg set %i private-key /etc/wireguard/wg0/wg0.key <(cat /etc/wireguard/wg0/privkey)";
echo "[Peer]";
echo "PublicKey = ${PUBKEY_SERVER}";
echo "Endpoint = ${ENDPOINT}:${PORT}";
echo "AllowedIPs = fd23::23:0:0/96";
echo "PresharedKey = $(cat psk)";
echo "PersistentKeepalive = 25"; } > "${basewgfolder}/wg0.conf"
else
test -f privkey || wg genkey > privkey
test -f pubkey || wg pubkey < privkey > pubkey
test -f psk || wg genpsk > psk
echo "Frage O nach den den folgenden Daten und wenn du sie hast, starte das hier nochmal"
echo "Address"
echo "PublicKey"
echo "Endpoint"
echo "Port"
echo ""
echo "Schicke ihm verschlüsselt (Jabber oder Email) folgende Daten:"
echo "PublicKey = $(cat pubkey)"
echo "PresharedKey = $(cat psk)"
echo "Hostname = ${HOSTNAME}"
fi
EOF
cat <<'EOF' > /usr/bin/void-backup
#!/bin/bash
export LANG="en_US.UTF-8"
backupcfg="/etc/backup.cfg"
ziel="/var/lib/backup/ziel"
cfg="/etc/btrbk/btrbk.conf.system"
if [ $UID -ne 0 ]; then
echo "Keine Rootrechte."
exit 1
fi
if [[ ! -f "${backupcfg}" ]] && [[ ! -f /etc/btrbk/btrbk.conf ]]; then
echo "Eine USB-Festplatte einrichten?"
while read -p "[Y/n] " answer; do
test -z "${answer}" && answer="y"
case "${answer}" in
n*|N*)
echo "Entweder eine Konfigurationsdatei anlegen. (${backupcfg})"
echo "(Diese Datei wird normalerweise durch \`void-createbackupcontainer\` erstellt)"
echo "UUID=\"uuid\""
echo "Oder eine Backupfestplatte einrichten. \`void-createbackupcontainer\`"
exit 0
;;
y*|Y*|j*|J*)
echo "Schliesse nun eine leere oder zu leerende USB-Festplatte an und starte dieses Programm nochmal, wenn es beendet ist"
exec /usr/bin/void-createbackupcontainer
;;
esac
done
elif [[ -f "${backupcfg}" ]] && [[ ! -f /etc/btrbk/btrbk.conf ]]; then
source "${backupcfg}"
elif [[ -f /etc/btrbk/btrbk.conf ]]; then
cfg="/etc/btrbk/btrbk.conf"
fi
if [ -z "${UUID}" ]; then
echo "Keine Backupplatte angegeben."
exit 1
fi
fhelp() {
echo "Nutze es so:"
echo "sudo backup"
echo "sudo backup poweroff (um den Rechner nach dem Backup herunterzufahren.)"
#echo "sudo backup update (um den Rechner nach dem Backup up zu daten.)"
#echo "update und poweroff sind mixbar"
echo "sudo backup passwd (um das Passwort für die Backupfestplatte zu ändern.)"
}
if [ ! -e "/dev/disk/by-uuid/${UUID}" ]; then
echo "Bitte Backupfestplatte anschliessen."
exit 1
fi
for argval in "$@"
do
case "${argval}" in
power|poweroff|p)
poweroff=y
;;
help|-h|--help|h)
fhelp
exit
;;
update)
update=y
;;
passwd)
passwd=y
;;
esac
done
if [ -e /tmp/backup ]; then
echo "Es läuft schon ein Backupvorgang oder wurde nicht richtig beendet."
echo "Bei letzterem: 'sudo rm -rf /tmp/backup'"
exit 1
fi
touch /tmp/backup
if [[ "${passwd}" == "y" ]]; then
cryptsetup luksChangeKey "/dev/disk/by-uuid/${UUID}"
rm -rf /tmp/backup
exit 0
fi
function finish {
sync
if [ "${poweroff}" = "y" ]; then
shutdown -h now
fi
sleep 4
umount "${ziel}"
echo " "
echo " "
if [[ "${MOUNTEDBY}" == "script" ]]; then
cryptsetup close "luks-${UUID}"
echo "Festplatte kann nun sicher entfernt werden."
elif [[ "${MOUNTEDBY}" == "gnome" ]]; then
echo "Festplatte bitte mit der grafischen Oberflaeche auswerfen (wie ein USB-Stick)"
echo ""
echo "oder:"
echo "sudo umount /dev/mapper/luks-${UUID}"
echo "sudo cryptsetup close luks-${UUID}"
echo ""
fi
rm -rf /tmp/backup
echo "FERTIG"
}
trap finish EXIT
if [ ! $(mountpoint -q -x "/dev/mapper/luks-${UUID}") ]; then
if ! cryptsetup open UUID="${UUID}" "luks-${UUID}"; then
echo "Konnte /dev/disk/by-uuid/${UUID} nicht öffnen."
exit
fi
MOUNTEDBY="script"
else
MOUNTEDBY="gnome"
fi
if ! mount "/dev/mapper/luks-${UUID}" "${ziel}"; then
echo "Konnte /dev/mapper/luks-${UUID} in ${ziel} nicht mounten."
exit
fi
if mountpoint -q /var/lib/backup/quelle/boot; then
mkdir -p "/var/lib/backup/ziel/void/boot"
if ! btrbk --config="${cfg}" --progress --quiet run backupboot; then
btrbk --config="${cfg}" --progress --quiet clean
echo "Wegen Fehler nicht herunterfahren."
poweroff=n
fi
fi
mkdir -p "/var/lib/backup/ziel/void/{rootfs,home}"
if ! btrbk --config="${cfg}" --progress --quiet run backuprootfs; then
btrbk --config="${cfg}" --progress --quiet clean
echo "Wegen Fehler nicht herunterfahren."
poweroff=n
fi
#if [[ "${update}" = "y" ]]; then
# if command -v voidupdate >/dev/null; then
# if ! voidupdate; then
# echo "UPDATE FAILED, nicht runterfahren"
# poweroff=n
# fi
# else
# if ! apt-get -y -q upgrade; then
# echo "UPDATE FAILED, nicht runterfahren"
# poweroff=n
# fi
# fi
#fi
EOF
cat <<'EOF' > /usr/bin/void-createbackupcontainer
#!/bin/bash
backupcfg="/etc/backup.cfg"
if [ $UID -ne 0 ]; then
echo "Keine Rootrechte."
exit 1
fi
#test -f "${backupcfg}" && echo "${backupcfg} existiert" && exit 1
# find all disks
declare -A disk_tmp=()
declare -A disk=()
index=0
for i in $(find /dev/disk/by-id/ -type l -printf "%P\n" | grep usb | grep -v part | tac ); do
name="$(readlink -f /dev/disk/by-id/"${i}")"
if [[ "${name}" =~ *"^[0-9]+$"* ]]; then
continue
fi
if [[ "${name}" == *"dm"* ]]; then
continue
fi
if [[ "${name}" == *"/dev/sr"* ]]; then
continue
fi
if blkid "${name}"|grep -q UUID; then
size="$(fdisk -l "${name}" | head -n1 | awk '{print $3}')"
else
continue
fi
size=$(awk "BEGIN { printf(\"%.0f\n\", ${size}); }")
uuid=$(blkid -o value -s UUID ${name})
index=$(( index + 1 ))
disk_tmp+=( [${index}.id]="${i}" [${index}.name]="${name}" [${index}.uuid]="${uuid}" [${index}.size]="${size}" )
done
disk_tmp+=( [count]="${index}" )
if [[ "${disk_tmp[count]}" -eq 0 ]]; then
echo "No Disk attached."
exit 1
fi
# show devices
echo "Devices:"
for i in $(seq 1 "${disk_tmp[count]}"); do
echo "${disk_tmp[${i}.id]}"
echo " - uuid: ${disk_tmp[${i}.uuid]}"
echo " - name: ${disk_tmp[${i}.name]}"
echo " - size: ${disk_tmp[${i}.size]}"
done
# choose device
found=
while read -p "Which Device? [${disk_tmp[1.uuid]}]: " output; do
test -z "${output}" && output="${disk_tmp[1.uuid]}"
for i in $(seq 1 "${disk_tmp[count]}"); do
if [[ "${disk_tmp[${i}.id]}" == "${output}" ]] || [[ "${disk_tmp[${i}.name]}" == "${output}" ]] || [[ "${disk_tmp[${i}.uuid]}" == "${output}" ]]; then
found=1
id="${disk_tmp[${i}.id]}"
break
fi
done
[[ "${found}" ]] && break
echo "${output} not found"
done
echo "g
n
1
w
q" | fdisk "/dev/disk/by-id/${id}"
UUID=$(blkid -o value -s UUID "/dev/disk/by-id/${id}-part1")
if ! cryptsetup luksFormat UUID="${UUID}"; then
echo "Konnte /dev/disk/by-uuid/${UUID} nicht verschluesseln."
exit 1
else
if ! cryptsetup open UUID="${UUID}" "luks-${UUID}"; then
echo "Konnte /dev/disk/by-uuid/${UUID} nicht verschluesseln."
exit 1
fi
fi
if ! mkfs.btrfs -f "/dev/mapper/luks-${UUID}"; then
echo "Konnte /dev/mapper/luks-${UUID} nicht formatieren"
exit 1
fi
if ! mount "/dev/mapper/luks-${UUID}" "/var/lib/backup/ziel"; then
echo "Konnte /dev/mapper/luks-${UUID} nicht nach /var/lib/backup/ziel mounten"
exit 1
fi
if mountpoint -q /boot; then
mkdir -p "/var/lib/backup/ziel/${HOSTNAME}/boot"
fi
mkdir -p "/var/lib/backup/ziel/${HOSTNAME}/{rootfs,home}"
umount "/var/lib/backup/ziel"
cryptsetup close "luks-${UUID}"
echo "UUID=\"${UUID}\"" > "${backupcfg}"
echo "Erstellen des Containers fertig."
EOF
cat <<'EOF' > /usr/bin/void-snapshot
#!/bin/sh
if [ -f /etc/btrbk/btrbk.conf ]; then
cfg="/etc/btrbk/btrbk.conf"
else
cfg="/etc/btrbk/btrbk.conf.system"
fi
if mountpoint -q /var/lib/backup/quelle/boot; then
btrbk --config="${cfg}" --quiet run snapshotboot
fi
btrbk --config="${cfg}" --quiet run snapshotrootfs
if ! update-grub 2> /dev/null; then
echo update-grub failed
fi
EOF
cat <<'EOF' > /usr/bin/void-update
#!/bin/bash
if [ $UID -ne 0 ]; then
echo "Keine Rootrechte."
exit 1
fi
RESTART=
echo "Synchronisiere Repositorys"
@ -140,35 +484,56 @@ mapfile -t updatedpkgs < <(xbps-install -un|awk '{print $1}')
if [[ "${#updatedpkgs[@]}" -eq 0 ]]; then
echo "Keine Updates"
exit
else
echo "Es sind Updates da!"
while read -p "Installieren? [Y/n] " answer; do
test -z "${answer}" && answer="y"
case "${answer}" in
n*|N*|*o|*O)
exit
;;
y*|Y*|j*|J*)
break
;;
esac
done
fi
echo "Lege Snapshot an"
void-snapshot
echo "Entferne nicht benutzte Pakete"
xbps-remove -oy > /dev/null
echo "Räume den Cache auf"
xbps-remove -Oy > /dev/null
echo "Installiere Updates"
xbps-install -u
echo "Installiere Updates"
if ! xbps-install -uy; then
echo "Update failed."
exit
fi
if [[ "$(xcheckrestart)" ]]; then
RESTART=1
fi
for i in "${updatedpkgs[@]}"; do
if grep "^linux-" <<< "${i}"; then
if grep -q "^linux" <<< "${i}"; then
vkpurge list | head -n -1 | xargs -r vkpurge rm
RESTART=1
fi
done
if [[ "${RESTART}" ]]; then
echo ""; echo "Bitte den Computer neu starten."
fi
echo ""
echo "Update fertig."
EOF
chmod 755 /usr/local/bin/voidupdate
module end

View File

@ -95,22 +95,22 @@ lvcreate -q -y --name root -l 100%FREE "voidvg.${diskid}"
mkfs.btrfs -q -f "/dev/mapper/voidvg.${diskid}-root"
mkswap "/dev/mapper/voidvg.${diskid}-swap"
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}"
btrfs subvol create "${dest}/void-rootfs"
btrfs subvol create "${dest}/home"
btrfs subvol create "${dest}/rootfs"
btrfs subvol create "${dest}/homefs"
mkdir -p "${dest}/snapshot" "${dest}/backup"
umount "${dest}"
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}" -o subvol=void-rootfs
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}" -o subvol=rootfs
for i in boot home dev proc sys tmp etc var/lib/backup/quelle/rootfs var/lib/backup/ziel var/db; do mkdir -p "${dest}/${i}"; done
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}"/home -o subvol=home
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}"/home -o subvol=homefs
if [[ "${cfg[fde_key_store]}" == "once" ]]; then
mkdir -p "${dest}/var/lib/backup/quelle/boot"
mkdir -p "${dest}/var/lib/backup/quelle/bootfs"
mkfs.btrfs -q -f "${target_boot}"
mount "${target_boot}" "${dest}/boot"
btrfs subvol create "${dest}/boot/void"
btrfs subvol create "${dest}/boot/bootfs"
mkdir -p "${dest}/boot/snapshot" "${dest}/boot/backup"
umount "${dest}/boot"
mount "${target_boot}" "${dest}/boot" -o subvol=void
mount "${target_boot}" "${dest}/boot" -o subvol=bootfs
fi
for dir in dev proc sys run; do mkdir -p "${dest}"/$dir ; mount --rbind /$dir "${dest}"/$dir ; mount --make-rslave "${dest}"/$dir ; done

View File

@ -95,22 +95,22 @@ lvcreate -q -y --name root -l 100%FREE "voidvg.${diskid}"
mkfs.btrfs -q -f "/dev/mapper/voidvg.${diskid}-root"
mkswap "/dev/mapper/voidvg.${diskid}-swap"
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}"
btrfs subvol create "${dest}/void-rootfs"
btrfs subvol create "${dest}/home"
btrfs subvol create "${dest}/rootfs"
btrfs subvol create "${dest}/homefs"
mkdir -p "${dest}/snapshot" "${dest}/backup"
umount "${dest}"
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}" -o subvol=void-rootfs
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}" -o subvol=rootfs
for i in boot home dev proc sys tmp etc var/lib/backup/quelle/rootfs var/lib/backup/ziel var/db; do mkdir -p "${dest}/${i}"; done
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}"/home -o subvol=home
mount "/dev/mapper/voidvg.${diskid}-root" "${dest}"/home -o subvol=homefs
if [[ "${cfg[fde_key_store]}" == "once" ]]; then
mkdir -p "${dest}/var/lib/backup/quelle/boot"
mkdir -p "${dest}/var/lib/backup/quelle/bootfs"
mkfs.btrfs -q -f "${target_boot}"
mount "${target_boot}" "${dest}/boot"
btrfs subvol create "${dest}/boot/void"
btrfs subvol create "${dest}/boot/bootfs"
mkdir -p "${dest}/boot/snapshot" "${dest}/boot/backup"
umount "${dest}/boot"
mount "${target_boot}" "${dest}/boot" -o subvol=void
mount "${target_boot}" "${dest}/boot" -o subvol=bootfs
fi
for dir in dev proc sys run; do mkdir -p "${dest}"/$dir ; mount --rbind /$dir "${dest}"/$dir ; mount --make-rslave "${dest}"/$dir ; done