Biorąc pod uwagę, że ZFS jest opisywany bardziej jako baza danych niż system plików, uzasadnione wydaje się oczekiwanie, że będzie on zachowywał się podobnie do systemu zarządzania wersjami, inteligentnie zarządzając modyfikacjami plików, przeniesieniami i nazwami. Pytania dotyczą w szczególności migawek, jednak migawki mają wiele wspólnego z klonami i
- Kiedy plik jest modyfikowany w ZFS po migawce, czy migawka będzie miała ten sam rozmiar i tylko różnice, czy cały plik?
- Kiedy plik zostanie przeniesiony do ZFS po migawce, czy migawka pozostanie zasadniczo zerowa?
- Czy po zmianie migawki nazwa pliku w ZFS zostanie zmieniona na zero?
Czy po utworzeniu migawki w pliku, w której znajduje się dowiązanie do pliku, pozostanie zasadniczo pusta?
Sugeruje się, że BTRFS jest zaprojektowany tak, aby robić w zasadzie te same rzeczy, co ZFS, czy zatem można by oczekiwać takich samych zachowań w tych warunkach?
Kiedy komputer z systemem Windows uzyskuje dostęp do udziału ZFS zdalnie przez SAMBA, czy powyższe zachowanie jest prawdziwe, czy też SAMBA stanowi podzbiór standardowych instrukcji dysku, tzn. Ruch staje się kopią + usunięciem?
Czy możliwe jest ogólne udzielenie odpowiedzi na powyższe pytania, czy też wszystkie odpowiedzi dotyczą konkretnego wdrożenia?
Zgodnie z prośbą komentatora następujący test jest wykonywany na opisanych operacjach:
Informacje o systemie:
- Jądro CentOS 7 3.10.0
- ZFS v0.6.5.9-1
.
`zpool list` `zfs list`
POOL SIZE ALLOC FREE USED AVAIL REFER
Utwórz pulę: zpool create -m /test/mnt FILE-TEST /test/1.img /test/2.img
FILE-TEST 224M 80.5K 224M 73K 192M 19K
Migawka: zfs snapshot FILE-TEST@1
FILE-TEST 224M 122K 224M 73K 192M 19K
FILE-TEST@1 0 - 19K
Utwórz plik: echo ‘test’ > /test/mnt/test.txt
FILE-TEST 224M 132K 224M 95K 192M 21K
FILE-TEST@1 17K - 19K
Zwiększ rozmiar pliku: `head -c 128K /test/mnt/test.txt
FILE-TEST 224M 678K 223M 490K 192M 148K
FILE-TEST@1 17K - 19K
Migawka: zfs snapshot FILE-TEST@2
FILE-TEST 224M 267K 224M 239K 192M 148K
FILE-TEST@1 17K - 19K
FILE-TEST@2 0 - 48K
Edytuj plik, zmień ostatnie 4 bajty.
FILE-TEST 224M 1.07M 223M 386K 192M 148K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
Migawka: zfs snapshot FILE-TEST@3
FILE-TEST 224M 548K 223M 388K 192M 148K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 0 - 148K
Zmień nazwę pliku mv test.txt test2.txt
FILE-TEST 224M 552K 223M 404K 192M 150K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 10K - 148K
Migawka: zfs snapshot FILE-TEST@4
FILE-TEST 224M 1.06M 223M 645K 191M 150K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 10K - 148K
FILE-TEST@4 0 - 150K
Nowy folder: mkdir /test/mnt/subdir
FILE-TEST 224M 716K 223M 420K 192M 151K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 10K - 148K
FILE-TEST@4 9K - 150K
Migawka: zfs snapshot FILE-TEST@5
FILE-TEST 224M 790K 223M 424K 192M 151K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 10K - 148K
FILE-TEST@4 9K - 150K
FILE-TEST@5 0 - 151K
Przenieś plik: mv /test/mnt/test2.txt /test/mnt/subdir/
FILE-TEST 224M 584K 223M 444K 192M 151K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 10K - 148K
FILE-TEST@4 9K - 150K
FILE-TEST@5 10K - 151K
Migawka: zfs snapshot FILE-TEST@6
FILE-TEST 224M 602K 223M 447K 192M 151K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 10K - 148K
FILE-TEST@4 9K - 150K
FILE-TEST@5 10K - 151K
FILE-TEST@6 0 - 151K
Utwórz plik linku twardego: cp -l /test/mnt/subdir/test2.txt /test/mnt/subdir/test3.txt
FILE-TEST 224M 603K 223M 466K 192M 152K
FILE-TEST@1 17K - 19K
FILE-TEST@2 138K - 148K
FILE-TEST@3 10K - 148K
FILE-TEST@4 9K - 150K
FILE-TEST@5 10K - 151K
FILE-TEST@6 12K - 151K
Uwagi z powyższego:
- ROZMIAR i BEZPŁATNIE są bardzo stałe i zgodne z zajmowaną przestrzenią plików
- ALLOC jest losowy
- REFER na migawkach wydaje się być równy ówczesnemu REFER na puli
- W przypadku większości operacji USED na migawkach wynosi około 10 KB, z wyjątkiem zmiany pliku, w której USED jest nieco większy niż cały zmieniony rozmiar pliku.
- UŻYWANY na basenie rośnie w nierównych skokach
- REFER stopniowo rośnie około 1K na operację
- Migawki nieprądowe mają niezmieniony rozmiar
Odpowiedzi:
Różne bloki zwiększają rozmiar.
Oznacza to, że jeśli plik składa się ze 100 bloków i zmodyfikujesz pojedynczy bajt (zakładając, że jeden bajt jest mniejszy niż jeden blok), na końcu zostanie dodany jeden nowy blok (łącznie 101), twój stary plik będzie odnosił się do bloków 1 do 100 ( można uzyskać dostęp tylko do odczytu z migawki), a Twój nowy / bieżący plik będzie odnosił się do bloków 1 do 37 i 39 do 101 (lub dowolnej innej kombinacji w zależności od faktycznej operacji modyfikacji).
Gdy tylko zniszczysz migawkę, blok 38 zostanie oznaczony jako wolny i może zostać nadpisany (o ile żadne inne migawki go nie odwołują).
W tym samym systemie plików tak, oprócz metadanych (na przykład odniesienia należy zmienić).
Pomiędzy systemami plików jest to operacja pełnego kopiowania i usuwania, nawet jeśli systemy plików znajdują się w tej samej puli lub są potomkami.
Tak, oprócz metadanych (na przykład twoje nowe imię musi być gdzieś zapisane).
Czy mógłbyś być bardziej szczegółowy tutaj?
Nie przypuszczałbym, że robi to wszystko tak samo.
Masz dwie możliwe implementacje udostępniania plików Windows - albo serwer CIFS opracowany przez Sun dla Solaris i otwarty z OpenSolaris / illumos, albo implementację Samba SMB, która jest używana w prawie wszystkich dystrybucjach GNU / Linux i systemach BSD:
Zakładam, że w drugim przypadku masz prawie to samo, co na innych systemach, chociaż go nie testowałem.
Możesz na nie odpowiedzieć zgodnie z kodem, który znajduje się na repozytorium illumos / OpenZFS (repozytorium Github), jeśli lubisz czytać kod C, lub możesz odpowiedzieć ogólnie na podstawie stron podręcznika i dokumentacji. Na przykład właściwości REFER, UŻYWANE itd. Są tam szczegółowo wyjaśnione. Najbardziej interesujące strony to
man zpool
(sprzęt, układy dysków, właściwości puli),man zfs
(właściwości systemu plików, migawki, klony),man chmod
(tylko Solaris / illumos, listy ACL plików i udziałów) orazman zdb
(debugowanie i analiza).źródło
cp -l ...
aby wygenerować plik z tym samym i-węzłem, to czy różnica przechowywana między migawką a bieżącym systemem plików będzie zasadniczo zerowa , czy będzie to rozmiar nowego pliku. Być może innym pytaniem jest to, czy ZFS jest w pełni świadomy linków twardych, co powinno być oczywistym pytaniem.