„COMP::OmegaByte::Linux biztonsági mentés (online)” változatai közötti eltérés
(Ú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 ( | |- | ||
| ''grub2'' | Segítségével | | ''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 | 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 === | === Hasznos parancsok === | ||
A btrfs fájlrendszerében úgynevezett | 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 | 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// 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. | |||
==== 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á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 ==== | ==== 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 ===== | =====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 ===== | ===== 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 === | === 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, | 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''': | |||
{| 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! | ||
#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"` | ||
=== 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 | 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 | |||
# 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 | ||
=== 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 | |||
# 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 | ||
=== 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 | |||
# 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 | ||
=== 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 | |||
# 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/ | ||
sudo | # 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 | |||
# 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 | ||
=== Eszközök leválasztása === | |||
A | 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 | |||
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. | 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. | |||
== 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 | |||
=== 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 | |||
#!/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 | |||
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