Bagaimana cara mengubah image disk Linux menjadi file yang jarang?

12

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.fileberfungsi saat cattidak pada gambar disk yang dipasang.

endolit
sumber
2
Menulis nol ke dalam file tidak akan membuat file jarang. Itu konsep yang berbeda. Ketika Anda mencari / membaca file jarang ketika OS menemukan blok data tidak benar-benar ada (daftar blok kosong untuk data di wilayah itu) itu (OS) secara otomatis mengisi buffer baca dengan nol byte.
hotei
Catatan: sudo cat /dev/zero > zero.filetidak berfungsi karena bash Anda (berjalan seperti Anda, bukan root) melakukan pengalihan sebelum menjalankan sudoperintah. Lihat unix.stackexchange.com/questions/1416/…
Fritz

Jawaban:

19

Pertama-tama, file jarang hanya ditangani secara transparan jika Anda mencari, bukan jika Anda menulis nol.

Untuk membuatnya lebih jelas, contoh dari Wikipedia

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

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)

dd if=/dev/zero of=sparse-file bs=1k count=5120

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

cp --sparse=always original sparsefile

atau Anda dapat menggunakan opsi tar - atau tar - rsync juga.

mihi
sumber
1
Menurut Wikipedia, menulis nol dengan dd akan membuat file yang jarang. Bisakah Anda menjelaskan apa artinya "mencari"?
endolith
1
Bagaimana dengan kucing? Tidak ada apa pun di halaman manual tentang file jarang, jadi saya anggap cat /dev/zero > zero.filetidak apa-apa untuk mengisi ruang kosong dengan nol?
Ludwig Weinzierl
2
@endolith: Memperbarui jawaban saya untuk memperjelas apa perbedaan yang digunakan dduntuk menulis nol atau untuk mencari.
mihi
2
@Ludwig Weinzierl: Ya, catperintah 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.
mihi
1
@endolith Anda membutuhkan ruang ekstra, ya. tetapi karena Anda dapat mengompresi tarball, Anda hanya perlu ruang untuk file asli dan versi terkompresi dari file jarang.
mihi
12

Mungkin cara termudah untuk menyebarkan file di tempat adalah dengan menggunakan fallocateutilitas sebagai berikut:

fallocate -v --dig-holes {file_name}

fallocate (1) disediakan oleh paket util-linux di Debian .

Onlyjob
sumber
1
Untuk beberapa alasan, fallocate --dig-holesmenghasilkan file 103GiB dari 299GiB asli, sementara cp --sparse=alwaysmemberi saya 93GiB - semua dengan jumlah SHA1 yang sama (ukuran diperiksa via du -B1Gvs du --apparent-size -B1G). Jadi fallocatesepertinya memberikan hasil yang lebih rendah.
Ruslan
3

Mengedit jawaban saya untuk kelengkapan:

  1. Balon ruang FS kosong dengan nol (PERINGATAN: ini mengubah gambar disk Anda):

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

  1. Salin ke gambar yang jarang:

'dd' memiliki opsi untuk mengonversi file dengan nol ke file jarang:

dd if=disk.img of=disk-sparse.img conv=sparse

Lam Das
sumber
1
Ya, opsi ini bukan sejak OP bertanya. Ini lebih dari "tinggalkan remah roti untuk pencari lain" ... :-)
Lam Das
1
tergantung pada tipe sistem file, zerofreemungkin lebih cepat daripada memasang dan menulis nol ke sistem file, dan membuat disk image tumbuh lebih sedikit jika sudah mengandung banyak nol.
mihi
2

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:

dd if=/dev/zero of=some_image.img bs=1M count=20000

dan kemudian membuat sistem file di dalamnya:

mkfsofyourchoice some_image.img

lalu cukup pasang gambar, dan salin semuanya dari gambar lama ke yang baru? Apakah itu akan berhasil untuk Anda?

Janne Pikkarainen
sumber
2

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:

image -> partimage -> image -> cp --sparse=alway

Harus menghasilkan apa yang Anda inginkan (bahkan mungkin bisa tetap pada langkah terakhir, belum mencoba).

Grumbel
sumber
1
Sayangnya gambar yang dibuat oleh partimage tidak dapat dipasang tanpa meluaskannya lagi, menjadikannya hanya cocok untuk keperluan arsip.
Perkins
0

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.

endolit
sumber
-2

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.

hotei
sumber
Menarik - downvote namun saya perhatikan tidak ada bantahan terhadap apa yang saya tulis. Jika itu akurat tetapi tidak membantu itu bukan alasan untuk downvote. Jika itu tidak akurat dan tidak membantu maka itu memang layak untuk itu.
hotei
Saya melihat di tempat lain bahwa OP punya pertanyaan terkait dengan pemasangan gambar terkompresi. Saya berasumsi ini adalah kelanjutan dari utas itu. Mengetahui bahwa saya sekarang dapat melihat mengapa saran saya untuk kompresi tidak diterima. Program C sederhana masih merupakan cara mudah untuk membuat file jarang. TETAPI - apakah (tidak ditentukan) OS akan membiarkan Anda memasang ISO yang jarang. Selektif Ubuntu ISO mounter saya tidak 100% yakin itu akan berhasil juga ... tapi semoga berhasil.
hotei
4
mengapa menemukan kembali roda? cp --sparse=alwaysmelakukan pekerjaan dengan baik
mihi
@mihi: Itu ide yang bagus. Saya tidak tahu tentang opsi jarang karena tidak tersedia dalam rasa BSD ( freebsd.org/cgi/… ) dan saya tidak pernah memiliki persyaratan untuk melihat halaman manual Linux untuk cp (sampai hari ini).
hotei
Salah satu cara untuk memiliki gambar terkompresi dan me-mountnya juga adalah dengan hanya menyimpannya pada sistem file yang mendukung kompresi asli. Membuat pemulihan data mengerikan jika Anda mengalami kerusakan drive, tetapi untuk itulah pencadangan, bukan?
Perkins