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] ## Põhjused Docker'i Eraldi Subvolume'ile Panemiseks ### 1. **Timeshift Välistab /var/lib/docker Automaatselt** 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] - Põhjustada Timeshift'i hangu või ebaõnnestumist[^2][^5] - Tekitada massiivseid varukoopiaid, mis pole süsteemi taastamiseks vajalikud - Luua ringviiteid ja kummalist käitumist snapshot'ide puhul[^2] ### 2. **Docker Andmed Ei Kuulu Süsteemi Snapshot'idesse** - Docker konteinerid ja image'id on **efemeersed** - neid saab alati uuesti luua - Docker volume'id sisaldavad **rakenduse andmeid**, mitte süsteemi konfiguratsiooni - Süsteemi taastamisel tahad sa vana süsteemikonfiguratsiooni, aga mitte vanu konteineri layer'eid[^6][^1] ### 3. **Jõudlus ja Ruumikasutus** - Docker loob Btrfs'iga väga palju subvolume'e (iga layer = subvolume)[^7][^1] - Need subvolume'id kasvavad kiiresti ja võtavad palju ruumi - Snapshot'ide tegemisel ilma nende välistamiseta dubleeritaks ka kõik Docker andmed[^8][^6] ## Soovitatud Btrfs Subvolume Struktuur AI Serverile ### Flat Layout (Soovitatav) Flat layout on parim praktika, kus kõik subvolume'id on top-level'i otsesed lapsed, mitte nested:[^9][^10][^11][^12][^8] ```bash # 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 Seadistus ```bash # /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 ``` ## Installeerimisskript ```bash #!/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" ``` ## Timeshift Seadistamine ### Timeshift Installimine ja Seadistamine ```bash # 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 ``` ### Timeshift Seadistused ```bash # /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/**" ] } ``` ### Automaatsed Snapshot'id ```bash # 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 ``` ## Docker Seadistamine Btrfs'iga ### Variant 1: Overlay2 Storage Driver (Soovitatav) ```bash # /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] - Docker eemaldas Btrfs storage driver'i toe versioonist 23.0[^16] - Overlay2 on kiirem ja lihtsamini hallatav[^14][^15] - Btrfs host failisüsteem + overlay2 storage driver on parim kombinatsioon[^15][^1][^13] ### Variant 2: Docker Volume'id Eraldi Subvolume'idel ```bash # 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 ``` ## Varundusstrateegiad ### 1. **Timeshift - Süsteemi Snapshots (Automaatne)** **Eesmärk:** Kiire süsteemi taastamine pärast update'i või konfiguratsioonivea ```bash # Automaatsed snapshot'id iga päev # Säilita: 5 päevast, 3 boot'i # Varundab ainult @ subvolume'i ``` ### 2. **Btrfs Send/Receive - Andmete Varundamine (Käsitsi/Scheduled)** **Eesmärk:** Oluliste andmete (projektid, mudelid) varundamine välisele kettale ```bash #!/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" ``` ### 3. **Inkrementaalne Btrfs Backup** ```bash #!/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!" ``` ### 4. **Rsync - Failipõhine Backup** ```bash #!/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" ``` ### 5. **Automatiseerimine Systemd Timer'itega** ```bash # /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 ``` ```bash # /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 ``` ```bash # 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 ``` ## Kontrolli ja Monitoori ```bash # 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 / ``` ## Kokkuvõte: Optimaalne Struktuur **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: 1. **Kiire süsteemi taastamine** Timeshift'iga (ainult @ subvolume) 2. **Efektiivne ruumikasutus** (ei varunda Docker'i jne) 3. **Paindlik andmete varundamine** (ise valid, mida ja millal) 4. **Selge organisatsioon** (igal asjal oma koht) 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]