Cette machine tourne sur un noyau 2.6.30.5 compilé maison et m'a déjà servi à installer lxc (voir billets précédents).
Je dispose donc des sources de la dernière compil du noyau et j'ai simplement relancé :

srvglus238:/usr/src/linux-2.6.30.5# make menuconfig

J'ai simplement validé le module nilfs dans la section miscellanous filesystem:

nilfs lenny



Ensuite pas besoin de recompiler entièrement le noyau:

srvglus238:/usr/src/linux-2.6.30.5# make fs/nilfs2/nilfs2.ko
scripts/kconfig/conf -s arch/x86/Kconfig
  CHK     include/linux/version.h
  CHK     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-x86
  CALL    scripts/checksyscalls.sh
  CC [M]  fs/nilfs2/inode.o
  CC [M]  fs/nilfs2/file.o
  CC [M]  fs/nilfs2/dir.o
  CC [M]  fs/nilfs2/super.o
  CC [M]  fs/nilfs2/namei.o
  CC [M]  fs/nilfs2/page.o
  CC [M]  fs/nilfs2/mdt.o
  CC [M]  fs/nilfs2/btnode.o
  CC [M]  fs/nilfs2/bmap.o
  CC [M]  fs/nilfs2/btree.o
  CC [M]  fs/nilfs2/direct.o
  CC [M]  fs/nilfs2/dat.o
  CC [M]  fs/nilfs2/recovery.o
  CC [M]  fs/nilfs2/the_nilfs.o
  CC [M]  fs/nilfs2/segbuf.o
  CC [M]  fs/nilfs2/segment.o
  CC [M]  fs/nilfs2/cpfile.o
  CC [M]  fs/nilfs2/sufile.o
  CC [M]  fs/nilfs2/ifile.o
  CC [M]  fs/nilfs2/alloc.o
  CC [M]  fs/nilfs2/gcinode.o
  CC [M]  fs/nilfs2/ioctl.o
  CC [M]  fs/nilfs2/gcdat.o
  LD [M]  fs/nilfs2/nilfs2.o
  MODPOST 280 modules
  CC      fs/nilfs2/nilfs2.mod.o
  LD [M]  fs/nilfs2/nilfs2.ko


srvglus238:/usr/src/linux-2.6.30.5# mkdir /lib/modules/2.6.30.5/kernel/fs/nilfs2

srvglus238:/usr/src/linux-2.6.30.5# cp fs/nilfs2/nilfs2.ko /lib/modules/2.6.30.5/kernel/fs/nilfs2

srvglus238:/usr/src/linux-2.6.30.5# depmod -aq

srvglus238:/usr/src/linux-2.6.30.5# modprobe nilfs2

srvglus238:/usr/src/linux-2.6.30.5# lsmod
Module                  Size  Used by
nilfs2                135328  0
veth                    5808  0
configfs               24248  1
bridge                 48264  0
stp                     2444  1 bridge
llc                     5760  2 bridge,stp
ext4                  197848  2
jbd2                   47672  1 ext4
crc16                   1928  1 ext4
dm_snapshot            21192  0
dm_mirror              14160  0
dm_region_hash          9032  1 dm_mirror
dm_log                  8936  2 dm_mirror,dm_region_hash
dm_mod                 51048  3 dm_snapshot,dm_mirror,dm_log
psmouse                42372  0
evdev                  10048  0
8250_pnp               17992  0
e1000                 115240  0
floppy                 54504  0
8250                   30552  1 8250_pnp
serial_core            17976  1 8250
rtc_cmos               10344  0
container               3928  0
thermal                15960  0
processor              27392  0
ac                      4976  0
button                  6376  0
shpchp                 32580  0
i2c_piix4              10840  0
pci_hotplug            14000  1 shpchp
intel_agp              28784  1

srvglus238:/# modinfo nilfs2
filename:       /lib/modules/2.6.30.5/kernel/fs/nilfs2/nilfs2.ko
license:        GPL
description:    A New Implementation of the Log-structured Filesystem (NILFS)
author:         NTT Corp.
depends:       
vermagic:       2.6.30.5 mod_unload


Je vais utiliser le périph /dev/sde1 pour les tests:

srvglus238:~# cat /proc/partitions
major minor  #blocks  name

   8        0    3145728 sda
   8        1    2634628 sda1
   8        2     506047 sda2
   8       16    1048576 sdb
   8       17    1044193 sdb1
   8       32    2305856 sdc
   8       33    2305296 sdc1
   8       48     524288 sdd
   8       49     524272 sdd1
   8       64    3145728 sde
   8       65    3140676 sde1
   8       80    2097152 sdf
   8       81     979933 sdf1
   8       82    1116517 sdf2
   8       96    3145728 sdg
   8       97    3140676 sdg1
   8      112    5242880 sdh
   8      113     979933 sdh1
   8      114     489982 sdh2
   8      115    1951897 sdh3
   8      116    1815345 sdh4


srvglus238:/# apt-get install nilfs2-tools
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances      
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
  module-assistant nilfs2-source
Les NOUVEAUX paquets suivants seront installés :
  module-assistant nilfs2-source nilfs2-tools
0 mis à jour, 3 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 325ko dans les archives.
Après cette opération, 1098ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ?
Réception de : 1 http://192.168.1.80 lenny/main module-assistant 0.10.11.0 [103kB]
Réception de : 2 http://192.168.1.80 lenny/main nilfs2-source 2.0.4-1 [126kB]
Réception de : 3 http://192.168.1.80 lenny/main nilfs2-tools 2.0.6-1 [95,0kB]
325ko réceptionnés en 1s (172ko/s)  
Sélection du paquet module-assistant précédemment désélectionné.
(Lecture de la base de données... 54592 fichiers et répertoires déjà installés.)
Dépaquetage de module-assistant (à partir de .../module-assistant_0.10.11.0_all.deb) ...
Sélection du paquet nilfs2-source précédemment désélectionné.
Dépaquetage de nilfs2-source (à partir de .../nilfs2-source_2.0.4-1_all.deb) ...
Sélection du paquet nilfs2-tools précédemment désélectionné.
Dépaquetage de nilfs2-tools (à partir de .../nilfs2-tools_2.0.6-1_amd64.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de module-assistant (0.10.11.0) ...
Paramétrage de nilfs2-source (2.0.4-1) ...
Paramétrage de nilfs2-tools (2.0.6-1) ...
localepurge: Disk space freed in /usr/share/locale: 136K

Voyons quels sont les outils installés :

srvglus238:/# dpkg -L nilfs2-tools|egrep '/usr/bin|/sbin|/etc'
/usr/bin
/usr/bin/mkcp
/usr/bin/lscp
/usr/bin/chcp
/usr/bin/lssu
/usr/bin/dumpseg
/usr/bin/rmcp
/sbin
/sbin/mkfs.nilfs2
/sbin/mount.nilfs2
/sbin/nilfs_cleanerd
/sbin/umount.nilfs2
/etc
/etc/nilfs_cleanerd.conf


srvglus238:/# mkfs -t nilfs2 /dev/sde1
mkfs.nilfs2 ver 2.0
Start writing file system initial data to the device
       Blocksize:4096  Device:/dev/sde1  Device Size:3216052224
File system initialization succeeded !!
srvglus238:/#


srvglus238:/# mkdir /nilfs

srvglus238:/# mount -t nilfs2 /dev/sde1 /nilfs

srvglus238:/# tail -1 /var/log/kern.log
Aug 20 10:14:32 srvglus238 kernel: segctord starting. Construction interval = 5 seconds, CP frequency < 30 seconds


srvglus238:/# mount|grep sde
/dev/sde1 on /nilfs type nilfs2 (rw,gcpid=7000)

srvglus238:/# df -hT
Sys. de fich. Type     Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1     ext3    2,5G  2,0G  436M  83% /
tmpfs        tmpfs    247M     0  247M   0% /lib/init/rw
udev         tmpfs     10M  140K  9,9M   2% /dev
tmpfs        tmpfs    247M     0  247M   0% /dev/shm
/dev/sdb1     ext3   1004M  823M  130M  87% /usr/share
/dev/sdc1     ext3    2,2G  1,5G  646M  70% /opt
/dev/sdd1     ext3    496M   11M  460M   3% /swap
/dev/sdh4     ext3    1,8G  866M  792M  53% /srv
/dev/sdg1     ext4    3,0G  1,7G  1,2G  61% /opt/vservers/vweb3
/dev/sdf2     ext3    1,1G  395M  624M  39% /opt/vservers/vweb4
/dev/sdh3     ext3    1,9G  889M  893M  50% /opt/vservers/vweb5
/dev/sdh2     ext3    464M  358M   83M  82% /usr/local
/dev/sdh1     ext4    942M  514M  382M  58% /var/cache
/dev/sde1   nilfs2    3,0G   16M  2,9G   1% /nilfs

srvglus238:/# ll /nilfs/
total 1
drwxr-xr-x 2 root root 4096 aoû 20 10:09 .
-rw-r--r-- 1 root root    0 aoû 20 10:09 .nilfs


srvglus238:/# cat /etc/nilfs_cleanerd.conf |egrep -v '^#|^$'

protection_period    3600
selection_policy    timestamp    # timestamp in ascend order
nsegments_per_clean    2
cleaning_interval    5
use_mmap
log_priority        info


srvglus238:/# cp /var/log/syslog*.gz /nilfs

srvglus238:/nilfs# ll
total 25
drwxr-xr-x 2 root root 4096 aoû 20 12:06 .
-rw-r--r-- 1 root root    0 aoû 20 10:09 .nilfs
-rw-r----- 1 root root 1076 aoû 20 11:06 syslog.2.gz
-rw-r----- 1 root root 1073 aoû 20 11:06 syslog.3.gz
-rw-r----- 1 root root 1580 aoû 20 11:06 syslog.4.gz
-rw-r----- 1 root root 1409 aoû 20 11:06 syslog.5.gz
-rw-r----- 1 root root 1363 aoû 20 11:06 syslog.6.gz
-rw-r----- 1 root root 1416 aoû 20 11:06 syslog.7.gz



Je crée un snapshot

srvglus238:/# mkcp -s /dev/sde1

Puis j'essaie de lister les snapshots justement:

srvglus238:/# lscp -s /dev/sde1
lscp: Inappropriate ioctl for device

Aie pas bon ! Recherche et soluce:

=========================================
Nilfs has once changed ioctl interface (ABI) to clean up architecture
dependency problems found in the review process of mainline merge.

The nilfs2-tools included in Ubuntu Jaunty is older than that.

Please download the latest util package (nilfs-utils-2.0.14) from

  http://www.nilfs.org/en/download.html

and use it instead.

The newer nilfs2-tools is available on karmic, but in either case it
seems to be less frequently updated than Debian.
========================================

OK on va chercher les outils à jour et auparavant désinstaller l'obsolète (version 2.0.6 chez debian) et
bien sûr démonter /nilfs:

srvglus238:/# apt-get remove nilfs2-tools

srvglus238:/# umount /nilfs


srvglus238:/# cd /usr/local

srvglus238:/usr/local# wget http://www.nilfs.org/download/nilfs-utils-2.0.14.tar.bz2

srvglus238:/usr/local# tar jxvf nilfs-utils-2.0.14.tar.bz2 && mv nilfs-utils-2.0.14.tar.bz2 src

srvglus238:/usr/local# cd nilfs-utils-2.0.14

srvglus238:/usr/local/nilfs-utils-2.0.14# ./configure

srvglus238:/usr/local/nilfs-utils-2.0.14# make

srvglus238:/usr/local/nilfs-utils-2.0.14# make install


Et on recommence:

srvglus238:/# mount -t nilfs2 /dev/sde1 /nilfs
mount.nilfs2: WARNING! - The NILFS on-disk format may change at any time.
mount.nilfs2: WARNING! - Do not place critical data on a NILFS filesystem.

Déjà on est prévenu :)

srvglus238:/# lscp -s
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   2  2009-08-20 10:38:29   ss    -         25         18
                   7  2009-08-20 10:59:09   ss    -         12         18
                   8  2009-08-20 11:02:33   ss    i          8         18

C'est déjà mieux


J'ai toujours mes fichiers dans /nilfs

srvglus238:/nilfs# ll
total 25
drwxr-xr-x 2 root root 4096 aoû 20 12:06 .
-rw-r--r-- 1 root root    0 aoû 20 10:09 .nilfs
-rw-r----- 1 root root 1076 aoû 20 11:06 syslog.2.gz
-rw-r----- 1 root root 1073 aoû 20 11:06 syslog.3.gz
-rw-r----- 1 root root 1580 aoû 20 11:06 syslog.4.gz
-rw-r----- 1 root root 1409 aoû 20 11:06 syslog.5.gz
-rw-r----- 1 root root 1363 aoû 20 11:06 syslog.6.gz
-rw-r----- 1 root root 1416 aoû 20 11:06 syslog.7.gz

Je crée un snapshot et vérifie:

srvglus238:/# mkcp -s /dev/sde1
srvglus238:/# lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2009-08-20 10:09:46   cp    -         11          3
                   2  2009-08-20 10:38:29   ss    -         25         18
                   3  2009-08-20 10:56:51   cp    i          8         18
                   4  2009-08-20 10:58:56   cp    -         14         19
                   5  2009-08-20 10:58:59   cp    -         13         20
                   6  2009-08-20 10:59:04   cp    -         14         19
                   7  2009-08-20 10:59:09   ss    -         12         18
                   8  2009-08-20 11:02:33   ss    i          8         18
                   9  2009-08-20 11:04:00   cp    i          8         18
                  10  2009-08-20 11:05:39   cp    -        288        106
                  11  2009-08-20 11:05:51   cp    -         22        106
                  12  2009-08-20 11:06:35   cp    -         23          3
                  13  2009-08-20 11:06:48   cp    -         97         60
                  14  2009-08-20 12:03:10   cp    -         21         12
                  15  2009-08-20 12:06:34   ss    -         15          9


Je supprime des fichiers:

srvglus238:/nilfs# rm s*

srvglus238:/nilfs# ll

total 1
drwxr-xr-x 2 root root 4096 aoû 20 12:09 .
-rw-r--r-- 1 root root    0 aoû 20 10:09 .nilfs



Puis je crée un point de montage sur lequel je vais monter l'un des snapshots
(résultat de la commande lscp champ CNO):

srvglus238:/# mkdir /nilfs-ss

srvglus238:/# mount -t nilfs2 -r -o cp=15 /dev/sde1 /nilfs-ss/

srvglus238:/# mount |grep nilfs
/dev/sde1 on /nilfs type nilfs2 (rw,gcpid=15381)
/dev/sde1 on /nilfs-ss type nilfs2 (ro,cp=15)

srvglus238:/# ll /nilfs-ss/
total 25
drwxr-xr-x 2 root root 4096 aoû 20 12:06 .
-rw-r--r-- 1 root root    0 aoû 20 10:09 .nilfs
-rw-r----- 1 root root 1076 aoû 20 11:06 syslog.2.gz
-rw-r----- 1 root root 1073 aoû 20 11:06 syslog.3.gz
-rw-r----- 1 root root 1580 aoû 20 11:06 syslog.4.gz
-rw-r----- 1 root root 1409 aoû 20 11:06 syslog.5.gz
-rw-r----- 1 root root 1363 aoû 20 11:06 syslog.6.gz
-rw-r----- 1 root root 1416 aoû 20 11:06 syslog.7.gz

Impeccable: je peux récupérer les fichiers effacés par erreurs.

Il faudra penser à mettre le paquet nilfs2-tools en hold pour éviter un écrasement accidentel
(jeu de dépendances par exemple)

srvglus238:/# echo "nilfs2-tools hold" | dpkg --set-selections
srvglus238:/# dpkg -l nilfs2-tools
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements
|/ Err?=(aucune)/H=à garder/besoin Réinstallation/X=les deux (État,Err: majuscule=mauvais)
||/ Nom                 Version            Description
+++-==================================================
hc  nilfs2-tools        2.0.6-1            Continuous Snapshotting Log-structured Filesystem


Site officiel:

http://www.nilfs.org/en/