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.
●
Copyonwrite loop driver
●
Geïmplementeerd als block device driver
●
Auteur: Gerlof Langeveld (AT Computing)
Kernel model applicatie proces system calls
virtual filesystem switch
beneden dit > niveau bestaan geen files meer; alleen nog maar "diskblokken"
blockdriver niveau binnen de kernel >
fs fs fs type type type B C A
buffer cache
logische disk
user mode kernel mode
Demo-blockdriver ●
Ideeën komen niet uit de lucht vallen...
●
Het begon met een "fakedisk" driver
●
Lesmateriaal "Linux Device Drivers" cursus
●
Demonstratie van verkeer tussen buffer cache en driverniveau
●
Gebouwd als tweelingdriver: ◗
block driver voor onder de buffercache
◗
characterdriver om requests gemakkelijk terug te sluizen naar het userniveau
●
Daemon op userniveau legt de brug tussen character driver en een fakedisk oppervlak (in een gewone file)
Fake-disk driver
daemon
application processes
←character read+write requests from/to buffer cache a ddress→ ioctl to get command description blocks→ ←ioctl to notify "ope ration done"
fadid with logger
file system layer
buffer cache d_ en uest req
request
char driver (master: fadim)
block driver (slave: fadis)
subroutine call
interrupt routine
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 'firsttime start', en beginnen aan een lange vragenlijst
●
Een Live CD die schrijfbaar leek te zijn bestond nog niet
●
Wij bouwden een combinatie van
◗
Fakedisk driver
◗
Copyonwrite principe (a la "snapshotdisk" oppervlak)
◗
Fakediskoppervlak als file op floppy of USBstick
◗
File gebruikt met "sparsefileholes" techniek
Cowloop driver
application processes
file system laag
buffer cache
cowloop driver met boekhouding van "geschreven" blokken
cowfile op USBstick of op hard disk (sparse)
"lagere" block driver
Problemen ●
We wilden geen characterdriver en daemon erbij ◗
filecreat,read,write rechtstreeks vanuit de kernel is gecompliceerd; we keken de kunst af bij 'core'files
●
Als de filesysteemlaag, hoog in de kernel, weet dat het gemounte filesystemtype geen writeoperatie kent (bijv. ISO9660) dan stuurt hij geen writerequests naar beneden. Gekunstelde oplossing voor onze Live CD:
◗
maak 'dd'kopie van de LINUXdistributie (ext2fs) in één file
◗
compress de 'dd'file
◗
maak 'n ISOimage dat alleen die compressed 'dd'file bevat.
◗
gebruik de cloopdriver (Russell) om dat te mounten
Leven na de Live-CD ●
"Schrijfbare" Live CD is nu gemeengoed ◗
veel buitenlandse Linuxtijdschriften hebben onze ATMission Live CD verspreid (GPL)
◗
voor ons geen corebussines
◗
nieuwere Live CD's gebruiken speciale filesysteemmodules: 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 manpages
Voorbeeld ●
modprobe cowloop > laad de cowloopdriver (module) in de kernel
●
cowdev
-a
/dev/fd0
/tmp/flop.cow
/dev/cow/3
> nestel de cowloopdriver bovenop de /dev/fd0 driver, blockdevicenaam /dev/cow/3 wordt de nieuwe "bovenkant", gebruik (zo nodig creëer) als cowfile: /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 cowloopdriver los van onderliggende blockdriver
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)