01. BIOS + OS.md 14 KB

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]

# 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

# /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

#!/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

# 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

# /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

# 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)

# /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

# 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

# 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

#!/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

#!/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

#!/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

# /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

Kontrolli ja Monitoori

# 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]