İlk başta önerilen "meydan okuma" bazılarının yorumladığı gibi zor, uygulanabilir veya kulağa naif gelmeyebilir gibi görünse de, öyle değildir. Daha büyük bir diskten daha küçük bir diske geçmek için dd kullanmanın arkasındaki ana fikir mükemmel derecede iyidir ve verileri taşımak için faydaları vardır. Tabii ki, işgal edilen verinin hedef diske sığması için yeterli boş alana sahip olmak gerekli bir gerekliliktir.
Buradaki fikir, başlangıçta önerildiği gibi tüm diski değil, her bir bölümü ayrı ayrı tanımlamaktır. Daha da fazlası yapılabilir: Kesilecek bölümler, dosya sistemi yeniden boyutlandırma araçlarının küçük bir yardımı ile güvenli bir şekilde geçirilebilir. Aslında, bu tür bir taşıma, dosya sistemi katmanında çalışmayan ve cp, rsync, pax, ... gibi araçlarla engellenmeyen ve aygıt katmanını engellemeyen araçlarla kolayca kopyalanamayan genişletilmiş dosya özniteliklerini korumak için ilginçtir. Dd kullanmak, SELinux ile ilgili sorunları önlemek için işletim sisteminin yeniden yüklenmesi veya FS'nin yeniden etiketlenmesi gerekliliğini ortadan kaldırır.
Benzer görevleri yerine getirmek için genellikle yaptığım şey aşağıdadır:
1) Önce etkilenen bölümler içindeki kesilecek dosya sistemlerini azaltın. Bunun için resize2fs aracını kullanın (bir ext2 / ext3 / ext4 fs hakkında konuştuğumuzu varsayarsak - diğer modern FS'lerde de aynı amaçla yeniden boyutlandırma araçları bulunur). Her ne kadar - bariz nedenlerle - bir dosya sisteminin içinde bulunduğu bölümden daha büyük olamamasına rağmen, güvenli bir şekilde daha küçük olabileceğini unutmayın. Buradaki güvenlik hilesi "gereğinden fazla" azaltmaktır. Örneğin: 500 Gig diskine taşımak istediğiniz 1 TB'lık bir dosya sisteminiz olduğunu düşünün. Bu durumda, fs'yi diyelim ki 450 Gig'e düşürmeyi öneriyorum (elbette bunun için yeterli boş alanınız olması gerekir, yani, bu dosya sisteminde şu anda işgal edilen alan 450 Gig'i aşamaz). Görünüşe göre israf edilen 50 Gig'lık alan, veri taşıma işleminden sonra düzeltilecektir.
2) Hedef diski, alan kısıtlamaları dikkate alınarak uygun geometri ile bölümlere ayırın;
3) verileri disk aygıtını değil, bölümleme aygıt (lar) ını kullanarak kullanın (yani, kullanmak dd if=/dev/sda# of=/dev/sdb#
yerine her bölüm için kullanın if=/dev/sda of=/dev/sdb
). NOT: sda ve sdb burada sadece örnektir; ÖNEMLİ NOT: Daha büyük bir bölümden daha küçük bir bölümleme cihazına gelerek, dd, blok cihazının sonuna yazı yazma girişiminden şikayet edecektir, çünkü bu noktaya gelmeden önce dosya sistemi verileri tamamen kopyalanacaktır. Böyle hata mesajı önlemek için kullandığınız kopyanın boyutunu belirtebilirsiniz bs=
ve count=
büzüşen dosya sistemi boyutuna uyacak şekilde parametreler, ancak bu bazı (basit) hesaplamayı gerektirir, ama yapılırsa yanlış veri riski de vardır.
4) Verileri öğrendikten sonra, resize2fs kullanarak hedef bölüm (ler) içindeki ilgili dosya sistemlerini yeniden boyutlandırın. Bu sefer yeni dosya sistemi boyutunu belirtmeyin. Boyut belirtimi olmadan çalıştırıldığında, resize2fs dosya sistemini izin verilen maksimum boyutu kaplayacak şekilde büyütür, böylece bu durumda 450 Gig dosya sistemi 500 Gig bölümünün tamamını işgal etmek için tekrar büyür ve hiçbir bayt israf edilmez. ("Gerekenden fazlasını azalt" yaklaşımı yanlışlıkla boyutları yanlış belirlemenizi ve verilerinizi riske atmanızı önler. GB ve GiB birimlerinin zor olabileceğini unutmayın).
Daha karmaşık işlemler için not: Kopyalamak istediğiniz bir önyükleme yöneticiniz varsa, bu durum büyük olasılıkla muhtemeldir, disk aygıtlarını disk aygıtlarını kullanarak disk aygıtlarını (ör. dd if=/dev/sda of=/dev/sdb bs=4096 count=5
) seçin ve ardından / dev / sdb içindeki geometriyi yeniden yapılandırın (geçici olarak yeni sürücü için geçersiz bir geometri ancak sağlam ve geçerli bir önyükleme yöneticisi içerir). Son olarak, bir seferde bir bölüm oluşturmak için yukarıda açıklandığı gibi bölümleme aygıtlarını kullanmaya devam edin. Birçok kez böyle işlemler yaptım. Son zamanlarda, MacOSX ve Linux kurulumlarının bir karışımını içeren bir HDD'den MacMini'mde daha küçük bir SDD'ye yükseltme yaparken başarıyla karmaşık bir taşıma gerçekleştirdim6,2. Bu durumda, Linux'u harici bir sürücüden önyüklemek zorunda kaldım, bootmanager'i buldum, GPT'yi yeni diskte düzeltmek için gdisk'i çalıştırdım ve son olarak sadece küçültülmüş dosya sistemlerini içeren her bölümü dd'ed ettim. (GPT bölüm şemasının, biri başlangıçta diğeri diskin sonunda olmak üzere, bölüm tablosunun iki kopyasını sakladığını unutmayın. gdisk, PT'nin ikinci kopyasını bulamadığı ve bölümler disk boyutunu aştığı için çok şikayet ediyor, ancak disk geometrisini yeniden tanımladıktan sonra PT kopya sorununu doğru bir şekilde düzeltiyor). Bu çok daha karmaşık bir durumdu, ancak söz etmeye değer çünkü bu tür bir operasyonun da mükemmel bir şekilde uygulanabilir olduğunu gösteriyor.
İyi şanslar! ... ve en önemlisi bu tür işlemlerden önce tüm önemli verileri yedeklemeyi unutmayın. Bir hata ve verilerinize geri dönülmez bir şekilde zarar verebilirsiniz.
Ve yeterince vurgulamamam durumunda: verilerinizi taşıma işleminden önce yedekleyin! :)
dd
en uygun blok boyutu hesaplama yararlıdır