Saya ingin sengaja merusak file untuk menguji klaim bahwa btrf dapat menyembuhkan dirinya sendiri . Artikel tersebut berbicara tentang melepas sistem file, merusak foto dengan "membalik" sedikit saja dan kemudian memasang kembali. Dalam sistem file yang lebih lama ini hanya akan rusak tetapi seharusnya memperbaiki dirinya sendiri di btrfs. Secara teori, ini masuk akal tetapi saya benar-benar ingin mengujinya.
Masalahnya adalah artikel itu tidak menjelaskan bagaimana melakukan semua itu.
Bagaimana saya akan mengubah bit tunggal di bagian yang sangat spesifik dari sistem file?
Saya juga harus menunjukkan bahwa ini harus dilakukan pada sistem file offline sehingga btrfs tidak melihat tulisan saya sebagai disengaja.
Sunting: Sementara pertanyaan (dan diskusi) berbicara banyak tentang btrfs, saya ingin tahu apakah ada metode independen filesystem menerapkan jenis korupsi ini (sehingga dapat dibandingkan di berbagai jenis RAID / pengontrol / dll).
sumber
filefrag -v
untuk mencari tahu di mana tepatnya sebuah file berada.Jawaban:
Saya bukan ahli, tetapi
btrfs-progs
paket itu sebenarnya termasuk alat khusus untuk melakukan ini, meskipun Anda mungkin harus membangun dari sumber. Bagaimanapun, setelah Anda menginstal atau membangunbtrfs-progs
, Anda harus dapat menggunakan alatbtrfs-corrupt-block
, yang digunakan oleh pengembang btrf untuk menguji sistem file.Sekarang, seperti yang saya katakan, saya belum punya banyak waktu untuk bermain-main dengan btrf, jadi saya tidak tahu persis penggunaan alat ini. Tetapi dengan itu, Anda harus dapat merusak sistem file offline, yang akan diperbaiki ketika file yang rusak dibaca (dengan asumsi bahwa Anda telah menyiapkan RAID atau sesuatu sehingga ada salinan lain untuk digunakan).
sumber
btrfs-corrupt-block
sebenarnya ditulis sebagai tes asli dan bukan "trik" oleh pengembang btrfs, ini harus sesuai dengan tagihan.btrfs-corrupt-block
digunakan oleh pengembang, jadi itu tidak akan sangat berguna jika itu tipuan :)btrfs-corrupt-block
itu bukan tes yang tulus, karena itu akan ditemukan dengan sangat cepat oleh seseorang yang menusuk sumbernya, dan digunakan sebagai PR negatif terhadap Oracle (setidaknya; serta pengembang / kontributor btrf lainnya). Itu hanya komentar spontan.Dapatkan nilai satu sektor pada perangkat blok (mis.
/dev/sda1
) Dengan offset 1 juta sektor offset (hanya sebuah contoh):Offset 1M * 512 byte yang dipilih secara acak ini hanya untuk memastikan Anda keluar dari bagian metadata dari sistem file dan sebenarnya pada sektor yang berisi data.
Edit data sektor mentah dengan mengubah konten dengan hex editor. Lihat misalnya Perlu editor hex yang baik untuk Linux .
Pasang kembali sektor pada drive dengan
if
danof
argumen terbalik:sumber
@Oli - hai, saya Jim Salter, pria yang benar-benar menulis artikel itu. Saya bekerja dengan mesin virtual, yang membuat semuanya lebih sederhana. Apa yang saya lakukan dimulai dengan file JPEG, dan membukanya di hex editor. Yang khusus saya gunakan adalah Bless, yang dapat Anda instal di Ubuntu dengan apt-get install bless sederhana .
Setelah membuka JPEG di Bless, saya menekan halaman ke bawah beberapa kali untuk masuk ke dalam "daging" dari JPEG, dan kemudian hanya menyoroti data bernilai sekitar lima puluh byte, dan menyalin dan menempelkannya ke editor teks (di saya kasus, gEdit). Ini memberi saya sesuatu untuk dicari.
Sekarang saya menyimpan JPEG ke setiap array di VM. Penyimpanan di belakang array adalah serangkaian file .qcow2. Setelah saya menyimpan JPEG ke dalam array, saya dapat memuat file .qcow2 yang terkait dengan masing-masing array ke Bless, dan mencari mereka - mereka tidak terlalu besar, hanya JPEG dan beberapa metadata - untuk pola lima puluh byte itu Saya telah menyorot dan menyalin dari JPEG. Voila, saya punya blok untuk korup! Pada titik ini, saya hanya bisa mengedit byte individual dari JPEG yang disimpan di disk virtual VM menggunakan Bless - dan, yang penting, melakukannya dengan cara yang persis sama pada setiap array.
Satu-satunya kerutan adalah bahwa dalam kasus array RAID5 diuji dalam artikel, saya harus memastikan saya mengedit salinan data yang sebenarnya dalam strip, dan bukan paritas untuk strip itu sendiri - itu adalah gambar kecil pada sebuah jika tidak array kosong, jadi tidak ada data di blok BERIKUT di strip, membuat blok paritas berisi data tidak diubah dari blok data. Jika saya secara tidak sengaja mengedit blok paritas alih-alih blok data, gambar akan ditampilkan sebagai tidak berubah.
Satu catatan terakhir - Anda tidak PERLU mesin virtual untuk melakukan ini - Anda bisa melakukan hal yang sama dengan cara yang sama dengan bare metal; itu hanya akan lebih menyusahkan di pantat karena Anda harus bekerja dengan seluruh drive mentah alih-alih dengan file .qcow2 kecil yang bagus, dan Anda harus menarik drive dan meletakkannya di mesin yang berbeda, atau boot ke lingkungan langsung (atau hanya bergantian) untuk mengacaukannya. (Saya menguji penyembuhan data ZFS persis seperti ini, tetapi pada mesin logam telanjang nyata, 7-tahun lalu ketika saya pertama kali tertarik pada filesystem next-gen.)
Semoga ini membantu!
sumber
Anda dapat mencoba program kecil yang akan melakukan pada file yang dibuka.
FIBMAP
ioctl(2)
Dengan pencarian web cepat, saya menemukan posting blog ini http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html merinci cara melakukan ini - itu bahkan akan memberi Anda tautan ke program sampel yang dapat Anda kompilasi dan jalankan sendiri.
Ini persis cara
hdparm --fibmap
(disebutkan oleh @falconer) diimplementasikan.Setelah menemukan nomor blok, Anda bisa menggunakan
dd
gongfu untuk memodifikasi file, seperti @gertvdijk dibuat sketsa. Atau mungkin Anda bisa memodifikasifibmap.c
program di atas untuk melakukan flip bit untuk Anda, langsung menulis ke file perangkat melewati lapisan sistem file (tiga parameter untuk program: 1. path ke file, 2. file perangkat yang berisi file sistem, 3. offset dan bit yang ingin Anda modifikasi).( Disclaimer: saya belum diuji dan tidak bisa menjamin bahwa
FIBMAP
ioctl(2)
akan bekerja untuk file di perangkat loopback atau btrfs sistem file, tapi saya akan sangat berharap itu tidak saya. Menebakhdparm
akan memeriksa jenis perangkat sebelum melakukanioctl(2)
pada file dan karenanya kegagalan.)sumber
akan memberi Anda BBA di mana file tersebut berada. Setelah ini, Anda dapat menggunakan jawaban @gertvdijk.
sumber
0,39: device not found in /dev
Itu karena btrfs atau (lebih mungkin) karena saya menggunakannya pada file yang dipegang loopback. Saya akan mencoba dan menyelesaikan ini dengan VM yang "tepat".hdparm
bekerja pada setiap sistem file tetapi mungkin tidak demikian.