
Come è noto, se qualcosa può andare storto, lo farà sicuramente. Probabilmente tutti noi abbiamo vissuto momenti in cui un file importante è stato accidentalmente eliminato o il testo in un editor modificato è stato accidentalmente selezionato e distrutto.
Se sei un hoster o il proprietario di un sito web, è probabile che tu abbia affrontato attacchi agli account utente o al tuo sito. In tali situazioni, è fondamentale ripristinare la cronologia, trovare il modo in cui è avvenuta l'intrusione e identificare la vulnerabilità sfruttata dall'aggressore.
Per affrontare problemi simili, il file system NILFS2 è un'ottima soluzione.
È presente nel kernel di Linux a partire dalla versione 2.6.30.
Una caratteristica di questo file system è simile a un sistema di controllo delle versioni: puoi sempre ripristinare lo stato del sistema indietro nel tempo e vedere com'era qualche tempo fa.
Per garantire questa funzionalità non è necessario configurare script Cron, effettuare snapshot e simili. Il file system NILFS2 fa tutto da solo. Non riscrive mai i dati vecchi e scrive sempre in nuove aree del disco, se c'è spazio libero sufficiente. Tutto ciò è in pieno accordo con il principio Copy-on-Write.
In effetti, qualsiasi modifica a un file comporta la creazione automatica di un nuovo snapshot del file system, quindi puoi utilizzare questo file system come una macchina del tempo e riportare indietro lo stato dei file.
Storia
NILFS2 è stato sviluppato nelle profondità , che è effettivamente controllata dallo stato ed è la più grande compagnia di telecomunicazioni del Giappone. Specificamente, è stato sviluppato presso i CyberSpace Laboratories sotto la direzione di .
Per cosa sia stato sviluppato esattamente non è noto, tuttavia, si può supporre che un file system di questo tipo, con la sua funzionalità di 'macchina del tempo', sia ideale per memorizzare dati su cui le agenzie di intelligence potrebbero voler indagare, riproducendo l'intero panorama di SMS, email e così via...
NILFS2 è anche uno strumento potenzialmente molto prezioso per i servizi di sicurezza interna, poiché consente di recuperare tutte le email eliminate nel database di posta, rivelando eventuali irregolarità da parte dei dipendenti che potrebbero successivamente tentare di nasconderle, eliminando o modificando i loro file.
Come tracciare l'intera cronologia delle comunicazioniIn Linux sui server (dove è consigliabile installare NILFS2 per motivi di sicurezza interna), per memorizzare i messaggi di posta elettronica viene spesso utilizzato un metodo di archiviazione basato su file. Il cosiddetto formato . È sufficiente installare e configurare l'archiviazione delle email in Maildir. Un altro formato, , consiste in un grande file di testo facilmente analizzabile in messaggi separati.
Se il server di posta utilizza un database, NILFS2 offre la possibilità di ripristinare la cronologia esatta delle modifiche al database e di ripristinarlo a uno di questi momenti. A quel punto, sarà necessario utilizzare gli strumenti del DB per esaminare cosa conteneva in quel preciso momento...
Tuttavia, qualcosa è andato storto. O il governo giapponese ha cambiato idea sul monitorare tutto (simile al principio Yurov), o le prestazioni di NILFS2 su HDD tradizionali sono risultate inferiori alle aspettative, e NILFS2 è stata rilasciata sotto licenza GPL, entrando rapidamente nel kernel di Linux, poiché non c'erano lamentele particolari sul codice scritto dai altamente qualificati programmatori giapponesi.
A cosa somiglia NILFS2?
In termini di utilizzo: è simile a un sistema di controllo versione . Ogni checkpoint del file system è un commit che viene effettuato automaticamente senza il consenso dell'utente ad ogni modifica: sia che si tratti di eliminazione, modifica del contenuto di un file o dei permessi. Ogni commit ha un numero che aumenta linearmente.
In termini di programmazione: è simile a un buffer circolare. Il file system accumula le modifiche e le scrive in un blocco di circa 8 MB (2000 * 4096, dove 2000 è il numero di elementi nel blocco e 4096 è la dimensione della pagina di memoria). L'intero disco è suddiviso in questi chunk. La scrittura avviene in modo sequenziale. Quando lo spazio libero finisce, vengono eliminati i snapshot più vecchi e i chunk vengono riscritti.
Le principali caratteristiche di NILFS2
- Versionamento!!!
- La procedura di recupero del file system dopo un crash è semplice: all'avvio, si cerca l'ultimo chunk con un checksum valido, e su di esso si imposta il superblocco. È praticamente un'operazione istantanea.
- Poiché la scrittura avviene sempre in modo lineare:
- può mostrare buoni risultati quando si utilizza su SSD, con scritture casuali lente.
- NILFS2 risparmia le risorse SSD, poiché praticamente non c'è il fattore di moltiplicazione della scrittura.
Per essere precisi, non supera 2.Il fatto è che durante la sovrascrittura ciclica dell'intero disco, NILFS2 trasferisce i dati immutabili in nuovi pezzi (chunk).Se abbiamo sul disco il 10% di dati immutabili, otterremo un incremento del 10% nella scrittura dopo una completa sovrascrittura. E un incremento del 50% con il 50% di occupazione del dispositivo dopo una completa sovrascrittura del disco.
Il massimo fattore di amplificazione della scrittura è 2. Questo è molto basso considerando che tutto viene scritto in modo sequenziale. In generale, la moltiplicazione della scrittura sarà inferiore a quella di un normale file system frammentato con un settore di 4096 byte. (Scaturito da ).
- La potenziale semplicità dell'implementazione della replica su un file system NILFS2 remoto
NILFS2 per /home
Nei sistemi operativi simili a Unix, di solito è presente una cartella /home dove vengono archiviati i dati degli utenti. Diverse applicazioni salvano in questa cartella le loro impostazioni relative a ciascun utente.
E chi, se non gli utenti, commette errori più spesso? Quindi, come si suole dire, è stato proprio Dio a volerci far usare NILFS2 su /home.
Inoltre, con la diffusione degli SSD, ora possiamo smettere di preoccuparci di forti cali di prestazioni quando utilizziamo file system con CoW.
Sì, possiamo creare istantanee (snapshot) frequentemente sia in ZFS che in BTRFS, ma c'è sempre il rischio che una modifica persa di un file rimanga tra le istantanee. E le istantanee devono anche essere gestite: si devono eliminare quelle vecchie. In NILFS2, tutto ciò avviene automaticamente, letteralmente ogni pochi secondi.
Ho creato un volume logico utilizzando lvcreate (nel gruppo di volumi nvme, pool sottile thin). Raccomando di creare proprio su un volume LVM, poiché in seguito potrà essere facilmente espanso. Consiglio di avere il 50% di spazio libero sul disco con NILFS2 per una buona profondità di versioning.
lvcreate -V10G -T nvme/thin -n homee l'ho formattato in NILFS2:
mkfs.nilfs2 -L nvme_home /dev/nvme/home
mkfs.nilfs2 (nilfs-utils 2.1.5)
Inizio a scrivere i dati iniziali del file system sul dispositivo
Dimensione del blocco: 4096 Dispositivo: /dev/nvme/home1 Dimensione del dispositivo: 10737418240
Inizializzazione del file system riuscita!!
Successivamente, è necessario copiare tutti i dati dalla attuale /home.
L'ho fatto subito dopo l'avvio del computer, prima di accedere al mio account, come utente root. Se fossi entrato con il mio utente, alcune applicazioni avrebbero aperto socket e file nella cartella del mio utente /home/user, rendendo difficile la copia pulita. Come noto, la home directory per l'utente root si trova solitamente in /root, quindi nessun file verrà aperto nella partizione /home.
mkdir /mnt/newhome
mount -t nilfs2 /dev/nvme/home /mnt/newhome
cp -a /home/. /mnt/newhome Riguardo l'ultima riga, vedi. .
Successivamente, modifichiamo /etc/fstab, dove si monta il file system per /home, su
/dev/disk/by-label/nvme_home /home nilfs2 noatime 0 0
Opzione noatime necessario per migliorare le prestazioni, in modo che atime non venga modificato ad ogni accesso ai file. Procediamo poi al riavvio.
Tipi di snapshot in NILFS2.
Uno snapshot normale senza immunità all'eliminazione è chiamato checkpoint (checkpoint o punto di ripristino).
Uno snapshot con protezione contro l'autoeliminazione è chiamato snapshot, poi semplicemente snapshot.
La visualizzazione dei checkpoint avviene tramite il comando lscp
Visualizzazione degli snapshot (snapshot) lscp -s
Possiamo anche creare snapshot e checkpoint in qualsiasi momento tramite:
mkcp [-s] dispositivoRipristiniamo i dati.
NILFS consente di montare quanti più snapshot precedenti possibile in parallelo con il funzionamento del ramo principale del filesystem, ma solo in modalità di sola lettura.
Ecco come funziona. I normali checkpoint creati da NILFS2 possono essere automaticamente rimossi in qualsiasi momento (quando lo spazio su disco finisce o secondo le regole di nilfs_cleanerd), quindi prima del montaggio dobbiamo convertire il checkpoint in uno snapshot oppure, in termini russi, 'fissare' lo snapshot.
chcp ss numero_checkpointDopo di che possiamo montare lo snapshot, ad esempio in questo modo:
mount -t nilfs2 -r -o cp=numero_checkpoint /dev/nvme/home /mnt/nilfs/numero_checkpoint Dopo di ciò copiamo i file da ripristinare dallo snapshot in /home.
Successivamente rimuoviamo il flag di non cancellabilità dallo snapshot, affinché in futuro il raccoglitore di spazzatura automatico possa eliminare i dati obsoleti:
chcp cp numero_checkpointUtilities per NILFS2
Il problema è proprio questo. Sì, certo, possiamo creare FS, modificarne le dimensioni online, visualizzare l'elenco dei checkpoint, crearli ed eliminarli. Il pacchetto nilfs2-utils offre un set di strumenti basilare.
Poiché NTT ha interrotto il finanziamento, non ci sono strumenti low-level rapidi che consentano di visualizzare la cronologia delle modifiche ai file e di eseguire il diff tra gli snapshot.
Il mio strumento n2u
Per colmare questo vuoto, ho scritto , che permette di visualizzare la cronologia delle modifiche di un file/directory specifico:
n2u log nomefileIl risultato è approssimativamente questo:
CHECKPOINT DATA ORA TIPO DIMENSIONE MODALITÀ
1787552 2019-11-24 22:08:00 primo 7079 cp
1792659 2019-11-25 23:09:05 cambiato 7081 cpFunziona piuttosto rapidamente per il modo implementato: cerca le differenze tra i file con il metodo della bisezione, montando e confrontando rapidamente file/directory in diversi snapshot.
È possibile impostare un intervallo di checkpoint usando la chiave -cp CP1:CP2 o -cp {ANNO-MM-GG}:{ANNO-MM-GG}.
È anche possibile visualizzare la differenza tra i checkpoint per un determinato file o directory:
n2u diff -r cp1:cp2 nomefileÈ possibile visualizzare l'intera cronologia delle modifiche: tutte le differenze tra i checkpoint di un file/directory specifica:
n2u blame [-r cp1:cp2] nomefileL'intervallo di date in questo comando è anch'esso supportato.
Richiamo agli sviluppatori
Su Habr ci sono molti esperti. Vi prego, migliorate NILFS2. Implementate la replica, un diff veloce a livello basso tra le revisioni, reflink e altre funzionalità!
Link
.
Repository:
.
.
Mailing list:
. Identificativo per l'iscrizione linux-nilfs.
.
.
.
Ringraziamenti:
- Agli sviluppatori di NILFS2: Ryusuke Konishi, Koji Sato, Naruhiko Kamimura, Seiji Kihara, Yoshiji Amagai, Hisashi Hifumi e Satoshi Moriai. Altri principali contributori sono: Andreas Rohner, Dan McGee, David Arendt, David Smid, dexen deVries, Dmitry Smirnov, Eric Sandeen, Jiro SEKIBA, Matteo Frigo, Hitoshi Mitake, Takashi Iwai, Vyacheslav Dubeyko.
- Alle compagnie Amblin Entertainment e Universal Pictures per la meravigliosa serie di film . La prima immagine del post è presa dal film «Ritorno al futuro — 3».
- Compagnie per il supporto e la possibilità di pubblicazione sul loro blog su Habr.
P.S. Segnalate gli errori riscontrati in privato. Alzo la karma per questo.
Puoi provare NILFS2 ordinando una macchina virtuale da con il coupon qui sotto. Per tutti i nuovi clienti, è previsto un periodo di prova gratuito di 3 giorni.
Fonte: habr.com
