The Linux Cowloop Device Driver Hendrik-Jan Thomassen AT Computing BV Nijmegen
Inleiding Biedt mogelijkheid om block device schrijfbaar te laten lijken, zonder dat block device zelf te beschrijven. Copy on write loop driver Geïmplementeerd als block device driver Auteur: Gerlof Langeveld (AT Computing)
Kernel model applicatie proces system calls user mode kernel mode beneden dit > niveau bestaan geen files meer; alleen nog maar "diskblokken" virtual filesystem switch buffer cache fs type A fs type B fs type C block driver niveau binnen de kernel > logische disk
Demo-blockdriver Ideeën komen niet uit de lucht vallen... Het begon met een "fake disk" driver Lesmateriaal "Linux Device Drivers" cursus Demonstratie van verkeer tussen buffer cache en driver niveau Gebouwd als tweeling driver: block driver voor onder de buffer cache character driver om requests gemakkelijk terug te sluizen naar het user niveau Daemon op user niveau legt de brug tussen character driver en een fake disk oppervlak (in een gewone file)
Fake-disk driver application processes daemon fadid with logger end_ request file system layer buffer cache request character read+write requests from/to buffer cache address ioctl to get command description blocks ioctl to notify "operation done" block driver (slave: fadis) char driver (master: fadim) interrupt routine subroutine call
Knoppix - Live CD Klaus Knopper's Live CD was een grote inspirator Maar: op een CD kun je niet schrijven Stopte je je sessie, dan verdampte al je werk Programma's zoals Firefox en Gimp detecteren een 'first time start', en beginnen aan een lange vragenlijst Een Live CD die schrijfbaar leek te zijn bestond nog niet Wij bouwden een combinatie van Fake disk driver Copy on write principe (a la "snapshot disk" oppervlak) Fake disk oppervlak als file op floppy of USB stick File gebruikt met "sparse file holes" techniek
Cowloop driver application processes file system laag buffer cache cowloop driver met boekhouding van "geschreven" blokken cowfile op USB stick of op hard disk (sparse) "lagere" block driver
Problemen We wilden geen character driver en daemon erbij file creat,read,write rechtstreeks vanuit de kernel is gecompliceerd; we keken de kunst af bij 'core' files Als de filesysteem laag, hoog in de kernel, weet dat het gemounte file system type geen write operatie kent (bijv. ISO9660) dan stuurt hij geen write requests naar beneden. Gekunstelde oplossing voor onze Live CD: maak 'dd' kopie van de LINUX distributie (ext2 fs) in één file compress de 'dd' file maak 'n ISO image dat alleen die compressed 'dd' file bevat. gebruik de cloop driver (Russell) om dat te mounten
Leven na de Live-CD "Schrijfbare" Live CD is nu gemeengoed veel buitenlandse Linux tijdschriften hebben onze ATMission Live CD verspreid (GPL) voor ons geen core bussines nieuwere Live CD's gebruiken speciale filesysteem modules: Unionfs (oorspr. uit Plan 9), Aufs (nu in Knoppix) Cowloop als aparte driver beschikbaar via SourceForge en via http://www.atconsultancy.nl/cowloop driver source (3000 regels), Make en installatiescripts een handvol hulpprogramma's uitgebreide man pages
Voorbeeld modprobe cowloop > laad de cowloop driver (module) in de kernel cowdev -a /dev/fd0 /tmp/flop.cow /dev/cow/3 > nestel de cowloop driver bovenop de /dev/fd0 driver, block device naam /dev/cow/3 wordt de nieuwe "bovenkant", gebruik (zo nodig creëer) als cow file: /tmp/flop.cow mount /dev/cow/3 /mnt/flopmountpoint cp /some/demo/file /mnt/flopmountpoint/ umount /dev/cow/3 cowdev -d /dev/cow/3 > koppel cowloop driver los van onderliggende block driver
Pro & contra Inefficiente I/O: elke read & write gaat via aparte kernel-daemon: scheduling overhead Linux heeft (momenteel) een standaard Device Mapper snapshot in device mapper kan ongeveer hetzelfde ongedocumenteerd kernel-interface dmsetup(1) en Documentation/dm/snapshot.txt Meer ervaring nodig met 'xen'
Device mapper 'dm' Standaard Linux kernel module (vrij nieuw) dmsetup create cowdevnaam 0 size snapshot lowerdevice cowfiledevice p chunksz cowdevnaam wordt nieuwe "bovenste" blockdevice (0 en size bepalen startsectornr. en grootte daarvan) lowerdevice is het read-only onderliggende device cowfiledevice is waar de modificaties naar toe gaan (nadeel: moet blockdevice zijn; regular file kan niet) 'p' staat voor persistent: overleeft reboot; alternatief is 'n' (kost meer I/O en ruimte)