Linux - Ръководство за внедряване на разширени файлови системи, част 4

Ръководство за разширени файлови системи, част 4

Оригинален източник: http://www-106.ibm.com/developerworks/library/l-fs4.html

Въведение в devfs

С пускането на Linux 2.4 стана възможно използването на файлова система с нови функции, като Reiserfs, XFS, GFS и други. Тези файлови системи все още не са тествани достатъчно и има въпроси за това какво точно могат да направят, колко са добри и доколко е оправдано използването им в производствена Linux среда. В тази статия Даниел обяснява целта и ползите от използването на devfs, файлова система за управление на устройства, и се подготвя да разбере следващата си статия, която ще обхване оптималната инсталация на devfs на вашата система.

devfs презентация

Устройства, устройства навсякъде.

Devfs или Device Filesystem е проектиран с единствената цел да предостави нов (по-"нормален") начин за управление на всички блокови и символни устройства, които попълват директорията /dev. Вероятно знаете, че нормалното /dev дърво съдържа стотици блокови и символни специални устройства, които се намират в основната файлова система. Всеки такъв специален файл е достъпен за процесите в потребителското пространство и осигурява лесно взаимодействие с устройствата на ядрото. Чрез извършване на операции върху такива специални файловеX сървърътима достъп до видео хардуер,fsckможе да извършва проверки на файловата система иlpdизпраща данни през паралелен порт към принтер и т.н.

Проблеми с управлението.

Въпреки че цялата идея за показване на устройства като специални файлове е добра, трябва да се отбележи, че обикновените Linux системи ги управляват по далеч от оптималния и тромав начин. Много неща се поддържат в Linux в наши дни.различен хардуер. В "класическия" подход това означава, че стотици специални файлове "живеят" в директорията /dev, за да "представят" съответния хардуер. Повечето от тези специални файлове "дори не се свързват" с действително устройство на вашата машина (но директорията /dev все пак трябва да има такъв специален файл, в случай че се добавят нови хардуер/драйвери). Този подход създава много объркване.

Само един такъв аргумент е достатъчен, за да се осъзнае необходимостта от "възстановяване" на директорията /dev, разбира се, при спазване на принципа на "обратна съвместимост". За да разберем по-добре как devfs решава повечето от проблемите, свързани с "класическата" /dev директория, нека да разгледаме devfs от гледна точка на разработването на нов драйвер за устройство.

Вътрешна организация на управление на устройството

За да добием ясна представа за devfs, нека видим как devfs променя традиционния подход за добавяне на нов драйвер. Традиционният (не-devfs) базиран на ядрото драйвер на устройство "регистрира" устройството към останалата част от системата чрез системни извиквания register_blkdev() или register_chrdev() (в зависимост от това дали се регистрира блоково или символно устройство).

ЧислотоMajor(8-битово цяло число без знак) се предава като параметър на register_blkdev() или register_chrdev(). След като регистрира устройство, ядрото знае, че този конкретен основен номер съответства на конкретния драйвер за устройството, което е издало повикването register_. dev() .

Въпросът е какъв основен номер трябва да използва разработчикът на драйвера, за да премине с register_ заявката. dev()? Няма проблем, ако разработчикът на драйвера не планира да го използва "извън света". В този случай всяко голямо число ще свърши работа, стига да не е в конфликт с други главни числа,използвани в конкретен случай. Като алтернатива, разработчикът може "динамично" да присвои основен номер преди register_. dev() . Въпреки това, "като цяло", такова решение е приемливо само ако драйверът не е предназначен за широко използване.

Получаване на номер.

Ако програмист иска да направи драйвера си достъпен за обществеността (а повечето Linux разработчици са склонни да правят точно това), тогава използването на главния номер „изневиделица“ или дори динамичното му разпределяне няма да работи. В такива случаи разработчикът на драйвера трябва да се свърже с разработчиците на ядрото на Linux и да получи "официален" основен номер за тяхното конкретно устройство. След това за всички потребители на Linux това устройство (и само то) ще бъде свързано с такъв основен номер.

Важно е да имате "официалния" основен номер, тъй като за да взаимодейства с това конкретно устройство, администраторът трябва да създаде специален файл в директорията /dev. Когато се създава възел на устройство (специален файл), той трябва да има същата основна като регистрирана във вътрешните структури на ядрото. След това, когато потребителски процес извърши операция върху файл на устройство, ядрото знае към кой драйвер да се свърже. В противен случай картографирането от специален файл към драйвера на ядрото се извършва по основен номер, а не по имена на устройства. Подобно "недоразумение" на името на устройството е характеристика на системите без devfs.

След като драйвер на устройство има официална основна, той може да се използва публично и възелът на устройството може да бъде включен в дървото /dev на различни дистрибуции чрез официалния скрипт /dev/MAKEDEV. Такъв скрипт помага на суперпотребителя да автоматизира процеса на създаване на възли на устройства с правилните главни и второстепенни номера, права и собственици.

Традиционенпроблеми.

Проблемът не е само в това. Linux стигна до точката, в която всички "официални" големи и второстепенни номера ще бъдат изчерпани. Разбира се, можете просто да увеличите дължината на числата, но това ще направи още по-трудно проследяването на уникалността на главните за шофьорите. Има и по-радикален начин за решаване на проблема. Това е превключване към devfs.

devfs подход. devfs_register()

Има кратко описание на това как devfs функционира и решава много проблеми. След правилно конфигуриране на devfs, което включва добавяне на поддръжка на devfs към ядрото и извършване на много доста трудни промени в стартиращите скриптове, суперпотребителят рестартира системата. Ядрото се стартира и драйверите на устройства започват да регистрират своите устройства за останалата част от системата. Ако това е система без devfs, системните извиквания register_blkdev() и register_chrdev() (заедно със съпътстващите главни числа) се изпълняват както преди. Въпреки това, ако devfs е активиран, тогава драйверите на устройства използват ново, подобрено извикване на ядрото, наречено devfs_register(), за да регистрират своите устройства.

Има много какво да се каже за това извикване devfs_register(). Въпреки че можете да посочите главни и второстепенни числа за обратна съвместимост, няма строго изискване да го направите. Вместо това, извикването devfs_register() предава пътя към устройството като параметър, което е начинът, по който впоследствие ще се появи под /dev. Например, драйверът на устройството foo регистрира своето устройство с devfs. След това драйверът предава параметъраfoo0на извикването devfs_register(), като казва на ядрото, че нов файл на устройството,foo0, трябва да бъде създаден в основата на пространството от имена на devfs. Отговорът на извикването на devfs_register() добавя възел на устройство foo0 към основното пространство на имената на devfs и запис, че този нов възел foo0 трябва да нанесе на устройство fooдрайвер в ядрото.

Devfs в действие

След като всички драйвери на устройства са стартирани и са регистрирали съответните си устройства в ядрото, ядрото стартира /sbin/init и скриптовете за инициализация на системата започват да се изпълняват. В началото на процеса на стартиране (преди проверката на файловата система), rc скриптовете монтират файловата система devfs към /dev, която съдържа представянето на пространството от имена на devfs. След това монтиране всички регистрирани устройства (например/dev/foo0) могат да бъдат достъпни както в нормална система без devfs. Разликата е, че при достъп до устройства картите на ядрото към съответнитеdevfs драйвери на устройствасе обработват по имена на устройства, а не поглавничисла.

Красотата на този подход е, че всички необходими възли на устройството (и нищо друго) се създават автоматично от ядрото. Съответно, няма нужда да преследвате последния MAKEDEV скрипт (защото всички регистрирани устройства магически се появяват в /dev). Това също така означава, че директорията /dev не е претрупана със стотици "фалшиви" възли на устройства. Всъщност, използвайки devfs, можете да отидете на /dev и да разберете какви устройства "наистина" имате. Например, ако имате лаптоп с възможност за гореща смяна, устройствата ще се появяват и изчезват в /dev, докато поставяте или премахвате PC карти. Това прави devfs много "чист" и "функционален" след всичко, което беше някога.

Красотата на devfs

Devfs прави много неща по-лесни. Помислете за стартиране на стартиращ CD-ROM на Linux, който се състои от зареждащо устройство, initrd, ядро ​​и loopback файлова система на компактдиска. Когато BIOS прехвърли контрола на CD, зареждащото устройство зарежда ядрото и initrd и след това стартира скрипта /linuxrc от "развития" initrd. Първи приоритет/linuxrc е да монтира компактдиска, така че loopback файловата система да може да бъде монтирана и достъпна сама.

Без devfs скриптът /linuxrc трябва да изпробва много специални файлове в /dev, които или "представляват", или "не представляват" действителния хардуер на системата. Например /linuxrc трябва да сканира/dev/hdc, /dev/scd0, /dev/hdbи други за живо CD-ROM устройство. Докато сканирането продължава, няколко „фалшиви“ възли на устройства ще бъдат изпробвани напразно.

Ако се използва devfs, скриптът /linuxrc просто отива към/dev/cdroms, който съдържа всички специални файлове, свързани с "истински" CD-ROM за тази машина, независимо далиIDEилиSCSI. Благодарение на тази devfs конвенция, изборът е много специфичен; само активни устройства са изброени в поддиректорията и "проверяващият код" дори не трябва да знае подробностите за основния CDROM, като например дали е на IDE канал или използва SCSI ID. Всъщност това е още едно предимство на devfs. Както ще видите в следващата статия от тази серия, devfs има напълно различно местоположение по подразбиране за устройства в /dev.

Ако имате нужда от достъп до конкретно блоково устройство (диск, дял, CD-ROM и т.н.), достъпът може да се осъществи чрез няколко специални файла. Например моят сървър има един SCSI CD-ROM. С активиран devfs мога да работя с него, като се преместя към/dev/cdroms/cdrom0или/dev/scsi/host0/bus0/target4/lun0/cd. В този случай ще има достъп до същото устройство. Просто имам избор през кой файл ще го направя. Като алтернатива мога да получа достъп до моя CD-ROM "стар стил" като/dev/sr0, ако желая.и инсталира удобна и малка програма devfsd. Версиите на devfsd се променят много бързо, но като цяло това е програма, която се грижи за "обратната съвместимост" на специални файлове и ви позволява да персонализирате /dev по много различни начини. Програмата devfsd ще бъде разгледана в следващата статия, когато описваме процеса на мигриране към devfs на вашата система. А сега малко devfs ресурси:

За автора

Живеещ в Албакърки, Ню Мексико, Даниел Робинс е президент/главен изпълнителен директор на Gentoo Technologies, Inc. и създател на Gentoo Linux, усъвършенстван Linux за компютър, и систематаPortage, система за портове от следващо поколение за Linux. Той също е участвал като автор на книгите на MacmillanCaldera OpenLinux Unleashed,SuSE Linux UnleashedиSamba Unleashed. Даниел се е занимавал с компютри по някакъв начин от втори клас, когато за първи път е бил изложен на програмния език Logo, както и на потенциално опасна доза Pac Man. Това вероятно обяснява защо оттогава той работи като водещ графичен художник вSONY Electronic Publishing/Psygnosis. Даниел обича да прекарва време със съпругата си Мери и новата си дъщеря Хадаса. Можете да се свържете с Daniel на [email protected].