= bubbalog =Дневникът на моето стадо

Пълен Backup и Restore на FreeBSD 8.0 с LiveCD

Friday 18.12.2009 11:42 EEST · Публикувано от в = FreeBSD =, = Мът'рял от нетя =

Използвана литература: http://lists.freebsd.org/pipermail/freebsd-doc/2005-May/007913.html

http://www.daemonforums.org/showthread.php?t=2238#post16537

След поредния срив на системата вече наистина ми дойде до гуша от неистовото преинсталиране което отнема по няколко часа. Данните не се затриват, подсигурил съм се стабилно, но това преисталиране на системата и това донастройване още един ден, все нещо си забравил, все нещо има да се донапипне… трябва да се измисли нещо по въпроса. Това разбира се е измислено много отдавна и се нарича бекъп. Но как да се направи това? За Виндовса – ясно, Akronis -> имидз на целия дял и спи града спокоен… Но за FreeBSD това се оказа едно по-тягостно премеждие. От Hiren’s диска не намерих нито едно приложение, което да е полезно за случая, па боло то и да направи бекъп на целия диск, а не само на дял, няма нито едно което да разчита UFS слайсовете на FreeBSD-to… Само Akronis се справи донякъде със задачата, направи имидж, но после при ресторването резултата беше плачевен, ресторна се безпроблемно, започна да зарежда и до там… Решението? Колкото и да отлагах този момент, ето че дойде и да се запозная и да се науча да работя с вградените за целта в самото FreeBSD комадни за целта dump, restore и bzcat. Идеята? Понеже се оказа, че не може да се направи цял имидж на диска (което се оказва, че е и безмислено), затова се прави бекъп на всеки слайс и след срив само се ресторва, копира се обратно бекъпа на www директорията и базата данни и всичко си идва на мястото само за около час. Следната статия описва как направих аз това, а накрая има споменати няколко думи пак по въпроса, но четено от други места в процеса на учене. В крайна сметка работата се оказа лесна, неприятно бях изненадан само от леко мудната скорост с която всичко се случва при бекъпването и рестора, но това зависи от диска върху който работите.

Backup (Архивиране) на слайсовете.

1. Избор на място за бекъпа. Задачата е свързана с това да намерите подходящо и достатъчно голямо място което да побере всичкия бекъп който ще направите. Аз например шернах една директория на Windows машината, после я маунтнах на FreeBSD машината и правих бекъпите по мрежата. Друго решение е закачането на друг диск на който да се запише всичко… решения колкото искаш.

2. Създаване на самия бекъп. Това може да стане по 2 начина:

обикновен, некомпресиран пълен бекъп на слайса

# dump -0Lauf /path/to/backups/ad0s1а.dump /dev/ad0s1а

или създаване на компресиран “on the fly” бекъп

# dump -0Lauf – /dev/ad0s1a | bzip2 > /path/to/backups/ad0s1a.dump.bz2

където

  • 0 – значи пълен бекъп на зададения слайс
  • f “name” – създаване на файл
  • a – ще ви трябва ако създавате бекъпа като файл
  • L – нужно е, когато се бекъпва маунтната файлова система
  • verbose – по принцип изхода на целия процес е във verbose mode, което значи, че по подразбиране е настроен да извежда това, което се случва в момента, поради което няма нужда от отделен параметър за тази функция

Ето примерен вид какво става по време на процеса:

# dump -0Laufv /dev/ad0s1e | bzip2 > /usr/ad0s1e.dump.bz2
DUMP: Date of this level 0 dump: Wed Dec 16 00:32:02 2009
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping snapshot of /dev/ad0s1e (/tmp) to v
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 120 tape blocks.
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: DUMP: 111 tape blocks on 1 volume
DUMP: finished in 1 seconds, throughput 111 KBytes/sec
DUMP: level 0 dump on Wed Dec 16 00:32:02 2009
DUMP: Closing v
DUMP: DUMP IS DONE
#

Следва гореописаното съответно чакане и с това процеса е приключен. Сега остава чакането, кога всичко това ще ви стане нужно… а когато това стане се пристъпва към следващата операция

Restore (Възобновяване) на данните.

Тук нещата са малко по пипкави. Аз малко се полутах докато разбера какво точно се прави, но най-накрая се спрях на варианта с FreeBSD LiveCD – възможно най-лесния и безболезнен вариант. Тъй като разбираемо на диска на който ще ресторваме няма операционна система, логично е да се предположи че няма как да пренесем бекъпите обратно на сървъра. Как тогава? За целта аз използвах един друг хард който изключително рядко ползвам, форматирах го на FAT32, записах на него бекъпите и го закачих на сървърната машина. Тогава ми хрумна, че този хард може да се държи там и да се включва само когато е нужен, а през останалото време да е разкачен, за да не харчи излишен ток, което е важно, когато системата сработи на UPS. И нека започнем.

1. Заредете системата от LiveCD диска и когато стигнете до основното меню отидете на Configure->Fdisk. От там направете дял за FreeBSD и го направете  активен ако е нужно с натискане на S. Натиснете Q и излезте от това меню.

2. Изберете disklabel опцията и създайте необходимите слайсове. Sysinstall създава тези слайсове и ги маунтва в /mnt директорията. Например ако използвате “Auto” опцията Sysinstall ще създаде и маунтне следните слайсове последния начин:

/     = /mnt
/tmp     = /mnt/tmp
/var    = /mnt/var
/usr    = /mnt/usr

Следва записване на всичко с натискане на W (игнорирайте диалога коойто ще излезе) и излизане от менюто с Q.  Тук е мястото да спомена, че понякога се получава един бъг – слайсовете не могат да се запишат. Незнам от какво е, но ми се струва, че просто системата не може да се сработи с диска и започва да пищи, че няма място да създаде всичко това. Работата се оправя като рестартирате, заредите наново от LiveCD-то и пропуснете стъпката с Fdisk и нараво започнете с правенето на слайсовете (върху партишъна създаден при първото зареждане). Сега вече не би трябвало да имате проблеми при записването с W. Излезте от менюто и да пристъпим към следващата стъпка.

3. Излезте на главното меню и изберете fixit -> cd/dvd. Ще ви се отвори специален (FixIt#) шел и е време да започнем същинската работа. Първата работа е да създадем по-голям темп дял който системата да може да използва. Направете това чрез линкване към /mnt/tmp дяла който създадохме преди малко

# mv tmp/ tmp.old
# ln -sf /mnt/tmp tmp

Създава се нова директория в която се маунтва гореописания FAT32 диск на който се помещават бекъпите

# mkdir /mnt/backups
# /mnt2/sbin/mount_msdosfs /dev/ad0s5 /mnt/backups

/dev/ad0s5 е това, което представлява FAT32 дяла на втория диск. Как ще излезе при вас – трябва сами да разберете, но щом сте стигнали до тук, това трябва да ви е ясно как става. Другия тънък момент който трябва да се спомене тук и който ми докара големи главоболия, е липсата на някои команди които след малко четене се разбра, че се намират в /mnt2/sbin. Забележете, че диска се маунтва не с “maunt -t msdosfs” а директно с maunt_msdosf. Въпреки, че реално и двете на една работеща система правят едно и също, в конкретния случай не е така. Общо взето казано – там се намира всичко което ще ви потрябва за по натам.

При другия вариант (който намерих за по-удачен в последствие), решение е да си използвате един диск, който перманентно е закачен на системата и си е с FreeBSD  партишън на него. При този случай, просто използвайте стандартния начин за маунтване

# mount /dev/ad1s1a /mnt/backups

Дойде момента за същинското ресторване на данните, при което се използват комантите restore и bzcat. Логиката е такава: при подаване на команда бекъпа се разгъва в тази директория в която се намирате в момента. Процеса се състои в последователното влизане във всяка директория и разгъването на бекъпа. В моя случай избрах компресиран бекъп (по обективни причини),  изглеждаше по следния начин:

# cd /mnt
# bzcat /mnt/backups/ad0s1a.dump.bz2 | restore -rf –
# cd /mnt/var
# bzcat /mnt/backups/ad0s1d.dump.bz2 | restore -rf –
# cd /mnt/tmp
# bzcat /mnt/backups/ad0s1e.dump.bz2 | restore -rf –
# cd /mnt/usr
# bzcat /mnt/backups/ad0s1f.dump.bz2 | restore -rf –

при некомпресирания вариант е би било по почити същия начин, като се следва същата логика:

# cd /mnt
# restore -rf /mnt/usb/ad0s1a.dump
# cd /mnt/var
# restore -rf /mnt/usb/ad0s1d.dump
# cd /mnt/tmp
# restore -rf /mnt/usb/ad0s1e.dump
# cd /mnt/usr
# restore -rf /mnt/usb/ad0s1f.dump

С малко търпение и ако всичко е минало добре изпълнявате двете последни стъпки

# chroot /mnt
# chmod 1777 /tmp

редактирате fstab и rc.conf ако искате или имате нужда

# ee /etc/fstab etc
# ee /etc/rc.conf

и идва момента на истината

# reboot

След като сте стигнали вече до тук, би трябвало след около минутка да може да заредите вашата “нова” стара операционна система. При мен цялата тази операция, заедно с копирането на регуларните бекъпи на блога и базата данни и оправянето на на пермишъните и ресторването на базата отне невероятните 60 минути, срещу няколко часовото преинсталиране на цялата систена и няколкодневното и донагласяне, защото винаги има нещо което си забравил… Ами това е, вече може да сте спокойни и винаги да можете да реагирате в рамките на час да вдигнете сървъра до работно ниво от  статут “тотална щета”. Мисля засега толкова стига писане, а амо има още мещо разбирасе ще допълвам тук в тази статия.

* * *

P.S.: Ето и още няколко вметки, отметки и други подобни на които сум се натъкнал докато четях по въпроса.

1. Целия този процес горе може да се използва за копиране от един диск на друг. Винаги съм си мечтал вместо да инсталирам неистово да мога да копирам системата от един диск на друг, а направо бях очарован от възможноста на FreeBD да се инсталира на една машина, после диска да с сложи на друга и всичко да тръгне (с корекция само на мрежата разбира се) все едно винаги си е бил там. Това може да стане по следния начин:

# newfs -U /dev/ad2s1a
# mount /dev/ad2s1a…. /target
# cd /target
# dump -0Lauf – /dev/ad1s1a  | restore -rf –

2. С промяна на числото (по подразбиране “0” за пълен бекъп), може да се правят инкрементални (частични) бекъпи, като се взимат само променените файлове. За повече информация – “man dump”. Лично аз не съм го чел, повече ми харесва идеята да имам един чист цялостем бекъп направен от раз наедно, но на някой може да му е полезно.

3. Ако искате може да направите бекъп на MBR. За целта може да използвате

# dd if=/dev/ad0 of=/path/to/mbr.img bs=512 count=1

а за възтановяване:

# dd if=/path/to/mbr.img of=/dev/ad0 bs=512 count=1

* * *

Остави коментар

Писането на кирилица е задължително!
Коментари, които не са на кирилица ще бъдат изтрити без предупреждение.
Всеки коментари съдържащи 1 или повече линка, ще бъдат публикувани след одобрение.