Saya memiliki banyak gambar disk, dibuat dengan ddrescue, pada partisi EXT, dan saya ingin mengurangi ukurannya tanpa kehilangan data, sementara masih dapat di-mount.
Bagaimana saya bisa mengisi ruang kosong di sistem file gambar dengan nol, dan kemudian mengkonversi file menjadi file jarang sehingga ruang kosong ini sebenarnya tidak disimpan di disk?
Sebagai contoh:
> du -s --si --apparent-size Jimage.image
120G Jimage.image
> du -s --si Jimage.image
121G Jimage.image
Ini sebenarnya hanya memiliki 50G data nyata, jadi, pengukuran kedua harus jauh lebih kecil.
Ini seharusnya akan mengisi ruang kosong dengan nol:
cat /dev/zero > zero.file
rm zero.file
Tetapi jika file jarang ditangani secara transparan , itu mungkin benar-benar membuat file jarang tanpa menulis apa pun ke disk virtual, ironisnya mencegah saya mengubah gambar disk virtual menjadi file jarang itu sendiri. :) Melakukannya?
Catatan: Untuk beberapa alasan, sudo dd if=/dev/zero of=./zero.file
berfungsi saat cat
tidak pada gambar disk yang dipasang.
sumber
sudo cat /dev/zero > zero.file
tidak berfungsi karena bash Anda (berjalan seperti Anda, bukan root) melakukan pengalihan sebelum menjalankansudo
perintah. Lihat unix.stackexchange.com/questions/1416/…Jawaban:
Pertama-tama, file jarang hanya ditangani secara transparan jika Anda mencari, bukan jika Anda menulis nol.
Untuk membuatnya lebih jelas, contoh dari Wikipedia
tidak tidak menulis nol apapun, itu akan membuka file output, mencari (melompati) 5MB dan kemudian menulis nol nol (yaitu tidak ada sama sekali). Perintah ini ( bukan dari Wikipedia)
akan menulis angka nol 5MB dan tidak akan membuat file jarang!
Akibatnya, file yang sudah non-jarang tidak akan secara ajaib menjadi jarang nanti.
Kedua, untuk membuat sebuah file dengan banyak nol jarang, Anda harus cp itu
atau Anda dapat menggunakan opsi tar - atau tar - rsync juga.
sumber
cat /dev/zero > zero.file
tidak apa-apa untuk mengisi ruang kosong dengan nol?dd
untuk menulis nol atau untuk mencari.cat
perintah itu akan mengisi seluruh disk Anda (atau setidaknya jumlah yang tidak dicadangkan untuk root atau dengan kuota) dengan nol "nyata", dan tidak membuat file yang jarang.Mungkin cara termudah untuk menyebarkan file di tempat adalah dengan menggunakan
fallocate
utilitas sebagai berikut:fallocate (1) disediakan oleh paket util-linux di Debian .
sumber
fallocate --dig-holes
menghasilkan file 103GiB dari 299GiB asli, sementaracp --sparse=always
memberi saya 93GiB - semua dengan jumlah SHA1 yang sama (ukuran diperiksa viadu -B1G
vsdu --apparent-size -B1G
). Jadifallocate
sepertinya memberikan hasil yang lebih rendah.Mengedit jawaban saya untuk kelengkapan:
losetup --partscan --find --show disk.img
Asumsikan ia memberikan / dev / loop1 sebagai disk dan hanya ada satu partisi, jika tidak kita perlu mengulang ini untuk setiap partisi dengan mountable FS di dalamnya (abaikan swap partisi dll.).
mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile
Biarkan itu selesai dengan ENOSPC.
/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1
'dd' memiliki opsi untuk mengonversi file dengan nol ke file jarang:
dd if=disk.img of=disk-sparse.img conv=sparse
sumber
zerofree
mungkin lebih cepat daripada memasang dan menulis nol ke sistem file, dan membuat disk image tumbuh lebih sedikit jika sudah mengandung banyak nol.Apakah maksud Anda bahwa gambar yang dibuat ddrescue Anda, katakanlah, 50 GB dan pada kenyataannya sesuatu yang jauh lebih sedikit sudah cukup?
Jika itu masalahnya, tidak bisakah Anda membuat gambar baru dengan dd:
dan kemudian membuat sistem file di dalamnya:
lalu cukup pasang gambar, dan salin semuanya dari gambar lama ke yang baru? Apakah itu akan berhasil untuk Anda?
sumber
PartImage dapat membuat gambar disk yang hanya menyimpan blok sistem file yang digunakan, sehingga secara drastis mengurangi ruang yang diperlukan dengan mengabaikan blok yang tidak digunakan. Saya tidak berpikir Anda dapat langsung memasang gambar yang dihasilkan, tetapi pergi:
Harus menghasilkan apa yang Anda inginkan (bahkan mungkin bisa tetap pada langkah terakhir, belum mencoba).
sumber
Sekarang ada alat yang disebut virt-sparsify yang akan melakukan ini. Ini mengisi ruang kosong dengan nol dan kemudian menyalin gambar ke file jarang. Itu membutuhkan menginstal banyak dependensi.
sumber
Saya menduga Anda akan memerlukan program khusus yang ditulis untuk spec itu jika itu BENAR-BENAR apa yang ingin Anda lakukan. Tapi apakah itu ...?
Jika Anda benar-benar memiliki banyak area nol maka alat kompresi yang baik akan menurunkannya secara signifikan. Dan mencoba menulis file jarang tidak akan berhasil dalam semua kasus. Jika saya ingat dengan benar, bahkan file jarang mengambil minimal 1 blok penyimpanan keluaran di mana blok input berisi bit bit yang tidak nol. Sebagai contoh - katakan Anda memiliki file yang memiliki rata-rata bahkan 1 bit tidak nol per blok 512 byte - tidak dapat ditulis "jarang". By the way, Anda tidak akan kehilangan data jika Anda kompres file dengan zip, bzip, bzip2 atau p7zip. Mereka tidak suka kompresi mpeg atau jpeg yang lossy.
Di sisi lain, jika Anda perlu melakukan pencarian acak membaca ke dalam file maka kompresi mungkin lebih banyak masalah daripada nilainya dan Anda kembali ke menulis jarang. Seorang programmer C atau C ++ yang kompeten harus dapat menulis sesuatu seperti itu dalam satu jam atau kurang.
sumber
cp --sparse=always
melakukan pekerjaan dengan baik