За архивна система използвам Venti. Първоначално venti e писан за Plan9, но е включен в порта на Plan9 приложения за Posix Plan9Port (
http://swtch.com/plan9port/). Как работи venti и начини да се използва са описани в статията на двамата Шоновци (които са и автори на първата версия)
http://plan9.bell-labs.com/sys/doc/venti/venti.pdfVenti от гледна точка на потребителяЗа потребителя venti e програма, която архивира колекция от файлове и връща идентификатор, с който те могат да бъдат четени по-късно. Файловете се архивират с командата vac.
$ export venti=192.168.0.10
$ vac work
vac:0d3fc5aad2621af41abc8f661facc34fdebba57b
Резултатът от vac e 20 байтово число, наречено score. То може да бъде използвано по два начина за достъп до данните. Командите по-долу предполагат, че score-a e записан във файла vacfile.
1. С командата unvac може да се извлекат всички файлове.
$ unvac vacfile
2. С командата vacfs те могат да бъдат представени като 9P2000 файлов сървър и след това да се монтират в Линукс използвайки v9fs (aka 9p).
$ vacfs vacfile
$ mount -t 9p /tmp/ns.$USER/vacfs.t /mnt/vac -o trans=unix
$ ls /mnt/vac
Интересното при venti е, че нов запис на същите данни не заема (почти) никакво място в архивната система. Например ако в мрежата има 10 компютъра с Федора и единствените разлики са малки промени в конфигурациите, архивирането им в Venti ще заеме малко повече място отколкото архивирането на един компютър. Ако директорията ми work e 10GB и я архивирам днес, променя 100К в няколко файла и я архивирам пак, второто архивиране отнема само 100К. Но ако използвам втория score-a ще виждам _всички_ файлове, които са били в work, а не само променените.
Друга интересна черта на venti е, че след като запишеш нещо, никога повече не можеш да го изтриеш. Venti поддържа добавяне на данни и извличането им, но не триенето им. Една от причините е да може да поддържа инкременталното архивиране. Това може да е неприятно (например ако погрешка запишеш колекцията от порно в архива), но пък има и предимства. Дори и погрешка не можеш да изтриеш архивни данни, които да се окаже, че ти трябват по-късно.
Та моята бакъп система е проста. Всеки ден (да кажем 8 декември 2008) в определен час правя vac на всички файлове, които искам да запазя и записвам score-a в /archives/2008/12/08/all.vac. Ако искам да видя файловете от този ден, мога просто да монтирам (с vacfs и 9p) съответния vacfile. За удобство, след това изпълнявам vac още веднъж върху директорията /archives със специалната опция -m, която "залепя" дърветата представени от .vac файловете в съответната директория на мястото на самия файл. По този начин получавам един vac file -- /archive.vac. Ако го монтирам в /mnt/vac и искам да видя какво е съдържанието на файловете на 3 януари 2006, просто правя
cd /mnt/vac/2006/01/03
и виждам всички файлове точно както са изглеждали на този ден.
Venti не направен така, че да е удобно данните в архива да се копират на външен носител. Дисковото му пространство е разделено на 512МБ арени. Понеже от venti не може да се трие, когато една арена се напълни, venti я "запечатва" и тя никога повече не се променя. В този момент арената може да бъде записана на външен (непроменяем) носител за по-голяма сигурност. В добавка, може да се запише SHA1 сумата на всички данни от арената на непроменяем носител и от време на време да се сравнява с SHA1 сумата на арената на диска (в случай, че някой хахор все пак реши да промени съдържанието на архива).
Аз имам скрипт, който пускам на ръка и създава iso файлове на всички арени, които не съм записал от последния път когато съм изпълнявал скрипта. След това записвам всички ISO-та ръчно на DVD-R дискове, освен последния (непълен), който записвам на DVD-RW. Засега имам някъде към 70 DVD-та с копие на архива, което е по-малко от DVD на седмица откакто съм започнал да архивирам.
Освен че записвам archive.vac на харддиска, също така го изпращам на email адрес, който е напълно независим от домашната ми система. Ако (чукам на дърво) някой ден се случи нещо вкъщи, от този score и съдържанието на DVD-тата мога да възстановя всички данни, освен тези които не съм записал още на външен носител. След 2 години ще презапиша всички DVD-та на нови носители за да съм сигурен, че няма да се повреди някое от тях.
Във venti в момента пазя архив на 3 компютъра -- сървъра вкъщи, служебния лаптоп и стария ми личен лаптоп (който отскоро е Plan9 сървъра ми вкъщи). Скоро ще пусна да се архивира и новия ми личен лаптоп.
Venti от гледна точка на администратора муИнсталирането на venti е сравнително лесно, няма да го описвам в подробности. Venti изисква три партишъна/файла -- index file, arenas file и bloom filter. Arenas файла/дяла съдържа всички данни и трябва да е колкото може по-голям. Аз започнах с 30GB диск, след това го преместих на 300GB диск, скоро добавих още един 750GB диск. Ако дяла/файла започне да се пълни, в конфигурацията на Venti може да се добави нов arenas file и venti ще започне да използва и двата (или повече). Index файла съдържа хеш таблица, която позволява на venti да работи бързо (виж по-долу кратко описание как работи venti). Размерът му трябва да е около 5-10% от размера на arenas файла. Данните в index файла не са жизнено важни, ако се изгубят могат да бъдат генерирани от arenas файла. Venti може да работи с повече от един index файл, но при добавянето на нов трябва да се регенерира целия индекс (отнема десетина минути). Bloom файла пази стойностите на Блуум филтъра, който се използва от venti да ускори работата още повече. Обикновено файлът е 32 или 64МБ, зависи от конфигурацията.
Аз имам дялове на отделен диск за index и arenas, bloom е обикновен файл на основната ми файлова система.
Как работи VentiVenti може да изпълнява две операции: архивиране на блок и извличане на вече архивиран блок. След като архивира даден блок, venti връща уникален адрес, който идентифицира блока в архивната система. Този адрес зависи от данните в блока, всъщност той е точно SHA1 сумата на данните. Ако впоследствие на venti бъде изпратен друг блок, проверката дали тези данни са вече в архивната система е лесна -- смяташ SHA1 сумата на новия блок и проверяваш дали резултатът го има в index файла. Ако отговорът е да, отговаряш че блокът е архивиран без да правиш нищо. Иначе записваш новия блок в активната арена и добавяш score-a му в индекса. Ако клиентът иска да прочете даден блок по score-a му, намираш го в индека, проверяваш в коя арена е той (пише го в индекса), четеш и връщаш резултата. Интересното е, че клиентът може независимо от сървъра да провери дали върнатите данни са това, което е поискал -- просто смята SHA1 от получения блок и ако резултатът е различен от score-a, знае, че някой го е излъгал (това за параноиците, които се страхуват от хахори
). Блоковете са с размери до 56К (не знам защо точно толкова). Ако трябва да се запишат по-големи файлове, те се разделят на блокове (обикновено 8К), записват се, след това score-овете на тези блокове се организират в нови блокове, които се записват и така рекурсивно докато накрая се получи единствен score, който е адрес за целия файл. По-подробно описание има в статията, която споменах по-горе.
Ако на някой му е интересно, мога да му пратя скриптовете, които използвам. Елементарни са, няма нищо сложно в нито един от тях.
Мързи ме да прочета всичкия текст дето съм написал, предварително се извинявам за правописните грешки