최신 OpenBSD에서 서버를 시작할 계획입니다. (웹, 클라우드 등) ffs2 파티션을 정기적으로 백업해야 합니다(예: cron 사용).
그러나 이에 대한 문서는 없고 덤프 유틸리티에 대한 문서만 있습니다. 내가 이해한 바로는 마운트 해제된 장치만 덤프할 수 있습니다. (FreeBSD의 덤프에는 라이브 파일 시스템의 백업을 허용하는 -L 옵션이 있지만 OpenBSD에는 이 기능이 없습니다.)
마운트된/활성 파티션을 덤프하는 방법은 무엇입니까? 다른 파일 시스템을 사용하도록 제안하시겠습니까?
답변1
dump
활성 파티션에서 사용할 수 있습니다 . rsnapshots
(OpenBSD 기반은 아니지만 패키지로 제공됨)도 유용할 수 있습니다.
일반적인 권장 사항에 따라 백업을 신중하게 계획하십시오. 데이터베이스(MySQL 등)에는 자체 백업 도구 및/또는 마스터-슬레이브 동기화가 있는 경우가 많으며 이는 유용할 수 있으며 복구를 더 쉽게 해줍니다. 이메일 백업은 주로 다음 사항에 따라 달라집니다.어떻게귀하/귀하의 사용자가 이를 사용할 계획인 경우 일일 백업은 큰 도움이 되지 않을 수 있습니다(예: 실수로 삭제된 메시지를 복구하려는 경우 메시지는 종종 빠르게 이동하는 대상입니다(적어도 Dovecot에는 IMAP 마스터-슬레이브 동기화가 있음). 백업 버전이 지정된 저장소(예: git 저장소)는 본질적으로 "스스로 백업"하므로 의미가 없을 수 있습니다.
답변2
대답은 덤프를 사용하는 것입니다.
OpenBSD 버전 덤프는 FreeBSD의 -L과 같은 플래그 없이 마운트된 파일 시스템용입니다.(UPD: 사실은 아닙니다. 아래를 참조하세요)
물론, 라이브 FS의 모든 읽기/쓰기 작업에는 잠금이 필요하지 않습니다. maildir(메일 저장에 가장 많이 사용되는 형식, imap/smtp 서버에서 사용됨) 형식은 읽기 및 쓰기 작업이 각각의 작업과 인터리브될 수 있도록 설계되었기 때문입니다. 다른.
dd를 사용하지 마십시오. 파일 시스템 수준이 아닌 바이트 수준에서 작동하므로 dd를 사용하면 일관성 없는 데이터 복사본이 생성될 수 있습니다. dd 주변의 래퍼인 OpenBSD /altroot 기능을 사용하지 마십시오.
고쳐 쓰다:
라이브 FS에 대한 덤프는 R/O 플래그를 사용하여 다시 마운트됩니다.
:(
따라서 /var 파티션을 덤프하는 데 사용할 수 없습니다. 실시간 FS에는 tar를 사용하십시오.
이것이 내 OpenBSD 서버 백업을 위한 솔루션입니다. 관심이 있으시면 귀하의 시스템에 내 backup.sh를 채택하십시오.
#!/usr/bin/env bash
# TODO:
#
# - full backup => incremental backup?
function use
{
echo "Usage: $0 local backup_dir"
exit 1
}
if [ $# -ne 2 ]
then
use
fi
if [[ $1 == local ]]
then
:
else
use
fi
BACKUPS="/home/neva_blyad/Облако/Загрузки/Система/Резервные образы/srv | LoveCry.pt/$2"
function remount_rw
{
DEV="$1"
# Filesystem path
DIR=`mount | grep "$DEV" | awk '{ print $3 }'`
[ "$DIR" = / ] || DIR="$DIR/"
# Remount back in R/W mode
mount -fu -o rw "$DIR"
}
function backup
{
DISK="$1"
DEV="$2"
FILENAME="$3"
# Filesystem path
DIR=`mount | grep "$DEV" | awk '{ print $3 }'`
[ "$DIR" = / ] || DIR="$DIR/"
# Backup a partition
echo "Backing up partition $DEV ($DIR)..."
# Store filesystem into archive
if [ "$DIR" = /var/ ]
then
# TODO
#
# Warning! This branch was not tested.
# (Do exclusions work properly?)
# Can't remount as R/O even for several minutes.
# We should use tar.
cd "$DIR"
gtar cf - --exclude=home \
--exclude=mail \
--exclude=opt/local \
--exclude=tmp \
--exclude=usr/local \
--exclude=var \
--exclude=Облако ./ |
pv -perab -s $(du -ksx ./ | cut -f1)K | \
#lz4 --force --quiet - "$BACKUPS/${DISK}_${FILENAME}.tar.lz4" && chown neva_blyad:neva_blyad "$BACKUPS/{$DI
xz --quiet > "$BACKUPS/${DISK}_${FILENAME}.tar.xz" && chown neva_blyad:neva_blyad "$BACKUPS/${DISK}_${FILEN
cd /
else
# Remount in R/O mode.
# (Really, it is not neccessary, dump will do it anyway.)
mount -fu -o ro "$DIR"
# Use dump
cd "$DIR"
dump -0uan -h0 -f - ./ |
pv -perab -s $(du -ksx ./ | cut -f1)K | \
#lz4 --force --quiet - "$BACKUPS/${DISK}_${FILENAME}_dump.lz4" && chown neva_blyad:neva_blyad "$BACKUPS/{$D
xz --quiet > "$BACKUPS/${DISK}_${FILENAME}_dump.xz" && chown neva_blyad:neva_blyad "$BACKUPS/${DISK}_${FILE
cd /
# Remount back in R/W
mount -fu -o rw "$DIR"
fi
}
# Make sure only root can run our script
if [ $EUID -ne 0 ]
then
echo 'This script must be run as root'
exit 1
fi
# Create backup directory
doas -u neva_blyad mkdir -p "$BACKUPS"
# Backup GPT of /dev/sd{0,1,2,4,5,6}*
echo 'Backing up GUID partition tables (GPT) of disks /dev/sd{0,1,2,4,5,6}*...'
fdisk sd0 > "$BACKUPS/sd0_fdisk"
fdisk sd1 > "$BACKUPS/sd1_fdisk"
fdisk sd2 > "$BACKUPS/sd2_fdisk"
fdisk sd4 > "$BACKUPS/sd4_fdisk"
fdisk sd5 > "$BACKUPS/sd5_fdisk"
fdisk sd6 > "$BACKUPS/sd6_fdisk"
chown neva_blyad:neva_blyad "$BACKUPS"/sd*_fdisk
# Backup BSD labels of /dev/sd{0,1,2,4,5,6}*
echo 'Backing up partition labels of BSD slices /dev/sd{0,1,2,4,5,6}*...'
disklabel sd0 > "$BACKUPS/sd0_disklabel"
disklabel sd1 > "$BACKUPS/sd1_disklabel"
disklabel sd2 > "$BACKUPS/sd2_disklabel"
disklabel sd4 > "$BACKUPS/sd4_disklabel"
disklabel sd5 > "$BACKUPS/sd5_disklabel"
disklabel sd6 > "$BACKUPS/sd6_disklabel"
chown neva_blyad:neva_blyad "$BACKUPS"/sd*_disklabel
# Backup BSD labels of /dev/sd{0,1,2,4,5,6}* (detailed)
echo 'Backing up partition labels of BSD slices /dev/sd{0,1,2,4,5,6}* (detailed)...'
disklabel -v sd0 > "$BACKUPS/sd0_disklabel_detailed"
disklabel -v sd1 > "$BACKUPS/sd1_disklabel_detailed"
disklabel -v sd2 > "$BACKUPS/sd2_disklabel_detailed"
disklabel -v sd4 > "$BACKUPS/sd4_disklabel_detailed"
disklabel -v sd5 > "$BACKUPS/sd5_disklabel_detailed"
disklabel -v sd6 > "$BACKUPS/sd6_disklabel_detailed"
chown neva_blyad:neva_blyad "$BACKUPS"/sd*_disklabel_detailed
#sync
# Cleanup before exiting if the program receives a signal during execution
function cleanup
{
# Remount /dev/sd4* back in R/W
remount_rw /dev/sd4a
remount_rw /dev/sd4b
remount_rw /dev/sd4d
remount_rw /dev/sd4e
#remount_rw /dev/sd4f
# Mark files back with dump flag
chflags dump /home/
chflags dump /home/neva_blyad/Облако/
chflags dump /opt/local/
chflags dump /tmp/
chflags dump /usr/local/
chflags dump /var/
chflags dump /var/mail/
}
trap cleanup INT TERM
# Backup /dev/sd4* (/)
chflags nodump /home/
chflags nodump /opt/local/
chflags nodump /tmp/
chflags nodump /usr/local/
chflags nodump /var/
backup sd4 /dev/sd4a root
chflags dump /home/
chflags dump /opt/local/
chflags dump /tmp/
chflags dump /usr/local/
chflags dump /var/
# Backup /dev/sd4* (/home/)
chflags nodump /home/neva_blyad/Облако/
backup sd4 /dev/sd4b home
chflags dump /home/neva_blyad/Облако/
# Backup /dev/sd4* (/opt/local/, /tmp/, /usr/local/)
backup sd4 /dev/sd4d opt_local
#backup sd4 /dev/sd4e tmp # Used actively, should not remount as R/O
backup sd4 /dev/sd4f usr_local
# Backup /dev/sd5* (/var/)
chflags nodump /var/mail/
backup sd5 /dev/sd5a var
chflags dump /var/mail/
echo Done
Cron 데몬은 이를 주기적으로 구동합니다.
$ doas crontab -l
# Environment
SHELL=/bin/sh
PATH=/root/.local/bin/:/usr/local/sbin/:/usr/local/bin/:/usr/sbin/:/usr/bin/:/sbin/:/bin/
HOME=/var/log/
MAILTO=root
...
# Make backup everyday at 05:00
#0 5 * * MON backup.sh local mon
#0 5 * * TUE backup.sh local tue
#0 5 * * WED backup.sh local wed
#0 5 * * THU backup.sh local thu
#0 5 * * FRI backup.sh local fri
0 5 * * SAT backup.sh local sat
#0 5 * * SUN backup.sh local sun