Memulihkan sistem file ext4 dengan jurnal korup

9

Saya memiliki hard drive yang tampaknya telah mengembangkan beberapa jenis masalah perangkat keras di jurnal. Ini mencegah drive dimuat. Menjalankan mount -r -t ext4 /dev/sda5 /mnt/roothasil di kernel memuntahkan berikut:

[ 1420.671055] ata1.00: exception Emask 0x0 SAct 0x1000000 SErr 0x0 action 0x0
[ 1420.673862] ata1.00: irq_stat 0x40000008
[ 1420.676600] ata1.00: failed command: READ FPDMA QUEUED
[ 1420.679326] ata1.00: cmd 60/40:c0:a8:9d:0a/00:00:08:00:00/40 tag 24 ncq 32768 in
[ 1420.679326]          res 41/40:40:e1:9d:0a/00:00:08:00:00/00 Emask 0x409 (media error) <F>
[ 1420.685014] ata1.00: status: { DRDY ERR }
[ 1420.687858] ata1.00: error: { UNC }
[ 1420.761064] ata1.00: configured for UDMA/133
[ 1420.763863] sd 0:0:0:0: >[sda] Unhandled sense code
[ 1420.766653] sd 0:0:0:0: >[sda]  
[ 1420.769364] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 1420.772104] sd 0:0:0:0: >[sda]  
[ 1420.774780] Sense Key : Medium Error [current] [descriptor]
[ 1420.777491] Descriptor sense data with sense descriptors (in hex):
[ 1420.780249]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 1420.783175]         08 0a 9d e1 
[ 1420.785972] sd 0:0:0:0: >[sda]  
[ 1420.788730] Add. Sense: Unrecovered read error - auto reallocate failed
[ 1420.791545] sd 0:0:0:0: >[sda] CDB: 
[ 1420.794331] Read(10): 28 00 08 0a 9d a8 00 00 40 00
[ 1420.797242] end_request: I/O error, dev sda, sector 134913505
[ 1420.800072] ata1: EH complete
[ 1420.800077] JBD2: Failed to read block at offset 2748
[ 1420.812529] JBD2: recovery failed
[ 1420.815275] EXT4-fs (sda5): error loading journal

Saya hampir tidak mengerti apa artinya ini, tetapi ini jelas terlihat seperti masalah perangkat keras yang mencegah jurnal dimuat. Apakah ada cara untuk mengatasi ini? Bisakah jurnal, misalnya, dipindahkan ke offset yang berbeda sambil membiarkan sisa drive sebagian besar utuh? Saya tidak punya niat untuk terus menggunakan drive; Saya hanya ingin memasangnya sehingga saya dapat menyalin beberapa file penting.

JSB ձոգչ
sumber
Dua hal: pastikan untuk melepaskan dan menghubungkan kembali kabel. Jika bahkan dapat menyingkirkan masalah perangkat keras sementara. Jika ya, dapatkan kabel baru. Jika tidak, coba juga disk di komputer lain dengan kabel yang berbeda.
0xC0000022L
Apakah Anda mencoba ke fscksistem file?
psusi
Saya memiliki masalah yang sama hari ini di mana saya entah bagaimana berhasil merusak jurnal ketika membuka kunci partisi ext4 terenkripsi saya. Saya hanya bisa me-mount sebagai baca saja. Saya berhasil memperbaikinya dengan menjalankan rutin 'Periksa' terhadap partisi di GParted. Rutin 'Periksa' menemukan masalah dengan jurnal dan memperbaikinya secara otomatis.
navnav

Jawaban:

8

Untuk me-mountnya read-only, tanpa memutar ulang jurnal sehingga Anda dapat mengakses file Anda (Anda mungkin akan kehilangan beberapa perubahan yang belum dilakukan ke fs biasa):

mount -o ro,noload ...

Ronald
sumber
7

Lihatlah output dari smartctl -a /dev/sda. Jika itu bukan masalah kabel maka disk mungkin sekarat. Jika Anda tidak memiliki cadangan baru-baru ini, Anda harus mencoba menyalin konten perangkat blok (tanpa pemasangan) menggunakan dd_rescue atau dd dengan opsi masing-masing.

Setelah itu Anda dapat mencoba hdparm --write-sector(selalu lucu pilihan "SANGAT BERBAHAYA" ini ...).

Pilihan lain adalah membuat perangkat DM yang melewati sektor yang rusak. Itu tidak memulihkan isinya, tentu saja. Anda harus mengonversi offset sda5 (134913505) menjadi offset sda5 (cari tahu jumlah sektor pertama dari sda5 dan kurangi). Anggap offset sda5 adalah 12345. Anda membuat perangkat blok yang sektornya 12345 tidak dipetakan ke sda5 tetapi di tempat lain (misalnya perangkat loop). Definisi perangkat (untuk pembuatan dmsetup) terlihat seperti ini:

0 12345 linear /dev/sda5 0
12345 1 linear /dev/loop0 0
12346 99987653 /dev/sda5 12345

# format:
# logical_start_sector num_sectors linear destination_device start_sector

Anda tidak akan seberuntung itu hanya ada satu sektor yang rusak. Anda dapat memetakan sebanyak yang Anda inginkan (menghasilkan perangkat DM yang menghasilkan angka nol untuk sektor-sektor tersebut tetapi dapat ditulisi) tetapi menghitung offset di loop0 mungkin menjadi hal yang menyenangkan. Pilihan lain adalah menggunakan perangkat virtual dengan ukuran yang sama untuk memetakan dan menggunakan thin provisioning atau snapshot (dengan ukuran bongkahan kecil, misalnya 1 sektor) dari perangkat target nol.

Edit 1

Perangkat loop seharusnya tidak mengarah ke file pada disk yang sama (sda), tentu saja.

Hauke ​​Laging
sumber
Poin yang sangat bagus. --write-sectoradalah FAR dari "berbahaya". Bahkan, ini sebenarnya adalah pilihan ideal untuk digunakan setiap sektor tunggal korup tertentu mencegah Anda dari mendapatkan gambar sektor mentah terus menerus ( ddakan ditebus dengan "Kesalahan Perangkat I / O"; beberapa hdds bahkan akan perlu untuk siklus daya mesin ( !) untuk dikenali oleh OS lagi). Namun, Anda harus tahu tentang skrip shell jika Anda ingin menggunakan --write-sectoruntuk rentang sektor .
syntaxerror
0

Anda dapat mem-boot dalam mode pemulihan, di mana FS akan dipasang hanya-baca, dan menyalin barang-barang Anda.

schaiba
sumber
Saya sedang memasang read-only. Saya mengoreksi baris perintah yang ditunjukkan di atas untuk membuatnya lebih jelas.
JSB ձոգչ
Dan bisakah Anda mengakses drive?
schaiba
Tidak. Mencoba memasang RO drive (atau dalam R / W, tidak ada bedanya) menghasilkan kesalahan yang ditampilkan di atas.
JSB ձոգչ
Maka saran dengan pertukaran kabel mungkin berguna. Dan mengenai pertanyaan Anda, jurnal tidak dapat dipindahkan seperti yang Anda inginkan.
schaiba