isotousb.sh
Skriver en ISO til minnepenn slik Etcher gjør det: rå byte-kopi, tvungen flush, og en tilbakelesing som beviser at bytene faktisk havnet der. Med sikringene som mangler når man kjører dd for hånd.
Dette scriptet sletter en hel disk. Det er hele poenget med det, og det finnes ingen angreknapp. Sikringene under er laget for å gjøre det vanskelig å velge feil disk, men les gjennom fila før du kjører den, akkurat som med alt annet du laster ned og gir rot-tilgang.
Problemet det løser
dd gjør jobben helt fint. Problemet er alt dd ikke gjør: den advarer deg ikke om at /dev/sda er systemdisken din, den sier ikke fra om skrivingen ble ufullstendig, og den avslutter i det kjernen har tatt imot dataene - ikke i det minnepennen er ferdig med å skrive dem. Én bokstav feil i enhetsnavnet, og du har overskrevet feil disk uten et eneste spørsmål underveis.
Scriptet legger fire ting oppå: bare USB-disker vises i lista, du må skrive inn diskstørrelsen for å bekrefte, dataene tvinges fysisk ut på pinnen, og til slutt leses de tilbake og sammenlignes med kilden.
Bruk
Må kjøres som root, siden den skriver til en rå blokkenhet.
sudo ./isotousb.sh fil.isoVanlig kjøring. Kjenner igjen ISO-typen selv.sudo ./isotousb.shUten filnavn: spør etter stien til ISO-en.--linuxTving rå dd-kopi, uten gjenkjenning.--windowsTving Windows-metoden via WoeUSB.--autoAutomatisk gjenkjenning. Dette er standard.-hHjelpetekst. Krever ikke root.Steg 1 - scriptet undersøker ISO-en
Før noe som helst velges, leses ISO-en. Her med en Debian netinst-ISO:
$ sudo ./isotousb.sh debian-13.6.0-amd64-netinst.iso ==> Image: debian-13.6.0-amd64-netinst.iso (755MB) OK Secure Boot: ISO ships a signed shim - should boot with Secure Boot ON. OK ISO type: Linux / hybrid - correct method is a raw byte-for-byte write (dd). Verify manually if you like: list files : 7z l -- "debian-13.6.0-amd64-netinst.iso" hybrid MBR : dd if="debian-13.6.0-amd64-netinst.iso" bs=512 count=1 2>/dev/null | tail -c2 | xxd (55aa in the last 2 bytes = hybrid/dd-writable) (If this is wrong, re-run with --linux or --windows to force it.)
To ting er slått fast her, og begge kan du etterprøve selv med kommandoene den skriver ut. Hybrid-sjekken leser de to siste bytene i sektor 0 og ser etter signaturen 55aa. Finnes den, er ISO-en laget for å kunne kopieres rått til en disk og likevel boote:
$ dd if=debian-13.6.0-amd64-netinst.iso bs=512 count=1 2>/dev/null | tail -c2 | xxd
00000000: 55aa U.
Secure Boot-sjekken ser etter en signert oppstartskjede inne i ISO-en: både bootx64.efi og en grubx64.efi ved siden av. Er begge der, kan du la Secure Boot stå på i firmware:
$ 7z l -- debian-13.6.0-amd64-netinst.iso | grep -iE 'EFI/boot/(boot|grub)x64'
2026-07-11 16:45:08 ..... 1036152 1036152 EFI/boot/bootx64.efi
2026-07-11 16:45:08 ..... 2684352 2684352 EFI/boot/grubx64.efi
Scriptet kan ikke legge til Secure Boot-støtte. Den støtten ligger inne i ISO-en, i form av en signert shim, og kan ikke settes på utenfra. Det scriptet gjør er å fortelle deg om den er der, slik at du vet på forhånd om du må slå av Secure Boot i firmware for å få pinnen til å boote.
Steg 2 - bare USB-disker vises
Her ligger den viktigste sikringen. Lista bygges av lsblk, filtrert på hele disker som enten er merket som flyttbare eller sitter på USB-bussen. Systemdisken kommer aldri opp som et valg - på maskinen under finnes to NVMe-disker på nesten en terabyte hver, og ingen av dem er i lista:
==> Scanning for removable / USB disks... Available target disks: [0] /dev/sdb 28.9G Kingston DataTraveler (usb) /dev/sdb1 28.9G vfat KINGSTON /media/youruser/KINGSTON Select target disk number [0-0]: _
Partisjonene under hver disk vises med etikett og monteringspunkt, slik at du kjenner igjen pinnen din på innholdet og ikke bare på et enhetsnavn. Til sammenligning ser lsblk alle diskene i maskinen - det er filteret som holder systemdiskene utenfor:
$ lsblk -dnp -o NAME,SIZE,RM,TRAN,TYPE /dev/sda 0B 1 usb disk ← flyttbar, kommer med i lista /dev/sdb 0B 1 usb disk ← flyttbar, kommer med i lista /dev/nvme0n1 953.9G 0 nvme disk ← systemdisk, filtrert bort /dev/nvme1n1 953.9G 0 nvme disk ← systemdisk, filtrert bort
Steg 3 - bekreftelsen du ikke kan klikke bort
Ingen [y/N]. Du må skrive inn diskstørrelsen nøyaktig slik den står, noe som krever at du faktisk leser hva som står der:
################ DESTRUCTIVE ################ About to ERASE and overwrite: Disk : /dev/sdb 28.9G (Kingston DataTraveler) With : debian-13.6.0-amd64-netinst.iso Everything on /dev/sdb will be permanently lost. To confirm, type the disk size exactly as shown (28.9G): _
Skriver du noe annet, avbrytes det hele uten at en eneste byte er skrevet. I tillegg nekter scriptet å kjøre hvis ISO-en ligger lagret på disken du er i ferd med å overskrive - da ville kilden blitt spist opp underveis.
Steg 4 - skriving, flush og verifisering
==> Unmounting any partitions on /dev/sdb... ==> Writing image (raw, byte-for-byte) to /dev/sdb... Tip: dd holds output until the first block completes, then updates every second. 791674880 bytes (792 MB, 755 MiB) copied, 41 s, 19.3 MB/s ==> Flushing remaining buffers to the device (do NOT unplug)... done. OK Write complete. ==> Verifying: reading back 755MB from /dev/sdb and comparing... reading the stick back (this is the slow part - pv shows real progress): 755MiB 0:00:38 [19.7MiB/s] [=========================>] 100% OK Verification PASSED - device matches the image byte-for-byte. OK Ejected /dev/sdb - safe to remove. This ISO supports Secure Boot - you can leave Secure Boot ON in firmware.
Verifiseringen er den delen vanlig dd hopper over, og den er grunnen til at Etcher er til å stole på. De første 755 MB leses tilbake fra pinnen og sammenlignes byte for byte med ISO-fila. Det er sånn du oppdager en minnepenn som er i ferd med å dø, eller en forfalsket pinne som utgir seg for å være større enn den er. Cachen tømmes først, så det som leses kommer garantert fra pinnen og ikke fra RAM.
Hvorfor dd status=progress og ikke pv | dd? Fordi et pipe måler hvor fort dataene havner i kjernens skrivecache, altså i RAM. Da får du en framdriftslinje som suser til 100 % og deretter blir stående helt stille mens pinnen faktisk skriver - du aner ikke om den har hengt seg opp eller bare jobber. dd med conv=fsync avslutter først når dataene er ute på fysisk media, så tallet du ser er ekte. pv brukes derimot under tilbakelesingen, der lesingen er sann framdrift.
Windows-ISO-er
En Windows-installasjons-ISO kan ikke bare kopieres rått - den trenger en partisjonert pinne med filene lagt ut på et FAT- eller NTFS-volum. Scriptet kjenner igjen en Windows-ISO på bootmgr og sources/install.wim i innholdslista, og sender jobben videre til WoeUSB-ng, som er det etablerte åpne verktøyet for akkurat dette. Er install.wim over 4 GB, velges NTFS automatisk, siden FAT32 ikke kan holde en så stor fil.
Mangler WoeUSB, skriver scriptet ut de nøyaktige installasjonskommandoene for distribusjonen din og lar deg velge: la det installere selv, gjør det manuelt i et annet vindu og kom tilbake, eller avbryt.
Verktøy som mangler
Ved oppstart sjekkes det hva som finnes på maskinen. Mangler noe, får du kommandoen for din egen pakkebehandler - apt, dnf, pacman og zypper er kjent - og samme valg som over. pv og eject er valgfrie: uten dem fungerer alt, du får bare ingen framdriftslinje under verifiseringen.
!! Missing optional tools: pv
To install, run these commands:
sudo apt-get update
sudo apt-get install -y pv
Options:
[A] Auto-install now (this script runs it for you)
[M] I will run it myself - then come back
[S] Skip (continue without them)
Choose [A/M/S]: _
Vedlikeholdes ikke - endre den selv
Laget for min egen maskin og lagt ut som det er. Ingen oppdateringer, ingen support, ingen garantier - særlig ikke for et script som sletter disker.
Skal den gjøre noe annet, last den ned og gi hele fila til en AI sammen med ønsket ditt: «hopp over verifiseringen», «skriv til to pinner etter hverandre», «lag en ISO av en pinne i stedet». Kommentarene i fila forklarer hvorfor hver sikring er der, så modellen - og du - kan se hva som trygt kan endres og hva som står der av en grunn.