2009-11-07 5 views
7

Pracuję nad narzędziem do synchronizacji plików opartym na Perlu. Pobiera pliki do katalogu tymczasowego (który gwarantuje, że jest na tym samym systemie plików co plik rzeczywisty), a następnie przenosi pliki tymczasowe na miejsce na stare, zachowując metadane, takie jak uprawnienia, prawa własności i listy ACL. Zastanawiam się, jak osiągnąć ten ostatni krok na Linuksie.Zapisywanie pliku Atom w systemie Linux bez utraty metadanych

Na Mac OS X, przynajmniej w C, użyłbym funkcji exchangedata. Zajmuje to dwie nazwy plików jako argumenty i zamienia ich zawartość, pozostawiając wszystkie metadane (oprócz mtime) w stanie nienaruszonym. Gwarantuje to, że operacja jest atomowa - wszyscy czytelnicy zobaczą stary plik lub nowy, nigdy coś pośredniego. Niestety, nie sądzę, że jest dostępny w systemie Linux.

Wiem, że rename porusza się atomowo, ale nie zachowuje metadanych. Z drugiej strony, mógłbym otworzyć plik i zastąpić dane zawartością nowego, który zachowałby wszystkie metadane, ale nie byłby operacją atomową. Wszelkie sugestie dotyczące rozwiązania tego problemu?

+2

Jakiego rodzaju metadanych pracujesz tak ciężko, aby je zachować? Wszystko, co jest w systemie Unix, to właściciel/grupa i uprawnienia dla właściciela/grupy/wszystkich. Czy to zmienia się tak bardzo, że byłoby to dla ciebie problemem? –

+0

Wiele systemów plików Linux obsługuje również rozszerzone atrybuty i listy ACL, a nieuprzywilejowany użytkownik może nie mieć wymaganych uprawnień do zmiany użytkownika i grupy pliku tymczasowego na stare. Zasadniczo jest tu dużo subtelności i zastanawiam się, czy coś już istnieje, aby sobie z tym poradzić. –

Odpowiedz

6

Jedyne podejście, jakie widzę tutaj, to odczytanie metadanych z zastępowanego pliku, zastosowanie go do pliku tymczasowego, a następnie zmiana nazwy pliku tymczasowego na stary plik. (rename zachowuje atrybuty pliku źródłowego, oczywiście.)

+0

Trudno jednak określić, jakie są wszystkie właściwe metadane. Są atrybuty plików, rozszerzone atrybuty, listy ACL, etykiety bezpieczeństwa, możliwości plików i inne rzeczy związane z systemem plików lub systemem ... – ephemient

+2

To brzmi jak dobra lista rzeczy, od których zacząć. "Wróg dobra jest wielki". – jrockway

+0

Tak, jeśli nie ma kompletnego rozwiązania (które jak dotąd nie wydaje się być), to uzyskanie co najmniej częściowego problemu jest lepsze niż nic. Nawet 'rsync' ma ograniczony zestaw metadanych, o których wie/dba. – ephemient

4

specyficznego systemu plików, ale ...

XFS_IOC_SWAPEXT ioctl zamienia stopnie dwóch deskryptorów na XFS.

#include <xfs/xfs.h> 
#include <xfs/xfs_dfrag.h> 

xfs_swapext_t sx = { 
    ..., 
    .sx_fdtarget = fd1, 
    .sx_fdtmp = fd2, 
    ... 
}; 
xfs_swapext(fd1, &sx); 

Zobacz źródła do xfs_fsr na przykład użycia.