[ KOI8 | CP1251(MS-Windows) | CP866(DOS) | ISO8859-5 | Mac ]
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.
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:
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.
/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 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.
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.
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
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.
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):
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/tmpsizif@botik.ru
Last modified: Sun Oct 5 00:15:27 MSD 1997