Docker ja sarnased dünaamilised süsteemid tuleb kindlasti eraldi subvolume'idele panna, mida Timeshift automaatselt ei varunda. See on üks peamisi Btrfs parimal kasutamise tavasid serveri keskkonnas.[^1][^2][^3][^4][^5]
Timeshift välistab vaikimisi /var/lib/docker täpselt sel põhjusel. Docker loob pidevalt uusi subvolume'e (iga image layer jaoks) ja mount point'e, mis võivad:[^3][^4][^5]
Flat layout on parim praktika, kus kõik subvolume'id on top-level'i otsesed lapsed, mitte nested:[^9][^10][^11][^12][^8]
# Mount top-level subvolume
sudo mount /dev/nvme0n1p2 -o subvolid=5 /mnt/btrfs-root
# Loo subvolume'id (flat layout)
# SNAPSHOTVAD subvolume'id (Timeshift varundab)
sudo btrfs subvolume create /mnt/btrfs-root/@
sudo btrfs subvolume create /mnt/btrfs-root/@home
sudo btrfs subvolume create /mnt/btrfs-root/@snapshots
# MITTE-SNAPSHOTVAD subvolume'id (Timeshift EI varunda)
sudo btrfs subvolume create /mnt/btrfs-root/@docker
sudo btrfs subvolume create /mnt/btrfs-root/@containerd
sudo btrfs subvolume create /mnt/btrfs-root/@libvirt
sudo btrfs subvolume create /mnt/btrfs-root/@varlibweaviate
sudo btrfs subvolume create /mnt/btrfs-root/@varlog
sudo btrfs subvolume create /mnt/btrfs-root/@varcache
sudo btrfs subvolume create /mnt/btrfs-root/@tmp
sudo btrfs subvolume create /mnt/btrfs-root/@opt
# AI/ML projektide andmed (eraldi varundusstrateegiga)
sudo btrfs subvolume create /mnt/btrfs-root/@data
sudo btrfs subvolume create /mnt/btrfs-root/@projects
sudo btrfs subvolume create /mnt/btrfs-root/@models
# /etc/fstab näide optimeeritud AI serverile
# EFI
UUID=xxxx-xxxx /boot/efi vfat defaults 0 2
# SNAPSHOTVAD subvolume'id
UUID=yyyy / btrfs defaults,subvol=@,compress=zstd:3,noatime,ssd,space_cache=v2,discard=async 0 0
UUID=yyyy /home btrfs defaults,subvol=@home,compress=zstd:3,noatime,ssd,space_cache=v2,discard=async 0 0
UUID=yyyy /.snapshots btrfs defaults,subvol=@snapshots,compress=zstd:3,noatime,ssd,space_cache=v2,discard=async 0 0
# MITTE-SNAPSHOTVAD subvolume'id (Docker, logs, cache)
UUID=yyyy /var/lib/docker btrfs defaults,subvol=@docker,compress=zstd:1,noatime,ssd,space_cache=v2,discard=async 0 0
UUID=yyyy /var/lib/containerd btrfs defaults,subvol=@containerd,compress=zstd:1,noatime,ssd,space_cache=v2 0 0
UUID=yyyy /var/lib/weaviate btrfs defaults,subvol=@varlibweaviate,compress=zstd:1,noatime,ssd,space_cache=v2 0 0
UUID=yyyy /var/log btrfs defaults,subvol=@varlog,compress=zstd:3,noatime,ssd,space_cache=v2 0 0
UUID=yyyy /var/cache btrfs defaults,subvol=@varcache,compress=zstd:1,noatime,ssd,space_cache=v2 0 0
UUID=yyyy /tmp btrfs defaults,subvol=@tmp,noatime,ssd,space_cache=v2 0 0
UUID=yyyy /opt btrfs defaults,subvol=@opt,compress=zstd:3,noatime,ssd,space_cache=v2 0 0
# AI/ML andmed (oma varundusstrateegiga)
UUID=yyyy /data btrfs defaults,subvol=@data,compress=zstd:1,noatime,ssd,space_cache=v2,discard=async 0 0
UUID=yyyy /projects btrfs defaults,subvol=@projects,compress=zstd:3,noatime,ssd,space_cache=v2 0 0
UUID=yyyy /models btrfs defaults,subvol=@models,compress=zstd:1,noatime,ssd,space_cache=v2 0 0
# Top-level juurdepääs hoolduseks
UUID=yyyy /mnt/btrfs-root btrfs defaults,subvolid=5,noatime,ssd,space_cache=v2 0 0
#!/bin/bash
# PopOS 24.04 Btrfs Subvolume Setup for AI Server
set -e
# HOIATUS: Kontrolli muutujaid enne käivitamist!
DEVICE="/dev/nvme0n1p2" # Sinu Btrfs partitsioon
MOUNT_POINT="/mnt/btrfs-root"
echo "=== Btrfs Subvolume Struktuur AI Serverile ==="
echo "Seade: $DEVICE"
echo ""
read -p "Kas jätkad? (jah/ei): " answer
if [ "$answer" != "jah" ]; then
echo "Katkestatud."
exit 1
fi
# Mount top-level subvolume
sudo mkdir -p $MOUNT_POINT
sudo mount $DEVICE -o subvolid=5 $MOUNT_POINT
# Kontrolli, kas @ juba olemas
if [ -d "$MOUNT_POINT/@" ]; then
echo "Subvolume @ juba olemas, jätan vahele..."
else
echo "Loon põhilised subvolume'id..."
# Snapshotavad subvolume'id
sudo btrfs subvolume create $MOUNT_POINT/@
sudo btrfs subvolume create $MOUNT_POINT/@home
sudo btrfs subvolume create $MOUNT_POINT/@snapshots
# Mitte-snapshotavad süsteemi subvolume'id
sudo btrfs subvolume create $MOUNT_POINT/@docker
sudo btrfs subvolume create $MOUNT_POINT/@containerd
sudo btrfs subvolume create $MOUNT_POINT/@libvirt
sudo btrfs subvolume create $MOUNT_POINT/@varlibweaviate
sudo btrfs subvolume create $MOUNT_POINT/@varlog
sudo btrfs subvolume create $MOUNT_POINT/@varcache
sudo btrfs subvolume create $MOUNT_POINT/@tmp
sudo btrfs subvolume create $MOUNT_POINT/@opt
# AI/ML andmete subvolume'id
sudo btrfs subvolume create $MOUNT_POINT/@data
sudo btrfs subvolume create $MOUNT_POINT/@projects
sudo btrfs subvolume create $MOUNT_POINT/@models
fi
# Näita loodud subvolume'id
echo ""
echo "=== Loodud Subvolume'id ==="
sudo btrfs subvolume list $MOUNT_POINT
echo ""
echo "=== UUID ==="
sudo blkid $DEVICE | grep -o 'UUID="[^"]*"'
echo ""
echo "Subvolume'id loodud! Järgmised sammud:"
echo "1. Lisa ülalolevad read /etc/fstab faili (kasuta õiget UUID'd)"
echo "2. Loo vajalikud mount point'id"
echo "3. Taaskäivita süsteem"
echo "4. Seadista Timeshift kasutama @ subvolume'i"
# Installi Timeshift
sudo apt install -y timeshift
# Käivita Timeshift GUI esmakordseks seadistuseks
sudo timeshift-gtk
# Või kasuta CLI'd
sudo timeshift --create --comments "Initial snapshot" --tags D
sudo timeshift --list
# /etc/timeshift/timeshift.json peamised seaded
{
"backup_device_uuid" : "sinu-uuid-siia",
"do_first_run" : "false",
"btrfs_mode" : "true",
"include_btrfs_home_for_backup" : "false",
"include_btrfs_home_for_restore" : "false",
"stop_cron_emails" : "true",
# Subvolume'id, mida varundatakse (ainult @)
"btrfs_subvolumes" : [
{ "path" : "@", "snapshot" : "true" }
],
# Välistused (automaatsed + käsitsi)
"exclude" : [
"/var/lib/docker/**",
"/var/lib/containerd/**",
"/var/lib/weaviate/**",
"/var/log/**",
"/var/cache/**",
"/tmp/**",
"/data/**",
"/projects/**",
"/models/**",
"/home/**",
"*.pyc",
"*.log",
"__pycache__/**",
".cache/**",
".local/share/Trash/**"
]
}
# Seadista automaatsed snapshot'id
sudo timeshift --snapshot-device /dev/nvme0n1p2 --btrfs
# Seadista graafik (nt: iga päev, säilita 5 päeva)
# Seda saab teha GUI's või otse JSON failis:
# "schedule_monthly" : "false",
# "schedule_weekly" : "false",
# "schedule_daily" : "true",
# "count_daily" : "5",
# "schedule_hourly" : "false",
# "schedule_boot" : "true",
# "count_boot" : "3"
# Kontrolli cron tööd
sudo systemctl status cronie
sudo cat /etc/cron.d/timeshift-hourly
# /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"data-root": "/var/lib/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# Taaskäivita Docker
sudo systemctl restart docker
# Kontrolli
docker info | grep "Storage Driver"
# Storage Driver: overlay2
Miks overlay2?[^13][^14][^15][^16]
# Loo spetsiifilised subvolume'id oluliste konteinerite jaoks
sudo btrfs subvolume create /mnt/btrfs-root/@weaviate_data
sudo btrfs subvolume create /mnt/btrfs-root/@jupyter_data
sudo btrfs subvolume create /mnt/btrfs-root/@postgres_data
# Mount need
echo 'UUID=yyyy /var/lib/weaviate-data btrfs defaults,subvol=@weaviate_data,compress=zstd:1,noatime,ssd 0 0' | sudo tee -a /etc/fstab
# Kasuta docker-compose'is host mount'e
# docker-compose.yml:
# volumes:
# - /var/lib/weaviate-data:/var/lib/weaviate
Eesmärk: Kiire süsteemi taastamine pärast update'i või konfiguratsioonivea
# Automaatsed snapshot'id iga päev
# Säilita: 5 päevast, 3 boot'i
# Varundab ainult @ subvolume'i
Eesmärk: Oluliste andmete (projektid, mudelid) varundamine välisele kettale
#!/bin/bash
# backup-data.sh - AI/ML andmete varundamine
BACKUP_DEST="/mnt/backup-drive"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
# Loo read-only snapshot
sudo btrfs subvolume snapshot -r /projects /mnt/btrfs-root/@projects_backup_$DATE
# Saada välisele kettale
sudo btrfs send /mnt/btrfs-root/@projects_backup_$DATE | \
sudo btrfs receive $BACKUP_DEST/projects/
# Kontrolli
sudo btrfs subvolume list $BACKUP_DEST
# Kustuta vana snapshot (pärast kinnitamist)
# sudo btrfs subvolume delete /mnt/btrfs-root/@projects_backup_$DATE
echo "Varundamine valmis: $DATE"
#!/bin/bash
# incremental-backup.sh
SUBVOL="/projects"
BACKUP_DEST="/mnt/backup-drive/projects"
PARENT_SNAP="$(ls -t $BACKUP_DEST | head -1)"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
SNAP_NAME="projects_$DATE"
# Loo uus snapshot
sudo btrfs subvolume snapshot -r $SUBVOL /mnt/btrfs-root/$SNAP_NAME
# Inkrementaalne send (ainult muudatused)
if [ ! -z "$PARENT_SNAP" ]; then
echo "Inkrementaalne backup parent'ilt: $PARENT_SNAP"
sudo btrfs send -p $BACKUP_DEST/$PARENT_SNAP \
/mnt/btrfs-root/$SNAP_NAME | \
sudo btrfs receive $BACKUP_DEST/
else
echo "Täielik backup (esimene)"
sudo btrfs send /mnt/btrfs-root/$SNAP_NAME | \
sudo btrfs receive $BACKUP_DEST/
fi
# Puhasta vanad snapshot'id (säilita viimased 10)
ls -t /mnt/btrfs-root/ | grep "projects_" | tail -n +11 | \
xargs -I {} sudo btrfs subvolume delete /mnt/btrfs-root/{}
echo "Inkrementaalne backup valmis!"
#!/bin/bash
# rsync-backup.sh - Jupyter notebooks ja koodide varundamine
SOURCE="/home/user/jupyter-notebooks"
DEST="/mnt/backup-drive/jupyter-backups"
DATE=$(date +%Y-%m-%d)
rsync -avz --delete \
--exclude '.ipynb_checkpoints' \
--exclude '__pycache__' \
--exclude '*.pyc' \
--exclude 'venv/' \
--exclude '.git/' \
$SOURCE $DEST/$DATE/
echo "Rsync backup valmis: $DATE"
# /etc/systemd/system/ai-data-backup.service
[Unit]
Description=AI/ML Data Backup
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/incremental-backup.sh
User=root
# /etc/systemd/system/ai-data-backup.timer
[Unit]
Description=AI/ML Data Backup Timer
Requires=ai-data-backup.service
[Timer]
OnCalendar=daily
OnCalendar=Sun *-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
# Aktiveeri timer
sudo systemctl daemon-reload
sudo systemctl enable ai-data-backup.timer
sudo systemctl start ai-data-backup.timer
# Kontrolli
sudo systemctl list-timers
# Btrfs ruumikasutuse kontroll
sudo btrfs filesystem usage /
sudo btrfs filesystem df /
# Subvolume'ide loetelu
sudo btrfs subvolume list / -t
# Timeshift snapshot'ide loetelu
sudo timeshift --list
# Docker ruumikasutus
docker system df
# Puhasta Docker prügi
docker system prune -a --volumes
# Kontrolli mount point'e
mount | grep btrfs
# Snapshot'ide ruumikasutus
sudo btrfs qgroup show /
Snapshotavad (Timeshift):
@ → / (süsteem, paketid, konfiguratsioonid)@home → /home (kasutaja kodukataloog, valikuline)MITTE Snapshotavad (Timeshift välistab):
@docker → /var/lib/docker ✅@varlibweaviate → /var/lib/weaviate ✅@varlog → /var/log ✅@varcache → /var/cache ✅@tmp → /tmp ✅Eraldi Varundatavad (käsitsi/scheduled):
@projects → /projects (AI/ML projektid)@data → /data (töötlemata andmed)@models → /models (treenitud mudelid)See struktuur annab sulle:
Kas see vastab sinu vajadustele või soovid mõnda osa täpsustada? [^17][^18][^19][^20][^21][^22][^23][^24][^25][^26][^27][^28][^29][^30][^31][^32][^33][^34][^35][^36][^37][^38]