Sécurisez votre frère, sécurisez ...
ZFS 0.8 a la capacité d'envoyer des instantanés incrémentiels de données chiffrées sans déchiffrement. Autrement dit, en ayant une baie chiffrée, vous pouvez en organiser une copie miroir sur une machine distante, sans faire confiance au propriétaire des locaux distants. La clé et les données déchiffrées ne quittent pas les locaux de confiance.Aucun de mes clients (microcontrôleurs) n'a plus d'une salle de serveurs, si un incendie y arrive, par exemple une étoile. Après avoir convenu avec votre collègue dans une entreprise d'administration dangereuse, vous pouvez vous assurer mutuellement sans craindre qu'ils puissent utiliser les données.Tout service sous la forme d'une machine virtuelle est installé sur Proxmox, où les données se trouvent sur ZFS, et vous aurez toujours la possibilité de stocker une copie distante de la machine virtuelle. Il y a une chance qu'un jour, au lieu de tomber dans le découragement, vous irez dans une pièce isolée, ramasserez un morceau de fer et exécuterez tous les services en bonne santé. J'ai déjà transféré presque tous mes services à Proxmox il y a environ 2 ans et je n'ai aucun regret, tout fonctionne bien. Sur ZFS, j'ai un serveur terminal pour 30 personnes, qui est lié à des clients légers (c'est-à-dire 30 emplois à part entière). En plus de la copie actuelle, vous aurez également des instantanés pour les x derniers jours à la fois localement et à distance.Oui, vous perdrez la productivité de l'utilisation même de zfs et du cryptage, mais pour moi, je suis arrivé à la conclusion que j'étais prêt à payer ce prix pour une telle fonctionnalité.Une cuillère de goudron
En tacle, vous volez immédiatement dans la pommade. Oui, ZFS est plus lent. Essentiellement. Mais vous ne pouvez pas l'utiliser comme un fs ordinaire. Il devrait fonctionner dans un ensemble de disques, où une augmentation du nombre de disques est la bienvenue, les disques devraient de préférence être SAS, le contrôleur devrait fonctionner en mode HBA (et non raid0 en tant que disques simples), il devrait y avoir de la RAM ECC et il devrait y en avoir beaucoup, il doit y en avoir un SSD (meilleur PCI-E) comme cache pour la lecture du deuxième niveau (petit, concerts à partir de 64) et un SSD pour ZIL peut être très petit, mais de préférence MLC.En ce qui concerne le SSD, j'ai mis ces recommandations et acheté 2 SSD PCI-E de 128 et chacun divisé en 16 concerts et le reste. J'ai lancé deux partitions de 16 gigaoctets dans ZIL en tant que miroir et lancé les parties restantes sous le cache de deuxième niveau en tant que stripe. À la merci de zfs a donné 16 concerts d'opéra. (Une fente sur une mère achetée avec ebay s'est avérée inopérante; si cela fonctionnait, cela donnerait 32)zfskeeper.sh
À partir du script, j'avais besoin d'une notification automatique des problèmes, de la surveillance du nombre de clichés aux deux extrémités et du contrôle de la vitesse. Parmi les scripts qui sont tombés entre mes mains, aucun script ne m'a satisfait. Ci-dessous, je donnerai certains des scripts que j'ai examinés avant de le faire. Pour recevoir des notifications par e-mail, remplacez mes données dans votre fonction send_error_to_mail () par votreaide zfskeeper.sh vous montrera des exemples d'utilisationzfskeeper.sh prepare vous indiquera la procédure pour les actions préparatoires (recommandé)zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 prendra l'instantané actuel et laissera les 10 derniers instantanészfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m replicator bank / rtl / subvol-100-disk-0 20Envoyer des données non chiffrées à l'hôte distant: 22 sous le réplicateur d'utilisateur avec une vitesse allant jusqu'à 10 Mo / s et laisser 10 images sur la source et 20 sur l'hôte distantzfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m replicator bank / rtl / subvol -100-disk-0 20 -w la même chose, mais les données seront cryptées#!/bin/bash
zpool=$1
lsnaps=$2
ip=$3
port=$4
speedl=$5
remoteuser=$6
backpool=$7
rsnaps=$8
sendargs=$9
ZFSLOGDIR=~/zfskeeplogs
if [ ! -d "$ZFSLOGDIR" ]; then
mkdir -p $ZFSLOGDIR
fi
NAMESNAP=`date "+%Y_%m_%d_%T"|sed s/:/_/g`
logfile=$ZFSLOGDIR/$NAMESNAP.log
write_to_log ()
{
echo `date +"%T"`" $1" >> $logfile
}
log_last_command ()
{
if [ $? -ne 0 ]; then
write_to_log "$1 FAILED."
if [ $2 = true ]; then
write_to_log "Script execution stops"
send_error_to_mail "$1" "$?" "$*"
exit 1
fi
else
write_to_log "$1 COMPLETED."
fi
}
send_error_to_mail ()
{
Subject=`hostname`" ZFS backup $zpool missing"
swaks --header "Subject: $Subject" --to admin@mydomain.ru --from "alertbot@mydomain.ru" -a LOGIN -au alertbot@mydomain.ru -ap ailPass --server mail.mydomain.ru -tls --body \
"$Subject
command: zfskeeper.sh $3
$1
$2" \
--attach $logfile
}
case "$#" in
1)
case "$1" in
prepare)
echo "
Sender mashine:
apt install swaks mbuffer
useradd -s /bin/bash replicator
mkdir -p /home/replicator
chown replicator:replicator /home/replicator
zfs allow -u replicator send,snapshot,destroy,mount bank/encrypted
su replicator
ssh-keygen
Receiver machine:
ln -s /usr/sbin/zfs /usr/local/bin/zfs
useradd -s /bin/bash replicator
mkdir -p /home/replicator
chown replicator:replicator /home/replicator
passwd replicator
Sender mashine:
ssh-copy-id -i .ssh/id_rsa.pub Remotehost
zfs allow -u replicator compression,create,receive,destroy,mount bank/companyname
"
;;
*)
echo "
Usage:
To show the prepare instrutions:
zfskeeper.sh prepare
localkeeping:
keep last 10 snapshots of bank/encrypted/subvol-100-disk-0
zfskeeper.sh bank/encrypted/subvol-100-disk-0 10
remotekeeping:
keep last 10 snapshots bank/encrypted/subvol-100-disk-0 and send it by ssh to Remotehost:22 bank/rtl/subvol-100-disk-0
and keep last 20 copies by replicator user and limit transferspeed 10Mb/s
zfskeeper.sh bank/encrypted/subvol-100-disk-0 10 Remotehost 22 10m replicator bank/rtl/subvol-100-disk-0 20
If you need to send encrypted data, then you need add -w to the end of the line
zfskeeper bank/encrypted/subvol-100-disk-0 10 Remotehost 22 10m replicator bank/rtl/subvol-100-disk-0 20 -w
"
;;
esac
exit 0
;;
2)
echo `date +"%T"`" Local keeping of $NAMESNAP being started" > $logfile
;;
8|9)
echo `date +"%T"`" Remote keeping of $NAMESNAP being started" > $logfile
;;
*)
echo "illegal number of parameters" >&2
exit 1
;;
esac
numsnap=`zfs list -H -o name -t snapshot -s creation|grep "${zpool}@"|wc|awk '{ print $1 }'`
let MAXSNAP=numsnap-lsnaps+1 >/dev/null
if [ $MAXSNAP -gt 0 ] ; then
for d in `zfs list -H -o name -t snapshot -s creation| grep "${zpool}@"|/usr/bin/head -n"$MAXSNAP"`; do
zfs destroy ${d}
log_last_command "Remove local snapshot $d"
done
fi
zfs snapshot $zpool@backup_$NAMESNAP
log_last_command "Create local $zpool@backup_$NAMESNAP" true
if [ -z "$backpool" ]; then
write_to_log "Local keeping is complete"
exit 0
fi
if [ -n "$ip" ]; then
if ping -c 1 $ip > null ; then
sship="ssh -c aes128-ctr -p"$port" -l"$remoteuser" "$ip
else
echo "URL $ip is not accesiible, abort"
send_error_to_mail "Try to ping remote host" "URL $ip is not accesiible, abort" "$*"
exit 1
fi
else
exit 0
fi
numsnap=`$sship zfs list -H -o name -t snapshot -s creation|grep "${backpool}@"|wc|awk '{ print $1 }'`
let MAXSNAP=numsnap-rsnaps+1 >/dev/null
if [ $MAXSNAP -gt 0 ] ; then
for d in `$sship zfs list -H -o name -t snapshot -s creation| grep "${backpool}@"|/usr/bin/head -n"$MAXSNAP"`; do
$sship zfs destroy ${d}
log_last_command "Remove local snapshot $d"
done
fi
MOST_SLAVE_SNAP_NAME=`$sship zfs list -H -o name -t snapshot -s creation|grep "$backpool@backup"|tail -n1|awk -F "@" '{print $2}'`
if [ -n "`zfs list -H -o name -t snapshot -s creation|grep -w "$zpool@$MOST_SLAVE_SNAP_NAME"`" ]; then
zfs send $sendargs -i $MOST_SLAVE_SNAP_NAME $zpool@backup_$NAMESNAP | mbuffer -q -v 0 -s 128k -m 1G | pv -L $speedl | $sship "mbuffer -q -v 0 -s 128k -m 1G | zfs receive -vF $backpool@backup_$NAMESNAP" &>> $logfile
log_last_command "Sending incremental backup to the remote machine" true
else
if [ -n "`$sship zfs list -H -o name -s creation|grep -w "$backpool"`" ]; then
$sship zfs destroy -r $backpool 2>> $logfile
log_last_command "Need to destroy remotepool for full sending $backpool" true
fi
zfs send $sendargs $zpool@backup_$NAMESNAP | mbuffer -q -v 0 -s 128k -m 1G | pv -L $speedl | $sship "mbuffer -q -v 0 -s 128k -m 1G | zfs receive -vF $backpool" &>> $logfile
log_last_command "Sending full backup to the remote machine" true
fi
write_to_log "Remote keeping is complete"
exit 0
zfskeepall.sh
Afin de conserver plusieurs sections toniques, vous avez besoin d'un script de contrôle. Tout le monde peut déjà le faire selon son goût et sa couleur, selon la configuration. Mon test ressemble à ceci:#!/bin/bash
scriptpath=/home/replicator/zfskeeper.sh
$scriptpath bank/encrypted/subvol-100-disk-0 5 RemoteHost 22 30m replicator bank/rtl/subvol-100-disk-0 5 -w
Solutions existantes
Je l'ai trouvé en premier, sur la base de cela, j'ai vérifié l'opérabilité globale du mécanisme. Merci aux auteurs, mais le style d'écriture est plutôt sale, il a fallu le réécrire sans ambiguïté.zfs-auto-snapshot.sh n'est qu'un bloc. Il y a quelque chose à emprunter, beau, soigné, mais volumineux etpeu fonctionnel zfsbackup.sh - également unPS soigné, mais peu fonctionnel J'ai mordu le zfs à partir de la troisième fois, chaque fois qu'il a grignoté pendant environ un mois. Je ne pouvais pas la faire travailler rapidement et j'ai complètement échoué. En général, la situation a changé après l'installation de disques SAS (au moins 7200, au moins NL).Paix pour tous! Merci pour la lecture!