2024. április 20., szombat

Gyorskeresés

Raspberry PI - SD / USB image backup, helytakarékos módon

Írta: | Kulcsszavak: raspberry . pi . image . backup . mini . bash . szkript

[ ÚJ BEJEGYZÉS ]

Előző cikkemben minimal rendszerrel foglalkoztam, most itt az idő, hogy a lehető legkevesebb helyet felhasználva elkészítsük a teljes rendszerünk mentését egy állományba, amit aztán pont úgy ki tudunk írni, mint a hivatalosakat.

A Windowsos image kezelő program és a Linuxos DD-s megoldás egyformán alkalmatlan erre a feladatra, mert az állományok mellett az üres területet is lementik.

Írtam egy Bash szkriptet Linuxra, ami másként ment, kihasználja az rsync parancs képességeit.

Lényegében annyit csinál a szkript, hogy miután megmutattuk neki az SD kártya elérési útját, amiben segít a szkript az fdisk -l paranccsal, megállapítja, hogy mennyi a foglalt hely, ehhez képest csak pár Mb-vel nagyobb méretű image fájlt készít egy munka könyvtárba, abba átmenti az első partíciót (boot) kompletten, majd pedig az EXT4-es partíciót is, a már megfelelően kicsire választott állományba.
Az így készült image simán kiírható bármivel, amivel eddig is írtuk ki a képfájlokat, aztán majd ki lehet terjeszteni a fájlrendszert az aktuális SD kártyánk méretére.

Hogy számokat is említsek, például az 1.9G-s képfájlban érkező minimal image [link] elfért egy 550Mb körüli állományban is. Minél nagyobb SD kártyát használunk, vagy minél több az üres hely rajta, annál nagyobb lesz a különbség.

#!/bin/bash

#GPL v3 Licensz érvényes erre a szkriptre. Író: CPT.Pirk
#Köszönet bambano, Jester01, vadoca és azbest kollégáknak a prohardver.hu fórumából.
#
#Nem vagyok se programozó, se informatikus, kérem ezek szerint kezelni a szkriptet.
#Azért született meg ez a szkript, mert nem találtam nekem megfelelő megoldást az image fájl
#méretének csökkentésére.

#deklarációk
PROGRAM=`basename $0`
SDCARD=`basename $1`
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
WORKDIR="$DIR/rpi_shrink"
IMAGEFILE="$WORKDIR/RASPBERRY_PI_SHRINKED_IMAGE.IMG"

#root ellenőrzés
if [ "$(id -u)" != "0" ];
then
echo -e "$PROGRAM program futtatásához root jogokra van szükséged.\n"
exit 1
fi

#használati útmutató
function usage
{
clear
echo "#########################################################################"
echo "# Raspbery PI image shrink script #"
echo "# #"
echo "# Ez a szkript le fogja menteni a Raspberry PI memóriakártyájának #"
echo "# mindkét particióját egy image állományba, az üres terület mentése #"
echo "# nélkül, igy lehetőséged lesz az eredetinél kisebb memóriakártya #"
echo "# használatára, amikor kiirod újra az image-t. #"
echo "# #"
echo "# Első verzió, használd a saját felelőségedre, megeheti a hörcsögödet #"
echo "# #"
echo "#########################################################################"
echo ""
echo " SD kártya: $SDCARD"
echo " Munka könyvtár: $WORKDIR"
echo " Elkészitendő image fájl neve: $IMAGEFILE"
echo ""
echo " Kezdődhet a folyamat? (igen/nem):"
echo ""
read resp
if [ "$resp" = "i" ] || [ "$resp" = "igen" ]
then
clear
else
clear
echo "A program leállt."
exit 1
fi
#exit 0
}

#első használatkor ez jön be
if [ -z "$1" ]; then
clear
echo "#########################################################################"
echo "# Raspbery PI image shrink script #"
echo "# #"
echo "# Kérlek add meg az SD kártya elérési utját, amit az fstab #"
echo "# kimenetében látsz. Ez valószínüleg /dev/mmcblk0 lesz. #"
echo "# #"
echo "# formátum: sudo ./rpi_shrink.sh /dev/mmcblk0 #"
echo "# #"
echo "#########################################################################"
fdisk -l
exit 1
else
usage
fi

#munka könyvtár rendezése
if [ -f $IMAGEFILE ]; then
echo ""
echo "A korábbi munka könyvtár és tartalma törölve."
umount /dev/$SDCARD'p1'
umount /dev/$SDCARD'p2'
umount $LOOPDEVICE'p1'
umount $LOOPDEVICE'p2'
rm -rf -- $WORKDIR
losetup -D
fi
mkdir $WORKDIR
cd $WORKDIR

#átmeneti tároló mappák létrehozása
mkdir SRC_PART1 SRC_PART2 DST_PART1 DST_PART2

#felcsatoljuk az SD partíciókat a fájlrendszerbe a df -h számára és a későbbiekhez
sudo mount /dev/$SDCARD'p1' SRC_PART1
sudo mount /dev/$SDCARD'p2' SRC_PART2


#forrás partíciók adatainak beolvasása
SRC_PART1_MAX=`df -h $WORKDIR/SRC_PART1 | tail -1 | awk '{print $2}'`
SRC_PART1_USED=`df -h $WORKDIR/SRC_PART1 | tail -1 | awk '{print $3}'`
SRC_PART1_TYPE=`parted /dev/$SDCARD -ms p \ | grep "^1" | cut -f 5 -d:`
SRC_PART2_MAX=`df -h $WORKDIR/SRC_PART2 | tail -1 | awk '{print $2}'`
SRC_PART2_USED=`df -h $WORKDIR/SRC_PART2 | tail -1 | awk '{print $3}'`
SRC_PART2_TYPE=`parted /dev/$SDCARD -ms p \ | grep "^2" | cut -f 5 -d:`

#IMG fájl méretének kiszámítása
DEST_PART2_MINIMUM_BYTE=`df $WORKDIR/SRC_PART2 | tail -1 | awk '{print $3 + 10000}'`
DEST_PART2_MINIMUM=`df $WORKDIR/SRC_PART2 | tail -1 | awk '{print $3 / 1024 + 5 + '$SRC_PART1_MAX'}'`

#IMG fájl áttekintő
clear
echo "#########################################################################"
echo " Raspberry PI image shrink script"
echo ""
echo "Az SD kártya 'boot' particiójának teljes mérete: $SRC_PART1_MAX ebből használt: $SRC_PART1_USED fájlrendszere: $SRC_PART1_TYPE "
echo "Az SD kártya 'root fájlrendszer' particiójának teljes mérete: $SRC_PART2_MAX ebből használt: $SRC_PART2_USED fájlrendszere: $SRC_PART2_TYPE "
echo ""
echo "Az iso fájl mérete $DEST_PART2_MINIMUM MB lesz."
echo ""
echo " Kezdődhet az image fájl készítése? (igen/nem):"
echo ""
read resp
if [ "$resp" = "i" ] || [ "$resp" = "igen" ]
then
clear
else
clear
umount /dev/$SDCARD'p1'
umount /dev/$SDCARD'p2'
echo "A program leállt."
exit 1
fi
#IMG fájl létrehozása, loop eszközként csatolása
echo ""
dd if=/dev/zero of=$IMAGEFILE bs=1 count=0 seek=${DEST_PART2_MINIMUM%%.*}'M'
dir

#megnézzük hol ér véget az első partíció, hogy azt követően indulhasson a második
echo ""
#P1_START=`fdisk -l /dev/$SDCARD | grep /dev/$SDCARD'p1' | awk '{print $2}'`
P1_END=`fdisk -l /dev/$SDCARD | grep /dev/$SDCARD'p1' | awk '{print $3}'`
#P2_START=`fdisk -l /dev/$SDCARD | grep /dev/$SDCARD'p2' | awk '{print $2}'`

#echo "$P1_START $P1_END $P2_START"

#exit 1
#partíciók létrehozása az IMG fájlban, boot flag, Fat32 LBA típus az első partíciónak
(echo n; echo p; echo 1; echo; echo $P1_END; echo w) | fdisk -c $IMAGEFILE #par1
(echo n; echo p; echo 2; echo; echo; echo w) | fdisk -c $IMAGEFILE #part2
(echo a; echo 1; echo t; echo 1; echo c; echo w) | fdisk -c $IMAGEFILE #fat32 LBA, boot flag

#nem biztos, hogy a loop modul be van töltve
echo ""
modprobe loop

#loop eszköz rögzítése a kimenetről
LOOPDEVICE=`losetup -f --show $IMAGEFILE`
echo "$LOOPDEVICE"

#partíciók fájlrendszerének kialakítása
echo ""
partx -a -v $LOOPDEVICE
echo ""
mkfs.vfat -F 32 -I $LOOPDEVICE'p1'
echo ""
mkfs.ext4 $LOOPDEVICE'p2'
#-n boot -L root

#csatoljuk a loop eszközt a másoláshoz
echo ""
mount $LOOPDEVICE'p1' DST_PART1
mount $LOOPDEVICE'p2' DST_PART2

echo "Másolás megkezdése"
rsync -vah SRC_PART1/ DST_PART1
echo ""
rsync -vah SRC_PART2/ DST_PART2
echo ""
echo "Másolás kész."

echo ""
umount $LOOPDEVICE'p1'
umount $LOOPDEVICE'p2'
umount /dev/$SDCARD'p1'
umount /dev/$SDCARD'p2'

rm -rf SRC_PART1 SRC_PART2 DST_PART1 DST_PART2
cd ..
clear
echo "#########################################################################"
echo " Raspberry PI image shrink script"
echo ""
echo " Másolás kész."
echo ""
echo ""
echo "Az imgage fájlt bármikor kiírhatod az alábbi paranccsal egy SD kártyára:"
echo "sudo dd bs=4M if=~/rpi_shrink/RASPBERRY_PI_SHRINKED_IMAGE.IMG of=/dev/mmcblk0"
echo "mmcblk0 helyére az SD kártyád nevét írd. A sudo fdisk -l parancs megmutatja."
echo ""
losetup -D
exit 0

Ez az első, működő verzió. Nyilván vannak benne szebben megoldható részek, így minden ötletet szívesen fogadok a további fejlesztésére.

Használat: kimásolod a pastebin oldalán a "RAW" területről a kódot (a színes nem lesz jó), beteszed egy valami.sh fájlba, futtathatóvá teszed (sudo chmod a+x valami.sh), majd futtatod (./valami.sh), onnan már egyértelmű, kétszer is rá fog kérdezni, hogy mehet-e a dolog.
Futási idő az SD kártyától függ, egy mai, gyors kártyán hamar végez.

Hozzászólások

(#1) vzoltan


vzoltan
aktív tag

:)

(#2) bambano


bambano
titán
LOGOUT blog

megeheti a hörcsögödet rotfl :)

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#3) CPT.Pirk válasza bambano (#2) üzenetére


CPT.Pirk
Jómunkásember

Ez kedvenc Linux disztrómból van, annak a telepítő programja indul így, hogy "alpha version, will eat your hamster". ;]

Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)

(#4) JoeYi


JoeYi
őstag

egy gzip-et még rátolhatsz, és még kisebb lesz

(#5) CPT.Pirk válasza JoeYi (#4) üzenetére


CPT.Pirk
Jómunkásember

Úgy voltam vele, hogy az már legyen a felhasználó dolga.

Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)

(#6) bacsomarton


bacsomarton
tag

Először is nagyon köszönöm a munkád! Rengeteg bosszúságtól mentene meg a script, de sajnos nem működik rendesen. :-( Tudnál esetleg segíteni?

Lehet, hogy az eltelt évek alatt változott valami a programok működésében, mindenesetre a vége előtt ezt dobja ki a rendszer:

rsync: write failed on "/root/rpi_shrink/DST_PART2/root/rpi_shrink/RASPBERRY_PI_SHRINKED_IMAGE.IMG": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(393) [receiver=3.1.1]

Az IMG fájlt létrehozza és ki is takarít maga után, de ha kiírom egy SD kártyára a produktumot, akkor a bootolási szakaszban kiakad.

Alapvetően egy Jessie Light -ot szeretnék lementeni (Radius szerver fut rajta), de kipróbáltam egy teljes rendszeren is és a végeredmény ugyan az.

Márton

(#7) bacsomarton válasza bacsomarton (#6) üzenetére


bacsomarton
tag

Ha javítani nem is tudtam a dolgon, sikerült egy másik megoldást találnom, ami már nekem is működött.

http://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/

A végcél azonos, azonban a koncepció más: a Win32DiskImager -el létrehozott IMG fájl méretét csökkenti le...

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.