Btrfs dosya sistemi nasıl kopyalanır


17

Bir btrfs dosya sisteminin içeriğinin tam bir kopyasını nasıl oluşturabilirsiniz ? By tam kopya Ben sadece ortalama akım verileri , aynı zamanda farklı alt hacimler onların sahip anlık aynı içeriğe sahip bloklar çoğaltarak değil: İdeal olan inek yapıları (yani koruyarak.

ddUUID'yi kopyaladığı için blok düzeyinde bir kopya (gibi ) iyi bir fikir değil gibi görünüyor ve görünüşe göre kolayca değiştirmenin bir yolu yok .

Yanıtlar:


4

Seçenek 1 - Aptal veri kopyalama ve ardından UUID değiştirme

Kaynak bölümünün bağlantısının kesildiğinden ve otomatikleştirilmeyeceğinden emin olun.

Kullanım ya dd(yavaş, dilsiz) ya dapartclone.btrfs -b -s /dev/src -o /dev/target

btrfstune -uKopyalamadan sonra ve montajdan önce UUID'yi değiştirmek için kullanın .

Veri kaybı uyarısı : Do DEĞİL montaj (auto) deneyin ya aslı veya kopya UUID değiştirildi kadar


Seçenek 2 - btrfs-clone

Ben şahsen denemedim btrfs-clone, ama mevcut bir BTRFS dosya sistemini yenisine klonlamayı, her bir alt cildi sırayla klonlamayı iddia ediyor.


1
Tamlık için bu, 2015 yılında btrfs-progs'a bir seçenek olarak eklendi: github.com/kdave/btrfs-progs/commit/…
goncalopp

16

Bugün (2016-05-06) itibariyle herhangi bir hazır çözüm bulamadım, ancak Yazma Kopyalama işleme de dahil olmak üzere sorunu amacım için çözdüm. "Klon" için adımlar /sourceiçin /targetşunlardır:

  1. Tarafından sipariş edilen alt hacim bir listesini alın ogen: btrfs subvolume list -qu --sort ogen /source. Sıralama, muhtemelen öncekilere bağlı anlık görüntülerin veya alt hacimlerin işlenmesini sağlamak için yeterlidir. Bu, Yazarken Kopyala ile başa çıkmak için önemlidir, çünkü önce temel hacimlerin aktarılması gerekir.

  2. Düğmesini kullanarak tüm alt hacimleri salt okunur yapın btrfs property set -ts /source/some-volume ro true.

  3. Şimdi, yukarıdaki listeden her alt hacim için, üstten başlayarak aşağıdakileri yapın:

    1. Birimin üst UUID'si (olarak görüntülenir -) yoksa veya üst UUID listede artık yoksa, çalıştırın:btrfs send /source/some/volume | btrfs receive /target/some/

    2. Birimin hala var olan bir üst UUID'si varsa, zaten nedeniyle aktarmış olmalıyız --sort ogenve veri çoğaltmasını önlemek için bunu bir temel olarak kullanabiliriz. Bu nedenle, listede üst UUID'nin yolunu bulun ve çalıştırın: btrfs send -p /source/parent/volume/ -c /source/parent/volume/ /source/some/volume/ | btrfs receive /target/some/(btrfs muhtemelen -pargümanı otomatik olarak tahmin eder , ancak açık olmayı tercih ederim).

    3. Yukarıdaki komutlardan birini çalıştırdıktan sonra hedef ve kaynak okuma-yazma yeniden yapmak: btrfs property set -ts /source/some/volume ro false; btrfs property set -ts /target/some/volume ro false. Kaynak daha önce salt okunursa bu adım atlanabilir.

Bu birçok durumu ele almalıdır. Uyarılar:

  1. Alt hacimleri / anlık görüntüleri iç içe yerleştirirken sıralamayla ilgili bazı komplikasyonlar olabilir.

  2. Komut dosyası yazıldığında tüm süreç açıkça daha eğlenceli.

  3. btrfs sendbirden çok klon kaynağı ( -c) argümanını kabul eder . Sadece ebeveynin hacim yolunu değil, aynı zamanda herhangi bir atadan veya daha önce gönderilen ciltlerden herhangi birinin belirtilmesi de avantajlı olabilir. Burada herhangi bir fark yaratmadı, ancak bazı durumlarda veri çoğaltmasından kaçınmaya yardımcı olabilir.

  4. Anlık görüntüler veya alt hacimlerdeki herhangi bir meta bilginin yol boyunca kaybolup kaybolmadığından emin değilim, ancak çoğu kullanım vakası için ilginç olan her şey korunmalıdır.

Tüm süreç, kullanılan 3.8 GB'lık (GB'ye göre df) 800 GB'lık bir dosya sistemini kullanılan 3.8 GB'lık 10 GB'lık bir görüntüye aktarmama yardımcı oldu. 190 GB olmadan aktarım -pve -cyaklaşık 190 GB kullanırdı, bu nedenle veri çoğaltma gerçekten önlendi.


İyi yazılmış cevap, teşekkürler. Ne ogenanlama geldiğini açıklayabilir misiniz ?
drumfire

@drumfire ogen, alt hacmin "kökeni nesli" dir. Farkları tam olarak anlamadığımı veya (orijinsiz) neslin kullanılmasının doğru olup olmayacağını itiraf etmeliyim, ancak bazı testlerin bunun daha iyi çalıştığını (tekrardan kaçınılması) gösterdiğini varsayalım. Nesil, bir alt hacme dayalı anlık görüntüler oluştururken güncelleniyor gibi görünüyor, ogen değil. Bazı bulguları duymak isterim. Büyük olasılıkla IRC'yi veya Btrfs posta listesini kontrol etmek en iyisidir.
Thomas Luzat

2
@ThomasLuzat algoritmasını aldım, etrafına bir miktar tüy ekledim (hata kontrolü vb.) Ve buraya koydum: github.com/jernst/btrfs-copy-filesystem/blob/master/… . Sorunum bozuk bir diskten kurtulmak için çalıştı ve bunun başkası için çalışacağının garantisi yok. Ama kimse bunu kodlamak için sıfırdan başka bir yerden başlamak isterse yine de burada yayınlıyorum. Şu anda yeni bir UBOS yöntemine bağlı olmakla birlikte, taşıması kolay olmalıdır.
Johannes Ernst

6

Bunu yapabilen bir python aracı oluşturdum . Bunu yaptım çünkü @Thomas Luzat'ın hem benim hem de @Johannes Ernst uygulamasında yaklaşımını denedim ve klonlama prosedüründe kullanılan alan 20GB'dan 40GB'ye iki katına çıktı. Daha verimli bir şeye ihtiyaç olduğunu düşündüm.

Bu yaygın dosya sistemi geçmişini göz önünde bulundurun:

current ---------------------------------\
             |       |        |          |
           snap4   snap3    snap2      snap1

Thomas algoritması ile önce "akım" klonlanır ve tüm anlık görüntüler (eski "akım" durumlarının anlık görüntüleri olarak) klon kaynağı / üst öğesi olarak "akım" kullanır. Açıkçası, snap3'ü snap4'e, snap2'yi snap3'e vb.

Ve bu sadece buzdağının görünen kısmı; karmaşık bir geçmişi olan bir btrfs dosya sisteminde "en iyi" klon kaynaklarını bulmak (yer tasarrufu açısından) önemsiz bir sorundur. Bu problemi çözmek için alanı daha verimli kullandığımız 3 strateji geliştirdim. Biri aslında kaynağınkinin biraz altında klon boyutuyla sonuçlandı.

İlgileniyorsanız github sayfasındaki ayrıntıları okuyabilirsiniz .



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.