CNFS

From Albasani
Jump to: navigation, search


Contents

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
}
Personal tools