Bagaimana cara debug ini? Masalah ini tiba-tiba muncul dalam beberapa hari terakhir. Semua cadangan situs web rusak.
Jika cadangan dibiarkan begitu saja tar
, tidak ada masalah, tetapi begitu tar dikompresi gz
atau xz
saya tidak dapat mengompresnya.
Ada banyak disk gratis
Local disk space 2.68 TB total / 2.26 TB free / 432.46 GB used
kesalahan
tar: Skipping to next header[===============================> ] 39% ETA 0:01:14
tar: A lone zero block at 2291466===============================> ] 44% ETA 0:01:13
tar: Exiting with failure status due to previous errors
878MiB 0:00:58 [15.1MiB/s] [===================================> ] 44%
Dan mengapa dikatakan Skipping to next header
? Belum pernah melakukan itu sebelumnya. Ada yang sangat salah pada beberapa file.
Ada sekitar 15 k file pdf, jpg, atau png di direktori.
perintah
pv $backup_file | tar -izxf - -C $import_dir
Pasti ada beberapa data yang merusak kompresi.
Saya juga telah mencoba memeriksa kesehatan HDD dengan melakukan ini:
# getting the drives
lsblk -dpno name
smartctl -H /dev/sda
smartctl -H /dev/sdb
Di kedua drive saya mendapatkan ini:
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Bagaimana saya bisa mengetahui file mana yang merusak tar.gz? Saya hanya ingin menghapusnya.
memperbarui
Sekarang telah menyalin semua file ke server lain dan saya memiliki masalah yang sama persis. Saya bisa tar semuanya dan mengekstraknya tanpa masalah, tetapi begitu saya ingin mengompres file, saya tidak bisa membuka kompresi mereka (gz / xz).
sumber
tar -cf xxx.tar ...
tanpa kompresigzip xxx.tar
? Apakah ekstrak tarball itu bersih? Apakahpv
menyebabkan masalah? Apa yang terjadi jika Anda droppv ... | ...
pipa dan hanya langsung menjalankantar -cvzf xxx.tar.gz ...
kemudiantar -xvzf xxx.tar ...
?pv
.Jawaban:
File Anda terpotong atau rusak, jadi
xz
tidak bisa sampai ke akhir data.tar
mengeluh karena arsip berhenti di tengah, yang logis karenaxz
tidak berhasil membaca seluruh data.Jalankan perintah berikut untuk memeriksa di mana masalahnya:
Jika
cat
mengeluh maka file rusak pada disk dan sistem operasi mendeteksi korupsi. Periksa log kernel untuk informasi lebih lanjut; biasanya disk perlu diganti pada saat ini. Jika hanyaxz
mengeluh maka OS tidak mendeteksi adanya kerusakan tetapi file tersebut tetap tidak valid (rusak atau terpotong). Bagaimanapun, Anda tidak akan dapat memulihkan file ini. Anda harus mendapatkannya kembali dari cadangan offline Anda.sumber
cat
atau apa pun akan melaporkan bahwa sebagian file tidak dapat dibaca). File-file tersebut mungkin telah terpotong (misalnya karena disk penuh saat menulisnya).cat
danxzcat
tidak mengembalikan kesalahan ..Saya tidak melihat menyebutkan bagaimana file tar rusak dibuat?
Anda mengatakan itu cadangan dari situs web, tetapi masalah yang Anda tunjukkan adalah semua ketika memulihkan / membongkar, jadi ada (sumber) di mana Anda perlu melakukan upaya pemecahan masalah.
Jika file tidak dapat dikompresi setelah memindahkan cadangan ke komputer / lokasi lain, mereka harus dibuat salah, atau rusak dalam transportasi.
Untuk menemukan sumber kesalahan:
pv
dan tanpa-i
)pv
dan tanpa-i
)Jika tidak ada masalah yang ditemukan sejauh ini:
pv
dan tanpa-i
)Jika tidak ada masalah yang ditemukan sejauh ini, skrip cadangan tidak membuat arsip seperti yang Anda lakukan ketika melakukannya dengan tangan (dan mungkin harus dimodifikasi untuk melakukan apa yang Anda lakukan secara manual).
Juga, pastikan untuk menggunakan jalur absolut dari semua perintah yang terlibat. Jika Anda memiliki variabel buruk
$PATH
dan / atau$LD_LIBRARY_PATH
pengganggu di sistem, Anda mungkin menggunakan binari trojan, yang dapat menyebabkan efek samping yang tidak disengaja.Tentu saja bisa juga
tar
versi yang tidak kompatibel yang terlibat, kecuali kedua sistem debian. Anda bisa mencoba memaksa POSIX -mode di kedua sisi.sumber
Anda menggunakan bendera
-i
yang dalam bentuk panjangnya--ignore-zeros
. Inilah sebabnya mengapa tar tidak mengeluh tentang file yang rusak. Jadi, jika Anda ingin men-debug file tar Anda, hapus saja-i
opsi dan Anda akan mendapatkan daftar file yang rusak.Ada juga 2 cara lain untuk menemukan file yang rusak di unix (secara umum). Saya mengutip jawaban yang diberikan dalam pertanyaan lain.
Sebagai referensi: Menemukan file yang rusak
sumber
Garis penalaran dalam jawaban oleh @MattBianco adalah apa yang saya ikuti secara metodis untuk menyelesaikan masalah khusus ini.
Blok nol menunjukkan EOF, tapi itu tergantung pada faktor blocking (defaultnya adalah konstanta yang dikompilasi, biasanya 20). Tar
--compare
|--diff
tampaknya mengeksekusi dengan--ignore-zeros
(-i
) secara implisit.Mengingat kerumitan ekstra
pv
, saya curigatar -i
menyebabkan masalahxz
, melihat tar man pada faktor pemblokiran yang saya sarankan untuk dihapus terlebih dahulu-i
Lalu jika itu tidak membantu, ganti dengan:
Jika Anda hanya membaca ini dengan googled "tar: A lone zero block at N" , dan tidak memipiskan apa pun, cobalah
--ignore-zeros
.sumber