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


�îæàëóéñòà, ïðî÷òèòå �ðàâèëà êîïèðîâàíèß è èñïîëüçîâàíèß äàííûõ ìàòåðèàëîâ.

Žáåñïå÷åíèå öåëîñòíîñòè ôàéëîâîé ñèñòåìû ïðè âíåçàïíûõ âûêëþ÷åíèßõ ðîóòåðà

�ðîáëåìà

‚íåçàïíûå âûêëþ÷åíèß PC-ðîóòåðà (êàê è ëþáîé Linux-ìàøèíû) ìîãóò ïðèâåñòè ê íàðóøåíèßì êîððåêòíîñòè ôàéëîâîé ñèñòåìû. �îâðåæäåíèß âîçíèêàþò èç-çà òîãî, ÷òî îïåðàöèè ñ ôàéëîâîé ñèñòåìîé íå ßâëßþòñß íåäåëèìûìè; íàïðèìåð, ìîäèôèêàöèß ôàéëà âêëþ÷àåò â ñåáß èçìåíåíèå êàê áëîêîâ ôàéëà, òàê è îïèñàòåëß ôàéëà (i-node), ñïèñêà ñâîáîäíûõ áëîêîâ è ò.ä., êîòîðûå çàïèñûâàþòñß íà äèñê íåñêîëüêèìè ðàçäåëüíûìè îïåðàöèßìè çàïèñè. �îñëå âûïîëíåíèß ïåðâîé èç îïåðàöèé è âïëîòü äî çàâåðøåíèß ïîñëåäíåé ôàéëîâàß ñèñòåìà íà äèñêå íàõîäèòñß â ïðîìåæóòî÷íîì, ïåðåõîäíîì ñîñòîßíèè; åñëè â ýòîò ìîìåíò ïðîèçîéäåò âûêëþ÷åíèå, ôàéëîâàß ñèñòåìà òàê è îñòàíåòñß â íåêîððåêòíîì ñîñòîßíèè è áóäåò òðåáîâàòü ïî÷èíêè (fsck).

‚î ìíîãèõ ñëó÷àßõ ïîâðåæäåíèß îêàçûâàþòñß íåñåðüåçíûìè, òàê ÷òî ïðè çàãðóçêå ñèñòåìû âîçìîæíà àâòîìàòè÷åñêàß ïî÷èíêà áåç ïîòåðè ôàéëîâ (fsck -a). ’åì íå ìåíåå, ñóùåñòâóåò âåðîßòíîñòü ñåðüåçíîãî ïîâðåæäåíèß, êîòîðîå ïîòðåáóåò ïî÷èíêè â ðó÷íîì ðåæèìå è, âîçìîæíî, âîññòàíîâëåíèß ïîòåðßííûõ ôàéëîâ. �îýòîìó äîïóñêàòü ïîâðåæäåíèß ôàéëîâîé ñèñòåìû íåëüçß, èáî ýòî ïðîòèâîðå÷èò ïðèíöèïó íåîáñëóæèâàåìîñòè (ñì. ðàçäåë 2.2) èçäåëèß.

�åøåíèå

�îñêîëüêó ïîâðåæäåíèß âîçíèêàþò èñêëþ÷èòåëüíî êàê ðåçóëüòàò íåçàâåðøåííûõ îïåðàöèé çàïèñè íà äèñê, ìû ìîæåì èçáåæàòü ïîâðåæäåíèé, ðàáîòàß ñ äèñêîì â ðåæèìå "òîëüêî íà ÷òåíèå" (read-only, r/o). Žäíàêî ïðîñòî ñìîíòèðîâàòü âåñü äèñê read-only íåëüçß, ïîñêîëüêó äëß ïîëíîöåííîé ðàáîòû ñèñòåìû òðåáóåòñß, ÷òîáû íåêîòîðûå êàòàëîãè (/tmp, /var/run, /var/log, ...) ðàáîòàëè â ðåæèìå "÷òåíèå è çàïèñü" (read/write, r/w). �ðè ýòîì çàïèñûâàåìàß â ýòè êàòàëîãè èíôîðìàöèß íîñèò ïðåõîäßùèé õàðàêòåð (âðåìåííûå ôàéëû, .pid ôàéëû, ôàéëû ñ îòëàäî÷íûìè ïðîòîêîëàìè è ò.ä.). �îýòîìó ïîëíîöåííîå ðåøåíèå âûãëßäèò òàê:

  1. „èñê ðàçáèâàåì íà äâà ðàçäåëà, îäèí read-only, äðóãîé read/write, è ôàéëîâîå äåðåâî ðàñïðåäåëßåì ìåæäó ðàçäåëàìè òàê, ÷òîáû òðåáóþùèå ìîäèôèêàöèè êàòàëîãè íàõîäèëèñü íà âòîðîì èç íèõ;
  2. �îñêîëüêó r/w ðàçäåë ïðè âûêëþ÷åíèè ìàøèíû ïîâðåæäàåòñß, ïðè çàãðóçêå ñèñòåìû ìû ñîçäàåì åãî (mkfs) çàíîâî è èíèöèàëèçèðóåì ñ ìàñòåð-êîïèè, õðàíßùåéñß íà êîðíåâîì ðàçäåëå.

�åàëèçàöèß

r/w ðàçäåë ìîíòèðóåòñß íà /var/lib/roroot/volatile, è ïðè ñòàðòå ñèñòåìû (/etc/init.d/boot) èíèöèàëèçèðóåòñß èç /var/lib/roroot/volatile.ini. Šàòàëîãè íà r/o ðàçäåëå, äëß êîòîðûõ íåîáõîäèìî îáåñïå÷èòü âîçìîæíîñòü çàïèñè, çàìåíßþòñß íà ñèìâîëè÷åñêèå ññûëêè íà ñîîòâåòñòâóþùèå èì êàòàëîãè íà r/w ðàçäåëå:

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

�åñêîëüêî ìîìåíòîâ òðåáóþò îñîáîãî îáõîæäåíèß ïðè ïåðåõîäå ê ðàáîòå ñ êîðíåâûì ðàçäåëîì â ðåæèìå r/o.

Šàòàëîã /etc/mtab

/etc/mtab ìîäèôèöèðóåòñß êîìàíäîé mount ïðè ìîíòèðîâàíèè è îòìîíòèðîâàíèè óñòðîéñòâ. "mount -n" îïóñêàåò ìîäèôèêàöèþ mtab, íî òîãäà íåêîòîðûå êîìàíäû, êîòîðûå áåðóò èç mtab èíôîðìàöèþ î ñìîíòèðîâàííûõ ôàéëîâûõ ñèñòåìàõ (íàïðèìåð, df è ñîáñòâåííî mount) áóäóò ðàáîòàòü íåèäåàëüíî.

Š ñ÷àñòüþ, ñóùåñòâóåò ôàéë /proc/mounts, ñîâïàäàþùèé ïî ôîðìàòó ñ /etc/mtab, è ñîäåðæàùèé ïîñòîßííî âåðíóþ èíôîðìàöèþ î ñìîíòèðîâàííûõ ôàéëîâûõ ñèñòåìàõ.

�îýòîìó ðåøåíèå ïðîáëåìû ñ /etc/mtab ñëåäóùåå: /etc/mtab çàìåíßåì ñèìâîëè÷åñêîé ññûëêîé íà /proc/mounts, è âñåãäà èñïîëüçóåì "mount -n".

’àáëèöà çàâèñèìîñòåé ìîäóëåé
/lib/modules/`uname -r`/modules.dep

’àáëèöà çàâèñèìîñòåé ìîäóëåé ñóùåñòâåííà äëß ðàáîòû modprobe è, ñëåäñòâåííî, kerneld, êîðî÷å, äëß àâòîìàòè÷åñêîé çàãðóçêè ìîäóëåé ßäðà. /etc/init.d/modutils ñòðîèò ýòîò ôàéë çàíîâî, åñëè îí íå ñóùåñòâóåò. �îñêîëüêó /lib/modules/`uname -r`/modules.dep íàõîäèòñß íà r/o ðàçäåëå, ýòî íå áóäåò ðàáîòàòü ïðîñòî òàê. Œû ìîäèôèöèðóåì /etc/init.d/modutils, ÷òîáû íà âðåìß ïîñòðîåíèß modules.dep èçìåíèòü ðåæèì ìîíòèðîâàíèß êîðíåâîé ôàéëîâîé ñèñòåìû íà r/w.

�òî íå èäåàëüíîå ðåøåíèå, ïîñêîëüêó ìàøèíà îêàçûâàåòñß íà êàêîå-òî âðåìß óßçâèìà äëß ïðîïàäàíèß ïèòàíèß. Žäíàêî ýòî âðåìß âåñüìà ìàëî (íåñêîëüêî ñåêóíä), è íåáîëüøîé ðèñê âïîëíå îêóïàåòñß ãàðàíòèåé ñóùåñòâîâàíèß àêòóàëüíîãî modules.dep.

”àéë /bin/login

‚ ïðîöåññå âõîäà ïîëüçîâàòåëß â ñèñòåìó, login ïûòàåòñß âûïîëíèòü ñìåíó âëàäåëüöà è ðåæèìîâ äîñòóïà (chown, chmod) äëß /dev/ttyXXX, íà êîòîðîì ïðîèñõîäèò âõîä. �îñêîëüêó êàòàëîã /dev íàõîäèòñß íà r/o ðàçäåëå, ýòè îïåðàöèè çàêàí÷èâàþòñß íåóäà÷åé.

‘ìåíà âëàäåëüöà è ðåæìîâ äîñòóïà òåðìèíàëà íå êðèòè÷íà (íå ñîçäàåò âîçìîæíîñòè íåñàíêöèîíèðîâàííîãî, ëèáî íåâîçìîæíîñòè ñàíêöèîíèðîâàííîãî äîñòóïà) äëß ðîóòåðîâ, ãäå îáû÷íî åäèíñòâåííûì ïîëüçîâàòåëåì ñèñòåìû ßâëßåòñß root. Žäíàêî login ïðîâåðßåò êîä çàâåðøåíèß îïåðàöèé chown è chmod, è â ñëó÷àå íåóäà÷è îáðûâàåò ïðîöåäóðó âõîäà--ýòî îçíà÷àåò íåâîçìîæíîñòü âõîäà â ñèñòåìó, åñëè êàòàëîã /dev íàõîäèòñß íà r/o ðàçäåëå. �àçìåñòèòü æå /dev íà r/w ðàçäåëå íåëüçß, ïîñêîëüêó åãî ïðèñóòñòâèå íåîáõîäèìî íà ýòàïå ðàñêðóòêè ñèñòåìû--â ÷àñòíîñòè, äëß ìîíòèðîâàíèß r/w ðàçäåëà.

�îýòîìó äëß ðîóòåðîâ èñïîëüçóåòñß ìîäèôèöèðîâàííaß âåðñèß /bin/login, êîòîðàß ñïîêîéíî âîñïðèíèìàåò çàâåðøåíèå chown/chmod ñ îøèáêîé EROFS.

�îñòîßííûå r/w êàòàëîãè

�à ðîóòåðàõ èíîãäà âñå-òàêè âîçíèêàåò ïîòðåáíîñòü çàïèñûâàòü ôàéëû òàê, ÷òîáû îíè ïåðåæèâàëè âûêëþ÷åíèå ïèòàíèß. �àïðèìåð, íåêîòîðûå ôàéëû ñòàòèñòèêè, èëè, ñêàæåì, áàçà ìèãðèðóþùèõ IP-àäðåñîâ (pppmlogin.db) íà ðîóòåðå, âûïîëíßþùåì ôóíêöèè òåðìèíàëüíîãî ñåðâåðà. …ñëè ïåðâóþ ïðîáëåìó åùå ìîæíî ïûòàòüñß ðåøàòü ïðè ïîìîùè "syslog to remote host", òî âòîðàß â ðàìêàõ îïèñàííîãî äåëåíèß íà r/o - r/w ðàçäåëû íå ðåøàåòñß.

�åøåíèå äàåò èñïîëüçîâàíèå óäàëåííîãî ñåðâåðà äëß õðàíåíèß ôàéëîâ. €íàëîãè÷íî ìîíòèðîâàíèþ r/w ðàçäåëà íà /var/lib/roroot/volatile, ìû ìîíòèðóåì (mount -t nfs) óäàëåííûé äèñê íà /var/lib/roroot/remote. ’àêæå àíàëîãè÷íî, êàòàëîãè íà r/o ðàçäåëå, äëß êîòîðûõ íåîáõîäèìî îáåñïå÷èòü ðåæèì "r/w ñ ïîñòîßííûì õðàíåíèåì", çàìåíßþòñß íà ñèìâîëè÷åñêèå ññûëêè íà ñîîòâåòñòâóþùèå èì ïîäêàòàëîãè íà óäàëåííîì äèñêå:

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

Šîíôèãóðàöèß ñèñòåìû äëß ðàáîòû â îïèñàííîì ðåæèìå

Ÿ íàäåþñü â îáîçðèìîì áóäóùåì èçãîòîâèòü àâòîìàòè÷åñêè èíñòàëëèðóåìûé ïàêåò (roroot-NNN.deb), êîòîðûé ïðè èíñòàëëßöèè (dpkg -i) áóäåò ñîçäàâàòü âñå íåîáõîäèìûå êàòàëîãè, ëèíêè è ò.ä. € ïîêà ïðèäåòñß âðó÷íóþ; ìîæíî èñïîëüçîâàòü ôàéëîâîå äåðåâî dish-routerà â êà÷åñòâå ïðîòîòèïà.

�àðåçêà äèñêà:

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):


�åñêîëüêî ññûëîê íà ìîäèôèöèðîâàííûå ôàéëû:

‘ïèñîê r/w êàòàëîãîâ:

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