, to uvidim progressiruyushchee uproshchenie imen po mere prodvizheniya k pervoj zapisi - ustrojstvu 0, kotoroe imeet vysokuyu plotnost' zapisi po umolchaniyu. Dlya togo chtoby obratit'sya k nemu kak k ustrojstvu s nizkoj plotnost'yu zapisi, neobhodimo ispol'zovat' imya fd048, a ne fd0. Poskol'ku bol'shinstvo ispol'zuemyh gibkih diskov ime- yut nizkuyu plotnost' zapisi, to imya fd048ds9 yavlyaetsya umolchaniem v programme mntf. Stroka 17 sootvetstvuet opcii -1 dlya ukazaniya ustrojstva 1 vmesto ustrojstva 0. Stroki 18-22 proveryayut, sishchestvuet li katalog dlya monti- rovaniya vtorogo ustrojstva. Esli vy ispol'zuete dva gibkih diska od- novremenno, to vy ne mozhete montirovat' ih oba v odin i tot zhe kata- log. Dlya razresheniya etoj problemy programma mntf ispol'zuet dlya monti- rovaniya ustrojstva 1 katalog /mnt1, a ne /mnt. Esli katalog /mnt1 ne sushchestvuet, po umolchaniyu ispol'zuetsya katalog /mnt, i vse horosho, esli vy ispol'zuete tol'ko ustrojstvo 1. Odnako sleduet izbegat' montirova- niya odnogo gibkogo diska na mesto vtorogo. Vy mozhete poluchit' nepred- vidennye rezul'taty. Esli vy sobiraetes' montirovat' dva gibkih diska, ubedites', chto u vas est' i katalog /mnt, i /mnt1. Stroka 23 delaet montiruemuyu fajlovuyu sistemu dostupnoj tol'ko dlya chteniya v sluchae, esli byla ukazana opciya -r, chto vypolnyaetsya do- bavleniem simvolov -r k imeni kataloga. |to ne yavlyaetsya chast'yu imeni kataloga, no kogda shell vypolnyaet obrabotku komandy, probela mezhdu imenem kataloga i -r dostatochno, chtoby raspoznat' -r kak opciyu. Stroka 24 sootvetstvuet opcii -s i prisvaivaet peremennoj SYSTEM znachenie sysv. |to oznachaet, chto nuzhno ispol'zovat' drugie soglasheniya ob imenah ustrojstv. Stroki 25-34 vypolnyayut proverku na oshibki v komandnoj stroke. Lyu- baya opciya, otlichnaya ot uzhe proverennyh, yavlyaetsya oshibkoj, poetomu vse, chto sootvetstvuet ulavlivayushchej vetke operatora case (*), schitaetsya ne- dopustimoj opciej. V etom sluchae vyvoditsya sintaksicheskaya podskazka, i programma zavershaetsya. V strokah 39-42 vypolnyaetsya vsya osnovnaya rabota. Operator case dejstvuet v sootvetstvii so znacheniem peremennoj SYSTEM. Esli ono rav- no "sysv", vypolnyaetsya stroka 40. V protivnom sluchae vypolnyaetsya stro- ka 41 dlya sistemy XENIX. Obratite vnimanie, chto v nashej versii komand- nogo fajla mntf v stroke sysv imeetsya tol'ko peremennaya s nomerom ust- rojstva. Esli vy ispol'zuete System V, vy mozhete dobavit' peremennuyu dlya ukazaniya plotnosti zapisi ili drugie parametry, kotorye vam nuzhny. Stroka 41 vypolnyaet versiyu komandy, rasschitannuyu na sistemu XENIX. Peremennaya CMD soderzhit, kak my otmechali, komandu montirovaniya (mount) ili razmontirovaniya (umount). Posledovatel'nost' simvolov /dev/fd ukazyvaet fajl ustrojstva dlya gibkogo diska. Peremennaya DRIVE ravna 0 ili 1. Peremennaya DENSITY ukazyvaet ustrojstvo s vysokoj ili nizkoj plotnost'yu zapisi. Esli dolzhna byt' vypolnena komanda montiro- vaniya, peremennaya DIR soderzhit katalog. Esli vypolnyaetsya razmontirova- nie, znachenie peremennoj DIR ravno nulyu. ZAMECHANIE PO VOPROSU BEZOPASNOSTI Obychno tol'ko superpol'zovatel' (root) mozhet montirovat' fajlovuyu sistemu. V bol'shih sistemah eto imeet smysl. Odnako na nebol'shih nastol'nyh mashinah eto mozhet byt' slishkom ogranichivayushchim faktorom. Dlya togo chtoby obojti eto trebovanie, ispol'zujte vozmozhnost' izmeneniya prav dostupa. CHtoby pozvolit' lyubomu pol'zovatelyu vypolnyat' komandy montirovaniya i razmontirovaniya, primenite sleduyushchie komandy: # chown root /etc/mount <- delaet pol'zovatelya root vladel'cem modulya /etc/mount # chmod 4511 /etc/mount i daet vozmozhnost' vypolnyat' komandu mount vsem pol'zovatelyam # chown root /etc/umount <- delaet to zhe samoe dlya komandy # chmod 4511 /etc/umount razmontirovaniya |ti komandy oblegchayut vsem pol'zovatelyam rabotu s gibkim diskom, no odnovremenno otkryvayut ogromnuyu dyru v zashchite sistemy. Esli kto-li- bo uzhe prolozhil tropinku prav dostupa na gibkij disk (sm. glavu 9), to montirovanie fajlovoj sistemy prodolzhit etu tropinku v glavnuyu sistemu i pozvolit takomu pol'zovatelyu stat' superpol'zovatelem vsej sistemy v celom prosto s gibkogo diska! -------------------------------------------------------------- IMYA: mntlook -------------------------------------------------------------- mntlook Poisk fajlovyh sistem na ustrojstvah NAZNACHENIE Prosmotr vseh fajlov diskovyh ustrojstv i obnaruzhenie vseh fajlo- vyh sistem, vklyuchaya nemontirovannye. FORMAT VYZOVA mntlook PRIMER VYZOVA mntlook /dev/hd* Poisk fajlovyh sistem na vseh zhestkih diskah TEKST PROGRAMMY 1 static char id[] = "@(#) mntlook v1.0 Look for mounts Author: Russ Sage"; Poisk fajlovyh sistem 3 #include 4 #include 5 #include 6 #include 7 #include 9 #define BSIZ 512 11 main(argc,argv) 12 int argc; 13 char *argv[]; 14 { 15 struct filsys sb; 16 int d, dev; 17 char buf[BSIZ]; 19 for (d = 1; d < argc; d++) 20 { 21 if (argv[d][0] == '-') 22 { 23 printf("mntlook: invalid argument %s\n", argv[d]); 24 printf("usage: mntlook device [device ...]\n"); 25 continue; 26 } 27 if ((dev = open(argv[d],O_RDONLY)) < 0) 28 { 29 sprintf(buf, "cannot open %s",argv[d]); nevozmozhno otkryt' 30 perror(buf); 31 continue; 32 } 34 /* throw away first block */ obojti pervyj blok 35 if (read(dev, &sb, sizeof(sb)) == -1) 36 { 37 perror("cannot read block 0"); ne chitaetsya blok 0 38 continue; 39 } 41 /* block 1 is the superblock */ blok 1 yavlyaetsya superblokom 42 if (read(dev, &sb, sizeof(sb)) == -1) 43 { 44 perror("cannot read block 1"); ne chitaetsya blok 1 45 continue; 46 } 48 if (sb.s_magic == S_S3MAGIC) 49 { 50 printf("\nDEV: %s --> VALID file system\n",argv[d]); 51 printf("filsys: %s\n",sb.s_fname); 52 printf("pack : %s\n",sb.s_fpack); 53 printf("type : %s byte block\n", 54 (sb.s_type == S_B512) ? "512" : "1024"); 55 printf("magic : %lx\n",sb.s_magic); 56 } 58 close(dev); 59 } 60 } OPISANIE ZACHEM NAM NUZHNA PROGRAMMA mntlook? Fajlovye sistemy yavlyayutsya serdcevinoj sistemy UNIX. Sama sistema ne sushchestvuet vne fajlovoj sistemy, a rasshirennye vozmozhnosti sistemy obespechivayutsya fajlovoj sistemoj. Dazhe nesmotrya na to, chto fajlovye sistemy nastol'ko vazhny, UNIX ne imeet nikakih sredstv dlya obnaruzheniya fajlovyh sistem kak takovyh. Ne imeetsya dazhe sredstv, kotorye mogli by soobshchit' nam, kakaya informa- ciya nahoditsya v superblokah. Nam neobhodimo universal'noe sredstvo dlya raboty s fajlovymi sistemami. Ono dolzhno obnaruzhivat' i identificirovat' superbloki, na- hodyashchiesya na ustrojstvah. Zametim, chto operaciya otkrytiya ustrojstva obychno trebuet nalichiya privilegij superpol'zovatelya. CHTO DELAET mntlook? Programma mntlook prednaznachena dlya prosmotra soderzhimogo fajlov ustrojstv i poiska superbloka. (My vkratce rassmatrivali superbloki ranee). Kogda superblok obnaruzhen, iz nego izvlekaetsya i vyvoditsya na ekran imya fajlovoj sistemy, imya diskovogo paketa, ispol'zuemyj razmer bloka i identifikacionnyj "magicheskij nomer". Pervonachal'noj cel'yu dannoj utility bylo obnaruzhenie na vneshnem nositele mashiny takih fajlovyh sistem, kotorye v nastoyashchij moment ne smontirovany. No kogda dannaya programma otkryvaet i chitaet ustrojstvo, ej vse ravno, bylo li ustrojstvo smontirovano ili net, poskol'ku dostup k nemu vypolnyaetsya na bolee nizkom urovne, chem uroven' fajlovoj sistemy. V rezul'tate obnaruzhivayutsya vse fajlovye sistemy, nezavisimo ot togo, byli oni smontirovany ili net. Davajte rassmotrim, kakim obrazom fajlovye sistemy svyazany s fi- zicheskim nositelem. K kazhdoj mashine podsoedineno fiksirovannoe chislo periferijnyh ustrojstv. Dlya raboty so smennymi nositelyami v UNIX rea- lizovana koncepciya montirovannogo i nemontirovannogo fajlovogo prost- ranstva. No pervym shagom yavlyaetsya ustanovka paketa diskov (ili gibkogo diska) v diskovoe ustrojstvo. Posle etogo mozhno vypolnyat' operacii chteniya i zapisi na fizicheskih nositelyah, ukazyvaya opredelennye imena ustrojstv. Montirovanie predstavlyaet soboj logicheskoe dejstvie, kotoroe chi- taet superblok s paketa diskov i zapisyvaet ego v pamyat', gde yadro sistemy podderzhivaet svoyu versiyu superbloka. Periodicheski vypolnyaetsya zapis' versii, nahodyashchejsya v pamyati, obratno na disk, chtoby eti dve versii byli po vozmozhnosti odinakovymi. V System V eto delaet program- ma update, kotoraya rabotaet v fonovom rezhime s momenta zagruzki siste- my. Dlya obrashcheniya neposredstvenno k fizicheskomu nositelyu ispol'zuyutsya takie komandy, kak, naprimer, komanda "od -c /dev /rfd0", kotoraya dam- piruet nestrukturirovannyj gibkij disk. Odnoj iz komand, kotorye ne- posredstvenno pomeshchayut dannye na ustrojstvo, yavlyaetsya komanda "cp file /dev/rfd0". Oblast' dannyh nachinaetsya s samogo pervogo bajta na gibkom diske. Takie dannye nesovmestimy s komandami tar, cpio ili fajlovoj sistemoj. Dlya obrashcheniya k fajlovoj sisteme ispol'zuetsya komanda "mount /dev/fd0 /mnt". Nachinaya s etogo momenta, vse obrashcheniya k dannomu ust- rojstvu vypolnyayutsya cherez katalog /mnt. Vazhno to, chto neposredstvennyj dostup k fajlu ustrojstva yavlyaetsya operaciej bolee nizkogo urovnya, chem operacii fajlovoj sistemy, chto pozvolyaet prochitat' informaciyu o su- perbloke neposredstvenno s ustrojstva. Vhodnoj informaciej dlya programmy mntlook yavlyayutsya imena fajlov ustrojstv. V komandnoj stroke nel'zya ukazyvat' nikakie opcii. Imena ustrojstv mogut byt' kak blochnymi, tak i simvol'nymi. Dlya operacii chteniya eto ne imeet nikakogo znacheniya, esli tol'ko u vas imeyutsya prava chteniya. Zatem programma chitaet vtoroj blok i proveryaet "magicheskoe chislo", opredelyayushchee superblok. Superblok - eto prosto struktura yazyka Si, kotoraya predopredelena sistemoj i hranitsya v fajle filsys.h, chto ukazano v nashej programme operatorom #include. Magicheskoe chislo predstavlyaet soboj dlinnoe celoe, imeyushchee zaranee opredelennoe znache- nie. Esli element struktury, kotoraya prochitana s diska, soderzhit eto chislo, to schitaetsya, chto ostal'naya chast' struktury yavlyaetsya korrektny- mi dannymi. Dlya kazhdoj fajlovoj sistemy imeetsya tol'ko odna struktura superbloka. Esli magicheskoe chislo takoe, kak nado, vyvoditsya ostal'naya infor- maciya o fajlovoj sisteme. Esli eto chislo nekorrektno, na ekran nichego ne vyvoditsya i programma obrabatyvaet v cikle sleduyushchij fajl ust- rojstva, ukazannyj v komandnoj stroke. Dannaya programma mozhet sluzhit' v kachestve funkcii, obespechivayushchej bezopasnost', poskol'ku ona umeet identificirovat' fajlovye sistemy, kotorye kto-libo ostavil na mashine nesmontirovannymi. Kak otmechaetsya v glave 9, narushiteli zashchity mogut chitat' dannye s nemontirovannyh ust- rojstv, poetomu esli ostavit' ustrojstvo ili fajlovuyu sistemu nemonti- rovannymi, to na samom dele eto ne predohranyaet ih ot nesankcioniro- vannogo dostupa. PRIMERY 1. $ mntlook /dev/hd13 Poisk superbloka na ustrojstve s imenem hd13. |to imya ukazyvaet ustrojstvo 1, tretij razdel. Dlya prosmotra razdelov v srede XENIX nuzh- no zapustit' programmu fdisk. Dlya System V nuzhno vospol'zovat'sya ko- mandoj iv. 2. $ mntlook /dev/fd0* Poisk fajlovyh sistem na gibkih diskah s lyuboj plotnost'yu zapisi, nahodyashchihsya v ustrojstve 0. |to snova primer dlya sistemy XENIX. 3. $ for DEV in /dev/*[fh]d* > do > echo "checking device: $DEV" > mntlook $DEV > done Dannyj cikl vypolnyaetsya po vsem imenam ustrojstv dlya gibih i zhestkih diskov po ocheredi. Kazhdoe imya vyvoditsya na ekran. Zatem prove- ryaetsya, soderzhit li dannoe ustrojstvo fajlovuyu sistemu. POYASNENIYA Stroki 3-7 opredelyayut vklyuchaemye fajly, kotorye ispol'zuet dannaya programma. Vam neobhodimo izuchit' eti fajly, poskol'ku oni ne tol'ko pomogut vam ponyat' rabotu etoj programmy, no i pokazhut vam nekotorye vazhnye znacheniya, imeyushchie otnoshenie k fajlovym sistemam. Stroka 9 opredelyaet razmer ispol'zuemogo bufera. |tot bufer pri- menyaetsya tol'ko dlya hraneniya soobshchenij ob oshibkah, poetomu on ne dol- zhen byt' ochen' bol'shim. Stroka 15 opredelyaet strukturu superbloka. On imeet tip filesys (sm. vklyuchaemyj fajl sys/types.h). Na moej mashine superblok imeet raz- mer 1024 bajta. Esli vy ne znaete tochno razmer bufera u vas, to vy mo- zhete proverit' ego, vstaviv v programmu sleduyushchij operator: printf ("the size is %d",sizeof(sb)) Stroka 16 opisyvaet rabochuyu peremennuyu d i deskriptor fajla dev. Stroka 17 ob座avlyaet bufer razmerom BSIZE. Stroki 19-59 - eto odin bol'shoj cikl for. |tot cikl predstavlyaet soboj vsyu ostal'nuyu chast' programmy. On vypolnyaetsya stol'ko raz, skol'ko argumentov ukazano v komandnoj stroke. Schetchik cikla nachina- etsya s 1, poskol'ku pervym argumentom argv[0] yavlyaetsya imya komandy. V kachestve argumentov dolzhny byt' ukazany imena fajlov, poetomu dannyj cikl ispol'zuet kazhdoe imya po ocheredi. V strokah 21-26 proveryaetsya, ne nachinaetsya li tekushchij rassmatri- vaemyj nami argument so znaka '-'. Esli da, to eto opciya, chto predstavlyaet soboj oshibku, poetomu vyvoditsya soobshchenie ob oshibke i operator continue vyzyvaet vypolnenie sleduyushchej iteracii cikla. Takim obrazom, dannaya programma otvergaet opcii, no rabotaet pri obnaruzhenii imen fajlov. Schitaya, chto imya fajla bylo najdeno, stroki 27-32 otkryvayut fajl ustrojstva s etim imenem tol'ko dlya chteniya. Esli dannyj vyzov open ne- udachen, my posylaem soobshchenie v bufer vmeste s imenem, ukazannym v ko- mandnoj stroke. |tot bufer peredaetsya programme obrabotki oshibok (sistemnoj), kotoraya ispol'zuet nashe soobshchenie kak pervuyu chast' svoego soobshcheniya ob oshibke. Ona vyvodit sistemnoe soobshchenie, kotoroe oprede- lyaet dannuyu oshibku. Po operatoru continue nachinaetsya vypolnenie sledu- yushchej iteracii cikla for. Stroki 35-39 chitayut pervyj blok fajla. Dlya kornevoj fajlovoj sistemy pervym blokom yavlyaetsya zagruzochnaya zapis'. Esli pri etom chte- nii voznikaet oshibka, vyvoditsya soobshchenie ob oshibke i vypolnenie cikla prodolzhaetsya. Stroki 42-46 chitayut vtoroj blok, kotoryj dolzhen nahodit'sya v tom meste, gde razmeshchaetsya superblok, esli on imeetsya. Po informacii, pro- chitannoj i pomeshchennoj v strukturu, my mozhem poluchit' dostup k kazhdomu elementu po ego imeni. Stroka 48 proveryaet, ravno li magicheskoe chislo v strukture magi- cheskomu chislu, opredelennomu v fajle zagolovka. Esli oni sovpadayut, programma mntlook vyvodit imya fajla ustrojstva i soobshchenie o tom, chto fajlovaya sistema korrektna, imya fajlovoj sistemy (esli ono imeetsya), imya paketa diskov, razmer ispol'zuemogo bloka i magicheskoe chislo v shestnadcatirichnom vide. V strokah 53-54 my imeem podobie kodirovannoj struktury: operator printf ispol'zuet strukturu tipa if-then-else dlya ukazaniya stroki, ko- toruyu nuzhno vyvodit'. Posle togo kak vyvedena pervaya stroka, vypolnya- etsya proverka i esli ona proshla uspeshno, to vyvoditsya znachenie 512. Esli v rezul'tate proverki polucheno znachenie "lozh'", vyvoditsya znache- nie 1024. |tot metod opisan v knige B.W.Kernighan, D.M.Ritchie "The C Programming Language" (Prentice-Hall, 1978). Stroka 58 zakryvaet ustrojstvo, i cikl vozvrashchaetsya v nachalo dlya prinyatiya sleduyushchego imeni ustrojstva. RAZMERNYE PARAMETRY Teper', kogda my rassmotreli vzaimootnosheniya mezhdu ustrojstvami i fajlovymi sistemami i nekotorye parametry, svyazannye s formatami diskov, davajte obratimsya k gajkam i boltikam etih ustrojstv. Hotya osnovnaya chast' etoj informacii mozhet pokazat'sya ekzotichnoj, ona mozhet okazat'sya vazhnoj pri opredelennyh obstoyatel'stvah. Naprimer, dlya usta- novki sistemy UNIX na novuyu mashinu vam nuzhno razbit' disk na segmenty i ponimat', kakim obrazom UNIX fakticheski raspolagaetsya na diske. Esli vy sozdaete programmy, kotorye vypolnyayut kakuyu-libo operaciyu nizkogo urovnya s diskom, vam, ochevidno, neobhodimo ponimat', chto vy delaete. Administratoram, poskol'ku oni dolzhny dobavlyat' novye ustrojstva v sistemu, neobhodimo umet' opredelyat' kolichestvo fajlovyh sistem (t.e. skol'ko mozhno sozdat' razdelov na diske), ih razmery i znat', kakim obrazom ustanovit' fajlovye sistemy v eti razdely. Administratory dolzhny takzhe umet' pisat' ili modificirovat' drajvery ustrojstv. Nako- nec, pri rabote s diskami voznikayut problemy, takie kak plohie bloki, kotorye neobhodimo izolirovat' i s kotorymi prihoditsya imet' delo. RAZMERY BLOKOV System V yavlyaetsya poslednim dostizheniem vetvi firmy AT&T v fa- mil'nom dereve UNIX. |to oznachaet, chto System V soderzhit poslednie pravki, vnesennye v ishodnuyu sistemu UNIX. |ti pravki prednaznacheny dlya togo, chtoby sdelat' UNIX zhiznesposobnym i stojkim kommercheskim produktom. Dlya povysheniya ustojchivosti byli vneseny izmeneniya, kasayushchi- esya raboty s fajlami i razmerov ih blokov. Obychno obmen dannymi s diskami osushchestvlyaetsya blokami po 512 baj- tov. Diskovaya apparatura imeet delo imenno s takim razmerom. Dlya ucheta etogo fakta UNIX pervonachal'no ispol'zoval 512-bajtnye bloki vnutri fajlovoj sistemy, chto, vozmozhno, oblegchalo napisanie programm i sozda- valo vpechatlenie, chto tak i nuzhno. Odnako nel'zya otricat', chto pri etom UNIX mozhet rabotat' medlenno! Dlya uskoreniya raboty vnutrennie programmy v nastoyashchee vremya ispol'zuyut bloki razmerom 1024 bajta. Sam disk dolzhen vypolnit' dva obrashcheniya k 512-bajtnym blokam, no v sisteme dve eti operacii chteniya rassmatrivayutsya kak odna operaciya chteniya bloka razmerom 1024 bajta. Edinstvennaya problema zaklyuchaetsya v tom, chto odni utility vydayut re- zul'taty v 512-bajtnyh blokah, a drugie - v 1024-bajtnyh, v zavisi- mosti ot togo, kogda oni byli napisany. Kogda sil'no priblizhayutsya pre- dely svobodnogo prostranstva na diske, vam dejstvitel'no nuzhno znat', s kakim razmerom vy imeete delo. Dlya luchshego ponimaniya problemy razmerov blokov, v tabl. 7-3 poka- zano, kakie utility kakoj razmer bloka ispol'zuyut. |ta informaciya po- luchena v osnovnom iz System V na mashine VAX, iz drugogo varianta System V i iz XENIX. |ti znacheniya mogut otlichat'sya na raznyh mashinah, no ideya sohranyaetsya. Vy vidite, chto bol'shinstvo utilit vydayut rezul'tat v blokah raz- merom 512 bajtov, no utility, otnosyashchiesya k fajlovoj sisteme, vydayut rezul'tat v 1024-bajtnyh blokah. Poskol'ku UNIX obrashchaetsya k diskovomu prostranstvu poblochno, vazhno umet' tochno vychislyat', skol'ko svobodnogo prostranstva v fajlovoj sisteme. Ves'ma ploha situaciya, kogda imeetsya kakoj-to bol'shoj fajl v redaktore vi (kotoryj ispol'zuet fajl /tmp dlya promezhutochnogo redaktirovaniya), a na diske nedostatochno mesta dlya za- pisi vremennogo fajla redaktora vi v real'nyj fajl na diske. Na samom dele eto mozhet sluchit'sya na personal'nyh mashinah s ogranichennym (ska- zhem, 20 Mbajt) ob容mom zhestkogo diska. Tablica 7-3 Razmery blokov dlya razlichnyh komand sistemy UNIX ------------------------------------------------------------- 512 bajtov/blok 1024 bajta/blok ------------------------------------------------------------- ls -s fdisk (razmery razdelov) sum mkfs cpio fsck df du ------------------------------------------------------------- RASCHETY, SVYAZANNYE S BLOKAMI Eshche odnim vazhnym voprosom, imeyushchim otnoshenie k fizicheskim ust- rojstvam i logicheskim fajlovym sistemam, yavlyaetsya opredelenie mestona- hozhdeniya opredelennogo bloka na zhestkom diske. Nomer etogo bloka vy- chislyaetsya po nomeram cilindra, dorozhki i sektora. Znanie nomerov blokov stanovitsya vazhnym, kogda na diske poyavlya- etsya defektnoe mesto. |to defektnoe mesto otmechaetsya nomerami cilindra i golovki. Vam neobhodimo vychislit', kakie bloki popadayut v defektnuyu oblast' i zanesti ih nomera v tablicu defektnyh blokov. Obratnaya zadacha takzhe vazhna. Esli programma fsck nachinaet soob- shchat', chto gde-to poyavilsya defektnyj blok, to kakim obrazom my mozhem uznat' nomera cilindra, golovki, sektora i t.d. dlya dannogo defektnogo bloka? Takoe obratnoe vychislenie sdelat' ochen' tyazhelo, esli ne nevoz- mozhno. Vo-pervyh, nomer bloka predstavlyaet soboj proizvedenie chetyreh chisel. Trudno uznat', kakie imenno eti chisla. Krome togo, fajlovye sistemy mogut ispol'zovat' informaciyu vida baza/smeshchenie, poetomu blok nomer 1 v fajlovoj sisteme v dejstvitel'nosti yavlyaetsya blokom nomer 1382 na diske. Opredelit', kakogo vida informaciya byla ispol'zovana v dannom sluchae, tozhe tyazhelo. Konkretnye dannye v sleduyushchem primere otnosyatsya k vpolne oprede- lennoj mashine, no na drugih mashinah ispol'zuyutsya podobnye zavisimosti. |ti dannye otnosyatsya k mashine s zhestkim diskom ob容mom 20 Mbajt s sistemami XENIX/DOS. Harakteristiki ustrojstva: 1 disk = 615 cilindrov, ili 615 cilindrov/disk 1 cilindr = 4 golovki (dorozhki), ili 4 golovki/cilindr Promyshlennyj standart: 1 dorozhka = 17 sektorov, ili 17 sektorov/dorozhku 1 sektor = 512 bajt, ili 512 bajt/sektor 1 Kbajt = 1024 bajta = 2^10 1 Mbajt = 1024 kilobajta = 2^20 = 1 048 576 bajt Harakteristiki ustrojstva razlichny dlya raznyh ustrojstv, no pro- myshlennyj standart dlya chisla sektorov na dorozhku i bajtov na sektor ostaetsya odinakovym. V tabl. 7-4 pokazany primery harakteristik raz- lichnyh ustrojstv. Tablica 7-4 Razmery zhestkih diskov i ih konfiguraciya -------------------------------------------------------------- CHislo cilindrov CHislo golovok Megabajty -------------------------------------------------------------- 981 3 25 697 5 30 981 5 42 925 7 55 1024 8 71 --------------------------------------------------------------- Vy vidite, chto chislo cilindrov i chislo dorozhek razlichny dlya ust- rojstv s raznym ob容mom. Opredelit' maksimal'nyj ob容m diskovoj pamyati mozhno peremnozheniem vseh chisel. V sleduyushchem primere vychislyaetsya obshchij razmer v bajtah dlya predydushchih dannyh. 615 cil 4 dor 17 sek 512 bajt ------- * ----- * ------ * -------- = 21 411 840 bajt/disk 1 disk 1 cil 1 dor 1 sek 21411840 bajt 1 megabajt ------------- * ------------ = 20.4 megabajta/disk 1 disk 1048576 bajt Otmetim, chto esli vy verno ukazyvaete edinicy izmereniya, to oni poparno sokrashchayutsya, za isklyucheniem odnoj snizu i odnoj sverhu, i v rezul'tate poluchayutsya nuzhnye edinicy izmereniya v otvete. Takim obra- zom, v pervoj stroke vychislenij cilindry, dorozhki i sektory sokrashcha- yutsya, i v kachestve edinic izmereniya ostayutsya bajty/disk. Poskol'ku my imeem delo s takim bol'shim kolichestvom razlichnyh edinic izmereniya, vy- chisleniya takogo roda (inogda nazyvaemye "razmernyj analiz") ubezhdayut nas, chto my ponimaem, o chem idet rech'. Ob容m dostupnoj diskovoj pamyati umen'shaetsya posle formatirovaniya, lokalizacii defektnyh blokov i razmeshcheniya na diske fajlovoj sistemy. Odnako nash primer pokazyvaet, chto vse razmery soglasuyutsya mezhdu soboj. Vazhnym momentom, na kotoryj neobhodimo obratit' vnimanie, yavlya- etsya ispol'zovanie raznyh terminov. Inogda primenyaetsya chislo golovok na cilindr, a inogda chislo dorozhek na cilindr. Pri ispol'zovanii kazh- dogo iz etih terminov sootvetstvuyushchim obrazom izmenyayutsya i drugie ter- miny. Sushchestvuet takaya vzaimosvyaz': cilindr, dorozhka, sektor = fizicheskij sektor cilindr, golovka, bajt = blok |ti dve zapisi vyrazhayut v tochnosti odno i to zhe. Kogda vy ispol'- zuete zapis' vida cilindr/dorozhka/sektor, to v rezul'tate poluchaete fizicheskij sektor. Ispol'zuya zapis' vida cilindr/golovka/bajt, vy po- luchaete v rezul'tate nomer bloka. Sleduet pomnit', chto GOLOVKA - eto to zhe samoe, chto i DOROZHKA. Esli vy eto zapomnite, vse ostal'noe vsta- net na svoe mesto. Nizhe privodyatsya nekotorye obshchie vychisleniya, kotorye chasto vsply- vayut, kogda vy rabotaete s diskom na nizkom urovne. |ti primery v bol'shej stepeni otnosyatsya k samomu ustrojstvu, chem k sisteme UNIX. Od- nako posle togo, kak vy pojmete etu informaciyu o diske, vam budet leg- che ponyat', kak rabotaet UNIX na etom urovne. 1. Skol'ko dorozhek imeet disk? 615 cil 4 dor Reshenie: ------- * ----- = 2460 dor/disk 1 disk 1 cil 2. Skol'ko bajt v dorozhke? 17 sek 512 bajt Reshenie: ------ * -------- = 8704 bajt/dor 1 dor 1 sek 3. Skol'ko dorozhek v odnom megabajte? 2460 dor 1 disk Reshenie: -------- * ------ = 123 dor/Mb 1 disk 20 Mb 4. Skol'ko cilindrov v odnom megabajte? 1 cil 2460 dor Reshenie: ----- * -------- = 30 cil/Mb, 4 dor 20 Mb 615 cil 1 disk 123 dor ili ------- * -------- * ------- = 30 cil/Mb 1 disk 2460 dor 1 Mb 5. Dan cilindr 47, dorozhka 2, sektor 4. Kakoj fizicheskij nomer sekto- ra? Reshenie: Snachala my obrashchaem vnimanie na to, chto vopros kasaetsya sektorov. V kachestve edinic izmereniya dany cilindr, dorozhka i sektor. Kak pere- vesti ih v drugie edinicy? My znaem, chto golovki - eto to zhe samoe, chto i dorozhki, poetomu v vychisleniyah nuzhno ispol'zovat' 4 golovki vmesto 4 dorozhek: 4 dor 17 sek 17 sek 47 cil * ----- * ------ + 2 dor * ------ + 4 sek = 1 cil 1 dor 1 dor = 3196 sek + 34 sek + 4 sek = = sektor 3234 RAZMERY FAJLOV V osnovnom pri rabote v sisteme UNIX my schitaem, chto ee resursy bezgranichny. Naprimer, my ne zabotimsya o tom, chto sozdannyj fajl polu- chitsya "slishkom bol'shim", a eto ne tak uzh redko v personal'nyh komp'- yuterah na gibkih diskah. Esli zhe my zanimaemsya soprovozhdeniem i admi- nistrirovaniem sistemy UNIX, to my dolzhny byt' gotovy imet' delo s si- tuaciyami, kogda prevyshayutsya razlichnye predel'nye znacheniya sistemy. Vsegda luchshe issledovat' eti voprosy zaranee v nekritichnyh situaciyah, poetomu davajte rassmotrim predely razmerov fajlov i ih smysl. Nekotorye parametry "zashity" v yadro sistemy pri ee generacii. Od- nim iz takih znachenij yavlyaetsya maksimal'nyj razmer fajla. On opredelya- et naibol'shee chislo blokov, kotorye mozhet zanimat' fajl. |tot parametr tesno svyazan s prinyatym v UNIX metodom ispol'zovaniya indeksnyh desk- riptorov fajla (inodes). |to nabory ukazatelej, sredi kotoryh pervye desyat' ukazyvayut na bloki dannyh, sleduyushchij ukazyvaet na druguyu tabli- cu, sleduyushchij - na tablicu, ukazyvayushchuyu na tablicu i t.d. Imeetsya eshche odno ogranichenie razmera fajla, kotoroe opredeleno dlya kazhdogo pol'zovatelya vo vremya raboty v sisteme - chislo ulimit (user limit - pol'zovatel'skij predel). |to znachenie ustanavlivaetsya v moment vashej registracii v sisteme i predstavlyaet soboj chislo blokov po 512 bajt, kotorye vy mozhete zapisat' v lyuboj zadannyj fajl. V shell'e imeetsya komanda ulimit, kotoraya pri ee vyzove bez argumentov vyvodit eto chislo. |ta zhe komanda pozvolyaet vam umen'shit' vashe znache- nie ulimit. Tol'ko superpol'zovatel' (root) mozhet UVELICHITX znacheniya ulimit. Pobochnym effektom umen'sheniya znacheniya ulimit yavlyaetsya to, chto vy ne mozhete snova uvelichit' ego do registracionnogo znacheniya. Znachenie ulimit ostaetsya takim zhe na vse vremya raboty vashego shell, poetomu dlya vosstanovleniya registracionnogo znacheniya vam neobhodimo vyjti iz sistemy, a zatem snova zaregistrirovat'sya. Eshche odnim interesnym momentom yavlyaetsya to, chto esli vy ustanovite vashe znachenie ulimit ravnym 0, vy ne smozhete sozdat' nikakie fajly! Maksimal'no dopustimym razmerom fajla v dannom sluchae yavlyaetsya nule- voj, poetomu nikakoj fajl ne mozhet byt' sozdan. |to predstavlyaetsya dostatochno rezonnym, odnako sushchestvuyut takie situacii, kogda fajl nu- levogo razmera MOZHET sushchestvovat'. Opyat' zhe, dlya vosstanovleniya vashego obychnogo znacheniya ulimit neobhodimo vyjti iz sistemy, a zatem snova zaregistrirovat'sya. Kak otmechalos' ranee, uvelichit' znachenie ulimit mozhet tol'ko su- perpol'zovatel'. |ta procedura dovol'no prosta. Snachala nuzhno uveli- chit' znachenie ulimit komandoj ulimit, a zatem zapustit' shell. |tot novyj shell imeet novoe znachenie ulimit. Esli my hotim, chtoby sistema zagruzhalas' s shell, imeyushchim bol'shee znachenie ulimit, my mozhem ustano- vit' programmu v inittab (tablice inicializacii sistemy), chtoby eta operaciya vypolnyalas' avtomaticheski. Nizhe privoditsya primer programmy, kotoraya izmenyaet znachenie ulimit i zapuskaet shell s etim novym znacheniem. Napomnim, chto eta programma mozhet byt' zapushchena tol'ko superpol'zovatelem. 1 #include 2 #include 4 main() 5 { 6 long v1, v2, v3, newlimit = 5120; 8 v1 = (long)ulimit(UL_GFILLIM, 0L); 9 v2 = (long)ulimit(UL_SFILLIM,newlimit); 10 v3 = (long)ulimit(UL_GFILLIM, 0L); 12 printf("v1: %ld v2: %ld ulim: %ld\n",v1,v2,v3); 13 setuid(getuid()); 14 execl("/bin/sh","ulimit sh", 0); 15 } Znachenie ulimit yavlyaetsya vozvrashchaemym znacheniem sistemnogo vyzova ulimit. Pervyj vyzov ulimit v stroke 8 poluchaet ishodnoe znachenie po umolchaniyu. |to znachenie sohranyaetsya v peremennoj v1. Vyzov v stroke 9 ustanavlivaet novoe znachenie ulimit ravnym znacheniyu peremennoj newlimit. Esli etot vyzov okanchivaetsya neudachej, peremennoj v2 prisva- ivaetsya vozvrashchaemoe znachenie -1, i my vidim eto po raspechatke, koto- ruyu vydaet stroka 12. Esli vyzov byl uspeshnym, vozvrashchaemym znacheniem yavlyaetsya novoe znachenie ulimit, i eto my tozhe vidim. Zatem vyzov v stroke 10 poluchaet eto znachenie ulimit. |to ili novoe znachenie, ili staroe, v zavisimosti ot togo, byla li uspeshnoj popytka izmenit' ulimit. V stroke 13 znachenie identifikatora tekushchego processa ustanavli- vaetsya ravnym znacheniyu identifikatora pol'zovatelya, zapustivshego dan- nyj process. |to srabotaet tol'ko v tom sluchae, esli pol'zovatel', za- pustivshij dannyj shell, imeet bolee nizkij identifikator, chem sam pro- cess. Cel' zaklyuchaetsya v tom, chtoby predostavit' vozmozhnost' obychnym pol'zovatelyam zapuskat' dannyj process, davaya im vremenno prava super- pol'zovatelya. (Ne ostavlyajte ishodnyj tekst etoj programmy v sisteme, poskol'ku kto-to mozhet prevratit' ee v "lazejku" i perekompilirovat' ee - v glave 9 my uvidim takogo roda dyry v sisteme zashchity.) Stroka 14 zapuskaet shell. Argumentom etogo shell yavlyaetsya stroka "ulimit sh". |ta stroka budet vyvedena na ekran, esli my vypolnim ko- mandu "ps -ef". Dannyj shell imeet novoe znachenie ulimit. Vozmozhnost' izmenit' znachenie ulimit pozvolyaet nam opredelit' na- ibol'shij vozmozhnyj razmer fajla. Sozdanie odnogo ili neskol'kih takih fajlov maksimal'nogo razmera polezno v celyah testirovaniya. Naprimer, polezno vyyasnit', skol'ko dannyh mozhet soderzhat' gibkij disk bez pere- polneniya ili chto proizojdet, kogda sistema vyjdet za predely svobodnyh blokov. My hotim ponyat', kak vedet sebya sistema v takih situaciyah. ------------------------------------------------------------- IMYA: umntsys ------------------------------------------------------------- umntsys NAZNACHENIE Razmontirovanie vseh fajlovyh sistem, smontirovannyh v dannyj mo- ment. FORMAT VYZOVA umntsys PRIMER VYZOVA umntsys Razmontiruet vse smontirovannye fajlovye sistemy TEKST PROGRAMMY 1 : 2 # @(#)umntsys v1.0 Unmount all file systems Author: Russ Sage Razmontirovanie vseh fajlovyh sistem 4 if [ "$#" -gt 0 ] 5 then echo "umntsys: too many arguments" >&2 6 echo "usage: umntsys" >&2 7 exit 1 8 fi 10 /etc/mount | sed -n -e '/^\/ /d' -e 's/^.* on \(.*\) read.*/umount \1/p' | sh - OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL umntsys? Inogda voznikayut situacii, kogda vy kak administrator hoteli by zapustit' sistemu v odnopol'zovatel'skom rezhime. Naprimer, vy hotite smenit' ili ustanovit' zhestkie diski i vam nuzhno, chtoby nikto ne imel dostupa k etomu ustrojstvu, poka vy s nim rabotaete. Vam mozhet takzhe ponadobit'sya zapustit' sistemu v minimal'noj konfiguracii s cel'yu lo- kalizacii kakoj-to problemy. Poskol'ku vypolnenie operacij zaversheniya raboty sistemy i perezagruzki predstavlyaet soboj dovol'no dlitel'nuyu proceduru, bylo by luchshe imet' sposob sohranit' sistemu rabotayushchej, no pereklyuchit' v odnopol'zovatel'skij rezhim, a zatem bystro perezapustit' mnogopol'zovatel'skij rezhim, chtoby svesti k minimumu neudobstva pol'- zovatelej. Dlya togo chtoby sdelat' eto, nam nuzhno ponyat' koncepciyu "urovnej raboty sistemy" i ispol'zovat' ih. Uroven' raboty (run level) v sisteme UNIX predstavlyaet soboj sostoyanie ili konfiguraciyu, v kotoroj mozhet byt' mashina. Fakticheski eto chislo, kotoroe opredelyaet, kakie vozmozhnosti sistemy vklyucheny ili otklyucheny i nahoditsya li sistema v odnoili mnogopol'zovatel'skom rezhi- me. Opisanie togo, chto proishodit na kazhdom urovne raboty sistemy, so- derzhitsya v fajle /etc/inittab. Obychno izmenenie urovnya raboty sistemy vklyuchaet v sebya perehod ot mnogopol'zovatel'skogo rezhima (naprimer, uroven' 6), k odnopol'zovatel'skomu rezhimu (uroven' S). Odnim iz pobochnyh effektov perehoda ot mnogopol'zovatel'skogo re- zhima k odnopol'zovatel'skomu yavlyaetsya to, chto vse dopolnitel'nye faj- lovye sistemy razmontiruyutsya. Edinstvennoj smontirovannoj fajlovoj sistemoj yavlyaetsya kornevaya (opredelennaya kak /dev/root, /dev/hd0a i t.p.). Ee nikogda nel'zya razmontirovat'. Kogda proishodit perehod ob- ratno k mnogopol'zovatel'skomu rezhimu, fajlovye sistemy obychno povtor- no montiruyutsya s pomoshch'yu fajla /etc/rc. My mozhem emulirovat' odnopol'zovatel'skij rezhim putem prekrashcheniya vypolneniya vseh processov v sisteme komandoj kill i razmontirovaniya vseh fajlovyh sistem. Komandnyj fajl umntsys prednaznachen dlya etoj ce- li. CHTO DELAET umntsys? Komandnyj fajl umntsys predstavlyaet soboj nabor konvejernyh pro- cessov, kotorye v konechnom itoge vypolnyayut razmontirovanie vseh smon- tirovannyh v dannyj moment fajlovyh sistem. Kornevaya fajlovaya sistema raspoznaetsya kak osobaya, poetomu ne delaetsya popytka razmontirovat' ee. Takzhe isklyuchaetsya popytka razmontirovat' nemontirovannye fajlovye sistemy. POYASNENIYA Pervym delom komandnyj fajl umntsys proveryaet otsutstvie argumen- tov v komandoj stroke. Poskol'ku dlya nego ne sushchestvuet opcij, komand- naya stroka dolzhna byt' pustoj. Esli kolichestvo argumentov bol'she nulya, eto oshibka, poetomu na standartnoe ustrojstvo registracii oshibok vyvo- ditsya soobshchenie ob oshibke, i programma zavershaetsya. Vsya rabota vypolnyaetsya v stroke 10. |tot operator pohozh na vol- shebnoe zaklinanie. Nachinaetsya on s vypolneniya obychnoj komandy mount bez argumentov. Po umolchaniyu komanda mount vyvodit tablicu s informa- ciej obo vseh katalogah i imenah ustrojstv montirovannyh fajlovyh sistem. |ta tablica vyglyadit primerno tak: ----------------------- | | / on /dev/hd0a read/write on Mon Jan 06 09:53:03 1986 | /tmp on /dev/hd01 read/write on Mon Jan 06 09:53:03 1986 | /usr on /dev/hd02 read/write on Mon Jan 06 09:53:03 1986 | /u1 on /dev/hd03 read/write on Mon Jan 06 09:53:03 1986 | /u2 on /dev/hd04 read/write on Mon Jan 06 09:53:03 1986 | /u3 on /dev/hd05 read/write on Mon Jan 06 09:53:03 1986 | /mnt on /dev/fd01 read/write on Mon Jan 06 09:54:41 1986 | Kogda fajlovaya sistema smontirovana, trebuyutsya i katalog, i imya ustrojstva. Kogda fajlovaya sistema ne smontirovana, ispol'zuetsya tol'- ko imya ustrojstva. Nam nuzhno vyrezat' imena ustrojstv iz tablicy mon- tirovaniya i vstavit' ih v komandu umount. |to delaetsya s pomoshch'yu ko- mandy sed. Komanda sed nachinaet rabotat' s opciej -n, kotoraya podavlyaet vy- polnyaemyj po umolchaniyu vyvod na ekran, poetomu nichego ne vyvoditsya, poka my ne poprosim. My mozhem ispol'zovat' eto v svoih interesah, ot- fil'trovyvaya nenuzhnye nam stroki. Pervoj korrekciej tablicy smontiro- vannyh fajlovyh sistem yavlyaetsya izbavlenie ot zapisi o kornevoj fajlo- voj sisteme, poskol'ku my by ne hoteli pytat'sya ee razmontirovat'. Poskol'ku kornevoj fajlovoj sisteme sootvetstvuet katalog "/", my mo- zhem ispol'zovat' ego v kachestve klyucha. Vyrazhenie v operatore sed ozna- chaet: "Iskat' s nachala stroki pervyj simvol naklonnoj cherty (poskol'ku etot simvol imeet special'noe znachenie, on ekranirovan obratnoj kosoj chertoj) i probel za nim. Kogda naklonnaya cherta najdena, udalit' ee". Dannyj shablon poiska sootvetstvuet tol'ko zapisi o kornevoj fajlovoj sisteme. Sleduyushchaya operaciya redaktirovaniya vypolnyaetsya bolee zamyslovato. Ona ispol'zuet vozmozhnost' gruppirovaniya regulyarnyh vyrazhenij i posle- duyushchej ssylki na nih po nomeru, chto vy uzhe videli v nekotoryh nashih predydushchih komandnyh fajlah. Dannyj sintaksis (regulyarnoe vyrazhenie) prednaznachen dlya gruppirovaniya simvolov i posleduyushchej ssylki na nih s pomoshch'yu nomera \n. Fokus v tom, chtoby vydelit' tol'ko imya ustrojstva i sgruppirovat' ego, chto i delaet komanda podstanovki sed'a. Pervoe vy- razhenie oznachaet: "Ot nachala stroki raspoznat' lyuboj simvol, za koto- rym sleduet lyuboe kolichestvo lyubyh simvolov, probel i slovo `on'; sgruppirovat' sleduyushchie simvoly vplot' do probela, slovo `read' i vse simvoly posle nego". V rezul'tate vsego etogo vydelyaetsya imya ust- rojstva i pomeshchaetsya vo vremennuyu peremennuyu, chtoby vposledstvii k nej mozhno bylo obratit'sya. Vtoraya chast' podstanovki sozdaet novuyu stroku vzamen ishodnoj. |ta stroka sostoit iz slova "umount", probela, zatem gruppovogo vyra- zheniya nomer 1, kotoroe predstavlyaet soboj vremennuyu peremennuyu, soder- zhashchuyu imya ustrojstva. V rezul'tate vseh etih dejstvij tablica smonti- rovannyh fajlovyh sistem (za isklyucheniem zapisi o kornevoj sisteme) prevrashchaetsya v nabor komand razmontirovaniya s imenami ustrojstv v ka- chestve argumentov. Poluchennyj rezul'tat imeet primerno takoj vid: ------------------- | | umount /dev/hd0a | umount /dev/hd01 | umount /dev/hd02 | umount /dev/hd03 | umount /dev/hd04 | umount /dev/hd05 | umount /dev/fd01 | Teper' eti komandy po konvejeru peredayutsya drugomu shell ("sh -"). Simvol "-" ukazyvaet shell, chto svoi komandy on dolzhen poluchat' so standartnogo vvoda, a v dannom sluchae eto nashi komandy umount, pe- redannye po konvejeru. Oni razmontiruyut vse fajlovye sistemy. ------------------------------------------------------------ IMYA: lrgf ------------------------------------------------------------ lrgf Sozdaet fajl maksimal'no vozmozhnogo razmera NAZNACHENIE Vypolnyaet operacii zapisi v fajl do teh por, poka ne obnaruzhitsya granica razmera fajla. FORMAT VYZOVA lrgf PRIMER VYZOVA lrgf Opredelenie granicy razmera fajla TEKST PROGRAMMY 1 char id[] = "@(#) lrgf v1.0 Create the largest file Author: Russ Sage Sozdat' fajl maksimal'nogo razmera 3 #include 4 #include 5 #include 6 #include 8 #define FSIZ 512 9 #define BSIZ 1024 11 long ulimit(); 12 char buf[BSIZ]; 14 main() 15 { 16 register int n, fd, bcnt; 17 char file[FSIZ]; 19 for (bcnt=0; bcnt