Introduzione
Questo sistema è stato integrato nella base di OpenBSD. Se desideri contribuire a openrsync, per favore invia le tue patch a tech@openbsd.org
Questo repository è semplicemente la versione di OpenBSD più alcune glue per la portabilità.
Questo è un'implementazione di rsync con una licenza BSD (ISC). È compatibile con un moderno rsync (3.1.3 viene utilizzato per il testing, ma qualsiasi protocollo 27 supportato farà), ma accetta solo una parte degli argomenti della riga di comando di rsync.
Il suo sistema operativo supportato ufficiale è OpenBSD, ma si compila e si esegue su altri sistemi UNIX. Vedi Portabilità per i dettagli.
La documentazione canonica per openrsync è le sue pagine manuali. Vedi rsync(5) e rsyncd(5) per i dettagli del protocollo o la documentazione delle utility in openrsync(1).
Se desideri scrivere la tua propria implementazione di rsync, le manpages del protocollo dovrebbero avere tutte le informazioni richieste.
Le sezioni Architettura e Algoritmo su questa pagina servono a introdurre i sviluppatori al codice sorgente. Sono non canoniche.
Progetto di background
openrsync è scritto come parte del progetto rpki-client(1), un validatore RPKI per OpenBSD. openrsync è stato finanziato da NetNod, IIS.SE, SUNET e 6connect.
Installazione
Su un sistema UNIX aggiornato, scarica e esegui semplicemente:
% ./configure % make
make install
Questo installerà la utility openrsync e le pagine manuali.
È okay avere un'installazione di rsync allo stesso tempo: i due non si scontreranno in alcun modo.
Se desideri aggiornare le tue sorgenti e reinstallare, esegui semplicemente lo stesso.
Se desideri disinstallare le sorgenti:
make uninstall
Se desideri interagire con openrsync come server, puoi eseguire il seguente:
% rsync --rsync-path=openrsync src/* dst % openrsync --rsync-path=openrsync src/* dst
Se desideri che openrsync e rsync interagiscano, è importante utilizzare le bandiere della riga di comando disponibili su entrambi.
Vedi openrsync(1) per una lista.
Algoritmo
Per una descrizione robusta dell'algoritmo rsync, vedi "The rsync algorithm", di Andrew Tridgell e Paul Mackerras.
Il PhD di Andrew Tridgell, "Efficient Algorithms for Sorting and Synchronization", copre i temi in modo più dettagliato.
Questo fornisce una descrizione adatta per immergersi nel codice sorgente.
L'algoritmo rsync ha due componenti: il mittente e il ricevente.
Il mittente gestisce i file di origine; il ricevente gestisce la destinazione.
Nella seguente invocazione, prima il mittente è host remote e il ricevente è localhost, poi l'opposto.
% openrsync -lrtp remote:foo/bar ~/baz/xyzzy % openrsync -lrtp ~/foo/bar remote:baz/xyzzy
L'algoritmo si basa su una lista di file che contiene nomi e metadati (ad esempio, modo, mtime, ecc.) condivisi tra componenti.
La lista di file descrive tutti i file di origine dell'aggiornamento e viene generata dal mittente.
La condivisione è implementata in flist.c.
Dopo aver condiviso questa lista, sia il ricevente che il mittente ordinano indipendentemente gli elementi per l'ordine lessicografico dei nomi dei file.
Ciò consente alla lista di file di essere inviata e ricevuta in ordine diverso.
L'ordinamento preserva un ordine directory-first, quindi i directory vengono elaborati prima dei file contenuti.
Inoltre, una volta ordinati, sia il mittente che il ricevente possono fare riferimento agli elementi di file per la loro posizione nell'array ordinato.
Dopo che il ricevente ha letto la lista, esso itera attraverso ogni file nella lista, passando informazioni al mittente affinché il mittente possa inviare istruzioni per aggiornare il file.
Ciò è chiamato "scambio di blocchi" e rappresenta il nucleo dell'algoritmo rsync.
Durante lo scambio di blocchi, il mittente attende di ricevere una richiesta di aggiornamento o messaggio di fine sequenza; una volta ricevuta la richiesta, esso cerca nuovi blocchi da inviare al ricevente.
Una volta completato lo scambio di blocchi, i file sono tutti aggiornati.
Il ricevente è implementato in receiver.c; il mittente, in sender.c.
Una grande parte dello scambio di blocchi avviene in blocks.c.
Scambio di blocchi
La sequenza dello scambio di blocchi è diversa per il file che è un directory, un collegamento simbolico o un file regolare.
Per i collegamenti simbolici, le informazioni richieste dal ricevente sono tutte quelle necessarie.
Per i directory, il ricevente ha bisogno di conoscere i contenuti del directory, e il mittente ha bisogno di conoscere i contenuti del directory.
Per i file regolari, il ricevente ha bisogno di conoscere i contenuti del file, e il mittente ha bisogno di conoscere i contenuti del file.
Lo scambio di blocchi è implementato in blocks.c.
Commenti (0)
Accedi o Registrati per candidarti