Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: bash script dd met progress bar  (gelezen 13715 keer)

Offline peer

  • Lid
bash script dd met progress bar
« Gepost op: 2019/05/25, 15:46:42 »
Ik heb een script gemaakt om een iso naar usb-stick te schrijven met dd.
Ik kies grafisch  (kdialog) een usb-device. Dan kies ik grafisch een iso-bestand. Daar wordt het root wachtwoord ingevoerd en begint dd. Dit gaad allemaal goed.
Alleen nu wil ik een progressbar maken met kdialog maar dat lukt mij niet.
- status=progress als optie toevoegen aan werkt niet.
- pv command (eerst installeren) toevoegen werkt niet
- sudo kill -USR1 (^dd$) werkt ook niet
- progress command (eerst installeren) gaf out tot 5% en stopte toen

Heeft iemand nog tips??

Inmiddels heb ik al gezien dat de optie status-progress wel info geeft als ik een drive (/dev/sde/) kopieer maar niet als ik een iso-file kopieer Ook het uitgebreidere dcfldd command geeft geen info bij een iso maar wel bij een drive
het huidige script
#!/bin/bash

# check if usb-devices sdd,sde,sdf,sdg and sdh are present
# get name if [present else variable is ""
sddName=$(lsblk -o SIZE,MODEL -l  /dev/sdd -d -n)
if [ "$sddName" = "" ]; then sddName=" -"; fi
sdeName=$(lsblk -o SIZE,MODEL -l  /dev/sde -d -n)
if [ "$sdeName" = "" ]; then sdeName=" -"; fi
sdfName=$(lsblk -o SIZE,MODEL -l  /dev/sdf -d -n)
if [ "$sdfName" = "" ]; then sdfName=" -"; fi
sdgName=$(lsblk -o SIZE,MODEL -l  /dev/sdg -d -n)
if [ "$sdgName" = "" ]; then sdgName=" -"; fi
sdhName=$(lsblk -o SIZE,MODEL -l  /dev/sdh -d -n)
if [ "$sdhName" = "" ]; then sdhName=" -"; fi

# check if no usb-devices are present
#if nr.1
if  [ "$sddName" = " -" ] && \
    [ "$sdeName" = " -" ] && \
    [ "$sdfName" = " -" ] && \
    [ "$sdgName" = " -" ] && \
    [ "$sdhName" = " -" ] ; then
    kdialog --msgbox "No usb-devices found.\nScript is cancelled!"
else
    # choose usb-device
    result=" -"
    while [ "$result" = " -" ];
    do
    result=$(kdialog --radiolist "Choose USB Device" \
    "$sddName" "sdd: ""$sddName" on \
    "$sdeName" "sde: ""$sdeName" off\
    "$sdfName" "sdf: ""$sdfName" off\
    "$sdgName" "sdg: ""$sdgName" off\
    "$sdhName" "sdh: ""$sdhName" off)
    done
    #if nr.2
    if [ "$result" = "" ]; then
        kdialog --msgbox "Script is cancelled!";
    else
        # create variable usbDevice for the dd-command
        if [ "$result" = "$sddName" ]; then usbDevice="/dev/sdd"; fi
        if [ "$result" = "$sdeName" ]; then usbDevice="/dev/sde"; fi
        if [ "$result" = "$sdfName" ]; then usbDevice="/dev/sdf"; fi
        if [ "$result" = "$sdgName" ]; then usbDevice="/dev/sdg"; fi
        if [ "$result" = "$sdhName" ]; then usbDevice="/dev/sdh"; fi
       
       
        # select isofile
        isoFile=$(kdialog --getopenfilename /home/peer/ "application/x-cd-image application/x-raw-disk-image")
       
        # write isofile
        password=$(kdialog --password "Please enter ROOT password:")
        echo "$password" | sudo -S dd if="$isoFile" of="$usbDevice" bs=4M status=progress &
       
        wait
        kdialog --msgbox "Iso File is written to ""$usbDevice"
       
    fi # if nr. 2
fi #if nr. 1

 
« Laatst bewerkt op: 2019/05/25, 16:23:30 door peer »

nahjo

  • Gast
Re: bash script dd met progress bar
« Reactie #1 Gepost op: 2019/05/25, 17:56:30 »
geeft die opdracht wel een betere status overzicht op een cli?

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #2 Gepost op: 2019/05/25, 19:32:41 »
als ik de dd opdracht in de terminal uitvoer dan krijg ik wel uitvoer. Echter, na een paar tellen is volgens de status  de hele iso gekopiëerd maar daarna is die nog een hele tijd bezig. Werkt dus niet goed.
In het script draait dd in de achtergrond. Wellicht moet ik daar iets van de uitvoer omleiden. Ik weet niet precies hoe ik dat moet doen.



Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #3 Gepost op: 2019/05/25, 19:44:03 »
dd werkt het het standaard cachingsysteem van Linux.
Om zeker te zijn dat alles gekopieerd is moet je na het dd-bevel een sync uitvoeren.
Als je een iso op een usb-stick wil kopiëren, gebruik je best zoiets:

1. Oudere dd zonder progress-bevel:
dd if="$IsoFile" bs=8M | pv | sudo dd of="/dev/sd$OutDrv" bs=8M conv=notrunc; sync
$IsoFile vervang je door het volledige filepath van de iso die je wil kopiëren.
$OutDrv vervang je door de driveletter van de usb-stick waarop je die iso wil kopiëren.
Als je pv niet hebt, doe je eerst eenmalig:
sudo apt install pv
Als je niet weet welke driveletter je usb-stick heeft, kun je snel een overzicht bekomen met de juiste driveletters via:
lsblk

2. Modernere dd met progress-parameter:
sudo dd if="$IsoFile" of="/dev/sd$OutDrv" bs=8M conv=notrunc status=progress; sync
$IsoFile vervang je door het volledige filepath van de iso die je wil kopiëren.
$OutDrv vervang je door de driveletter van de usb-stick waarop je die iso wil kopiëren.
Als je niet weet welke driveletter je usb-stick heeft, kun je snel een overzicht bekomen met de juiste driveletters via:
lsblk

En als je graag een compleet script hebt dat je helpt en meteen alles doet wat moet:
#!/bin/sh
if  [ -z "$1" ]
then
  echo "Geef invoerbestand (iso) op + uitvoer-driveletter."
else
  if [ -f "$1" ]
  then
    IsoFile="$1"
    if [ -z "$2" ]
    then
      echo "Geef uitvoer-driveletter op!"
    else
      OutDrv="$2"
      #dd if="$IsoFile" bs=8M | pv | sudo dd of="/dev/sd$OutDrv" bs=8M conv=notrunc; sync
      sudo dd if="$IsoFile" of="/dev/sd$OutDrv" bs=8M conv=notrunc status=progress; sync   
    fi
  fi
fi

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #4 Gepost op: 2019/05/25, 20:21:03 »
 een aantal tips had ik in mijn script al gebruikt. Mooi!
pv heb ik geprobeerd maar dat werkte bij mij niet lekker, waarschijnlijk omdat ik het samen gebruikte met dialog. Maar ik ga daar nog eens naar kijken. Het is wel de bedoeling dat er een progressbar in een popup van kdialog komt.
Ik heb op google wel gezien dat pv voor een (flinke) vertraging kan zorgen

Re: bash script dd met progress bar
« Reactie #5 Gepost op: 2019/05/25, 22:14:59 »
Echter, na een paar tellen is volgens de status  de hele iso gekopiëerd maar daarna is die nog een hele tijd bezig. Werkt dus niet goed.
Hallo, als ik een iso naar een usb-stick kopieer (ik gebruik unetbootin), dan wordt het merendeel razendsnel weggeschreven, maar het bestand dat eindigt op fs (file system) kan vele minuten duren. Misschien moet je gewoon wat meer geduld betrachten?

Offline vanadium

  • Lid
Re: bash script dd met progress bar
« Reactie #6 Gepost op: 2019/05/26, 04:39:38 »
Hallo, als ik een iso naar een usb-stick kopieer (ik gebruik unetbootin), dan wordt het merendeel razendsnel weggeschreven, maar het bestand dat eindigt op fs (file system) kan vele minuten duren. Misschien moet je gewoon wat meer geduld betrachten?
Zie uitleg van Bloom. In linux wordt alles eerst naar de geheugencache weggeschreven, en van daaruit naar de fysieke schijf.  Voor dd is de klus klaar als alles naar de geheugencache is weggeschreven. Dan gaat het besturingssysteem op de achtergrond evenwel verder met het overschrijven uit de cache naar de veel tragere harde schijf.

Daarom is het sync commando wel nuttig om betere feedback te krijgen wanneer alles écht op schijf staat. Ik doe dat met mijn rsync backup script. Door "sync" toe te voegen, wordt de terminal enkel terug vrijgegeven voor het volgende commando als alles volledig op de harde schijf staat. Zo weet ik zeker dat dit echt klaar is.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #7 Gepost op: 2019/05/26, 06:10:41 »
ik wil juist dat er een progress bar te zien is in kdialog, dus in een popup-menu, tijdens het kopiëren.

net even een iso gekopieerd in de terminal

eerst zonder pv:
    240123904 bytes (240 MB, 229 MiB) copied, 103,932 s, 2,3 MB/s

daarna met pv:
    240123904 bytes (240 MB, 229 MiB) copied, 2,38472 s, 101 MB/s
    240123904 bytes (240 MB, 229 MiB) copied, 73,313 s, 3,3 MB/s
Ik zie geen progressbar in de terminal maar het proces wordt nu in twee stappen weergegeven. Het eerste stuk is waarschijnlijk de geheugencache en het tweede stuk de fysieke schijf.

Als ik de optie status=progress toevoeg dan zie ik dat er in de eerste stap (met pv) twee tussenregels komen dus om de seconde. Zonder pv zie ik geen verschil.

Dit werkt dus niet met een iso-bestand.
 
« Laatst bewerkt op: 2019/05/26, 06:22:19 door peer »

Offline vanadium

  • Lid
Re: bash script dd met progress bar
« Reactie #8 Gepost op: 2019/05/26, 06:39:22 »
Met kdialog kan je in verschillende stappen van je script nu en dan de progress bar doen verder gaan. Dat gebeurt door telkens een afzonderlijke lijn van je script, na een commando dat wat tijd neemt.

Ik denk niet dat het zomaar mogelijk is de voortgang van één terminal commando te monitoren: dat zou vereisen dat voortgangsinformatie door dat terminalcommando, terwijl het werkt, zou moeten kunnen uitgelezen worden, en dan omgezet worden naar informatie die de kdialog progresbar aanstuurt.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #9 Gepost op: 2019/05/26, 07:39:19 »
ik ben bang dat dat ook lastig wordt ook al omdat ik geen mooie bruikbare info te zien krijg als output in de terminal. Als dit zou lukken dan zou het mogelijk moeten zijn om de output naar een variabele te sturen en die te gebruiken voor de kdialog progressbar.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #10 Gepost op: 2019/05/27, 14:55:46 »
ik ben toch weer een stapje verder. het lukt mij niet om bruikbare voorgangsinformatie uit de dd opdracht te halen.
Nu heb ik een progresbar gemaakt die gestart wordt als de dd opdracht begint en stopt als de dd opdracht klaar is.
De snelheid van de progress bar moet ik nog proberen aan te passen aan de schrijfsnelheid. Nu begint de progressbar weer vrolijk op 0% als de dd opdracht nog niet klaar is.
Ik laat dit even liggen. Ik ga eerst een root wachtwoord controle maken.
het script is weer bijgesloten.
#!/bin/bash

# check if usb-devices sdd,sde,sdf,sdg and sdh are present
# get name if [present else variable is ""
sddName=$(lsblk -o SIZE,MODEL -l  /dev/sdd -d -n)
if [ "$sddName" = "" ]; then sddName=" -"; fi
sdeName=$(lsblk -o SIZE,MODEL -l  /dev/sde -d -n)
if [ "$sdeName" = "" ]; then sdeName=" -"; fi
sdfName=$(lsblk -o SIZE,MODEL -l  /dev/sdf -d -n)
if [ "$sdfName" = "" ]; then sdfName=" -"; fi
sdgName=$(lsblk -o SIZE,MODEL -l  /dev/sdg -d -n)
if [ "$sdgName" = "" ]; then sdgName=" -"; fi
sdhName=$(lsblk -o SIZE,MODEL -l  /dev/sdh -d -n)
if [ "$sdhName" = "" ]; then sdhName=" -"; fi

# check if no usb-devices are present
#if nr.1
if  [ "$sddName" = " -" ] && \
    [ "$sdeName" = " -" ] && \
    [ "$sdfName" = " -" ] && \
    [ "$sdgName" = " -" ] && \
    [ "$sdhName" = " -" ] ; then
    kdialog --msgbox "No usb-devices found.\nScript is cancelled!"
else
    # choose usb-device
    result=" -"
    while [ "$result" = " -" ];
    do
    result=$(kdialog --radiolist "Choose USB Device" \
    "$sddName" "sdd: ""$sddName" on \
    "$sdeName" "sde: ""$sdeName" off\
    "$sdfName" "sdf: ""$sdfName" off\
    "$sdgName" "sdg: ""$sdgName" off\
    "$sdhName" "sdh: ""$sdhName" off)
    done
    #if nr.2
    if [ "$result" = "" ]; then
        kdialog --msgbox "Script is cancelled!";
    else
        # create variable usbDevice for the dd-command
        if [ "$result" = "$sddName" ]; then usbDevice="/dev/sdd"; fi
        if [ "$result" = "$sdeName" ]; then usbDevice="/dev/sde"; fi
        if [ "$result" = "$sdfName" ]; then usbDevice="/dev/sdf"; fi
        if [ "$result" = "$sdgName" ]; then usbDevice="/dev/sdg"; fi
        if [ "$result" = "$sdhName" ]; then usbDevice="/dev/sdh"; fi
       
       
        # select isofile
        isoFile=$(kdialog --getopenfilename /home/peer/ "application/x-cd-image application/x-raw-disk-image")
       
        # write isofile
        password=$(kdialog --password "Please enter ROOT password:")
        echo "$password" | sudo -S dd if="$isoFile" of="$usbDevice" bs=4M status=progress &
        dd_PID=$!
       
        # show progress menu
        dbusRef=`kdialog --progressbar "WRITING!!!\nThis can take a long time" 100`
        qdbus $dbusRef showCancelButton false
        i=0
        running="$(/proc/$dd_PID 2>&1)"
        running=$(echo $running | cut -d ' ' -f 5)
        while [ "$running" = "Permission" ];
        do
            i=$((i+1))
            qdbus $dbusRef Set "" value $i
            sleep 0.2
            if [ $i = 100 ]; then i=0; fi
            running="$(/proc/$dd_PID 2>&1)"
            running=$(echo $running | cut -d ' ' -f 5)
        done
        qdbus $dbusRef close
       
        #closing messgae
        kdialog --msgbox "Iso File is written to ""$usbDevice"
       
    fi # if nr. 2
fi #if nr. 1



Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #11 Gepost op: 2019/05/29, 10:39:47 »
ik ben een klein stapje verder met het weergegeven van de progress bij dd.

als ik het goed heb werkt dd eerst alleen in het geheugen en daarna gaat het echt schrijven. Als ik de optie 'status=progress' toevoeg dan  krijg ik alleen  de voortgang in het geheugen. Op het moment dat dd gaat beginnen met schrijven dan lees ik op het scherm al dat dd klaar is.
echo "$password" | sudo -S dd if="$isoFile" of="$usbDevice" bs=4M status=progress

echo "$password" | sudo -S dd if="$isoFile" of="$usbDevice" bs=4M status=progress oflag=sync
Als ik nu ook nog de optie  'oflag=sync' (zie tweede regel hierboven) dan krijg ik (volgens mij) de voortgang tijdens het schrijven. En dat is precies wat ik wil. Dat ziet er zo uit:
81096704 bytes (81 MB, 77 MiB) copied, 16 s, 5,1 MB/s          <<deze regel verandert tijdens het schrijven>>
19+1 records in
19+1 records out
81096704 bytes (81 MB, 77 MiB) copied, 16,0635 s, 5,0 MB/s

Als ik nu probeer om deze output te vangen dan lukt dit niet. Ik geloof dat dd hier errormessages hanteert maar ik krijg de output niet in een variabele.
Hier is een stukje van het script:
status=$(echo "$password" | sudo -S dd if="$isoFile" of="$usbDevice" bs=4M status=progress oflag=sync 2>&1) &
dd_PID=$!
echo $dd_PID
sleep 2
echo "status is "$status
sleep 2
echo "status is "$status
sleep 2
echo "status is "$status
sleep 2
echo "status is "$status


wait
echo "done"
en de bijbehorende output:
2595
status is
status is
status is
status is
done

Ik doe iets niet goed maar ik weet niet wat. Heeft iemand een idee?
Ik heb een vermoeden. dd draait in de background en kan daar de variabele in de foreground niet updaten. Hoe kan ik dit voor elkaar krijgen?
« Laatst bewerkt op: 2019/05/29, 10:58:45 door peer »

Offline vanadium

  • Lid
Re: bash script dd met progress bar
« Reactie #12 Gepost op: 2019/05/29, 11:00:03 »
Goed gevonden, die "oflag". Probeer echter met "fsync" van in plaats dan "sync". "sync" synct alles, terwijl "fsync" enkel synct waar dd mee bezit is.

Je script kan het zo zeker niet doen: je leest één keer aan het begin de status van "dd". Die variabele zal pas ingevuld worden als dd zijn werk heeft gedaan. Doordat je dat proces naar de achtergrond stuurt, kan je al verdergaan met om de twee seconden eenvoudig die variabele weer te geven. Zolang dd loopt op de achtergrond, zal die variabele niet bestaan. Je moet er ergens in slagen nu en dan de status van dd zelf te bekomen.

Misschien moet je zoeken in de richting de uitvoer van dd in een bestand op te slaan. Dan wordt het wat bash-tekstverwerking om periodiek de laatste regel uit te lezen (tail -n1 is hier nuttig). Die regel zal eruit zien als
17867735504 bytes (1.8 GB, 1.7 GiB) copied, 23 s, 77.7 MB/s

Het aantal bytes is hier de meest precieze maat van de vooruitgang. Het is eenvoudig dat eerste getal eruit te halen eens je weet hoe ;)

Om ergens een vooruitgang aan te geven in procent, zal je moeten beginnen in je script de totale grootte van het bestand op te meten in bytes. Dan kan je op regelmatige tijden de voorgang opmeten en het percentage berekenen.

Als je dat dan in een volgende stap met kdialog wil doen, dan zal je wellicht stappen moeten programmeren, waarbij je de progress bar bijwerkt wanneer 10%, 20%, 30% enz compleet is. Dat moet dan gebeuren door een loop met een "if" test, waar je pas uit gaat als minstens 10% is bereikt. Op dat moment werk je de dialoog bij en gaat naar de volgende loop, die wacht tot 20% bereikt is.
« Laatst bewerkt op: 2019/05/29, 11:16:20 door vanadium »

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #13 Gepost op: 2019/05/29, 11:31:11 »
vanadium,
bedankt voor je snelle feedback.
Je suggestie om oflag=sync te vervangen door oflag-fsync werkt niet. Ik krijg een error: 'invalid output flag: ‘fsync’'

het idee om te werken met een bestand kwam net ook bij mij op om gegevens van de background naar de foreground te krijgen. Om dan de tail-functie te gebruiken was nog niet bij mij opgekomen.

Ik ga er weer mee aan de slag

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #14 Gepost op: 2019/05/29, 13:59:48 »
het vangen van de output van dd en het schrijven naar een file gaat goed.
het lezen van deze file gaat echter niet goed.
hier is het scriptfragment:
echo "start"

echo "$password" | sudo -S  dd if="$isoFile" of="$usbDevice" bs=4M status=progress oflag=sync  2> output.txt &
dd_PID=$!

fileSize=$(wc -c "$isoFile" | awk '{print $1}')
echo $fileSize
running="Permission"
while [ "$running" = "Permission" ];
do       
    sleep 1
    running="$(/proc/$dd_PID 2>&1)"
    running=$(echo $running | cut -d ' ' -f 5)
    echo "running"
    perc="$(tail -n 1 output.txt)"
    echo $perc
    perc=$(echo $perc | cut -d ' ' -f 1)
    echo $perc
   
done
wait
echo "done"
Hier is de output.txt:
[sudo] password for peer:
4194304 bytes (4,2 MB, 4,0 MiB) copied, 1 s, 3,9 MB/s
12582912 bytes (13 MB, 12 MiB) copied, 2 s, 5,1 MB/s
16777216 bytes (17 MB, 16 MiB) copied, 3 s, 5,4 MB/s
25165824 bytes (25 MB, 24 MiB) copied, 4 s, 5,6 MB/s
29360128 bytes (29 MB, 28 MiB) copied, 5 s, 5,7 MB/s
33554432 bytes (34 MB, 32 MiB) copied, 6 s, 5,4 MB/s
37748736 bytes (38 MB, 36 MiB) copied, 7 s, 5,2 MB/s
41943040 bytes (42 MB, 40 MiB) copied, 8 s, 5,0 MB/s
46137344 bytes (46 MB, 44 MiB) copied, 9 s, 5,1 MB/s
50331648 bytes (50 MB, 48 MiB) copied, 10 s, 4,9 MB/s
58720256 bytes (59 MB, 56 MiB) copied, 12 s, 4,9 MB/s
62914560 bytes (63 MB, 60 MiB) copied, 13 s, 5,0 MB/s
67108864 bytes (67 MB, 64 MiB) copied, 13 s, 5,0 MB/s
71303168 bytes (71 MB, 68 MiB) copied, 14 s, 5,1 MB/s
79691776 bytes (80 MB, 76 MiB) copied, 15 s, 5,2 MB/s
19+1 records in
19+1 records out
81096704 bytes (81 MB, 77 MiB) copied, 16,0011 s, 5,1 MB/s
en hier is de output in de terminal:
start
81096704
running
[sudo] password for peer:
[sudo]
running
4194304 bytes (4,2 MB, 4,0 MiB) copied, 1 s, 3,9 MB/s
[sudo]
running
12582912 bytes (13 MB, 12 MiB) copied, 2 s, 5,1 MB/ss
[sudo]
running
16777216 bytes (17 MB, 16 MiB) copied, 3 s, 5,4 MB/s
[sudo]
running
25165824 bytes (25 MB, 24 MiB) copied, 4 s, 5,6 MB/s
[sudo]
running
29360128 bytes (29 MB, 28 MiB) copied, 5 s, 5,7 MB/s
[sudo]
running
33554432 bytes (34 MB, 32 MiB) copied, 6 s, 5,4 MB/s
[sudo]
running
37748736 bytes (38 MB, 36 MiB) copied, 7 s, 5,2 MB/s
[sudo]
running
41943040 bytes (42 MB, 40 MiB) copied, 8 s, 5,0 MB/s
[sudo]
running
46137344 bytes (46 MB, 44 MiB) copied, 9 s, 5,1 MB/s
[sudo]
running
50331648 bytes (50 MB, 48 MiB) copied, 10 s, 4,9 MB/s
[sudo]
running
58720256 bytes (59 MB, 56 MiB) copied, 12 s, 4,9 MB/s
[sudo]
running
62914560 bytes (63 MB, 60 MiB) copied, 13 s, 5,0 MB/s
[sudo]
running
71303168 bytes (71 MB, 68 MiB) copied, 14 s, 5,1 MB/s
[sudo]
running
71303168 bytes (71 MB, 68 MiB) copied, 14 s, 5,1 MB/s
[sudo]
running
79691776 bytes (80 MB, 76 MiB) copied, 15 s, 5,2 MB/s
[sudo]
done
Merkwaardig is dat ik wel de juiste regel uit de output.txt krijg maar als ik daar het eerste woord uit selecteer dan krijg ik telkens het woord 'sudo' (het allereerste woord van de file)

Ik heb een while-loop die elke seconde checkt. Dat doet de status=progress van dd ook.
« Laatst bewerkt op: 2019/05/29, 14:02:12 door peer »

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #15 Gepost op: 2019/05/30, 13:49:27 »
Ik stop met dit script. Het wordt te ingewikkeld voor mij.
Ik heb wel even een testje uitgevoerd met het schrijven van twee iso-bestanden m.b.v. dd in de terminal, mijn scriptje en met Etcher. Tekens dezelfde usb-stick en dezelfde usb-poort.
Dit zijn de resultaten:

isobestand van 150Mb:
dd:                       31sec
mijn script:       26sec
etcher:               40sec

isobestand van 1.6Gb
dd:                     4min, 38sec
mijn script:     7min, 32sec
etcher:             5min, 41sec

Bij het klein bestand ontlopen de getallen elkaar niet zo veel, Bij het grote bestand zie ik dat mijn script erg langzaam is. Hierin draait dd als proces in de achtergrond. Waarom het script zo veel langzamer is weet ik niet.
Opvallend is dat dd in de terminal duidelijk sneller is dan etcher.
Voortaan toch maar weer gewoon dd in de terminal gebruiken.
Bij

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #16 Gepost op: 2019/05/30, 14:33:17 »
Het probleem is dat je kdialog gebruikt om grafisch bestanden te kiezen en dan van daaruit dd aanroept, dat zelf geen GUI-programma is.
Installeer het programma dialog (zonder k) en pv.
sudo apt install dialog pv
Dan maak een script gdd met daarin:
(pv -n /dev/sdX | dd of=/dev/sdY bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Uitvoeren van dd-bevel, even geduld..." 10 70 0
Waarbij /dev/sdX de brondrive is en /dev/sdY de doeldrive voor de copy. Vervang die door de parameters die van kdialg komen.
Dan zal zich na het kiezen van bron en doel in kdialog een GUI-venster openen met daarin de progressiebalk.
Let wel: als je doel een drive is (ook usb-stick e.d.) dan moet dd voorafgegaan worden door sudo.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #17 Gepost op: 2019/05/30, 15:07:33 »
Bloom,

je hebt gelijk. Als ik kdialog en dd zou kunnen kombineren zoals met dialog dan had het misschien wel gewerkt.

De oplossing die jij geeft met dialog had ik ook gevonden en geprobeerd. Maar dialog werkt niet erg fijn op mijn pc met debian buster kde. Ik weet niet meer precies hoe het was maar ik heb het weer weggelegd.

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #18 Gepost op: 2019/05/30, 15:45:33 »
Ik draai zelf ook Debian Buster (momenteel zelfs Sid), maar niet met KDE maar met XFCE. En die oplossing met dialog werkt hier prima.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #19 Gepost op: 2019/05/31, 10:02:06 »
buster is volgens mij nog niet stable dus is nog gelijk aan testing. Ik heb in /etc/sources.list 'buster' vervangen door 'testing' dus ik zit ook op sid (still in development?)

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #20 Gepost op: 2019/05/31, 10:41:48 »
Testing is inderdaad een rolling release, Stable niet.
Sid is het per definitie ook. Het acroniem past inderdaad bij "Still In Development", maar alle releases van Debian hebben een naam van een karakter uit Toy Story en Sid is de buurjongen die graag kwam pesten en dingen vernielen.
Voor desktopsystemen gebruik ik standaard Testing en voor servers Stable. Voor mezelf werk ik al een paar jaar met een Sid desktop en met Testing servers. Dat laatste heeft te maken met LizardFS, dat ik gebruik voor mijn centrale opslagsysteem. Ik wou een bepaalde versie hebben en dat kon alleen als ik Testing als minimum draaide dus dat heb ik gedaan. Tot dusver geen enkel probleem, alles werkt heel stabiel.
Sid kan ik niet aan anderen aanraden. Bij upgrades kunnen er problemen meekomen (zoals onopgeloste afhankelijkheden) en dan moet je wel de expertise hebben om dat te kunnen oplossen. Testing is wel "makkelijker" op dat vlak.

DarkEra

  • Gast
Re: bash script dd met progress bar
« Reactie #21 Gepost op: 2019/05/31, 10:54:49 »
Debian testing is in mijn ogen nooit 100% een rolling release vanwege het feit dat er een tijdelijke freeze plaats vindt hoe dichter ze bij de uitgave van een nieuwe release komen. Tenminste zover ik begrepen heb.
Sid is de unstable repository.

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #22 Gepost op: 2019/05/31, 11:04:12 »
Dat is correct, maar een "freeze" betekent alleen dat er geen nieuwe functionaliteit meer voorzien wordt in pakketten. Eenmaal dat de huidige Testing de nieuwe Stable is geworden, wordt alles van Sid in Testing gezet met een nieuwe naam (dat zal na Buster Bullseye worden) en gaat onmiddellijk die nieuwe Testing van start. Omdat op dat ogenblik het verschil tussen Sid en Testing zeer klein is, rolt dat heel makkelijk en zonder problemen over. Daarom kun je met succes de naam "Testing" in sources.list opnemen en werkt alles effectief zoals een rolling release.
Het enige nadeel van Testing is dat er geen security updates zijn. Die zijn er alleen voor Stable. Testing krijgt dat ook wel binnen maar met de gewone updates mee en daardoor kunnen security fixes later toekomen bij Testing dan bij Stable. Tot dusver is dat voor mij nog nooit een probleem geweest. Overigens heeft ook Sid geen aparte security updates.

Er zijn mensen die denken door de naam 'Stable" in sources.list in te vullen in plaats van momenteel "Stretch" en straks "Buster", ze daarmee voor Stable ook een rolling release kunnen krijgen. Dat is echter zeker niet aan te raden. De afstand tussen een vorige en een nieuwe Stable is immers ruim twee jaar. Dat is heel veel pakketten met heel veel afhankelijkheden die opgelost moeten worden. Zelf heb ik dat wel eens geprobeerd, maar het gaat vaker fout dan goed. Dus met Stable doe je dat beter niet. Upgraden doe je daar het best door herinstalleren. Wat mij betreft geldt dat trouwens ook voor Ubuntu LTS.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #23 Gepost op: 2019/05/31, 13:09:28 »
was ik toch weer een beetje in de war met de naamgeving.
stable - testing - unstable
is dat nu hetzelfde als
stretch-buster- sid

we zijn nu off topic . Is niet erg want ik ben nu toch gestopt met het dd-script.

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #24 Gepost op: 2019/05/31, 13:25:51 »
stable - testing -unstable
is inderdaad momenteel
stretch - buster - sid
maar zodra er zeer binnenkort een nieuwe stable is wordt dat:
buster - bullseye - sid

Waarom ben je gestopt met het dd-script? Heb je de oplossing die ik als laatste gaf niet geprobeerd? Dialog zou ook prima moeten werken onder KDE hoor.