CNFS
Aus Albasani
Inhaltsverzeichnis |
Einleitung
Bei der ersten Installation hielten wir uns an http://kris.koehntopp.de/artikel/usenet/ und legten CNFS-Puffer (“Cyclic News File System”) als Dateien an. Später wurde die übergroße Swap-Partition (2 GB) geteilt und eine 1,5 GB große Partition direkt ("raw device") als CNFS-Puffer verwendet.
Auf dem zweiten Server hatten wir nun viel mehr Platz. Und ein Rescue-System, mit dem wir das Partitionierungsschema radikal ändern konnten. Nach den guten Erfahrungen auf dem ersten Server sollte nun der gesamte Spool auf raw devices liegen.
64 Bit
Die maximale Größe eines CNFS-Puffers im 32-Bit-Modus:
2093056 Byte = 2044 MB = 1.996 GB
Aus fünf logischen Puffern (DE, BIN, ALT, BIG8, INTL) werden so 21 Puffer, um einen Spool von 40 GB abzudecken.
Rein grundsätzlich unterstützt unsere Hardware (AMD Opteron(tm) Processor 144) den 64-Bit-Betrieb, aber Debian 3.1 ...
Ein Bootversuch mit kernel-image-2.6.8-11-amd64-k8 hinterlässt keine Spuren in den Log-Files. Auf die möglicherweise hilfreichen Kernelmeldungen auf dem Bildschirm haben wir keinen Zugriff.
Logical Volume Manager (LVM)
Das Problem
Linux unterstützt maximal 63 Partitionen pro IDE-Festplatte, aber nur 15 Partitionen pro SCSI-Festplatte. Auf direktem Weg lassen sich die geplanten 21 CNFS-Puffer auf unserem Server deswegen nicht anlegen.
$ vdir /dev/hd[ab] brw-rw---- 1 root disk 3, 0 2004-04-06 15:27 /dev/hda brw-rw---- 1 root disk 3, 64 2004-04-06 15:27 /dev/hdb
hda1 ist 3:1, hda2 3:2 und hda63 3:63. Die nächste Minor-Number, 3:64, ist dann schon hdb.
$ vdir /dev/sd[abc] brw-rw---- 1 root disk 8, 0 2004-04-06 15:27 /dev/sda brw-rw---- 1 root disk 8, 16 2004-04-06 15:27 /dev/sdb brw-rw---- 1 root disk 8, 32 2004-04-06 15:27 /dev/sdc
sda1 ist 8:1, sda2 8:2 und sda15 8:15. Die nächste Minor-Number, 8:16, ist dann schon sdb.
Die Lösung
/dev/sda4 umfasst den Großteil der Festplatte und ist das einzige physical volume in der volume group "spool".
apt-get install lvm2 pvcreate /dev/sda4 vgcreate spool /dev/sda4
Innerhalb der volume group kann man nun beliebig viele logical volume anlegen.
INN initialisiert CNFS-Puffer automatisch (es gibt kein mkfs.cnfs) wenn der Pufferkopf ungültig ist. Zur Sicherheit wird mit dd der zufällige Inhalt mit 0 überschrieben.
for v in \ alt1 alt2 alt3 \ de1 de2 de3 \ bin1 bin2 bin3 \ big1 big2 big3 big4 big5 big6 \ intl1 intl2 intl3 intl4 intl5 intl6 do lvcreate -L2044MB -n$v spool dd if=/dev/zero of=/dev/spool/$v bs=64k count=1 done
cycbuff.conf
In der Datei /etc/news/cycbuff.conf sieht das dann so aus:
cycbuff:DE1:/dev/mapper/spool-de1:2093056 cycbuff:DE2:/dev/mapper/spool-de2:2093056 cycbuff:DE3:/dev/mapper/spool-de3:2093056 cycbuff:BIN1:/dev/mapper/spool-bin1:2093056 cycbuff:BIN2:/dev/mapper/spool-bin2:2093056 cycbuff:BIN3:/dev/mapper/spool-bin3:2093056 cycbuff:ALT1:/dev/mapper/spool-alt1:2093056 cycbuff:ALT2:/dev/mapper/spool-alt2:2093056 cycbuff:ALT3:/dev/mapper/spool-alt3:2093056 cycbuff:BIG1:/dev/mapper/spool-big1:2093056 cycbuff:BIG2:/dev/mapper/spool-big2:2093056 cycbuff:BIG3:/dev/mapper/spool-big3:2093056 cycbuff:BIG4:/dev/mapper/spool-big4:2093056 cycbuff:BIG5:/dev/mapper/spool-big5:2093056 cycbuff:BIG6:/dev/mapper/spool-big6:2093056 cycbuff:INTL1:/dev/mapper/spool-intl1:2093056 cycbuff:INTL2:/dev/mapper/spool-intl2:2093056 cycbuff:INTL3:/dev/mapper/spool-intl3:2093056 cycbuff:INTL4:/dev/mapper/spool-intl4:2093056 cycbuff:INTL5:/dev/mapper/spool-intl5:2093056 cycbuff:INTL6:/dev/mapper/spool-intl6:2093056 metacycbuff:DE:DE1,DE2,DE3:SEQUENTIAL metacycbuff:BIN:BIN1,BIN2,BIN3:SEQUENTIAL metacycbuff:BIG:BIG1,BIG2,BIG3,BIG4,BIG5,BIG6:SEQUENTIAL metacycbuff:INTL:INTL1,INTL2,INTL3,INTL4,INTL5,INTL6:SEQUENTIAL metacycbuff:ALT:ALT1,ALT2,ALT3:SEQUENTIAL
Die Puffergröße ist 2 GB minus einer Seite:
$ echo "2 * 1024 * 1024 - 4096" | bc -q 2093056
Die Voreinstellung INTERLEAVE versucht, die Artikel möglichst gleichmäßig zwischen den einzelnen Puffer eines Meta-Puffers zu verteilen. Das ist sinnvoll, wenn diese Puffer auf verschiedenen Festplatten liegen.
Wenn die Puffer alle auf der selben Platte liegen, erhöht INTERLEAVE aber nur die die Wege für den Schreib-/Lesekopf. Darum die Option SEQUENTIAL.
Zugriffsrechte
INN läuft als Benutzer news. Um dem Newsserver Schreib-/Leserechte auf die logical volume zu geben, ändert man am besten den Besitzer der Gerätedatei. Unter Debian Sarge ist dafür die Datei /etc/default/lvm-common vorgesehen.
MODE_spool_big1="news:news 660" MODE_spool_big2="news:news 660" MODE_spool_big3="news:news 660" MODE_spool_big4="news:news 660" MODE_spool_big5="news:news 660" MODE_spool_big6="news:news 660" MODE_spool_bin1="news:news 660" MODE_spool_bin2="news:news 660" MODE_spool_bin3="news:news 660" MODE_spool_de1="news:news 660" MODE_spool_de2="news:news 660" MODE_spool_de3="news:news 660" MODE_spool_intl1="news:news 660" MODE_spool_intl2="news:news 660" MODE_spool_intl3="news:news 660" MODE_spool_intl4="news:news 660" MODE_spool_intl5="news:news 660" MODE_spool_intl6="news:news 660" MODE_spool_alt1="news:news 660" MODE_spool_alt2="news:news 660" MODE_spool_alt3="news:news 660"
Allerdings steckt in /etc/init.d/lvm ein Fehler, es fehlt die Option --dereference.
So sollte es aussehen:
$ grep chown /etc/init.d/lvm chown --dereference $OWN $DEV
storage.conf
Alle Postings größer 32 kB landen im Puffer BIN. Das ist recht einfach zu konfigurieren. Und verhindert, dass eine Flut von Bildern in de.alt.dateien.weibsbilder Diskussionen über Bilder in de.alt.dateien.misc fortschwemmt.
Alle deutschsprachigen Hierarchien landen im Puffer DE. Bei etwa 20 MB Traffic pro Tag ergibt sich eine Haltezeit von 300 Tagen.
method cnfs {
newsgroups: *
class: 6
options: BIN
size: 32768,
}
method cnfs {
newsgroups: abg.*,albasani.*,allgaeu.*,alt.de.*,at.*,belwue.*,bln.*,boerde.*,braunschweig.*,bremen.*,bremnet.*,cern.*,ch.*,chello.*,chemnitz.*,de.*,dece
iver.*,europa.*,ffm.*,free.de.*,hamburg.*,hanau.*,hannover.*,hanse.*,hildesheim.*,ingolstadt.*,kassel.*,kiel.*,kl.*,luebeck.*,muc.*,muenster.*,nbg.*,nord.*,
nrw.*,oecher.*,oesterreich.*,opennews.*,owl.*,pbinfo.*,posenet.*,rhein.*,ruhr.*,rwth.*,saar.*,sachsnet.*,stgt.*,telekabel.*,thur.*,ufra.*,ulm.*,westf.*,witt
en.*,wolfsburg.*,wuppertal.*
class: 5
options: DE
size: ,32767
}
method cnfs {
newsgroups: comp.*,humanities.*,misc.*,news.*,rec.*,sci.*,soc.*,talk.*
class: 4
options: BIG
size: ,32767
}
method cnfs {
newsgroups: alt.*
class: 3
options: ALT
size: ,32767
}
method cnfs {
newsgroups: *
class: 2
options: INTL
size: ,32767
}

