[ KOI8 | CP1251(MS-Windows) | CP866(DOS) | ISO8859-5 | Mac ]


Pozhaluista, prochtite Pravila kopirovaniya i ispol'zovaniya dannyh materialov.

Obespechenie celostnosti failovoi sistemy pri vnezapnyh vyklyucheniyah routera

Problema

Vnezapnye vyklyucheniya PC-routera (kak i lyuboi Linux-mashiny) mogut privesti k narusheniyam korrektnosti failovoi sistemy. Povrezhdeniya voznikayut iz-za togo, chto operacii s failovoi sistemoi ne yavlyayutsya nedelimymi; naprimer, modifikaciya faila vklyuchaet v sebya izmenenie kak blokov faila, tak i opisatelya faila (i-node), spiska svobodnyh blokov i t.d., kotorye zapisyvayutsya na disk neskol'kimi razdel'nymi operaciyami zapisi. Posle vypolneniya pervoi iz operacii i vplot' do zaversheniya poslednei failovaya sistema na diske nahoditsya v promezhutochnom, perehodnom sostoyanii; esli v etot moment proizoidet vyklyuchenie, failovaya sistema tak i ostanetsya v nekorrektnom sostoyanii i budet trebovat' pochinki (fsck).

Vo mnogih sluchayah povrezhdeniya okazyvayutsya neser'eznymi, tak chto pri zagruzke sistemy vozmozhna avtomaticheskaya pochinka bez poteri failov (fsck -a). Tem ne menee, sushestvuet veroyatnost' ser'eznogo povrezhdeniya, kotoroe potrebuet pochinki v ruchnom rezhime i, vozmozhno, vosstanovleniya poteryannyh failov. Poetomu dopuskat' povrezhdeniya failovoi sistemy nel'zya, ibo eto protivorechit principu neobsluzhivaemosti (sm. razdel 2.2) izdeliya.

Reshenie

Poskol'ku povrezhdeniya voznikayut isklyuchitel'no kak rezul'tat nezavershennyh operacii zapisi na disk, my mozhem izbezhat' povrezhdenii, rabotaya s diskom v rezhime "tol'ko na chtenie" (read-only, r/o). Odnako prosto smontirovat' ves' disk read-only nel'zya, poskol'ku dlya polnocennoi raboty sistemy trebuetsya, chtoby nekotorye katalogi (/tmp, /var/run, /var/log, ...) rabotali v rezhime "chtenie i zapis'" (read/write, r/w). Pri etom zapisyvaemaya v eti katalogi informaciya nosit prehodyashii harakter (vremennye faily, .pid faily, faily s otladochnymi protokolami i t.d.). Poetomu polnocennoe reshenie vyglyadit tak:

  1. Disk razbivaem na dva razdela, odin read-only, drugoi read/write, i failovoe derevo raspredelyaem mezhdu razdelami tak, chtoby trebuyushie modifikacii katalogi nahodilis' na vtorom iz nih;
  2. Poskol'ku r/w razdel pri vyklyuchenii mashiny povrezhdaetsya, pri zagruzke sistemy my sozdaem ego (mkfs) zanovo i inicializiruem s master-kopii, hranyasheisya na kornevom razdele.

Realizaciya

r/w razdel montiruetsya na /var/lib/roroot/volatile, i pri starte sistemy (/etc/init.d/boot) inicializiruetsya iz /var/lib/roroot/volatile.ini. Katalogi na r/o razdele, dlya kotoryh neobhodimo obespechit' vozmozhnost' zapisi, zamenyayutsya na simvolicheskie ssylki na sootvetstvuyushie im katalogi na r/w razdele:

ln -s /var/lib/roroot/volatile/X/Y/Z /X/Y/Z

Neskol'ko momentov trebuyut osobogo obhozhdeniya pri perehode k rabote s kornevym razdelom v rezhime r/o.

Katalog /etc/mtab

/etc/mtab modificiruetsya komandoi mount pri montirovanii i otmontirovanii ustroistv. "mount -n" opuskaet modifikaciyu mtab, no togda nekotorye komandy, kotorye berut iz mtab informaciyu o smontirovannyh failovyh sistemah (naprimer, df i sobstvenno mount) budut rabotat' neideal'no.

K schast'yu, sushestvuet fail /proc/mounts, sovpadayushii po formatu s /etc/mtab, i soderzhashii postoyanno vernuyu informaciyu o smontirovannyh failovyh sistemah.

Poetomu reshenie problemy s /etc/mtab sledushee: /etc/mtab zamenyaem simvolicheskoi ssylkoi na /proc/mounts, i vsegda ispol'zuem "mount -n".

Tablica zavisimostei modulei
/lib/modules/`uname -r`/modules.dep

Tablica zavisimostei modulei sushestvenna dlya raboty modprobe i, sledstvenno, kerneld, koroche, dlya avtomaticheskoi zagruzki modulei yadra. /etc/init.d/modutils stroit etot fail zanovo, esli on ne sushestvuet. Poskol'ku /lib/modules/`uname -r`/modules.dep nahoditsya na r/o razdele, eto ne budet rabotat' prosto tak. My modificiruem /etc/init.d/modutils, chtoby na vremya postroeniya modules.dep izmenit' rezhim montirovaniya kornevoi failovoi sistemy na r/w.

Eto ne ideal'noe reshenie, poskol'ku mashina okazyvaetsya na kakoe-to vremya uyazvima dlya propadaniya pitaniya. Odnako eto vremya ves'ma malo (neskol'ko sekund), i nebol'shoi risk vpolne okupaetsya garantiei sushestvovaniya aktual'nogo modules.dep.

Fail /bin/login

V processe vhoda pol'zovatelya v sistemu, login pytaetsya vypolnit' smenu vladel'ca i rezhimov dostupa (chown, chmod) dlya /dev/ttyXXX, na kotorom proishodit vhod. Poskol'ku katalog /dev nahoditsya na r/o razdele, eti operacii zakanchivayutsya neudachei.

Smena vladel'ca i rezhmov dostupa terminala ne kritichna (ne sozdaet vozmozhnosti nesankcionirovannogo, libo nevozmozhnosti sankcionirovannogo dostupa) dlya routerov, gde obychno edinstvennym pol'zovatelem sistemy yavlyaetsya root. Odnako login proveryaet kod zaversheniya operacii chown i chmod, i v sluchae neudachi obryvaet proceduru vhoda--eto oznachaet nevozmozhnost' vhoda v sistemu, esli katalog /dev nahoditsya na r/o razdele. Razmestit' zhe /dev na r/w razdele nel'zya, poskol'ku ego prisutstvie neobhodimo na etape raskrutki sistemy--v chastnosti, dlya montirovaniya r/w razdela.

Poetomu dlya routerov ispol'zuetsya modificirovannaya versiya /bin/login, kotoraya spokoino vosprinimaet zavershenie chown/chmod s oshibkoi EROFS.

Postoyannye r/w katalogi

Na routerah inogda vse-taki voznikaet potrebnost' zapisyvat' faily tak, chtoby oni perezhivali vyklyuchenie pitaniya. Naprimer, nekotorye faily statistiki, ili, skazhem, baza migriruyushih IP-adresov (pppmlogin.db) na routere, vypolnyayushem funkcii terminal'nogo servera. Esli pervuyu problemu eshe mozhno pytat'sya reshat' pri pomoshi "syslog to remote host", to vtoraya v ramkah opisannogo deleniya na r/o - r/w razdely ne reshaetsya.

Reshenie daet ispol'zovanie udalennogo servera dlya hraneniya failov. Analogichno montirovaniyu r/w razdela na /var/lib/roroot/volatile, my montiruem (mount -t nfs) udalennyi disk na /var/lib/roroot/remote. Takzhe analogichno, katalogi na r/o razdele, dlya kotoryh neobhodimo obespechit' rezhim "r/w s postoyannym hraneniem", zamenyayutsya na simvolicheskie ssylki na sootvetstvuyushie im podkatalogi na udalennom diske:

ln -s /var/lib/roroot/remote/X/Y/Z /X/Y/Z

Konfiguraciya sistemy dlya raboty v opisannom rezhime

Ya nadeyus' v obozrimom budushem izgotovit' avtomaticheski installiruemyi paket (roroot-NNN.deb), kotoryi pri installyacii (dpkg -i) budet sozdavat' vse neobhodimye katalogi, linki i t.d. A poka pridetsya vruchnuyu; mozhno ispol'zovat' failovoe derevo dish-routera v kachestve prototipa.

Narezka diska:

dish-router:~# fdisk
Using /dev/hda as default device!

Command (m for help): p

Disk /dev/hda: 10 heads, 34 sectors, 984 cylinders
Units = cylinders of 340 * 512 bytes

   Device Boot   Begin    Start      End   Blocks   Id  System
/dev/hda1            1        1       20     3383    1  DOS 12-bit FAT
/dev/hda2   *       21       21      562    92140   83  Linux native
/dev/hda3          563      563      755    32810   82  Linux swap
/dev/hda4          756      756      984    38930   83  Linux native

Command (m for help):


Neskol'ko ssylok na modificirovannye faily:

Spisok r/w katalogov:

dish-router:~# ls -l `find / -lname '*roroot*'`
lrwxrwxrwx 1 root root  28 Sep 29 22:41 /tmp -> /var/lib/roroot/volatile/tmp
lrwxrwxrwx 1 root root  36 Sep 30 17:47 /var/backups -> /var/lib/roroot/volatile/var/backups
lrwxrwxrwx 1 root root  35 Sep 29 22:41 /var/catman -> /var/lib/roroot/volatile/var/catman
lrwxrwxrwx 1 root root  33 Sep 29 22:41 /var/lock -> /var/lib/roroot/volatile/var/lock
lrwxrwxrwx 1 root root  32 Sep 29 22:41 /var/log -> /var/lib/roroot/volatile/var/log
lrwxrwxrwx 1 root root  32 Sep 29 22:41 /var/run -> /var/lib/roroot/volatile/var/run
lrwxrwxrwx 1 root root  38 Sep 29 22:41 /var/spool/lpd -> /var/lib/roroot/volatile/var/spool/lpd
lrwxrwxrwx 1 root root  40 Sep 29 22:41 /var/spool/smail -> /var/lib/roroot/volatile/var/spool/smail
lrwxrwxrwx 1 root root  32 Sep 29 22:41 /var/tmp -> /var/lib/roroot/volatile/var/tmp






sizif@botik.ru

Last modified: Sun Oct 5 00:15:27 MSD 1997