Mam sześć woluminów logicznych systemu Linux, które razem tworzą maszynę wirtualną. Maszyna wirtualna jest obecnie wyłączona, więc łatwo jest robić spójne zdjęcia ich.
Chciałbym spakować wszystkie sześć zdjęć razem w archiwum. Po prostu mogłem zrobić coś takiego:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Ale to oczywiście tworzy dodatkową kopię. Chciałbym uniknąć dodatkowej kopii.
Oczywiste podejście:
tar c /dev/Zia/vm_lvraid_* | whatever
nie działa, ponieważ tar rozpoznaje pliki jako specjalne (w tym przypadku dowiązania symboliczne) i zasadniczo przechowuje je ln -s
w archiwum. Lub, z --dereference
lub bezpośrednio wskazany /dev/dm-X
, rozpoznaje je jako specjalne (pliki urządzeń) i zasadniczo przechowuje je mknod
w archiwum.
Szukałem opcji wiersza polecenia do tar, aby zastąpić to zachowanie i nie znalazłem żadnego. Próbowałem również cpio
, ten sam problem, i nie mogłem znaleźć żadnych opcji, aby go zastąpić. Też próbowałem 7z
(ditto). To samo z pax
. Próbowałem nawet zip
, co się po prostu pogubiło.
edycja: Patrząc na kod źródłowy GNU tar i GNU cpio, wydaje się, że żaden z nich nie może tego zrobić. Przynajmniej nie bez poważnych sztuczek (nie można wyłączyć specjalnej obsługi plików urządzeń). Tak więc mile widziane byłyby sugestie poważnego oszustwa lub alternatywne narzędzia.
TLDR: Czy istnieje jakiś archiwizator, który spakuje wiele obrazów dysku razem (pobranych z surowych urządzeń) i przesyła strumieniowo to wyjście, bez wykonywania dodatkowych kopii na dysku? Moje preferencje byłyby wyprowadzane we wspólnym formacie, takim jak POSIX lub GNU tar.
źródło
Odpowiedzi:
Ostatnio chciałem to zrobić
tar
. Niektóre dochodzenie wskazało mi, że nie było to trochę nonsensowne. Wymyśliłem tę dziwnąsplit --filter="cat >file; tar -r ..."
rzecz, ale, cóż, było to strasznie wolne. Im więcej czytałem otar
tym, tym bardziej wydawało się to bezsensowne.Widzisz,
tar
to tylko połączona lista rekordów. Pliki składowe nie są w żaden sposób zmieniane - są całe w archiwum. Są one jednak zablokowane na 512-bajtowych granicach bloku , a przed każdym plikiem znajduje się nagłówek . Otóż to. Format nagłówka jest również bardzo prosty.Więc napisałem własny
tar
. Ja to nazywam ...shitar
.To naprawdę mięso i ziemniaki. Zapisuje nagłówki i oblicza chksum - co, relatywnie rzecz biorąc, jest jedyną trudną częścią. Robi
ustar
format nagłówka ... może . Przynajmniej emuluje to, co GNUtar
wydaje się uważać zaustar
format nagłówka do tego stopnia, że nie narzeka. I jest coś więcej, po prostu jeszcze tego nie skoagulowałem . Tutaj pokażę ci:To
tar
. Wszystko jest wypełnione\0
zerami, więc zmieniam sięem
w\n
ewline dla czytelności. Ishitar
:WYNIK
Mówię trochę na górze, bo to nie
shitar
jest cel -tar
robi to już pięknie. Chciałem tylko pokazać, jak to działa - co oznacza, że muszę dotknąćchksum
. Gdyby nie to, po prostudd
oderwałbym się odtar
pliku i skończyłbym z nim. Może to czasem działać, ale robi się bałagan, gdy w archiwum jest wielu członków. Mimo to, chksum jest naprawdę łatwe.Najpierw zrób 7 spacji - (myślę, że to dziwna rzecz gnu, jak mówi specyfikacja 8, ale cokolwiek - hack to hack) . Następnie dodaj wartości ósemkowe każdego bajtu w nagłówku. To twoje chksum. Więc potrzebujesz metadanych pliku przed wykonaniem nagłówka, inaczej nie masz programu chksum. A to
ustar
głównie archiwum.Dobrze. Co to znaczy:
To sprawia, że trzy obrazy dysków 500M, formatują i montuje każdy, i zapisuje plik do każdego.
Uwaga - najwyraźniej urządzenia blokujące zawsze będą blokować poprawnie. Bardzo przydatny.
To
tar
jest zawartość plików urządzeń dyskowych typu In-Stream i potokuje dane wyjściowexz
.Chwila prawdy ...
Brawo! Ekstrakcja...
Porównanie...
A wierzchowiec ...
I tak w tym przypadku
shitar
działa dobrze. Wolałbym nie zajmować się wszystkimi rzeczami, które nie przyniosą dobrego rezultatu. Ale powiem - nie rób co najmniej nowego wiersza w nazwach plików.Możesz także zrobić - a może powinieneś, biorąc pod uwagę oferowane przeze mnie alternatywy - z tym
squashfs
. Nie tylko dostajesz jedno archiwum zbudowane ze strumienia - ale jest wmount
stanie i wbudowane w jądrovfs
:Z pseudopliku. Przykład :
Możesz także użyć
btrfs (send|receive)
do przesłania strumienia objętości do dowolnegostdin
kompresora, który ci się podoba. Ta podobjętość nie musi oczywiście istnieć, zanim zdecydujesz się użyć jej jako kontenera kompresyjnego.Mimo to około
squashfs
...Nie wierzę, że robię tę sprawiedliwość. Oto bardzo prosty przykład:
To tylko wewnętrzny
-p
argument zamksquash
. Możesz pobrać plik-pf
zawierający tyle plików, ile chcesz. Format jest prosty - definiujesz nazwę / ścieżkę pliku docelowego w systemie plików nowego archiwum, nadajesz mu tryb i właściciela, a następnie mówisz, z którego procesu wykonać i odczytać standardowe wyjście. Możesz utworzyć tyle, ile chcesz - i możesz używać LZMA, GZIP, LZ4, XZ ... hmm jest więcej ... formatów kompresji, jak chcesz. A efektem końcowym jest archiwum, w którym tycd
.Więcej o tym formacie:
Oczywiście nie jest to tylko archiwum - jest to skompresowany, możliwy do zamontowania obraz systemu plików Linux. Jego format to jądro Linuksa - jest to system plików obsługiwany przez jądro wanilii. W ten sposób jest tak powszechny jak waniliowe jądro Linuksa. Więc jeśli powiedziałbyś mi, że używasz waniliowego systemu Linux, na którym
tar
program nie został zainstalowany, byłbym wątpliwy - ale prawdopodobnie uwierzyłbym ci. Ale jeśli powiedziałbyś mi, że używasz waniliowego systemu Linux, na którymsquashfs
system plików nie był obsługiwany, nie uwierzyłbym ci.źródło
input f 444 root root dd if=/dev/sda1 bs=1024 count=10
to f plik wejściowy? Być może lepiej byłoby stworzyć zabawkowe urządzenie, wypełnić je danymi i napisać z niego? I czy to wszystko wymaga rootowania?input
plik jest plikiem wsquashfs
archiwum - obraz systemu plików, który wynika z uruchomienia polecenia. Gdy to zrobiszmksquash
, możesz określić te pseudopliki poleceń dla poleceń, które są uruchamiane i z którychstdout
są przechwytywane w czasie kompresji.Problem przez jakiś czas mnie intrygował i myślę, że znalazłem rozwiązanie, które zadziałałoby.
Myślę, że możesz osiągnąć to, co chcesz dzięki 7z za pomocą
-si{NAME}
flagi.Będziesz mógł dostosować się do swoich potrzeb.
EDYCJA : Usuń Bezużyteczne użycie cat
źródło
7z
nie wspomina, że -si może przyjąć nazwę pliku, ale działa. To nie jest idealne (wyjście nie może być gdzieś potokowane), ale jest zdecydowanie najlepsze, jak dotąd, wyjście w wspólnym formacie.