NILFS :: mini howto
Contents
NILFS
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/
Εγκατάσταση
Τελευταία έκδοσης (μέχρι την στιγμή που γράφτηκε αυτό το 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
Δημιουργία Εικονικού Δίσκου
Εάν θέλουμε να δούμε την λειτουργία του 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
Δημιουργία Αρχείου Συστήματος
Αφού ολοκληρωθεί η αντιστοίχιση του εικονικού δίσκου με την εικονική συσκευή είμαστε έτοιμοι να ξεκινήσουμε την μορφοποίηση του δίσκου:
# 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 !!
Προσάρτηση Συσκευής
Αφού έχουμε ολοκληρώσει την μορφοποίηση του αρχείου συστήματος 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/
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 θα είχε χαθεί και δεν θα είχαμε την δυνατότητα να το επαναφέρουμε.
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
Προσάρτηση 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
Παράδειγμα Επαναφοράς
Παραθέτω ένα απλό παράδειγμα επαναφοράς αρχείου που έχει διαγραφεί:
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/