Riepilogo TL; DR : traduci un numero di settore md in offset (s) all'interno del /dev/mdX
dispositivo e come investigarlo xfs_db
. Il numero di settore proviene da sh->sector
in linux/drivers/md/raid5.c:handle_parity_checks5()
.
Non conosco gli interni MD, quindi non so esattamente cosa fare con l'output della printk
registrazione che ho aggiunto.
Anche gli offset nei dispositivi componenti (per dd
o un editor / visualizzatore esadecimale) sarebbero interessanti.
Suppongo che dovrei chiederlo sulla mailing list del raid Linux. Sono solo abbonati o posso pubblicare senza abbonarmi?
Ho xfs direttamente sopra MD RAID5 di 4 dischi sul mio desktop (no LVM). Un recente scrub ha rilevato un valore diverso da zero mismatch_cnt
(8 in effetti, perché md opera su pagine da 4 kB alla volta).
Questo è un RAID5, non RAID1 / RAID10 dove mismatch_cnt
! = 0 può accadere durante il normale funzionamento . (Gli altri collegamenti in fondo a questa pagina wiki potrebbero essere utili ad alcune persone.)
Potrei solo ciecamente repair
, ma poi non avrei idea di quale file verificare la possibile corruzione, oltre a perdere la possibilità di scegliere quale modo ricostruire. La risposta di Frostschutz a una domanda simile è l'unico suggerimento che ho trovato per risalire a una differenza nel filesystem. È ingombrante e lento, e preferirei usare qualcosa di meglio per restringerlo a pochi file prima.
Patch del kernel per aggiungere la registrazione
Stranamente, la funzione di controllo di md non segnala dove è stato trovato un errore . Ho aggiunto un printk
a md / raid5.c effettuare il login sh->sector
nel if
ramo che incrementi mddev->resync_mismatches
inhandle_parity_checks5()
(piccola toppa pubblicato su GitHub , originariamente basato sul 4.5-rc4 da kernel.org). Per questo per essere ok per uso generale, sarebbe probabilmente necessario evitare di inondare i registri nelle riparazioni con molte discrepanze (forse registrare solo se il nuovo valore di resync_mismatches
è <1000?). Inoltre forse accedi solo check
e non repair
.
Sono abbastanza sicuro che sto registrando qualcosa di utile (anche se non conosco gli interni MD!), Perché la stessa funzione stampa quel numero di settore nel caso di gestione degli errori diswitch
.
Ho compilato il mio kernel modificato e avviato, quindi ho eseguito nuovamente il controllo:
[ 399.957203] md: data-check of RAID array md125
...
[ 399.957215] md: using 128k window, over a total of 2441757696k.
...
[21369.258985] md/raid:md125: check found mismatch at sector 4294708224 <-- custom log message
[25667.351869] md: md125: data-check done.
Ora non so esattamente cosa fare con quel numero di settore. C'è sh->sector * 512
un indirizzo lineare all'interno /dev/md/t-r5
(aka /dev/md125
)? È un numero di settore all'interno di ciascun dispositivo componente (quindi fa riferimento a tre dati e un settore di parità)? Sto indovinando quest'ultimo, poiché una mancata corrispondenza di parità in RAID5 significa che i settori N-1 del dispositivo md sono in pericolo, compensati l'uno dall'altro dall'unità a strisce. Il settore 0 è l'inizio del dispositivo componente o è il settore dopo il superblocco o qualcosa del genere? Sono state fornite ulteriori informazioni handle_parity_checks5()
che avrei dovuto calcolare / accedere?
Se volessi ottenere solo i blocchi non corrispondenti, è corretto?
dd if=/dev/sda6 of=mmblock.0 bs=512 count=8 skip=4294708224
dd if=/dev/sdb6 of=mmblock.1 bs=512 count=8 skip=4294708224
dd if=/dev/sda6 of=mmblock.2 bs=512 count=8 skip=4294708224
dd if=/dev/sdd of=mmblock.3 bs=512 count=8 skip=4294708224 ## not a typo: my 4th component is a smaller full-disk
# i.e.
sec_block() { for dev in {a,b,c}6 d; do dd if=/dev/sd"$dev" of="sec$1.$dev" skip="$1" bs=512 count=8;done; }; sec_block 123456
Immagino di no, perché ottengo 4k di zeri da tutti e quattro i componenti del raid e 0^0 == 0
, quindi, dovrebbe essere la parità corretta, giusto?
Un altro posto che ho visto menzionare l'uso di indirizzi di settore in md è for sync_min
e sync_max
(in sysfs). Neil Brown nella lista dei raid linux , in risposta a una domanda su un'unità guasta con numeri di settore da hdrecover
, dove Neil ha usato il numero di settore del disco intero come numero di settore MD. Non è vero vero? I numeri di settore md non sarebbero relativi ai dispositivi componenti (partizioni in quel caso), non al dispositivo completo di cui fa parte la partizione?
settore lineare al nome file XFS:
Prima di rendermi conto che il numero del settore md era probabilmente per i componenti, non per il dispositivo RAID, ho provato a usarlo in sola lettura xfs_db
:
Il brevissimo suggerimento di Dave Chinner su come scoprire come XFS sta usando un determinato blocco non sembra funzionare affatto per me. (Mi sarei aspettato un qualche tipo di risultato, per alcuni settori, poiché il numero non dovrebbe essere oltre la fine del dispositivo anche se non è il settore non corrispondente)
# xfs_db -r /dev/md/t-r5
xfs_db> convert daddr 4294708224 fsblock
0x29ad5e00 (699227648)
xfs_db> blockget -nv -b 699227648
xfs_db> blockuse -n # with or without -c 8
must run blockget first
eh? Cosa sto facendo di sbagliato qui? Immagino che questa dovrebbe essere una domanda separata. Lo sostituirò con un link se / quando lo chiedo o trovo una risposta a questa parte da qualche altra parte.
Il mio RAID5 è essenzialmente inattivo, senza attività di scrittura e lettura minima (e noatime
, quindi le letture non producono scritture).
Altre cose sulla mia configurazione, niente di importante qui
Molti dei miei file sono video o altri dati compressi che forniscono un modo efficace per dire se i dati sono corretti o meno (o checksum interni nel formato file o semplicemente se decodifica senza errori). Ciò renderebbe possibile questo metodo di loopback di sola lettura , una volta che saprò quale file controllare. Non volevo eseguire una diff a 4 vie di ogni file nel filesystem per trovare prima la mancata corrispondenza, quando il kernel ha le informazioni necessarie durante il controllo e potrebbe facilmente registrarlo.
my /proc/mdstat
per il mio array di dati di massa:
md125 : active raid5 sdd[3] sda6[0] sdb6[1] sdc6[4]
7325273088 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
bitmap: 0/19 pages [0KB], 65536KB chunk
È su partizioni su tre unità Toshiba da 3 TB e su un'unità WD25EZRS a bassa potenza (lenta) non partizionata che sto sostituendo con un'altra Toshiba. (Usando mdadm --replace
per farlo online senza lacune nella ridondanza. Mi sono reso conto dopo una copia che avrei dovuto controllare lo stato RAID prima e dopo, per rilevare i problemi. È allora che ho rilevato la mancata corrispondenza. È possibile che sia in circolazione da molto tempo , dal momento che ho avuto alcuni crash quasi un anno fa, ma non ho vecchi registri e mdadm non sembra inviare messaggi su questo di default (Ubuntu 15.10).
I miei altri filesystem sono su dispositivi RAID10f2 realizzati da partizioni precedenti su tre HD più grandi (e RAID0 per / var / tmp). Il RAID5 è solo per l'archiviazione di massa, no /home
o /
.
Le mie unità vanno bene: i conteggi degli errori SMART sono 0 tutti i contatori di blocchi danneggiati su tutte le unità e sono stati superati i test automatici SMART brevi + lunghi.
quasi duplicati di questa domanda che non hanno risposte:
- Quali blocchi non corrispondono in un array md Linux?
- http://www.spinics.net/lists/raid/msg49459.html
- MDADM mismatch_cnt> 0. Qualche modo per identificare quali blocchi sono in disaccordo?
- Altre cose già collegate in linea, ma in particolare l'idea di loopback di sola lettura di Frostschutz .
- lavaggio nella pagina RAID wiki di Arch
.damaged
o qualcosa del genere, invece di sapere semplicemente che c'è probabilmente un file rotto da qualche parte.
mdadm -E /dev/xxx
.