Enhetsfil
Enhetsfiler ( engelska enhet fil) är speciella filer att under nästan alla Unix derivat och många andra operativsystem används. De möjliggör enkel kommunikation mellan användarutrymme , till exempel vanliga användarprogram , och kärnan och därmed slutligen maskinvaran på en dator . Denna kommunikation är transparent eftersom enhetsfiler används som vanliga filer.
Enhetsfiler under Unix
Typer av enhetsfiler
Filsystemen för Unix och liknande operativsystem skiljer mellan "normala" filer (binära / ASCII), kataloger , namngivna rör (även kallade FIFO ), symboliska länkar , uttag och datablock . Även om "normala" filer och kataloger är en del av standardfunktionen för vanliga filsystem, spelar namngivna rör redan en särskild roll, men är inte en del av enhetsfilerna. Endast de tre senaste typerna är enhetsfiler. Därför görs en åtskillnad mellan tre typer av enhetsfiler:
- karaktärsenheter : karaktärsorienterade enheter
- blockenheter : blockorienterade enheter
- uttagsenheter : uttagsorienterade enheter
Kommandon som ls
eller file
är lämpliga för att mata ut typen av en (enhet) file
.
Eftersom det vanligtvis finns en separat enhetsfil för varje enhet, samlades dessa filer redan i /dev
-katalogen i tidiga versioner av Unix. Det här förfarandet har standardiserats för Linux med filsystemhierarki -standarden ( Solaris lagrar enhetsfilerna under det virtuella filsystemet i /devices
och genererar automatiskt symlänkar som pekar från /dev
till de faktiska filerna i /devices
), och det föreskrivs också vilket enhetsfiler finns i den här katalogen under vilket namn måste finnas (se listorna nedan). Moderna Unix -derivat använder ofta speciella (virtuella) filsystem för att hålla den här katalogen uppdaterad. Under lång tid var devfs populärt under Linux för detta ändamål, men nu tar udev hand om administrationen av enhetsfiler.
Enhetsfiler används som ett gränssnitt mellan enhetsdrivrutiner eller systemkomponenter och applikationsprogram som körs i användarutrymme . Du kan till exempel skriva ut på en LPT -skrivare som är ansluten till datorn via parallellporten genom att skriva text direkt i /dev/lp0
. Begreppet enhetsfiler innebär att program i princip separeras från de enhetsdrivrutiner som fungerar i kärnan. Dessutom verkar användningen av en enhet helt transparent - du behöver inte använda ett speciellt program först utan kan skriva till en fil som motsvarar skrivaren. Detta möjliggör intuitiv användning av hårdvaran.
Begreppet enhetsfiler är en av grunden för Unix -principen Allt är en fil och utvidgades till exempel med tillvägagångssätt som derivatplan 9 .
Blockorienterade enheter
Block Devices (även block lagringsenhet, block enhet eller engelska. Block enhet) överför data i block av data och används därför ofta för parallella dataöverföringar som används. Alla dessa enheter använder operativsystemets egen buffert .
Beskrivning av enheten | Linux | FreeBSD | NetBSD / OpenBSD | Mac OS | Solaris |
---|---|---|---|---|---|
1. Diskett | fd0 | ||||
IDE hårddisk eller IDE CD-ROM-enhet på 1: a anslutnings master (i Linux ) | hda | ad0 | wd0 | ||
IDE-hårddisk eller IDE-CD-ROM-enhet på den första slavanslutningen | hdb | ad1 | |||
1. primär partition av den första IDE -hårddisken | hda1 | ||||
15. logisk partition av den första IDE -disken | hda15 | ||||
1. Skiva av den första IDE -skivan | ad0s1 | ||||
15. Skiva av den första IDE -skivan | ad0s15 | ||||
1: a partitionen i den första delen av den första IDE -disken | ad0s1a | ||||
2: a partitionen i den första delen av den första IDE -disken | ad0s1b | ||||
IDE CD-ROM-enhet på den första anslutningsmastern | acd0 | ||||
IDE CD-ROM-enhet på den första slavanslutningen | acd1 | ||||
1. SCSI CD-ROM-enhet | scd0 | cd0 | |||
SCSI - (flyttbar) disk, minsta SCSI -ID | sda | disk0 | |||
SCSI - (flyttbar) disk, nästa större SCSI -ID | sdb | disk1 | |||
1. primär partition av den första SCSI (flyttbara) disken | sda1 | disk0s0 | |||
11. logisk partition av den första SCSI (flyttbara) disken | sda15 | ||||
SCSI (flyttbar) disk, minsta SCSI ID | da0 | disk0 | |||
5: e partitionen i den andra delen av den andra SCSI (flyttbara) disken | da1s2e | ||||
på C th SCSI controller med SCSI ID = T D: te hårddisken och på det S: e skiva | c C t T d D s S | ||||
symbolisk länk på CD-ROM-enheten | cdrom | ||||
Det första namnområdet för den första registrerade NVMe -enheten | nvme0n1 | ||||
Den första partitionen av det första namnområdet för den första registrerade NVMe -enheten | nvme0n1p1 |
Karaktärsorienterade enheter
Teckenorienterade enheter överför bara ett tecken (vanligtvis en byte ) åt gången, så de måste tilldelas seriell dataöverföring . Vanligtvis, men inte alltid, överförs data obuffrad - dvs. omedelbart.
Beskrivning av enheten | Linux | DOS / Windows | Mac OS |
---|---|---|---|
1. Seriellt gränssnitt | ttyS0 | COM | |
1. Parallellt gränssnitt | lp0 | LPT1 | |
2. Parallellt gränssnitt | lp1 | LPT2 | |
symboliska länkar för pseudoterminaler | tty X | ||
Enhetsfiler för USB -enheter samt alla virtuella enhetsfiler | usbdev1.1 | ||
symbolisk länk till musenhetsfil | mouse | ||
Fil av en rambuffert (t.ex. bildskärm) | fb X | ||
Drivfil i ritläge ( macOS ). rdisk0, rdisk1, ... motsvarar här den första, andra, ... hårddisken som en enhet i sig, medan rdisk0s1 till exempel är den första partitionen på den första hårddisken. | rdisk# | ||
Enhetsstyrenheten för den första registrerade NVMe -enheten | nvme0 |
Nätverkskorten ( t.ex.Ethernet ,ISDN ) adresseras inte under Linux via enhetsfiler, utan via TCP / IP-stacken , även om enhetsfiler ofta också finns för speciella applikationer som t.ex. direktkontroll av hårdvaran ( netlink- enhet, D-kanal, etc.).
Uttagsorienterade enheter
Socket-orienterade enheter är inte enhetsfiler, utan en form av kommunikation mellan processer . Liksom FIFO är de inte enhetsfiler, men de kan också användas för att kommunicera med kärnan och utföra en liknande uppgift som karaktärsorienterade enheter.
Filnamn | menande |
---|---|
/dev/log | Uttag för syslog -demonen |
/dev/gpmdata | Uttag för GPM musen multiplexer |
/dev/printer | Uttag för lpd |
Falska enheter
En enhetsfil har inte en verklig enhet motsvarar, men kan också stå för en så kallad virtuell enhet (virtuell enhet) eller pseudo-enhet (pseudo-enhet). Detta är ett arbetsverktyg vars funktionalitet hanteras av operativsystemet (kärna, kärntillägg, drivrutin).
I motsats till vad termen virtuell enhet föreslår, återges inte nödvändigtvis en fysisk enhet här (se virtualisering ).
Följande är en lista över de vanligaste pseudodevices (alla teckenorienterade) i Unix och liknande system :
/dev/null | kasserar alla ingångar utan att producera någon utgång |
/dev/zero | producerar en teckenström som bara består av nulltecken (i C -notation: '\0' ) |
/dev/full | producerar en teckenström som, under läsåtkomst, endast består av nulltecken (i C -notation: '\0' ). Det finns ett ENOSPC -fel ("disk full") under skrivåtkomst. |
/dev/random | producerar riktiga slumpmässiga tal eller åtminstone kryptografiskt starka pseudo- slumpmässiga nummer (mestadels baserade på hårdvaruingångar) |
/dev/urandom | producerar pseudoslumpmässiga nummer (mestadels i motsats till /dev/random utan att blockera om ingen hårdvarudata genereras) |
Hantering av enhetsfiler med Linux som exempel
Det Linux-specifika kommandot mknod
används för att skapa enhetsfiler, vilket kräver tillhörande större och mindre nummer för att skapa en enhetsfil.
Om en användare installerade en ny drivrutin i tidiga Linux -versioner, måste en eller flera mknod
skapas med detta mknod
med hjälp av förardokumentationen och specificera det nödvändiga major / minor -numret för att kunna skapa det nödvändiga gränssnittet. Många Linux -distributioner gav därför redan tusentals enhetsfiler i /dev
-katalogträdet, oavsett om de någonsin skulle behövas. Å ena sidan var det förvirrande, å andra sidan var det svårt att automatiskt ladda nya drivrutiner för ny maskinvara, eftersom enhetsfilerna alltid måste underhållas manuellt.
Inom flera år och kärnutgåvor utvecklades två nya koncept:
devfs
Devfs introducerades i Linux -kärnträdet 2.2. Den bakomliggande tanken var att kärnmodulerna själva bär information om namnen på de enhetsfiler de genererar, tillsammans med de mindre och stora talen och typen. Detta gjorde att kärnan kunde generera själva enhetsfilerna för första gången.
Kärnan skapade sedan automatiskt de enhetsfiler som krävs eller tillhandahålls av kärnan och dess moduler i devfs -filsystemet med hjälp av devfsd -demonen . Filsystemet var vanligtvis monterat i katalogen /dev
.
udev
Efter noggrann övervägande verkade systemet med devfs vara för oflexibelt. Det krävdes ett system som reagerar när ny maskinvara är ansluten ( hotplugging ), laddar motsvarande kärnmoduler och skapar enhetsfilerna och tar bort dem igen när enheterna kopplas bort. Dessutom bör det vara möjligt att använda en uppsättning regler för att definiera vilket namngivningsschema du vill använda för dina enhetsfiler, hur de ska struktureras i underkataloger etc.
Med introduktionen av Kernel 2.6 blev udev detta nya enhetshanteringskoncept. I likhet med devfs finns det en demon som körs i användarutrymmet och gör det verkliga arbetet. Udev använder dock inte sitt eget filsystem, och den nödvändiga kärnkomponenten är mycket smalare, dvs mindre och enklare.
Enhetsfiler under Windows
Det finns också enhetsfiler i Windows : Du kan komma åt dem som programmerare använder CreateFile()
subrutin . Namnet på en enhetsfil har formatet \\.\NAME
. Enhetsfiler finns inte under normala kataloger, som under Unix, och kommunikationen är följaktligen inte transparent (för användaren). I allmänhet, som en användare med Windows skal, det finns inget sätt att komma åt enhetsfiler.
litteratur
- Arnold Willemer : Hur blir jag en UNIX -guru. Galileo Press, Bonn 2003, ISBN 978-3-89842-240-6 , från den hårdvaruåtkomst under UNIX: / dev
- Matt Welsh, Matthias K Dalheimer, Terry Dawson, Lar Kaufman: Linux -guide för installation och konfiguration. O'Reilly, ISBN 978-3-89721-353-1 , från vilken enheten arkiveras
webb-länkar
- Stora och mindre nummer från dokumentationen för konfigurering av HP 9000 -datorn
- Från FreeBSD -handboken: Enheter och enhetsnoder