Don't understand german? Read or subscribe to my english-only feed.

Raw-Devices mit Linux

Vor ein paar Tagen kam beim Mailen zum Thema Klonen von Systemen die Sprache auf “wie geht das mit Raw-Devices eigentlich mit Linux?”. Unter Solaris geht das bekanntlich mit /dev/rdsk/foo als Raw-Device für /dev/dsk/foo. Für Linux gibt es etwas Äquivalentes.

Die alte Variante der Nutzung von Raw-Devices mit Linux:

# modprobe raw
# raw /dev/raw/raw1 /dev/sda1

Und schon kann man auf /dev/raw/raw1 munter herumoperieren. Aber Achtung: Das Kernelmodul wollen die Linuxentwickler schon seit längerem “deprecaten”:

$KERNEL_SOURCE_2.6.16/Documentation/feature-removal-schedule.txt
What:   RAW driver (CONFIG_RAW_DRIVER) When:   December 2005
Why:    declared obsolete since kernel 2.6.3 O_DIRECT can be used instead
Who:    Adrian Bunk 

Wenn ich das richtig sehe, fliegt der raw-Treiber entweder mit 2.6.17 oder im Jänner 2007 raus. Ob das dann auch wirklich der Fall ist, wird man ja sehen. ;)

Statt dem Kernelmodul sollte man also O_DIRECT nutzen. Der Vorteil von O_DIRECT ist, dass man nur Lese-/Schreibrechte für das Device braucht und keine Rootrechte besitzen muß, um das Raw-Device auf eine Platte/Partition zu binden. Der Nachteil von O_DIRECT ist, dass es (AFAIK) Linux-only ist und die Applikation das halt von sich aus unterstützen muß.

dd auf /dev/raw/raw* ist nicht schneller als über ein Blockdevice, aber sg_dd taugt für Raw-Devices. Und aktuelle dd-Versionen aus den coreutils beherrschen O_DIRECT via dem Flag ‘direct’ (“direct use direct I/O for data”).

raw-Devices und O_DIRECT sind von der Geschwindigkeit her übrigens äquivalent, laut linux_2_6_datacenter_performance.pdf liegt das im Bereich von unter 2% Unterschied. Ein Benchmark mit O_DIRECT/raw und einem aktuellen 2.6er Kernel steht bei mir noch auf der ToDo-Liste.

Wer jetzt noch ein bisschen Theorie dazu will, kann z.B. “Asynchronous I/O Support in Linux 2.5” aus Reprint-Pulavarty-OLS2003.pdf und O_DIRECT von Andrea Arcangeli als Einstiegspunkt nehmen.

Comments are closed.