پرش به محتوا

ZFS در FreeBSD: pool آینه‌ای، dataset، snapshot و انتقال به سرور دیگر

روی دو دیسک pool آینه‌ای بسازید، برای هر نوع داده dataset با سهمیه بسازید، snapshot خودکار بگیرید و با zfs send نسخه‌ی پشتیبان را به سرور دیگر بفرستید.

FreeBSD 15سطح: متوسطبه‌روزرسانی: ۱۷ آبان ۱۴۰۵

ZFS در FreeBSD بخشی از سیستم پایه است و ابزار جداگانه‌ای لازم ندارد.

۱. فعال‌سازی و شناسایی دیسک

shell
sysrc zfs_enable=YES
service zfs start
geom disk list | grep -E 'Geom name|Mediasize|descr'

۲. pool آینه‌ای

دیسک‌ها (اینجا da1 و da2) کاملاً پاک می‌شوند.
shell
gpart create -s gpt da1 && gpart add -t freebsd-zfs -a 1m -l data0 da1
gpart create -s gpt da2 && gpart add -t freebsd-zfs -a 1m -l data1 da2
zpool create -o ashift=12 -O compression=lz4 -O atime=off tank mirror gpt/data0 gpt/data1
zpool status tank

برچسب‌های GPT (gpt/data0) نسبت به da1 پایدارترند و در گزارش خرابی دیسک دقیقاً نشان می‌دهند کدام دیسک باید تعویض شود.

۳. dataset و سهمیه

shell
zfs create tank/www
zfs create -o quota=50G tank/backup
zfs create -o recordsize=16k tank/pgdata      # small records suit databases
zfs list -o name,used,avail,quota,compressratio,mountpoint

هر dataset تنظیمات، سهمیه و snapshot جداگانه دارد.

۴. snapshot

shell
zfs snapshot tank/www@$(date +%F)
zfs list -t snapshot
ls /tank/www/.zfs/snapshot/

بازیابی یک فایل از snapshot با cp از همان پوشه‌ی .zfs انجام می‌شود. برگرداندن کل dataset به آخرین snapshot:

shell
zfs rollback tank/www@2026-11-08

snapshot روزانه‌ی خودکار با cron (crontab -e برای root). این خط ۱۴ snapshot آخر tank/www را نگه می‌دارد:

15 2 * * * /sbin/zfs snapshot tank/www@auto-$(date +\%F) && /sbin/zfs list -H -t snapshot -o name -S creation tank/www | grep '@auto-' | tail -n +15 | xargs -n1 /sbin/zfs destroy

برای چند dataset و سیاست‌های پیچیده‌تر (ساعتی، روزانه، ماهانه)، ابزار آماده‌ی zfstools یا sanoid را از pkg نصب کنید.

۵. انتقال به سرور دیگر

shell
zfs snapshot tank/www@send1
zfs send tank/www@send1 | ssh backup01 zfs receive -u backup/www

# Later, only the changes:
zfs snapshot tank/www@send2
zfs send -i @send1 tank/www@send2 | ssh backup01 zfs receive -u backup/www

۶. نگهداری

shell
sysrc -f /etc/periodic.conf daily_scrub_zfs_enable=YES
zpool status -x

با این تنظیم، periodic هر ۳۵ روز یک بار scrub اجرا می‌کند و نتیجه در گزارش روزانه‌ی ایمیل root می‌آید.