COMP::OmegaByte::Linux biztonsági mentés (online)

Innen: Farkas Attila Wiki
A lap korábbi változatát látod, amilyen ApelPro (vitalap | szerkesztései) 2023. július 13., 09:50-kor történt szerkesztése után volt. (Új oldal, tartalma: „== Szoftver követelmények == {| | Csomag || Leírás | ''btrfs-progs'' | Tartalmazza az összes eszközt a btrfs fájlrendszerhez (//snapshot// készítés stb.) | ''grub2'' | Segítségével //loop device//ba is írhatunk bootloadert | ''parted'' | Magas szintű UI-val (CLI) ellátott partíció manager (GParted ennek a GUI változata). Scriptelhető |} == BTRFS használati útmutató == A btrfs (Better FileSystem) egy verziókövető fájlrendszer. A felhas…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Szoftver követelmények

Csomag Leírás Tartalmazza az összes eszközt a btrfs fájlrendszerhez (//snapshot// készítés stb.) Segítségével //loop device//ba is írhatunk bootloadert Magas szintű UI-val (CLI) ellátott partíció manager (GParted ennek a GUI változata). Scriptelhető

BTRFS használati útmutató

A btrfs (Better FileSystem) egy verziókövető fájlrendszer. A felhasználó bármely pillanatban kérheti a fájlrendszerben található bármely mappa/fájl "mentését", úgynevezett //„snapshot”//, azaz pillanatkép létrehozásával. Ennek létrehozását követően a mappában található fájlokon vagy a kiválasztott fájlon történő módosítások a fizikai lemez más területére kerülnek, így a létrehozott pillanatképben elérjük a mentett állapotot.

    • Fontos** megjegyezni, hogy amennyiben egy fájlt letörlünk a a //snapshot// létrehozását követően, úgy a fájl a pillanatképből is el fog veszni.

Hasznos parancsok

A btrfs fájlrendszerében úgynevezett //subvolume//-ok jönnek létre. A root könyvtár egy nem kötelezett konvenció szerint //@// néven jön létre telepítéskor. Az egyéb //subvolume//-ok nevei ebből ágaznak el, pl. //@home// a ///home// könyvtárhoz tartozik.

Amennyiben a rendszert btrfs fájlrendszerre telepítettük, akkor a ///etc/fstab// állományt tanulmányozva látjuk, hogy meg kell nevezni az a csatolni kívánt //subvolume// nevét és a partíció UUID minden esetben ugyanaz. Ezek a //subvolume//-ok a rendszer tényleges gyökérkönyvtárában találhatók - a rendszer használata közben értendő root, azaz// / //könyvtár már a felcsatolt //subvolume// eredménye.

btrfs lemez gyökér felcsatolása mappába

A tényleges lemez gyökér felcsatolható a következő paranccsal: mount /dev/sdX /mnt. Amennyiben bele nézünk a ///mnt//
könyvtárba (ls /mnt), akkor azt fogjuk látni, hogy található benne egy //@// és egy //@home// könyvtár. Ezeket csatolja fel 

a rendszer indításkor az előbbiekben leírtak alapján.

Subvolume-ok listázása

A rendszerben elérhető //subvolume//-ok lekérdezhetők a btrfs subvolume list / paranccsal.

Snapshot készítés

A rendszerben //snapshot//-ot készíthetünk a btrfs subvolume snapshot @ /target/folder paranccsal, ahol a //@// az aktuális //subvolume// neve, amelyről a pillanatképet akarjuk készíteni, míg a ///target/folder/snapshot-name// a btrfs fájlrendszeren 
belül egy könyvtár, ahova a mentés kerülni fog //snapshot-name// néven. **Fontos**, hogy a cél mappa az adott btrfs fájlrendszeren belül kell legyen, különben hibát fog írni.

Fájlrendszer kiterjesztése

A btrfs fájlrendszer kiterjesztése a teljes lemezre a btrfs filesystem resize max / paranccsal történik, ahol ///// jelöli azt a fájlrendszert, amit ki szeretnénk terjeszteni. Ez esetben nem //subvolume//-ot jelöl!
   
Az általam használt mappa struktúra
Tegyük fel, hogy a lemez gyökér a ///mnt// könyvtárban van felcsatolva!
 * A //snapshot//-ok készítésének helye: ///mnt/snapshots//
 * A létrejött képfájl helye: ///mnt/tmp//
 * A létrejött képfájl neve: mindig a létrehozás ideje másodperc pontosan
Biztonsági mentés lépései
 - Konfigurációs szakasz
 - Snapshot létrehozás
 - Bináris képfájl létrehozás
 - Fájlrendszer létrehozása képfájlban
 - Snapshot tartalmának másolása képfájlba
 - Bootloader telepítés képfájlba
 - Eszközök leválasztása
 - Képfájl tömörítése

Konfigurációs szakasz

Ebben a részben létrehozzuk azokat a változókat, amiknek segítségével később egyszerűen át írhatjuk az egyes paramétereket - pl. képfájl mentésének helye, //snapshot// mentésének helye.

    • Konfigurációs változók:**

^ Változó ^ Jelentés ^ Alapérték ^ |mount_point |A lemez gyökér csatolási pontja |/mnt | |device |A csatolni kívánt eszköz |/dev/sda | |backup_dir |A képfájl (//loop device//) csatolási pontja |/save | |swapfile |A rendszerben található cserehely elérési útvonala |/swapfile | |backup_container |A képfájl elérési útonala |/mnt/tmp |


Amennyiben a megjelölt mappák nem léteznek, akkor a script automatikusan létrehozza azokat.

A dátum mentése is ebben a szakaszban történik, innentől minden fájl ezzel dolgozik!

<sxh bash>

  1. config files

mount_point="/mnt" device="/dev/sda1" backup_dir="/save" swapFile="/swapfile" backup_container="/mnt/tmp"

if ! test -d $backup_dir; then

   sudo mkdir -p $backup_dir

fi

if ! test -d $mount_point; then

   sudo mkdir -p $mount_point

fi

date=`date +"%Y-%m-%d_%H-%M-%S"` </sxh>

Snapshot létrehozás

 - Lemez gyökér csatolása a konfigurációs blokkban megadott könyvtárba
 - swapfile kikapcsolása
 - Lemez bufferek ürítése (sync)
 - Snapshot készítés a konfigurációs blokkban megadott útonalra
 - swapfile aktiválása
    • Amennyiben a swapflie-t nem kapcsoljuk ki, akkor a //snapshot// nem jön létre!**

Mivel létezik //@// és //@home// //subvolume// is, így mind a kettőt mentenünk kell külön-külön.

<sxh bash>

  1. mount root device to moint_point for creating snapshot

if ! mount | cut -f3 -d' ' | grep "${mount_point}$" > /dev/null; then

   echo "Mount root FS to $mount_point"
   sudo mount $device $mount_point

fi

  1. create btrfs snapshot

swapoff $swapFile sync echo "Create BTRFS snapshots..." sudo btrfs subvolume snapshot $mount_point/\@ $mount_point/snapshots/\@-$date sudo btrfs subvolume snapshot $mount_point/\@home $mount_point/snapshots/\@home-$date swapon $swapFile </sxh>

Bináris képfájl létrehozás

 - Rendszerben elfoglalt terület kiszámítása
 - Megfelelő méretű képfájl létrehozása
   - A touch segítségével létrehozhatunk egy üres állományt
   - A truncate --size=2GB kiterjeszti a fájlméretet pontosan 2GB-re
     - Az így kiterjesztett fájl nem foglalja le a lemezen ténylegesen a területet, folyamatosan növekszik a mérete. Másolásnál az üres helyeknél '\0'-t olvas ki és a cél helyen ténylegesen le foglalja a teljes méretet!

<sxh bash>

  1. calculate size of root device

rootDeviceSize=`lsblk -bo PATH,FSUSED | grep "$device" | cut -f2 -d' '` echo "Create $mount_point/tmp/$date.img with size: $rootDeviceSize"

  1. create backup image

sudo touch $mount_point/tmp/$date.img sudo truncate --size=$rootDeviceSize $mount_point/tmp/$date.img </sxh>

Fájlrendszer létrehozása képfájlban

 - Partíciók létrehozása képfájlban parted program segítségével
 - Képfájl használata, mint //loopback device//
   - losetup -P jelenti, hogy a partíciókat is keresse meg a fájlban
 - BTRFS fájlrendszer létrehozás
 - BTRFS //subvolume//-ok létrehozása


<sxh bash>

  1. create partitions in backup image

sudo parted $mount_point/tmp/$date.img mktable msdos sudo parted $mount_point/tmp/$date.img mkpart primary ext4 0% 100%

  1. setup backup image fs

sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img sudo mkfs.btrfs /dev/loop9p1

  1. create btrfs subvolumes

sudo mount /dev/loop9p1 $backup_dir sudo btrfs subvolume create $backup_dir/\@ sudo btrfs subvolume create $backup_dir/\@home </sxh>

Snapshot tartalmának másolása képfájlba

 - rsync futtatása
   - forrás: snapshot
   - cél: képfájl (//loopback device// csatolási pont)
   - Az rsync a cél helyen összeköti a hardlink-eket, a softlinkeket és beállítja a jogosultságokat
   - --sparse jelenti, hogy az üres helyeket ne másolja (ezzel lehet gyorsítani a folyamatot)
 - A képfájlban található ///etc/fstab// állományban UUID átírása a létrehozott partíció UUID-jére
 - //Snapshot//-ok törlése


<sxh bash>

  1. copy snapshot into image

sudo rsync -a -v -H -A -X --sparse --progress --human-readable --exclude="/swapfile" $mount_point/snapshots/\@-$date/* $backup_dir/\@/ sudo rsync -a -v -H -A -X --sparse --progress --human-readable $mount_point/snapshots/\@home-$date/* $backup_dir/\@home/

  1. change fstab UUID to new value

sudo sed -i s/`blkid | grep "sda" | cut -d'"' -f2`/`blkid | grep "loop9" | cut -d'"' -f2`/g $backup_dir/\@/etc/fstab

sudo btrfs subvolume delete $mount_point/snapshots/\@-$date sudo btrfs subvolume delete $mount_point/snapshots/\@home-$date

</sxh>

Bootloader telepítése képfájlba

 - Bootloader telepítéshez szükséges speciális területek csatolása képfájlba (mount --bind)
 - installGrub futtatása képfájlon belül chroot segítségével
 - A felcsatolt speciális területek leválasztása képfájlból


<sxh bash>

  1. install grub into image

sudo mount --bind /dev $backup_dir/\@/dev sudo mount --bind /proc $backup_dir/\@/proc sudo mount --bind /sys $backup_dir/\@/sys

sudo chroot $backup_dir/\@ installGrub

sleep 1s sudo umount $backup_dir/\@/dev sudo umount $backup_dir/\@/proc sudo umount $backup_dir/\@/sys </sxh>

Eszközök leválasztása

A //loopback device// lecsatolása a rendszerből, képfájl felszabadítása. Ezután mozgatható az elkészített másolat.

<sxh bash> umount /dev/loop9* losetup -d /dev/loop9 </sxh>

Képfájl tömörítése

<sxh bash> gzip $mount_point/tmp/$date.img </sxh>

Indítás után

Indítás után le kell futtatni a /bin/firstRun segéd script-et, ami létrehozza a swapfile-t, kiterjeszti a fájlrendszert a teljes lemez területre.

A script futtatása után a rendszer használható!

    • TODO**: Legyen ez a script automatikus indításban a képfájl létrehozásakor és az törölje ki magát onnan, amikor lefutott.
Scriptek

^ Név ^ Leírás ^ Futtatási jog ^ |/bin/createSnapshot |Snapshot készítés és képfájl létrehozás | root | |/bin/installGrub |Bootloadert installáló segéd script | chroot | |/bin/firstRun |Beállítások első futtatáskor | root |

Snapshot készítés és képfájl létrehozás

<sxh bash>

  1. !/bin/bash


  1. config files

mount_point="/mnt" device="/dev/sda1" backup_dir="/save" swapFile="/swapfile" backup_container="/mnt/tmp"

if ! test -d $backup_dir; then sudo mkdir -p $backup_dir fi

if ! test -d $mount_point; then sudo mkdir -p $mount_point fi

date=`date +"%Y-%m-%d_%H-%M-%S"`

  1. mount root device to moint_point for creating snapshot

if ! mount | cut -f3 -d' ' | grep "${mount_point}$" > /dev/null; then echo "Mount root FS to $mount_point" sudo mount $device $mount_point fi

  1. create btrfs snapshot

swapoff $swapFile sync echo "Create BTRFS snapshots..." sudo btrfs subvolume snapshot $mount_point/\@ $mount_point/snapshots/\@-$date sudo btrfs subvolume snapshot $mount_point/\@home $mount_point/snapshots/\@home-$date swapon $swapFile


  1. calculate size of root device

rootDeviceSize=`lsblk -bo PATH,FSUSED | grep "$device" | cut -f2 -d' '` echo "Create $mount_point/tmp/$date.img with size: $rootDeviceSize"

  1. create backup image

sudo touch $mount_point/tmp/$date.img sudo truncate --size=$rootDeviceSize $mount_point/tmp/$date.img

  1. create partitions in backup image

sudo parted $mount_point/tmp/$date.img mktable msdos sudo parted $mount_point/tmp/$date.img mkpart primary ext4 0% 100%

  1. setup backup image fs

sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img sudo mkfs.btrfs /dev/loop9p1

  1. create btrfs subvolumes

sudo mount /dev/loop9p1 $backup_dir sudo btrfs subvolume create $backup_dir/\@ sudo btrfs subvolume create $backup_dir/\@home

  1. copy snapshot into image

sudo rsync -a -v -H -A -X --sparse --progress --human-readable --exclude="/swapfile" $mount_point/snapshots/\@-$date/* $backup_dir/\@/ sudo rsync -a -v -H -A -X --sparse --progress --human-readable $mount_point/snapshots/\@home-$date/* $backup_dir/\@home/

  1. change fstab UUID to new value

sudo sed -i s/`blkid | grep "sda" | cut -d'"' -f2`/`blkid | grep "loop9" | cut -d'"' -f2`/g $backup_dir/\@/etc/fstab

sudo btrfs subvolume delete $mount_point/snapshots/\@-$date sudo btrfs subvolume delete $mount_point/snapshots/\@home-$date


  1. install grub into image

sudo mount --bind /dev $backup_dir/\@/dev sudo mount --bind /proc $backup_dir/\@/proc sudo mount --bind /sys $backup_dir/\@/sys

sudo chroot $backup_dir/\@ installGrub

sleep 1s sudo umount $backup_dir/\@/dev sudo umount $backup_dir/\@/proc sudo umount $backup_dir/\@/sys

umount /dev/loop9* losetup -d /dev/loop9

gzip $mount_point/tmp/$date.img

</sxh>

Bootloader installáló segéd script

<sxh bash>

  1. !/bin/bash

mount /dev/loop9p1 / update-grub grub-install /dev/loop9 umount /dev/loop9 </sxh>

Beállítások első futtatáskor

<sxh bash>

  1. !/bin/bash

swapSize="2G"

echo -e "p\nd 1\nn\np\n\n\n\nn\np\nw\n" | fdisk /dev/sda btrfs filesystem resize max /

touch /swapfile

  1. copy on write (cow) kikapcsolás a fájlhoz

chattr +C /swapfile dd if=/dev/zero of=/swapfile bs=100M count=20

mkswap /swapfile swapon /swapfile </sxh>