„COMP::OmegaByte::Linux biztonsági mentés (online)” változatai közötti eltérés

Innen: Farkas Attila Wiki
Ugrás a navigációhoz Ugrás a kereséshez
(Ú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…”)
 
Nincs szerkesztési összefoglaló
 
(10 közbenső módosítás ugyanattól a szerkesztőtől nincs mutatva)
1. sor: 1. sor:
[[category:COMP]]
[[category:COMP::OmegaByte]]
[[category:Linux]]
[[category:btrfs]]
[[category:backup]]
== Szoftver követelmények ==
== Szoftver követelmények ==
{|
{| class="wikitable"
| Csomag ||  Leírás
| 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
| ''btrfs-progs'' || Tartalmazza az összes eszközt a btrfs fájlrendszerhez (''snapshot'' készítés stb.)
| ''parted'' | Magas szintű UI-val (CLI) ellátott partíció manager (GParted ennek a GUI változata). Scriptelhető  
|-
| ''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ó ==
== 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.
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.
'''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 ===
=== 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.
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.
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 ====
==== 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//
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  
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.
a rendszer indításkor az előbbiekben leírtak alapján.


==== Subvolume-ok listázása ====
==== Subvolume-ok listázása ====
A rendszerben elérhető //subvolume//-ok lekérdezhetők a ''btrfs subvolume list /'' paranccsal.
A rendszerben elérhető ''subvolume''-ok lekérdezhetők a ''btrfs subvolume list /'' paranccsal.


==== Snapshot készítés ====
==== 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
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ájlrendszerenn 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.
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 ====
==== 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!
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 =====
=====Az általam használt mappa struktúra =====
Tegyük fel, hogy a lemez gyökér a ///mnt// könyvtárban van felcsatolva!
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 ''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 helye: ''/mnt/tmp''
  * A létrejött képfájl neve: mindig a létrehozás ideje másodperc pontosan
* A létrejött képfájl neve: mindig a létrehozás ideje másodperc pontosan


===== Biztonsági mentés lépései =====
===== Biztonsági mentés lépései =====
  - Konfigurációs szakasz
* Konfigurációs szakasz
  - Snapshot létrehozás
* Snapshot létrehozás
  - Bináris képfájl létrehozás
* Bináris képfájl létrehozás
  - Fájlrendszer létrehozása képfájlban
* Fájlrendszer létrehozása képfájlban
  - Snapshot tartalmának másolása képfájlba
* Snapshot tartalmának másolása képfájlba
  - Bootloader telepítés képfájlba
* Bootloader telepítés képfájlba
  - Eszközök leválasztása
* Eszközök leválasztása
  - Képfájl tömörítése
* Képfájl tömörítése


=== Konfigurációs szakasz ===
=== 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.
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  |


'''Konfigurációs változók''':
{| class="wikitable"
| 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.
Amennyiben a megjelölt mappák nem léteznek, akkor a script automatikusan létrehozza azokat.
65. sor: 76. sor:
A dátum mentése is ebben a szakaszban történik, innentől minden fájl ezzel dolgozik!
A dátum mentése is ebben a szakaszban történik, innentől minden fájl ezzel dolgozik!


<sxh bash>
#config files
#config files
mount_point="/mnt"
mount_point="/mnt"
device="/dev/sda1"
device="/dev/sda1"
backup_dir="/save"
backup_dir="/save"
swapFile="/swapfile"
swapFile="/swapfile"
backup_container="/mnt/tmp"
backup_container="/mnt/tmp"
 
   
  if ! test -d $backup_dir; then
if ! test -d $backup_dir; then
     sudo mkdir -p $backup_dir
     sudo mkdir -p $backup_dir
fi
fi
   
   
if ! test -d $mount_point; then
if ! test -d $mount_point; then
     sudo mkdir -p $mount_point
     sudo mkdir -p $mount_point
fi
fi
   
   
date=`date +"%Y-%m-%d_%H-%M-%S"`
date=`date +"%Y-%m-%d_%H-%M-%S"`
</sxh>
 
==== Snapshot létrehozás ====
=== Snapshot létrehozás ===
  - Lemez gyökér csatolása a konfigurációs blokkban megadott könyvtárba
* Lemez gyökér csatolása a konfigurációs blokkban megadott könyvtárba
  - swapfile kikapcsolása
* swapfile kikapcsolása
  - Lemez bufferek ürítése (''sync'')
* Lemez bufferek ürítése (''sync'')
  - Snapshot készítés a konfigurációs blokkban megadott útonalra
* Snapshot készítés a konfigurációs blokkban megadott útonalra
  - swapfile aktiválása
* swapfile aktiválása


**Amennyiben a swapflie-t nem kapcsoljuk ki, akkor a //snapshot// nem jön létre!**
'''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.
Mivel létezik ''@'' és ''@home'' ''subvolume'' is, így mind a kettőt mentenünk kell külön-külön.


<sxh bash>
# mount root device to moint_point for creating snapshot
# mount root device to moint_point for creating snapshot
if ! mount | cut -f3 -d' ' | grep "${mount_point}$" > /dev/null; then
if ! mount | cut -f3 -d' ' | grep "${mount_point}$" > /dev/null; then
     echo "Mount root FS to $mount_point"
     echo "Mount root FS to $mount_point"
     sudo mount $device $mount_point
     sudo mount $device $mount_point
fi
fi
   
   
# create btrfs snapshot
# create btrfs snapshot
swapoff $swapFile
swapoff $swapFile
sync
sync
echo "Create BTRFS snapshots..."
echo "Create BTRFS snapshots..."
sudo btrfs subvolume snapshot $mount_point/\@ $mount_point/snapshots/\@-$date
sudo btrfs subvolume snapshot $mount_point/\@ $mount_point/snapshots/\@-$date
sudo btrfs subvolume snapshot $mount_point/\@home $mount_point/snapshots/\@home-$date
sudo btrfs subvolume snapshot $mount_point/\@home $mount_point/snapshots/\@home-$date
swapon $swapFile
swapon $swapFile
</sxh>
 
==== Bináris képfájl létrehozás ====
=== Bináris képfájl létrehozás ===
  - Rendszerben elfoglalt terület kiszámítása
* Rendszerben elfoglalt terület kiszámítása
  - Megfelelő méretű képfájl létrehozása
* Megfelelő méretű képfájl létrehozása
    - A ''touch'' segítségével létrehozhatunk egy üres állományt
** A ''touch'' segítségével létrehozhatunk egy üres állományt
    - A ''truncate --size=2GB'' kiterjeszti a fájlméretet pontosan 2GB-re
** 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!
*** 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>
# calculate size of root device
# calculate size of root device
rootDeviceSize=`lsblk -bo PATH,FSUSED | grep "$device"  | cut -f2 -d' '`
rootDeviceSize=`lsblk -bo PATH,FSUSED | grep "$device"  | cut -f2 -d' '`
echo "Create $mount_point/tmp/$date.img with size: $rootDeviceSize"
echo "Create $mount_point/tmp/$date.img with size: $rootDeviceSize"
   
   
# create backup image
# create backup image
sudo touch $mount_point/tmp/$date.img
sudo touch $mount_point/tmp/$date.img
sudo truncate --size=$rootDeviceSize $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


=== 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>
# create partitions in backup image
# create partitions in backup image
sudo parted $mount_point/tmp/$date.img mktable msdos
sudo parted $mount_point/tmp/$date.img mktable msdos
sudo parted $mount_point/tmp/$date.img mkpart primary ext4 0% 100%
sudo parted $mount_point/tmp/$date.img mkpart primary ext4 0% 100%
   
   
# setup backup image fs
# setup backup image fs
sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img
sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img
sudo mkfs.btrfs /dev/loop9p1
sudo mkfs.btrfs /dev/loop9p1
   
   
# create btrfs subvolumes
# create btrfs subvolumes
sudo mount /dev/loop9p1 $backup_dir
sudo mount /dev/loop9p1 $backup_dir
sudo btrfs subvolume create $backup_dir/\@
sudo btrfs subvolume create $backup_dir/\@
sudo btrfs subvolume create $backup_dir/\@home
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


=== 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>
# copy snapshot into image
# copy snapshot into image
sudo rsync -a -v -H -A -X --sparse --progress --human-readable --exclude="/swapfile" $mount_point/snapshots/\@-$date/*  
sudo rsync -a -v -H -A -X --sparse --progress --human-readable --exclude="/swapfile" $mount_point/snapshots/\@-$date/* $backup_dir/\@/
$backup_dir/\@/
sudo rsync -a -v -H -A -X --sparse --progress --human-readable $mount_point/snapshots/\@home-$date/* $backup_dir/\@home/
sudo rsync -a -v -H -A -X --sparse --progress --human-readable $mount_point/snapshots/\@home-$date/* $backup_dir/\@home/
# 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
# change fstab UUID to new value
sudo btrfs subvolume delete $mount_point/snapshots/\@home-$date
sudo sed -i s/`blkid | grep "sda" | cut -d'"' -f2`/`blkid | grep "loop9" | cut -d'"' -f2`/g $backup_dir/\@/etc/fstab
   
   
</sxh>
sudo btrfs subvolume delete $mount_point/snapshots/\@-$date
==== Bootloader telepítése képfájlba ====
sudo btrfs subvolume delete $mount_point/snapshots/\@home-$date
  - 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


=== 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>
# install grub into image
# install grub into image
sudo mount --bind /dev $backup_dir/\@/dev
sudo mount --bind /dev $backup_dir/\@/dev
sudo mount --bind /proc $backup_dir/\@/proc
sudo mount --bind /proc $backup_dir/\@/proc
sudo mount --bind /sys $backup_dir/\@/sys
sudo mount --bind /sys $backup_dir/\@/sys
   
   
sudo chroot $backup_dir/\@ installGrub
sudo chroot $backup_dir/\@ installGrub
   
   
sleep 1s
sleep 1s
sudo umount $backup_dir/\@/dev
sudo umount $backup_dir/\@/dev
sudo umount $backup_dir/\@/proc
sudo umount $backup_dir/\@/proc
sudo umount $backup_dir/\@/sys
sudo umount $backup_dir/\@/sys
</sxh>
 
==== Eszközök leválasztása ====
=== 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.
A ''loopback device'' lecsatolása a rendszerből, képfájl felszabadítása. Ezután mozgatható az elkészített másolat.
 
umount /dev/loop9*
losetup -d /dev/loop9


<sxh bash>
=== Képfájl tömörítése ===
umount /dev/loop9*
gzip $mount_point/tmp/$date.img
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 ===


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.
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.
206. sor: 205. sor:
A script futtatása után a rendszer használható!
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.
'''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>
#!/bin/bash


== Scriptek ==
{| class="wikitable"
| 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
|}


#config files
=== Snapshot készítés és képfájl létrehozás ===
mount_point="/mnt"
#!/bin/bash
device="/dev/sda1"
#config files
backup_dir="/save"
mount_point="/mnt"
swapFile="/swapfile"
device="/dev/sda1"
backup_container="/mnt/tmp"
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"`
# 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
# 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
# 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"
# create backup image
sudo touch $mount_point/tmp/$date.img
sudo truncate --size=$rootDeviceSize $mount_point/tmp/$date.img
# 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%
# setup backup image fs
sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img
sudo mkfs.btrfs /dev/loop9p1
# create btrfs subvolumes
sudo mount /dev/loop9p1 $backup_dir
sudo btrfs subvolume create $backup_dir/\@
sudo btrfs subvolume create $backup_dir/\@home
# 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/
# 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
# 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
=== Bootloader installáló segéd script ===
#!/bin/bash
mount /dev/loop9p1 /
update-grub
grub-install /dev/loop9
umount /dev/loop9


if ! test -d $backup_dir; then
=== Beállítások első futtatáskor ===
sudo mkdir -p $backup_dir
#!/bin/bash
fi
swapSize="2G"
 
if ! test -d $mount_point; then
echo -e "p\nd 1\nn\np\n\n\n\nn\np\nw\n" | fdisk /dev/sda
sudo mkdir -p $mount_point
btrfs filesystem resize max /
fi
 
touch /swapfile
date=`date +"%Y-%m-%d_%H-%M-%S"`
# copy on write (cow) kikapcsolás a fájlhoz
 
chattr +C /swapfile
# mount root device to moint_point for creating snapshot
dd if=/dev/zero of=/swapfile bs=100M count=20
if ! mount | cut -f3 -d' ' | grep "${mount_point}$" > /dev/null; then
echo "Mount root FS to $mount_point"
mkswap /swapfile
sudo mount $device $mount_point
swapon /swapfile
fi
 
# 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
 
 
# 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"
 
# create backup image
sudo touch $mount_point/tmp/$date.img
sudo truncate --size=$rootDeviceSize $mount_point/tmp/$date.img
 
# 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%
 
# setup backup image fs
sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img
sudo mkfs.btrfs /dev/loop9p1
 
# create btrfs subvolumes
sudo mount /dev/loop9p1 $backup_dir
sudo btrfs subvolume create $backup_dir/\@
sudo btrfs subvolume create $backup_dir/\@home
 
# 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/
 
# 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
 
 
# 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>
#!/bin/bash
mount /dev/loop9p1 /
update-grub
grub-install /dev/loop9
umount /dev/loop9
</sxh>
 
==== Beállítások első futtatáskor ====
<sxh bash>
#!/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
# 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>

A lap jelenlegi, 2023. július 13., 10:24-kori változata

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 deviceba 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 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ájlrendszerenn 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!

#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"`

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.

# 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

# 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

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

# create backup image
sudo touch $mount_point/tmp/$date.img
sudo truncate --size=$rootDeviceSize $mount_point/tmp/$date.img

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

# setup backup image fs
sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img
sudo mkfs.btrfs /dev/loop9p1

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

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

# 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

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

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.

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

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

gzip $mount_point/tmp/$date.img

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

#!/bin/bash
#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"`

# 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

# 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

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

# create backup image
sudo touch $mount_point/tmp/$date.img
sudo truncate --size=$rootDeviceSize $mount_point/tmp/$date.img

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

# setup backup image fs
sudo losetup -P /dev/loop9 $mount_point/tmp/$date.img
sudo mkfs.btrfs /dev/loop9p1

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

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

# 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

# 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

Bootloader installáló segéd script

#!/bin/bash
mount /dev/loop9p1 /
update-grub
grub-install /dev/loop9
umount /dev/loop9

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

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