
Come sapete, se una sventura può accadere, accadrà sicuramente. Probabilmente, ognuno di noi ha vissuto situazioni in cui un importante file è stato accidentalmente cancellato, o dove del testo è stato selezionato e distrutto in un editor di testo.
Se siete hoster o proprietari di un sito, è probabile che abbiate affrontato attacchi agli account utente o al vostro sito. In questi casi, è importante ripristinare la cronologia, trovare il modo di accesso e la vulnerabilità usata dal malintenzionato.
Per risolvere problemi simili, il file system NILFS2 è molto adatto.
È presente nel kernel Linux a partire dalla versione 2.6.30.
La caratteristica distintiva di questo file system è che è simile a un sistema di controllo versioni: puoi sempre ripristinare lo stato del sistema a un momento precedente e vedere come era qualche tempo fa.
Per garantire questa funzionalità, non è necessario configurare script Cron, effettuare snapshot, ecc. Il file system NILFS2 fa tutto da solo. Non sovrascrive mai i dati vecchi e scrive sempre in nuove aree del disco, se c'è spazio sufficiente. In piena conformità con il principio Copy-on-Write.
Infatti, ogni modifica a un file comporta la creazione automatica di una nuova snapshot del file system, quindi puoi usare questo FS come una macchina del tempo e riportare indietro lo stato dei file.
Storia
NILFS2 è stata sviluppata nelle profondità , in effetti, una società statale (ha un pacchetto di controllo) e la più grande compagnia di telecomunicazioni del Giappone. In particolare, nel laboratorio CyberSpace Laboratories sotto la guida di .
Non si sa esattamente per cosa fosse stata sviluppata, tuttavia, si può presumere che un tale FS, con la sua funzionalità di “macchina del tempo”, sia ideale per conservare dati nei quali i servizi segreti potrebbero avere interesse a indagare, per rigiocare l'intera sequenza di SMS, email, ecc...
NILFS2 è anche, potenzialmente, uno strumento molto prezioso per i servizi di sicurezza interna, poiché consente di recuperare tutte le email cancellate nel database di posta, svelare gli errori dei dipendenti che potrebbero successivamente cercare di mascherarli, cancellando o modificando i propri file.
Come si può tracciare l'intera storia della corrispondenzaIn Linux sui server (e precisamente lì è consigliabile installare NILFS2 per motivi di sicurezza interna) per l'archiviazione dei messaggi di posta elettronica si utilizza molto spesso un metodo di archiviazione file. Il cosiddetto formato . È sufficiente installare e configurare la memorizzazione delle email in Maildir. Un altro formato è rappresentato da un grande file di testo, facilmente analizzabile in singoli messaggi.
Se il server di posta utilizza un database, NILFS2 permetterà di ripristinare la cronologia esatta delle modifiche al database e la possibilità di recuperare il database in qualsiasi momento di questi. E poi bisogna usare gli strumenti del DB per vedere cosa conteneva in quel momento...
Tuttavia, qualcosa è andato storto. O il governo giapponese ha deciso di non sorvegliare più tutti (come nel principio Yarovaya), o le prestazioni di NILFS2 su HDD tradizionali si sono rivelate piuttosto scarse, e NILFS2 è stata rilasciata sotto licenza GPL e rapidamente integrata nel kernel di Linux, dato che non c'erano particolari contestazioni al codice scritto da altamente qualificati sviluppatori giapponesi.
A cosa assomiglia NILFS2?
In termini di utilizzo: a un sistema di controllo delle versioni. Ogni checkpoint del file system è un commit, che viene effettuato automaticamente senza che l'utente ne sia a conoscenza ad ogni modifica: che sia un'eliminazione, una modifica del contenuto di un file o dei diritti di accesso. Ogni commit ha un numero che aumenta linearmente.
Dal punto di vista di un programmatore: assomiglia a un buffer circolare. Il file system raccoglie le modifiche e le scrive in pezzi 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, le istantanee più vecchie vengono eliminate e i chunk vengono riscritti.
I principali vantaggi di NILFS2
- Versioning!!!
- La procedura di ripristino del file system dopo un crash è elementare: al momento dell'avvio si cerca l'ultimo chunk con una checksum valida e vi si installa il superblocco. Si tratta di un'operazione praticamente istantanea.
- Poiché la scrittura avviene sempre in modo lineare,
- può mostrare buoni risultati durante il funzionamento su SSD con scritture casuali lente.
- NILFS2 risparmia risorse SSD, poiché il fattore di moltiplicazione della scrittura è quasi assente.
A dire il vero, non è superiore a 2.Il fatto è che, durante la scrittura ciclica dell'intero disco, NILFS2 trasferirà i dati immutabili in nuovi blocchi (chunk).Se abbiamo sul disco il 10% di dati immutabili, otterremo un aumento del 10% della scrittura dopo una scrittura completa. E avremo un incremento del 50% con il 50% di occupazione del dispositivo su una scrittura completa del disco.
Il massimo coefficiente di amplificazione della scrittura è 2. Questo è piuttosto poco considerando che tutto viene scritto in modo sequenziale. In generale, la moltiplicazione della scrittura sarà inferiore rispetto a un normale filesystem frammentato con settore da 4096 byte. (Stimolato da un commento ).
- La potenziale semplicità nell'implementazione della replica su un filesystem NILFS2 remoto
NILFS2 per /home
Nei sistemi operativi simili a Unix, di solito è presente una cartella /home in cui sono memorizzati i dati degli utenti. Diversi programmi salvano in questa cartella le loro impostazioni relative a ciascun utente.
E chi, se non gli utenti, combina più spesso guai? Quindi, come si suol dire, è un segno divino utilizzare NILFS2 su /home.
Soprattutto ora che con la diffusione degli SSD possiamo non preoccuparci di forti cali di prestazioni quando si utilizzano filesystem CoW.
Sì, possiamo creare snapshot del filesystem (snapshot) quante volte vogliamo sia in ZFS che in BTRFS, ma c'è sempre il rischio che una modifica persa di un file si trovi tra gli snapshot. E gli snapshot devono anche essere amministrati: rimuovendo quelli vecchi. In NILFS2 tutto ciò avviene automaticamente, letteralmente ogni pochi secondi.
Ho creato un volume logico usando lvcreate (nel gruppo di volumi nvme, pool sottile). Consiglio di creare proprio su quel volume lvm, poiché in seguito può essere facilmente espanso. È consigliabile 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 scrittura dei dati iniziali del filesystem sul dispositivo
Blocksize:4096 Dispositivo:/dev/nvme/home1 Dimensione del Dispositivo:10737418240
Inizializzazione del filesystem riuscita !!
Dopo questo, è necessario copiare tutti i dati dall'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 user, alcune applicazioni avrebbero aperto socket e file nella cartella del mio utente /home/user, rendendo difficile la copia pulita. Come è noto, la cartella home per l'utente root di solito si trova nel percorso /root, quindi in /home non verranno aperti file.
mkdir /mnt/newhome
mount -t nilfs2 /dev/nvme/home /mnt/newhome
cp -a /home/. /mnt/newhome Riguardo all'ultima riga, vedi. .
Poi modifichiamo /etc/fstab, dove viene montato il file system per /home, in
/dev/disk/by-label/nvme_home /home nilfs2 noatime 0 0
Opzione noatime è necessario per migliorare le prestazioni, in modo che ad ogni accesso ai file non venga modificato l'atime. Poi riavviamo.
Tipi di snapshot in NILFS2.
Uno snapshot normale senza immunità alla cancellazione è chiamato checkpoint (checkpoint o punto di ripristino).
Uno snapshot con protezione contro l'auto-cancellazione è chiamato snapshot, poi semplicemente snapshot.
La visualizzazione dei checkpoint si effettua con il comando lscp
Visualizzazione degli snapshot (snapshot) lscp -s
Possiamo anche creare snapshot e checkpoint in qualsiasi momento usando:
mkcp [-s] dispositivoRipristiniamo i dati.
NILFS ci consente di montare quanti più vecchi snapshot possibile in parallelo con il lavoro sul ramo principale del FS. Ma solo in modalità sola lettura.
Funziona così. I normali checkpoint creati da NILFS2 possono essere automaticamente eliminati in qualsiasi momento (quando lo spazio su disco si esaurisce o secondo le regole di nilfs_cleanerd), quindi prima del montaggio dobbiamo trasformare il checkpoint in snapshot o, per dirla in russo, fissare lo snapshot.
chcp ss numero_checkpointDopo di ciò 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 che copiamo i file da ripristinare dallo snapshot in /home.
E successivamente rimuoviamo il flag di non cancellazione dallo snapshot, affinché in futuro il raccoglitore automatico dei rifiuti possa eliminare dati obsoleti:
chcp cp numero_checkpointUtilità per NILFS2
Ecco il problema. Certo, possiamo creare FS, cambiarne la dimensione online, visualizzare l'elenco dei checkpoint, crearli e eliminarli. Il pacchetto nilfs2-utils fornisce un set minimo da gentiluomo.
Poiché NTT ha interrotto il finanziamento, non ci sono utilità a basso livello rapide che permettano di visualizzare la cronologia delle modifiche ai file e fare il diff tra gli snapshot.
La mia utilità n2u
Per riempire questo vuoto, ho scritto , che è in grado di mostrare la cronologia delle modifiche per un file/directory specifico:
n2u log nomefileL'output è più o meno 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 abbastanza rapidamente per il modo scelto di implementazione: cerca le differenze tra i file utilizzando il metodo della bisezione, montando rapidamente e confrontando il file/directory in diversi snapshot.
È possibile specificare un intervallo di checkpoint utilizzando l'opzione -cp CP1:CP2 o -cp {ANNO-MM-GG}:{ANNO-MM-GG}.
È anche possibile visualizzare la differenza tra i checkpoint per un file o directory specifica:
n2u diff -r cp1:cp2 nomefileÈ possibile visualizzare l'intera cronologia delle modifiche: tutte le differenze tra i checkpoint di un file/directory specifico:
n2u blame [-r cp1:cp2] nomefileL'intervallo di date in questo comando è anch'esso supportato.
Appello agli sviluppatori
Su Habr ci sono molti esperti. Vi prego, completate NILFS2. Implementate la replica, un diff rapido e a basso livello tra le revisioni, reflink e altre funzionalità utili!
Link
.
Repository:
.
.
Newsletter:
. 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: 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 aziende Amblin Entertainment e Universal Pictures per la meravigliosa serie di film . La prima immagine del post è presa dal film «Ritorno al futuro — 3».
- Azienda per il supporto e la possibilità di pubblicare nel proprio blog su Habr.
P.S. Invia eventuali errori riscontrati tramite messaggio privato. Accrescerò la karma per questo.
Puoi provare NILFS2 ordinando una macchina virtuale da con il coupon qui sotto. Per tutti i nuovi clienti, periodo di prova gratuito di 3 giorni.
Fonte: habr.com
