btrfs Skript anpassen

Hallo @TomZ ,

leider funktioniert die Zählschleife bei mir nicht und ich bin zu blöd eine Lösung zu finden :wink: (Schuhe zubinden klappt aber prima mit Schleife)

Habe einiges durch probiert aber leider ...
Fehlende Leerzeichen eingefügt sowie durch "markdown" enstandene entfernt.

Ich bekomme

/home/sgs/.local/bin/snapshots: Zeile 68: ${#files[]}: Falsche Substitution.

Mit

${$files[]}

#!/bin/bash
#!/bin/sh
In terminal zsh and bash. Mit verschiedenen Klammern Leerzeichen versucht aber ich bekomme es nicht hin.

Leider werde ich es wohl nie lernen :wink:

snapshots                                                                                                         [1]
[sudo] Passwort für sgs: 
++ date +%Y-%m-%d
+ snap=/mnt/snapshots/@_2020-02-15
++ date +%Y-%m-%d
+ snaphome=/mnt/snapshots/@home_2020-02-15
+ backup=/run/media/sgs/TS-sdd3-btrfs
++ date +%Y-%m-%d
+ snap2=/run/media/sgs/TS-sdd3-btrfs/@_2020-02-15
++ date +%Y-%m-%d
+ snap3=/run/media/sgs/TS-sdd3-btrfs/@home_2020-02-15
+ mp=/mnt/snapshots
+ '[' '!' -d /mnt/snapshots/@_2020-02-15 ']'
+ echo 'W: Updating snap!'
W: Updating snap!
+ btrfs subvolume delete /mnt/snapshots/@_2020-02-15
Delete subvolume (no-commit): '/mnt/snapshots/@_2020-02-15'
+ btrfs su snapshot -r /mnt/@ /mnt/snapshots/@_2020-02-15
Create a readonly snapshot of '/mnt/@' in '/mnt/snapshots/@_2020-02-15'
+ echo 'I: Snapshot updated!'
I: Snapshot updated!
+ '[' '!' -d /run/media/sgs/TS-sdd3-btrfs/@_2020-02-15 ']'
+ echo 'Send snap2'
Send snap2
+ files=($mp/@)
/home/sgs/.local/bin/snapshots: Zeile 68: ${#files[]}: Falsche Substitution.

Hättest du eine Ergänzung für die Forengemeinschaft evtl. auch im Tutorialbereich?

Wenn ich die "Schleife" raus nehme funktioniert alles :slight_smile:

Ich bin selber auch kein Experte auf dem Gebiet aber versuchen wir's mal. Mir scheint Dir fehlt ein * in den eckigen [*]?

Dieses Script funktioniert bei mir (zsh):

tmp="/mnt/snapshots/@_*"
files=($tmp)
echo "All snapshots:"
echo ${files[*]} 
echo "Oldest snapshot:"
echo ${files[0]}

Ich habe es der Einfachheit halber mal x.sh genannt:

$ ./x.sh
All snapshots:
/mnt/snapshots/@_2020-02-09 /mnt/snapshots/@_2020-02-11 /mnt/snapshots/@_2020-02-12 /mnt/snapshots/@_2020-02-14
Oldest snapshot:
/mnt/snapshots/@_2020-02-09

Komischerweise funktioniert das aber nur als Script, nicht wenn ich die Befehle manuell ausführe.
Die Ermittlung des ältesten Snapshots auf diese Weise ist aber eh keine saubere Lösung, das muss eleganter gehen, aber da es bisher bei mir funktioniert hat habe ich mir die Mühe noch nicht gemacht dass umzuschreiben.

1 Like

Danke für die schnelle Antwort :slight_smile:

Da dein Script nicht in </> war, sind da irgendwie neue Leerzeichen und markdown (kursiv) Sachen entstanden die ich als erste gelöscht und dann vergessen habe :smiley: :wink: :slight_smile:

Jetzt bin ich fertig, nachdem ich den Fehler beim ersten Durchlauf (nur ein snapshot vorhanden) abgefangen habe, und alles läuft (bis jetzt :smiley: ).

Vielen Dank :slight_smile:

Stunden der Mühe :wink: und Freude. :slight_smile:


Solution #2

Sieh Dir mal dass hier an:

versions=5
       list=$(ls -rd /mnt/snapshots/* | awk 'NR>'$versions)
        if [ "$list" == "" ]
              then
                echo "I: No old snapshots to delete""
        else
                btrfs subvolume delete $list
        fi

Wesentlich sauberer wie die obige Version.
Bitte erst mit 'echo $list' anstatt 'subvolume delete' ausprobieren, nicht dass Dir die ganzen Snapshots weggebügelt werden.

1 Like

Das mit dem wegbügeln habe ich schon erledigt :wink:
Wenn man den Timeshift Ordner löscht reisst es alles mit in die Tiefe (da war der Wurm drin, verschachtelte updates), bin gerade dabei meine externen snapshots zu installieren, schaun mer mal :wink:

1 Like
/mnt >>> sudo btrfs subv list /                                                                                          
ID 256 gen 252 top level 5 path @
ID 257 gen 252 top level 5 path @home
ID 275 gen 242 top level 256 path mnt/snapshot
ID 276 gen 252 top level 275 path mnt/snapshot/@_2020-02-17
ID 286 gen 248 top level 275 path mnt/snapshot/@home_2020-02-17

Jetzt muss ich snapshots rw 'en und nach oben schieben? Wie ??? :slight_smile:
Vorher @ + @home umbenennen.

Wenn du von einem RO Snapshot ein Snapshot machst, dann wird dieser RW sein.
Vorher wahrscheinlich dein Ziel umbenennen (mv) oder löschen.

1 Like

Jep, erst war die UUID falsch (=neu, fstab) dann hatte ich vergessen das "@home ro false" zu setzen, ging aber über TTY.

Wie sagte Bobbele mal so schön: Bin ich schon drin :smiley:

So alles gut, mal sehen ob Timeshift mit grub-btrfs funzt.

Ich habe versucht alles in ein Script zu packen, dabei sind mir, natürlich :wink: , Fehler unterlaufen.
Ich werde es mal mit getrennten versuchen für @ und @home.

1 Like

Immer noch nicht. ???
Naja nach update-grub etc. muss ich halt ${prefix} ändern.


Soweit bin ich bisher.

~ >>> sudo btrfs subv list /                                                                          
[sudo] Passwort für sgs: 
ID 276 gen 1078 top level 5 path @
ID 289 gen 1078 top level 5 path @home
ID 291 gen 479 top level 5 path timeshift-btrfs/snapshots/2020-02-17_13-13-42/@
ID 292 gen 481 top level 5 path timeshift-btrfs/snapshots/2020-02-17_13-13-42/@home
ID 295 gen 559 top level 5 path timeshift-btrfs/snapshots/2020-02-17_18-08-38/@
ID 296 gen 561 top level 5 path timeshift-btrfs/snapshots/2020-02-17_18-08-38/@home
ID 299 gen 1043 top level 5 path snapshot
ID 300 gen 1041 top level 299 path snapshot/@_2020-02-17_2
ID 301 gen 1044 top level 299 path snapshot/@home_2020-02-17_2

Das sieht jetzt viel besser aus :slight_smile: , denke ich mal.

sudo btrfs filesystem usage /                                                                   
Overall:
    Device size:                 111.79GiB
    Device allocated:             26.02GiB
    Device unallocated:           85.77GiB
    Device missing:                  0.00B
    Used:                         14.09GiB
    Free (estimated):             96.17GiB      (min: 96.17GiB)
    Data ratio:                       1.00
    Metadata ratio:                   1.00
    Global reserve:               40.62MiB      (used: 0.00B)

Data,single: Size:24.01GiB, Used:13.61GiB (56.69%)
   /dev/sdb1      24.01GiB

Metadata,single: Size:2.01GiB, Used:492.27MiB (23.94%)
   /dev/sdb1       2.01GiB

System,single: Size:4.00MiB, Used:16.00KiB (0.39%)
   /dev/sdb1       4.00MiB

Unallocated:
   /dev/sdb1      85.77GiB

Vor allem der freie Speicherplatz :slight_smile: .


@TomZ
Habe es mir angesehen :slight_smile: nix verstanden.

set -x

versions=5
       list=$(ls -rd /home/sgs/.local/bin/liste/* | awk 'NR'$versions)
        if [ "$list" == "" ]
              then
                echo "I: No old snapshots to delete"
        else
                echo $list
        fi

In dem Ordner "liste" sind 1379 Dateien.
Als Ausgabe bekomme ich

~ >>> delete-over-5                                                                                                                                         
+ versions=5
++ awk NR5
++ ls -rd /home/sgs/.local/bin/liste/2019-06-24@21:21_alien.txt / 
ca. 1379 dateien ??? oder 1374 nee, sind lt. Kate 1379 Zeilen
+ list=
+ '[' '' == '' ']'
+ echo 'I: No old snapshots to delete'
I: No old snapshots to delete

Das würde bedeuten es werden alle gelöscht. Nee, No old snapshots to delete
Momentan bin ich sehr vorsichtig was das löschen angeht :wink:
Da ist jetzt eine Textdatei "5" mit der Liste von den Dateien im Ordner "Liste" wie löscht da

btrfs subvolume delete $list

etwas?
Oder ist das der Ansatz?
Ich bin mehr so der "try, annoy and mistake " Typ was programmieren angeht :slight_smile:

Wobei, manchmal finde ich Fehler im code den ich als ganzes gar nicht verstehe :smiley:

Im Prinzip machst Du 3 Schritte:

  1. Zeig mir alle Dateien (die einem Muster folgen) -> "ls"
  2. Schneide die alten ab -> ls | awk
  3. Löschen

Und genau dass macht das Script, mit 'ls' denn Inhalt eines Verzeichnisses sortiert nach Datum an 'awk' zu schicken dass dann die überzähligen Dateien abschneidet.

Also nehmen wir mal als Beispiel dass Du in /mnt/snapshots 6 Snashots von %home hast, aber immer nur 5 behalten willst. Inhalt von /mnt/snapshots:

%home_1
%home_2
%home_3
%home_4
%home_5
%home_6
%_1
%_2
usw.

Ich musste die @ durch % ersetzen da die Forumsoftware nicht mehr als 10 @ erlaubt. Also immer "@" denken wenn Du "%" siehst. :slight_smile:
Das Script würde jetzt wie folgt ablaufen:

versions=5
snapshotDir="/mnt/snapshots/%home_*"

Ich nehme -rd als Parameter für ls damit ich nur die Verzeichnisse selber =Snapshots zu sehen bekomme und nach absteigendem Datum sortiert! Absteigend ist wichtig damit awk am richtigen Ende abschneidet!

allFiles=$(ls -rd $snapshotDir) # Jetzt sollten alle 6 %home snapshots in $allFiles stehen
echo $allFiles # Schauen wir uns zur Kontrolle den Inhalt der Variable an.

Jetzt schicken wir die Liste zu awk das uns die Überzähligen abschneidet:

toDelete=$(echo $allFiles | awk 'NR'$versions)
echo $toDelete

Hier sollten jetzt nur die Snapshots drin stehen die zu löschen sind, in unserem Beispiel nur der älteste Snapshot= %home1 . Daher ist die richtige Sortierung für den ls wichtig.

Und der Rest ist dann nur die Liste an den Löschbefehl (rm oder delete snapshots) zu schicken.
Im Falle von Snapshots wirst Du das Script normalerweise 2 mal aufrufen. Einmal mit

snapshotDir="/mnt/snapshots/%home_*"

und einmal mit

snapshotDir="/mnt/snapshots/%_*"

oder wie auch immer die Snapshots bei Dir heissen.

Ich habe mein Backup Script auf diesen Ansatz umgestellt um damit Snapshots und Datenbank Dumps zu löschen, funktioniert. Bei den Datenbank files dann halt mit 'rm $allFiles' anstatt 'btrfs delete...'
Mein alter Ansatz hatte das Problem dass immer nur genau ein Snapshot gelöscht wurde, dieses Script hier wird alle zu-alten Snapshots löschen. Egal ob einer oder mehrere zu viel sind.

1 Like

Ist ...local/bin/liste/* wirklich das Verzeichnis in dem deine Snapshots stehen? Wäre etwas ungewöhnlich?
Wenn ich deinen anderen Post richtig lese ist es eher " timeshift-btrfs/snapshots"?

Das heisst die Zeile oben müsste eher so lauten:

list=$(ls -rd /timeshift-btrfs/snapshots/@home* | awk 'NR'$versions)
bzw.
list=$(ls -rd /timeshift-btrfs/snapshots/@* | awk 'NR'$versions)

Aber ich sehe auch noch ein anderes Problem, sieht so aus wie wenn Timeshift für jedes Snapshot Paar ein eigenes Verzeichnis macht?

Das ist blöd, weil der "ls -rd" nicht alle Snapshots auf einmal sieht. Eventuell könnte man einen rekursiven "ls -Rdt" machen der durch alle Unterverzeichnise geht. Das müsstest Du aber ausprobieren. Problem wird sein dass der Pfad verloren geht und damit de Löschbefehl ins Leere greift.
Die Namensgebung von timeshift(?) ist auch anders als in meinem Script, Du darfst indeinem Fall nicht mit "@" für den ls arbeiten da Du dann immer beide, @ und @home gemeinsam bekommst.
Du musst explizit nach "@" und "@home", ohne "
" suchen.

Mein Ansatz geht davon aus dass alle Snapshots schön nebeinander in einem Verzeichnis liegen.

1 Like

Nein, ich spiele nicht (mehr) mit den Originalen :wink: :slight_smile:

Bei meiner Übung mit den 1379 werden halt alle 1379 Namen eingetragen.

Das hat bei mir nicht geklappt. Komisch, ich schau noch mal.

/mnt >>> ls                                                                                                                           
insgesamt 0
drwxr-xr-x 1 root root 256 17.02.2020 19:28 '@'/
drwxr-xr-x 1 root root  16 17.02.2020 12:11 '@home'/
drwxr-xr-x 1 root root  64 17.02.2020 21:10  snapshot/
drwxr-xr-x 1 root root  12 17.02.2020 13:13  timeshift/
drwxr-xr-x 1 root root 210 17.02.2020 18:08  timeshift-btrfs/
/mnt >>> cd timeshift                                                                                                                 
/mnt/timeshift >>> ls                                                                                                                 
insgesamt 0
drwxr-xr-x 1 root root 0 17.02.2020 13:13 backup/
/mnt/timeshift >>> cd backup                                                                                                          
/mnt/timeshift/backup >>> leer                                                                                                        
zsh: command not found: leer
/mnt/timeshift/backup >>> ..                                                                                                     [127]
/mnt/timeshift >>> cd ..                                                                                                              
/mnt >>> cd timeshift-btrfs                                                                                                           
/mnt/timeshift-btrfs >>> ls                                                                                                           
insgesamt 0
drwxr-xr-x 1 root root 76 17.02.2020 18:08 snapshots/
drwxr-xr-x 1 root root  0 17.02.2020 18:08 snapshots-boot/
drwxr-xr-x 1 root root  0 17.02.2020 18:08 snapshots-daily/
drwxr-xr-x 1 root root  0 17.02.2020 18:08 snapshots-hourly/
drwxr-xr-x 1 root root  0 17.02.2020 18:08 snapshots-monthly/
drwxr-xr-x 1 root root 76 17.02.2020 18:08 snapshots-ondemand/
drwxr-xr-x 1 root root  0 17.02.2020 18:08 snapshots-weekly/
/mnt/.../snapshots/2020-02-17_18-08-38 >>> ls                                                                                         
insgesamt 4,0K
/mnt/timeshift-btrfs >>> cd snapshots                                                                                                 
/mnt/timeshift-btrfs/snapshots >>> ls                                                                                                 
insgesamt 0
drwxr-xr-x 1 root root 30 17.02.2020 23:08 2020-02-17_13-13-42/
drwxr-xr-x 1 root root 30 17.02.2020 23:08 2020-02-17_18-08-38/
drwxr-xr-x 1 root root 246 17.02.2020 11:33 '@'/
drwxr-xr-x 1 root root  16 17.02.2020 12:11 '@home'/
-rw-r--r-- 1 root root 591 17.02.2020 23:08  info.json

grafik
(Ich schätze mal "timeshift" wird angelegt für rsync backups.)
Ja, für jeden Tag.
Aber das ist kein Problem :wink:
Mit

# /etc/timeshift-autosnap.conf
#

# skipAutosnap defines if timeshift-autosnap execution should be skipped.
# Default value is false.
skipAutosnap=false

# deleteSnapshots defines if old snapshots should be deleted.
# Default value is true.
deleteSnapshots=true

# maxSnapshots defines how much old snapshots script should left.
# Only positive whole numbers can be used.
# Default value is 3.
maxSnapshots=3
# updateGrub defines if grub entries should be auto-generated.
# If grub-btrfs package is not installed grub won't be generated.
# Default value is true.
updateGrub=true

# snapshotDescription defines value used to distinguish snapshots created using timeshift-autosnap
# Default value is "{timeshift-autosnap} {created before upgrade}".
snapshotDescription={TS-autosnap created before upgrade}

Mit timeshift-autosnap (.conf) werden z.Zt. (maxSnapshots=3) drei angelegt.

Meine liegen dann alle in /mnt/snapshot/, für das sortieren wären dann Unterordner besser? root und home. besser gleich snapshot@ und snapshothome, Von dem vielen snapgeschotte dreht sich bei mir schon alles :smiley: im Schädel.

/mnt >>> cd snapshot                                                                                                                  
/mnt/snapshot >>> ls                                                                                                                  
insgesamt 0
drwxr-xr-x 1 root root 256 17.02.2020 19:28 '@_2020-02-17_2'/
drwxr-xr-x 1 root root  16 17.02.2020 12:11 '@home_2020-02-17_2'/


Ich arbeite am liebsten mit dem fehlerfreien Original script, weil mir oft die Kenntnisse fehlen und ich mich durch die man-pages quälen muss :wink:

Wirklich 1379 Snapshots? Oder geht das Script vieleicht in die Unterverzeichnise der Snapshots mit rein? Ich meine mal gelesen zu haben dass mehr wie 10 oder so Snapshots dass System verlangsamen. Weil beim Löschen usw. erst mal durch alle Snapshots geschaut werden muß.
Daher scheint mir 1379 Snapshots irgendwie komisch, selbst wenn Du jeden Tag einen machst?

Ich nutze kein Timeshift sondern mache meine Snapshots selber über mein Script, einmal am Tag, oder immer vor einem Systemupdate.

Oops, wie's scheint ist mir beim kopieren irgendwie ein ">" abhanden gekommen :frowning:
Sorry!

Probier mal das hier in einem beliebigen Verzeichnis:

ls | awk 'NR>'2

Wenn Du zB. 10 Dateien in deinem Verzeichnis hat sollte 2 dir 8 davon anzeigen. Mit 3 bleiben noch 7 übrig, usw.

1 Like

Nein :slight_smile: :wink:

Das ist ein Ordner zum üüüüüüüben :slight_smile:

Deshalb die Sache mit dem kompletten (fehlerfeiem) Script :wink:

Timeshift ist die schnelle Lösung wenn ein update schief geht, zurück auf das System vor dem Update. Da das (btrfs) aber nur auf diesem Laufwerk geht ist es im Notfall (Plattencrash) auch weg, daher jetzt das script um alles extern zu sichern.

1 Like

Was immer ihr hier vorhabt, wäre es nicht einfacher, wenn ihr die timeshift-Kommandos in euer Skript mit einbaut? z.B.
sudo timeshift --list
sudo timeshift --delete SNAPSHOT

Syntax:

  timeshift --check
  timeshift --create [OPTIONS]
  timeshift --restore [OPTIONS]
  timeshift --delete-[all] [OPTIONS]
  timeshift --list-{snapshots|devices} [OPTIONS]

Options:

List:
  --list[-snapshots]         List snapshots
  --list-devices             List devices

Backup:
  --check                    Create snapshot if scheduled
  --create                   Create snapshot (even if not scheduled)
  --comments <string>        Set snapshot description
  --tags {O,B,H,D,W,M}       Add tags to snapshot (default: O)

Restore:
  --restore                  Restore snapshot
  --clone                    Clone current system
  --snapshot <name>          Specify snapshot to restore
  --target[-device] <device> Specify target device
  --grub[-device] <device>   Specify device for installing GRUB2 bootloader
  --skip-grub                Skip GRUB2 reinstall

Delete:
  --delete                   Delete snapshot
  --delete-all               Delete all snapshots

Global:
  --snapshot-device <device> Specify backup device (default: config)
  --yes                      Answer YES to all confirmation prompts
  --btrfs                    Switch to BTRFS mode (default: config)
  --rsync                    Switch to RSYNC mode (default: config)
  --debug                    Show additional debug messages
  --verbose                  Show rsync output (default)
  --quiet                    Hide rsync output
  --scripted                 Run in non-interactive mode
  --help                     Show all options

Examples:

timeshift --list
timeshift --list --snapshot-device /dev/sda1
timeshift --create --comments "after update" --tags D
timeshift --restore 
timeshift --restore --snapshot '2014-10-12_16-29-08' --target /dev/sda1
timeshift --delete  --snapshot '2014-10-12_16-29-08'
timeshift --delete-all 

Notes:

  1) --create will always create a new snapshot
  2) --check will create a snapshot only if a scheduled snapshot is due
  3) Use --restore without other options to select options interactively
  4) UUID can be specified instead of device name
  5) Default values will be loaded from app config if options are not specified

oder bin ich völlig am Thema vorbei? Einzige Entschuldigung: Der Thread startet bei mir etwas merkwürdig, so wie mittendrin...

viele Grüße gosia

Am Thema voll vorbei :slight_smile: :wink:
Ich will meine snapshots extern speichen :slight_smile: nicht die von timeshift.

Beiträge wurden verschoben, zu viel deutsch :wink: oder so

https://forum.manjaro.org/t/btrfs-tips-and-tricks/71186/20

Hallo SGS,

na da bin ich ja beruhigt, nehme alles zurück und behaupte das Gegenteil :wink:
so ist das, wenn man zu spät ins Theater kommt und den ersten Akt verpasst.

viele Grüße gosia

2 Likes

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.

Forum kindly sponsored by