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.