Hits : 4927

NILFS :: mini howto


NILFS


http://www.nilfs.org


NILFS is a new implementation of a log-structured file system (LFS) supporting continuous snapshotting.


Το NILFS είναι μία νέα υλοποίηση ενός log-structured αρχείου συστημάτων (LFS) που υποστηρίζει συνεχόμενα snapshotting.
Τα αρχικά σημαίνουν : New Implementation of a Log-structured File System


Αυτό που θέλουμε να πετύχουμε είναι η δημιουργία ενός αρχείου συστήματος στο οποίο όλες οι αλλαγές που γίνονται θα καταγράφονται
με την μορφή ενός versioning συστήματος. Το nilfs κρατάει σημεία ελέγχου (checkpoint) σε κάθε αλλαγή του αρχείου συστήματος μας και εμείς
μπορούμε να επιλέξουμε πότε θέλουμε να δημιουργήσουμε ένα αντίγραφο (snapshot) το οποίο θα μπορούμε να αναγνώσουμε ώστε να
επαναφέρουμε κάποια αρχεία στην προηγούμενη κατάστασή τους. Το nilfs μπορεί να εγκατασταθεί στο μηχάνημά μας με την μορφή ενός kernel module
και για αυτό η εγκατάσταση και η χρήση του είναι εξαιρετικά απλή και εύκολη.


Περισσότερα μπορείτε να δείτε στα παρακάτω url.


http://en.wikipedia.org/wiki/NILFS
http://en.wikipedia.org/wiki/Log-structured_file_system
http://aiya.ms.mff.cuni.cz/lfs/


Μία πολύ καλή τεκμηρίωση για το Log-structure File System (LFS) είναι το εξής αρχείο: file:lfs.pdf


Και ένα αρκετά καλό εργαλείο για Benchmark file systems: http://www.iozone.org/


top


Εγκατάσταση


Τελευταία έκδοσης (μέχρι την στιγμή που γράφτηκε αυτό το mini howto): 2.0.12


wget -c http://www.nilfs.org/download/nilfs-2.0.12.tar.bz2
tar jxvf nilfs-2.0.12.tar.bz2
cd nilfs-2.0.12
make
make install


wget -c http://www.nilfs.org/download/nilfs-utils-2.0.12.tar.bz2
tar jxvf nilfs-utils-2.0.12.tar.bz2
cd nilfs-utils-2.0.12
./configure
make
make install


top


Δημιουργία Εικονικού Δίσκου


Εάν θέλουμε να δούμε την λειτουργία του nilfs ή θέλουμε απλά να δοκιμάσουμε ένα versioning file system
τότε προτείνω τον παρακάτω τρόπο, δλδ την δημιουργία ενός εικονικού δίσκου.

Virtual Disk


Η δημιουργία ενός εικονικού δίσκου μπορεί να γίνει μέσω του προγράμματος dd
Η σελίδα στο wikipedia έχει μερικά παραδείγματα χρήσης: DD


Χρειάζεται να ορίσουμε το μέγεθος του blocksize καθώς και τον αριθμό των blocks.


Για παράδειγμα για την δημιουργία 1GB Virtual hard disk μπορούμε να γράψουμε την εξής εντολή:
1GB = 1024MB = 1024x1024 = 1048576


dd if=/dev/zero of=virtualdisk bs=1024 count=1048576


π.χ.


$ dd if=/dev/zero of=virtualdisk bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes (1,1 GB) copied, 28,2266 s, 38,0 MB/s


Εάν δεν θέλουμε να δεσμεύσουμε από την αρχή το 1GB (μιας και θέλουμε μόνο να κάνουμε δοκιμές)
τότε μπορούμε απλά να δημιουργήσουμε ένα αρχείο το οποίο να μπορεί να επεκταθεί μέχρι το 1GB


# dd if=/dev/zero of=virtualdisk bs=1 count=0 seek=1G

top


losetup


Τώρα χρειάζεται να αντιστοιχίσουμε τον εικονικό δίσκο που δημιουργήσαμε με μία εικονική συσκευή.
Το πρόγραμμα που χρειάζεται να χρησιμοποιήσουμε είναι το losetup
Ενδιαφέρουσα σελίδα είναι και η loop device στο wikipedia.


Για να δούμε εάν υπάρχουν αντιστοιχίσεις γράφουμε την εξής εντολή:


# losetup -a


Για να βρούμε την πρώτη διαθέσιμη εικονική συσκευή:


# losetup -f


Έστω λοιπόν ότι η πρώτη διαθέσιμη είναι η /dev/loop0


# losetup `losetup -f` virtualdisk


Οπότε τώρα για να ξαναδούμε τις αντιστοιχίσεις:


# losetup -a
/dev/loop0: [0817]:532494 (/tmp/virtualdisk)


Εάν θέλουμε να αποδεσμεύσουμε μία εικονική συσκευή από την αντιστοίχιση ενός εικονικού δίσκου:


# losetup -d /dev/loop0


top


Δημιουργία Αρχείου Συστήματος


Αφού ολοκληρωθεί η αντιστοίχιση του εικονικού δίσκου με την εικονική συσκευή είμαστε έτοιμοι να ξεκινήσουμε την μορφοποίηση του δίσκου:


# mkfs.nilfs2 /dev/loop0

mkfs.nilfs2 ver 2.0
Start writing file system initial data to the device
       Blocksize:4096  Device:/dev/loop0  Device Size:1073741824
File system initialization succeeded !!


top


Προσάρτηση Συσκευής


Αφού έχουμε ολοκληρώσει την μορφοποίηση του αρχείου συστήματος nilfs χρειάζεται να το προσαρτήσουμε σε έναν κατάλογο.
Ακριβώς όπως κάνουμε και σε οποιοδήποτε άλλο δίσκο.


Εάν δεν έχουμε δημιουργήσει έναν κατάλογο προσάρτησης, τότε δημιουργούμε έναν:


# mkdir -pv /media/nilfs


Αλλιώς προσαρτούμε τον δίσκο στον κατάλογο μας με την εξής εντολή:


# mount.nilfs2 /dev/loop0 /media/nilfs/


Εάν γράψουμε την εντολή mount χωρίς άλλες παραμέτρους, θα δούμε το πως έχει προσαρτηθεί:


# mount | grep /media/nilfs
/dev/loop0 on /media/nilfs type nilfs2 (rw,gcpid=21757)


Η από-προσάρτηση της συσκευής γίνεται με τον εξής τρόπο:


# umount /media/nilfs/


top


nilfs check points


Όπως προ-αναφέραμε το nilfs κρατάει check points όποτε γίνονται αλλαγές.
Για να δούμε τα check points ή ακόμα και τα snap shot points γράφουμε την εντολή:


# lscp


Ένα τυπικό παράδειγμα χρήσης είναι το παρακάτω:


root@xubuntu:~# cd /media/nilfs/
root@xubuntu:/media/nilfs# ls -a
.  ..  .nilfs
 
root@xubuntu:/media/nilfs# lscp 
                 CNO DATE     TIME  MODE  FLG NBLKINC       ICNT
                   1  2009-04-12 23:01:45   cp –         11          3
 
root@xubuntu:/media/nilfs# date > date.log
root@xubuntu:/media/nilfs# cat date.log 
Sun Apr 12 23:49:37 EEST 2009
root@xubuntu:/media/nilfs# lscp 
                 CNO DATE     TIME  MODE  FLG NBLKINC       ICNT
                   1  2009-04-12 23:01:45   cp –         11          3
                   2  2009-04-12 23:49:42   cp –         14          4
 
root@xubuntu:/media/nilfs# date > date.log 
root@xubuntu:/media/nilfs# date
Sun Apr 12 23:51:53 EEST 2009
root@xubuntu:/media/nilfs# lscp 
                 CNO DATE     TIME  MODE  FLG NBLKINC       ICNT
                   1  2009-04-12 23:01:45   cp –         11          3
                   2  2009-04-12 23:49:42   cp –         14          4
                   3  2009-04-12 23:51:54   cp –         11          4

Σύμφωνα με το παραπάνω παράδειγμα χρήσης, δημιουργήσαμε ένα αρχείο με όνομα date.log στις 23.49
κι έπειτα από μερικά λεπτά στις 23.51 ξανά-δημιουργήσαμε το αρχείο date.log διαγράφοντας τα περιεχόμενά του.


Σε ένα τυπικό αρχείο συστήματος το αρχικό περιεχόμενο του αρχείου date.log θα είχε χαθεί και δεν θα είχαμε την δυνατότητα να το επαναφέρουμε.


top


nilfs snapshot


Έχουμε την δυνατότητα να μετατρέψουμε ένα check point σε snap shot point.
Οπότε σύμφωνα με το παραπάνω παράδειγμα για να επαναφέρουμε το αρχικό αρχείο με όνομα date.log
χρειαζόμαστε το check point πριν την αλλαγή. Η τελευταία αλλαγή έγινε στις 23.51, οπότε θέλουμε το
προηγούμενο check point, δλδ το 23.49 που αντιστοιχεί στο check point με αριθμό 2.


Δεν μπορούμε όμως να κάνουμε χρήση ενός check point, χρειάζεται να μετατρέψουμε το check point σε snap shot.


Γράφουμε την παρακάτω εντολή:


# chcp ss 2


Η οποία έκανε την μετατροπή του checkpoint σε snapshot:


# lscp 
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2009-04-12 23:01:45   cp    -         11          3
                   2  2009-04-12 23:49:42   ss    -         14          4
                   3  2009-04-12 23:51:54   cp    -         11          4


Εάν παρατηρήσουμε αρκετά προσεκτικά θα δούμε ότι η στήλη MODE και στο σημείο με αριθμό 2 έχει μετατραπεί σε ss από cp


top


Προσάρτηση SnapShot


Είμαστε έτοιμοι να προσαρτήσουμε το snapshot ώστε να επαναφέρουμε το αρχείο μας στην αρχική του κατάσταση.
Για να γίνει αυτό χρειαζόμαστε ένα νέο κατάλογο στον οποίο θα προσαρτήσουμε το snapshot:


# mkdir -pv /media/nilfs.2


ΠΡΟΣΟΧΗ: Πρέπει να προσαρτήσουμε το snapshot μόνο σε κατάσταση ανάγνωσης κι όχι εγγραφής.


Εκτελούμε το εξής:


# mount.nilfs2 -r -o cp=2 /dev/loop0 /media/nilfs.2/


Για να δούμε τα σημεία που έχουμε προσαρτήσει:


# mount | grep /media/nilfs
/dev/loop0 on /media/nilfs type nilfs2 (rw,gcpid=21757)
/dev/loop0 on /media/nilfs.2 type nilfs2 (ro,cp=2)


Και φτάνουμε στο σημείο όπου μπορούμε να επαναφέρουμε την αρχική κατάσταση του αρχείου date.log:


# cat /media/nilfs.2/date.log 
Sun Apr 12 23:49:37 EEST 2009

# cat /media/nilfs/date.log 
Sun Apr 12 23:51:49 EEST 2009


top


Παράδειγμα Επαναφοράς


Παραθέτω ένα απλό παράδειγμα επαναφοράς αρχείου που έχει διαγραφεί:


root@xubuntu:~# rm /media/nilfs/date.log 
rm: remove regular file `/media/nilfs/date.log'? y removed `/media/nilfs/date.log'
 
root@xubuntu:~# lscp 
                 CNO DATE     TIME  MODE  FLG NBLKINC       ICNT
                   1  2009-04-12 23:01:45   cp –         11          3
                   2  2009-04-12 23:49:42   ss –         14          4
                   3  2009-04-12 23:51:54   cp –         11          4
                   4  2009-04-12 23:58:44   cp i          8          4
                   5  2009-04-13 00:06:55   cp –         13          3
root@xubuntu:~# chcp ss 4
root@xubuntu:~# mkdir -pv /media/nilfs.4
mkdir: created directory `/media/nilfs.4'
root@xubuntu:~# mount.nilfs2 -r -o cp=4 /dev/loop0 /media/nilfs.4/
 
root@xubuntu:~# cat /media/nilfs.4/date.log 
Sun Apr 12 23:51:49 EEST 2009
root@xubuntu:~# 
root@xubuntu:~# ls -l /media/nilfs/
total 0
root@xubuntu:~# 
root@xubuntu:~# cp /media/nilfs.4/date.log /media/nilfs/
`/media/nilfs.4/date.log' -> `/media/nilfs/date.log'
 
root@xubuntu:~# cat /media/nilfs/date.log 
Sun Apr 12 23:51:49 EEST 2009
 
root@xubuntu:~# lscp 
                 CNO DATE     TIME  MODE  FLG NBLKINC       ICNT
                   1  2009-04-12 23:01:45   cp –         11          3
                   2  2009-04-12 23:49:42   ss –         14          4
                   3  2009-04-12 23:51:54   cp –         11          4
                   4  2009-04-12 23:58:44   ss i          8          4
                   5  2009-04-13 00:06:55   cp –         13          3
                   6  2009-04-13 00:08:05   cp i          8          3
                   7  2009-04-13 00:08:57   cp –         14          4
root@xubuntu:~# umount /media/nilfs.4/
root@xubuntu:~# umount /media/nilfs.2/

top