[ 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 ôàéëû, ôàéëû ñ îòëàäî÷íûìè ïðîòîêîëàìè è ò.ä.). �îýòîìó ïîëíîöåííîå ðåøåíèå âûãëßäèò òàê:
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 ìîäèôèöèðóåòñß êîìàíäîé mount ïðè ìîíòèðîâàíèè è îòìîíòèðîâàíèè óñòðîéñòâ. "mount -n" îïóñêàåò ìîäèôèêàöèþ mtab, íî òîãäà íåêîòîðûå êîìàíäû, êîòîðûå áåðóò èç mtab èíôîðìàöèþ î ñìîíòèðîâàííûõ ôàéëîâûõ ñèñòåìàõ (íàïðèìåð, df è ñîáñòâåííî mount) áóäóò ðàáîòàòü íåèäåàëüíî.
Š ñ÷àñòüþ, ñóùåñòâóåò ôàéë /proc/mounts, ñîâïàäàþùèé ïî ôîðìàòó ñ /etc/mtab, è ñîäåðæàùèé ïîñòîßííî âåðíóþ èíôîðìàöèþ î ñìîíòèðîâàííûõ ôàéëîâûõ ñèñòåìàõ.
�îýòîìó ðåøåíèå ïðîáëåìû ñ /etc/mtab ñëåäóùåå: /etc/mtab çàìåíßåì ñèìâîëè÷åñêîé ññûëêîé íà /proc/mounts, è âñåãäà èñïîëüçóåì "mount -n".
’àáëèöà çàâèñèìîñòåé ìîäóëåé ñóùåñòâåííà äëß ðàáîòû modprobe è, ñëåäñòâåííî, kerneld, êîðî÷å, äëß àâòîìàòè÷åñêîé çàãðóçêè ìîäóëåé ßäðà. /etc/init.d/modutils ñòðîèò ýòîò ôàéë çàíîâî, åñëè îí íå ñóùåñòâóåò. �îñêîëüêó /lib/modules/`uname -r`/modules.dep íàõîäèòñß íà r/o ðàçäåëå, ýòî íå áóäåò ðàáîòàòü ïðîñòî òàê. Œû ìîäèôèöèðóåì /etc/init.d/modutils, ÷òîáû íà âðåìß ïîñòðîåíèß modules.dep èçìåíèòü ðåæèì ìîíòèðîâàíèß êîðíåâîé ôàéëîâîé ñèñòåìû íà r/w.
�òî íå èäåàëüíîå ðåøåíèå, ïîñêîëüêó ìàøèíà îêàçûâàåòñß íà êàêîå-òî âðåìß óßçâèìà äëß ïðîïàäàíèß ïèòàíèß. Žäíàêî ýòî âðåìß âåñüìà ìàëî (íåñêîëüêî ñåêóíä), è íåáîëüøîé ðèñê âïîëíå îêóïàåòñß ãàðàíòèåé ñóùåñòâîâàíèß àêòóàëüíîãî modules.dep.
‚ ïðîöåññå âõîäà ïîëüçîâàòåëß â ñèñòåìó, 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.
�à ðîóòåðàõ èíîãäà âñå-òàêè âîçíèêàåò ïîòðåáíîñòü çàïèñûâàòü ôàéëû òàê, ÷òîáû îíè ïåðåæèâàëè âûêëþ÷åíèå ïèòàíèß. �àïðèìåð, íåêîòîðûå ôàéëû ñòàòèñòèêè, èëè, ñêàæåì, áàçà ìèãðèðóþùèõ 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):
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