COMP::OmegaByte::Linux biztonsági mentés (online)
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 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
<sxh bash>
- !/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
</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>