Kopiering av store datamengder

Fra GNUskole
Hopp til: navigasjon, søk

Kopiering med cp

Kommandoen...

cp -a [SOURCE] [DEST]

...kopierer filer med all informasjon inntakt. -a for å si til cp-kommandoen at du vil kopiere dette som et "archive" - altså der alle kataloger, eier-informasjon og datoer kopieres inntakt.

Kopiering (og sletting) med rsync

rsync er utrolig praktisk når du vil kopiere, og spesielt slette, hundretusenvis av filer og kataloger.

rsync forholder seg nemlig litt annerledes til hvordan den skriver til inode-strukturen til filsystemet og du sparer timesvis med tid på det (spesielt om du sletter noen millioner filer).

Sjekk ut dette nettstedet for en enda raskere måte med perl: http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

Her er kommandoen for å slette 500 000 filer på 2,5 minutt: rsync -a --delete blanktest/ test/ (blanktest/ er en tom katalog som kopieres over til test/)

Kopiering med tar (hvis du vil deg selv vondt)

Av og til har man behov for å flytte store datamengder, for eksempel brukeres hjemmeområder. Tidligere var det slik at en vanlig kopiering vil da ikke være så godt egnet siden den endrer fildatoene til "nå"-datoen, og dessuten endrer eier og rettigheter til filene.

For å bøte på dette kan man bruke en litt finurlig tar-kommando for å kopiere filer fra /old til /new:

[root@ts01 ~]$ cd /old
[root@ts01 ~]$ tar -cf - . | (cd /new ; tar -xf - )

Her må man holde tungen beint i munnen for å få med alle mellomrommene og de rare tegnene...

Det som skjer er at man først går til /old med cd-kommandoen. Deretter pakker man inn (tar -cf) det som finnes i gjeldende mappe (.) og sender resultatet til STDOUT (standard utputt) (-). Deretter går man til /new med cd-kommandoen, og pakker ut ( tar -xf) det som kommer fra STDIN (standard innputt) (-), dvs innholdet fra /old.

Kopiering med dd

dd er en kommando som kan lese fra eller skrive rett til en fysisk enhet. Det kan være nyttig om man for eksempel ønsker å ta en kopi av en hel harddisk.

Med denne kommandoen kopieres ikke filene som sådan, men de "rå" dataene på den fysiske enheten det kopieres fra. Er det snakk om en harddisk leser den sektor for sektor og kan skrive dette til en ny enhet eller en fil. Et par praktiske eksempler:

Ta backup av "bootsector" av en harddisk

"Bootsektoren" til en harddisk er de første 512 bytene av en disk (sektor nummer 0), og er viktig for å kunne starte systemet rett. Grub og andre oppstartssystemer skriver kode hit, og man kan ikke "få tak" i disse dataene via det vanlige filsystemet. Man kan likevel lese de 512 første bytene av en harddisk med kommandoen dd. Her antar vi at /dev/sda er primærdisken:

dd if=/dev/sda of=bootsector.mbr bs=1 count=512

Her kjører vi kommandoen med parametrene

if=/dev/sda         Innput (enheten det skal leses fra) er /dev/sda
of=bootsector.mbr   Utputt er til en fil som heter bootsector.mbr i gjendende katalog
bs=1                "Block size" er satt til 1 (byte). 
                    Dette angir hvor store "porsjoner" vi skal lese
count=512           Vi skal lese 512 blokker (a 1 byte), altså til sammen 512 bytes.

Full harddisk-kopi

En gang i året kan det være greit å ta en full kopi av en harddisk (eller kanskje bare av en partisjon på den) som et "diskbilde" og så arkivere denne et sikkert sted. Før man tar kopi av en harddisk med dd bør den avmonteres. Er det snakk om partisjonen med systemet på kan det være greit å starte fra en Live-CD og fra denne koble inn en stor usb-disk som kan holde på diskbildet vi lager. Følgende kommando tar kopi av hele /dev/sda-disken (inkludert partisjonstabell, Master Boot Record og dataene) til en diskbilde-fil backup.sda:

dd if=/dev/sda of=/tmp/backup.sda

Sørg for at /tmp ikke ligger på disken vi kopierer fra... :-)

Følgende tar en kopi av partisjonen /dev/sda1 på tilsvarende måte:

dd if=/dev/sda1 of=/tmp/backup.sda1

Vi kan også komprimere før bildefilen skrives:

dd if=/dev/sda1 | gzip -9 | dd of=/tmp/backup.sda1.gz

...eller sende bildet til en annen maskin:

dd if=/dev/sda1 | ssh meg@et.annet.sted dd of=backup.sda1.gz

Vi har ikke noen "pipe" her mellom ssh-kommandoen og dd-kommandoen.

...eller komprimere og sende bildet til en annen maskin:

dd if=/dev/sda1/ | gzip -9 | ssh meg@et.annet.sted dd of=backup.sda1.gz

For å kjøre tilbake en backup gjør man:

dd if=backup.sda1.gz of=/dev/sda1

Lage en iso-fil av en CD eller DVD

Vi antar at /dev/cdrom er en CD/DVD-spiller med en CD/DVD-plate av Iron Maiden i. Følgende kommando vil da lage en ISO-fil av innholdet:

dd if=/dev/cdrom of=/tmp/TheBestOfIronMaiden.iso

Denne filen kan også "loop-monteres" inn i /mnt/isomappe hvis vi ønsker å lese innhodet i den:

mount -o loop /tmp/TheBestOfIronMaiden.iso /mnt/isomappe

Går ikke dette kan vi prøve å være litt mer eksplisitt:

mount -t iso9660 -o ro,loop=/dev/loop0 /tmp/TheBestOfIronMaiden.iso /mnt/isomappe