best7

advertisement
Les 7: Bestandssystemen
"Debugging is twice as hard as writing the code in the
first place. Therefore, if you write the code as cleverly
as possible, you are, by definition, not smart enough
to debug it." Brian Kernighan
best7-1
Organisatie bestandssysteem
Logisch bestandssysteem
Bestandsnamen
bestandsorganisatie
Logische bloknummers
fysiek bestandssysteem
Fysieke bloknummers
IO-controle
Bestandssysteem: logisch
Bestandssysteem: fysiek
best7-2
Overzicht
• Logisch bestandssysteem
– Gegevensbestanden
– directory's
– Bestandssystemen
• Bestandsorganisatie
–
–
–
–
–
directory's
Gegevensbestanden
Vrije ruimte
Partities
Reservekopieën
• Optimalisaties
best7-3
Gegevensbestanden
8
0
• Attributen
• Operaties
• Types
• Toegangsmethoden
N
Bestand
= benoemde verzameling bij elkaar horende gegevens
= eenheid van opslag.
Gegevensbestand
best7-4
Attributen
Gegevensbestand: attributen
•
•
•
•
•
•
•
•
•
•
•
•
•
•
publieke naam
systeemnaam
versie
plaats
(data)
de grootte
eigenaar
creatie-ogenblik
creatie-programma
protectie-informatie
reservekopie-informatie
ogenblik van laatste gebruik
type (op sommige systemen)
toegangsmethode
Opgeslagen in een directorybestand
best7-5
Naamgeving
• String van letters,cijfers en leestekens,
– Beperkt in lengte
– Soms onderscheid kleine/hoofdletters (Unix,
NTFS), soms niet (Windows, FAT)
– NTFS gebruikt unicode: βαДи‫הت‬탁탢齩
• Meestal ook bestandsextentie
– 8.3 notatie: abcdefgh.ijk
– Via extensies worden applicaties geassocieerd
best7-6
Operaties op bestanden
Gegevensbestand: operaties
Win32
Unix
Omschrijving
CreateFile
creat
Creëer een bestand
OpenFile
open
Open een bestand
CreateProcess exec
Start een proces
best7-7
Bestanden vs. open
bestanden
#include <stdio.h>
#include <fcntl.h>
int main() {
bestand
char buffer[100];
int handle;
handle = open (“test.txt”, O_RDWR | O_CREAT | O_TRUNC);
write (handle, “1234567890”, 10);
fsync (handle);
lseek (handle, 0, SEEK_SET);
read (handle, buffer, 10);
open bestand
buffer[10] = '\0';
printf ("String read = %s.\n", buffer);
close (handle);
return 0;
}
best7-8
Operaties op open
gegevensbestanden
Win32
Unix
Omschrijving
CloseHandle
close
Sluit een bestand
ReadFile
read
Lees data uit bestand
WriteFile
write
Schrijf data naar bestand
SetFilePointer
lseek
Stel de lees/schrijfwijzer in
SetEndOfFile
truncate Stel de lengte van het bestand in
best7-9
Voorbeeldprogramma Unix
Details: man 2 <system call>
best7-10
Voorbeeldprogramma
Windows
if (!copyfile(argv[1], argv[2], false)) exit(3);
best7-11
Delen van open bestanden
schijf
proces 1
open bestand 1
open bestand 2
Bestand (1)
proces 2
Bestand (2)
open bestand
lokale
bestandentabel
globale
bestandentabel
best7-12
Bestandstypes
•
•
•
•
directory's
Speciale bestanden (Unix, zie I/O)
Links, shortcuts
Gegevensbestanden
– ASCII: leesbaar
– Binair: betekenis enkel zinvol voor
programma dat indeling kent
– Uitvoerbaar
– Magic numbers om type te bepalen
• Speciaal geval: uitvoerbaar bestand, OS
kent indeling
best7-13
Toegangsmethoden
• Sequentiële toegang
• Directe toegang
• Geïndexeerde toegang
Tegenwoordig:
Directe toegang op byte-niveau
best7-14
Sequentiële toegang
huidige positie
reset
3 operaties:
- reset
- read next
- write next
read/write
Toegangsmethode: sequentieel
Toegangstijd naar een bepaalde record hangt af van de
plaats van de record in het bestand.
best7-15
Directe toegang
seek n
read/write
2 operaties:
- read n
- write n
of
3 operaties:
- seek n
- read next
- write next
Toegangsmethode: direct
Toegangstijd naar een bepaalde record hangt niet af van de
plaats van de record in het bestand.
best7-16
Geïndexeerde toegang
Toegangsmethode: geïndexeerd
best7-17
Directe toegang in Java
import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;
public class DemoRandomAccessFile {
public static void main(String[] args) {
try {
RandomAccessFile raf = new RandomAccessFile(“test.txt”, "rw");
byte ch = raf.readByte();
System.out.println("Read first character of file: " + (char)ch);
System.out.println("Read full line: " + raf.readLine());
raf.seek(raf.getFilePointer() - 10);
raf.writeBytes(“???”);
raf.seek(0);
System.out.println("Read full line: " + raf.readLine());
raf.seek(file.length());
raf.writeBytes("This will complete the Demo");
raf.close();
} catch (IOException e) {
System.out.println("IOException:");
e.printStackTrace();
}
}
}
best7-18
Overzicht
• Logische bestandssysteem
– Gegevensbestanden
– directory's
– Bestandssystemen
• Bestandsorganisatie
–
–
–
–
–
directory's
Gegevensbestanden
Vrije ruimte
Partities
reservekopieën
• Optimalisaties
best7-19
directory's
Directory
Gegevensbestanden
• Operaties
• Types
best7-20
Operaties op directory's
Win32
Unix
Omschrijving
CreateDirectory
mkdir
Maak een nieuwe directory
RemoveDirectory
rmdir
Laat een directory weg
FindFirstFile
opendir
Open een directory
FindNextFile
readdir
Lees een directory-element
FindClose
closedir
Sluit een directory
MoveFile
rename
Hernoem een bestand
SetCurrentDirectory chdir
Verander van huidige
directory
DeleteFile
unlink
Laat een bestand weg
GetFileAttributes
fstat
Lees een bestandsattribuut
best7-21
Directorytypes
•
•
•
•
•
1 niveau
2 niveaus
Boomstructuur
Acyclische graaf
Graaf
best7-22
Eenniveaudirectory
directory
test
data
mail
doc
bestanden
best7-23
Tweeniveaudirectory
Master file directory
(MFD)
User file directory
test
data
usr1
usr2
usr3
(UFD)
mail
doc
mail marks
mail
rep
bestanden
best7-24
Boomgestructureerde directory
root
stat
mail
prog copy
list
obj
spell
dist
prt
spell
bin
find
exp
all
progs
count hex
order
last
list
data
mail
find
first
best7-25
Acyclische graafdirectory's
root
list
all
dict
spell
w
count
list
rade
count words
list
w7
Symbolische link
best7-26
Links in Unix
% ln -s ttt symlink
% ls -al
drwx--x--x
2 els users
1024 Dec 3 08:48 .
drwx--x--x
3 els users
1024 Dec 3 08:47 ..
lrwx--x--x
1 els users
3 Dec 3 08:48 symlink -> ttt
-rw------1 tom users
23 Dec 3 08:48 ttt
% cat symlink
dit is een testbestand
% ln ttt hardlink
% ls -al
drwx--x--x
2 els users 1024 Dec 3 08:49 .
drwx--x--x
3 els users 1024 Dec 3 08:47 ..
-rw------2 tom users
23 Dec 3 08:48 hardlink
lrwx--x--x
1 els users
3 Dec 3 08:48 symlink -> ttt
-rw------2 tom users
23 Dec 3 08:48 ttt
% rm ttt
% ls -al
drwx--x--x
2 els users 1024 Dec 3 08:49 .
drwx--x--x
3 els users 1024 Dec 3 08:47 ..
-rw------1 tom users
23 Dec 3 08:48 hardlink
lrwx--x--x
1 els users
3 Dec 3 08:48 symlink -> ttt
% cat symlink
cat: cannot open symlink: No such file or directory
% cat hardlink
best7-27
dit is een testbestand
Graafdirectory
root
avi
tc
. .. mail count book
jim
. .. book unhex hyp
. .. count
% ls -al
drwx--x--x
drwx--x--x
2 kdb
3 kdb
digit
digit
1024 Dec
1024 Dec
. .. unhex hex
3 08:49 .
3 08:47 ..
best7-28
Overzicht
• Logische bestandssysteem
– Gegevensbestanden
– directory's
– Bestandssystemen
• Bestandsorganisatie
–
–
–
–
–
directory's
Gegevensbestanden
Vrije ruime
Partities
Reservekopieën
• Optimalisaties
best7-29
Monteren van
bestandssystemen
schijf =
subdirectory
C:
D:
E:
Monteren(bs) ~ openen(bestand)
best7-30
NFS: Network File System
best7-31
Virtueel bestandssysteem
VFS
gebruiker
kern
http://en.wikipedia.org/wiki/List_of_file_systems
best7-32
NFS Architectuur
best7-33
Overzicht
• Logische bestandssysteem
– Gegevensbestanden
– directory's
– Bestandssystemen
• Bestandsorganisatie
–
–
–
–
–
directory's
Gegevensbestanden
Vrije ruimte
Partities
Reservekopieën
• Optimalisaties
best7-34
Organisatie van directory's
Directory: f(naam) → adres_van_attributen
naam1
attrib
naam1
attrib
naam2
attrib
naam2
attrib
naam3
attrib
naam3
attrib
naam4
attrib
naam4
attrib
naam5
attrib
naam5
attrib
naam6
attrib
naam6
Lineaire lijst of via hakselfunctie, of b-tree
best7-35
Organisatie van
gegevensbestanden
• Contigue allocatie
• Gelinkte allocatie
• Geïndexeerde allocatie
best7-36
Histogram Windows (2010)
30000
25000
20000
Data
Programma's
15000
10000
5000
0
-
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Data
Programma’s
81 469
179 545
kleinste
0
0
grootste
4 0458 520 192
368 228 352
aantal
log2(bestandsgrootte)
best7-37
Cumulatieve distributie
1
0.9
0.8
0.7
Data
0.6
Programma's
0.5
0.4
0.3
0.2
0.1
0
-
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
> 50% bestanden < 8KiB
>75 % bestanden < 64 KiB
>90% bestanden < 1 MiB
best7-38
Contigue allocatie
blokken
0
1
directory
test.c
a.out
3
7
2
3
2
3
test.out
0
1
4
5
6
7
8
9
10
b.v. CD-ROM (iso9660)
blok met byte n =
beginblok + n div blokgrootte
Bestandsorganisatie: contigu
best7-39
Gelinkte allocatie
blokken
0
1
directory
test.c
a.out
3
7
2
4
test.out
0
0
2
3
4
5
6
7
8
blok met byte n =
( n div (blokgrootte-4))de blok
9
10
Bestandsorganisatie: gelinkt
best7-40
Allocatietabel
blokken
0
1
directory
test.c
a.out
3
7
test.out
0
2
3
4
5
6
7
8
blok met byte n =
( n div blokgrootte)de gelinkte blok
9
10
Bestandsorganisatie: fat
best7-41
Indextabelblokken
0
1
directory
test.c
a.out
5
6
test.out
8
3 2 - - 714- -
0---blok met byte n =
indexblok[n div blokgrootte]
2
3
4
5
6
7
8
9
10
Bestandsorganisatie: geïndexeerd
best7-42
Unix: inodes
blokken
0
1
12 directe wijzers
inode
Info
2
3
4
5
6
7
8
…
…
…
…
9
10
Bestandsorganisatie: inode
best7-43
Unix Inode
Offset
0x0
0x2
0x4
0x8
0xC
0x10
0x14
0x18
0x1A
0x1C
0x20
0x24
0x28
0x64
0x68
0x6C
0x70
0x74
0x80
0x82
0x84
0x88
0x8C
0x90
0x94
0x98
Size
__le16
__le16
__le32
__le32
__le32
__le32
__le32
__le16
__le16
__le32
__le32
4 bytes
60 bytes
__le32
__le32
__le32
__le32
12 bytes
__le16
__le16
__le32
__le32
__le32
__le32
__le32
__le32
Name
i_mode
i_uid
i_size_lo
i_atime
i_ctime
i_mtime
i_dtime
i_gid
i_links_count
i_blocks_lo
i_flags
Union osd1:
i_block[15] (12+1+1+1)
i_generation
i_file_acl_lo
i_size_high / i_dir_acl
i_obso_faddr
Union osd2:
i_extra_isize
i_checksum_hi
i_ctime_extra
i_mtime_extra
i_atime_extra
i_crtime
i_crtime_extra
i_version_hi
Description
Lower 16-bits of Owner UID.
Lower 32-bits of size in bytes.
Last access time, in seconds since the epoch.
Last inode change time, in seconds since the epoch.
Last data modification time, in seconds since the epoch.
Deletion Time, in seconds since the epoch.
Lower 16-bits of GID.
Hard link count.
Block map or extent tree. See the section "The Contents of inode.i_block".
File version (for NFS).
Lower 32-bits of extended attribute block.
Upper 32-bits of file size.
(Obsolete) fragment address.
Size of this inode - 128.
Upper 16-bits of the inode checksum.
Extra change time bits. This provides sub-second precision.
Extra modification time bits. This provides sub-second precision.
Extra access time bits. This provides sub-second precision.
File creation time, in seconds since the epoch.
Extra file creation time bits. This provides sub-second precision.
Upper 32-bits for version number.
best7-44
Globale
proces 1 bestandentabel
inodes
directory
directory
proces 2
inodes
best7-45
ijle bestanden
main()
{
int h = open("test.dat", O_CREAT|O_WRONLY, 0777);
lseek(h, 100000, SEEK_SET);
write(h, "Hallo", 5);
close(h);
}
% ls -al test.dat
-rwx--x--x 1 kdb
% du –b test.dat
8192 test.dat
users
100005 Nov 15 20:13 test.dat
Bestand: ijl
best7-46
MFT-record
MFT
record
Bestand van 9 blokken in 3 runs
best7-47
MFT-records
best7-48
Directory
best7-49
Compressie
best7-50
NTFS Streams
NTFS: streams
c:\>echo Hallo > test.txt
c:\>dir
15/11/2004 19:46 8 test.txt
c:\>more test.txt
Hallo
c:\>echo Nevenboodschap >test.txt:boodschap
c:\>dir
15/11/2004 19:46 8 test.txt
C:\>more test.txt
Hallo
C:\>more test.txt:boodschap
Nevenboodschap
best7-51
Quota
best7-52
Defragmentatie & Compactering
schijf
best7-53
Overzicht
• Logische bestandssysteem
– Gegevensbestanden
– directory's
– Bestandssystemen
• Bestandsorganisatie
–
–
–
–
–
directory's
Gegevensbestanden
Vrije ruimte
Partities
Reservekopieën
• Optimalisaties
best7-54
Beheer van vrije ruimte: bitmap
blokken
In gebruik
11111001000...
Bestandssysteem: vrije ruimte
Soms is het beheer gratis: b.v. FAT
0
1
2
3
4
5
6
7
8
9
10
best7-55
Beheer van vrije ruimte: links
blokken
0
1
vrij
2
3
4
5
6
7
8
9
10
best7-56
Beheer van vrije ruimte: wijzerblok
blokken
0
1
vrij
2
3
4
5
6
7
8
9
10
best7-57
Consistentie controleren
0 1 2 3 4 5 6 7
0 1 0 0 0 1 1 1 bezet
0 1 2 3 4 5 6 7
0 1 0 0 0 1 1 1 bezet
1 0 1 1 1 0 0 0 vrij
1 0 0 1 1 0 0 0 vrij
0 1 2 3 4 5 6 7
0 1 0 0 0 1 1 1 bezet
1
0 1 2 3 4 5 6 7
0 1 0 0 1 1 1 1 bezet
1 0 1 2 1 0 0 0 vrij
1 0 1 1 1 0 0 0 vrij
1
1 1
0
0 1 0 0 0 2 1 1 bezet
1 0 1 1 1 0 0 0 vrij
0
best7-58
Loggestructureerde
bestandssystemen
transacties
logbestand
Bestandssysteem: loggestructureerd
best7-59
Overzicht
• Logische bestandssysteem
– Gegevensbestanden
– directory's
– Bestandssystemen
• Bestandsorganisatie
–
–
–
–
–
directory's
Gegevensbestanden
Vrije ruimte
Partities
Reservekopieën
• Optimalisaties
best7-60
schijf 3
MBR
schijf 4
Partitie D
MBR
BB
schijf 2
Partitie C
schijf 1
Partitie B Partitie A
Partities of volumes
MBR
partitie = logische schijf
best7-61
Indeling partitie (cooked)
Boot block
Super block+free space mgmt
i-nodes
Unix File
Root directory
System (UFS)
BCB
PCB
FCB
root
data
Master File Table
Master File Table
Master File Table
NTFS
Partition boot sector (8 KiB) +
BIOS Parameter Block (BPB)
best7-62
Overzicht
• Logische bestandssysteem
– Gegevensbestanden
– directory's
– Bestandssystemen
• Bestandsorganisatie
–
–
–
–
–
directory's
Gegevensbestanden
Vrije ruimte
Partities
Reservekopieën
• Optimalisaties
best7-63
Reservekopie (back-up)
Fysieke reservekopie
Bescherming tegen
• Hardwareproblemen
• Ongelukjes
Logische reservekopie
best7-64
Fysieke reservekopie
reservekopie: fysiek
Schijfblokken 0..N
best7-65
Logische reservekopie
Bestand per bestand
reservekopie: logisch
Schijfblokken 0..N
best7-66
Logische incrementele
reservekopieën
reservekopie: incrementeel
best7-67
Overzicht
• Logische bestandssysteem
• Bestandsorganisatie
• Optimalisaties
– Vergrendelen bestanden
– Variabele blokgrootte
– Beperkte dynamische informatie
– RAM-disk
– Virtuele schijf
– Disk caches
– Free-behind - Read-ahead
– Compressie
best7-68
Vergrendelen bestanden
import java.io.*;
import java.nio.channels.*;
public class LockingExample {
public static void main(String arsg[]) throws IOException {
RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
// get the channel for the file
FileChannel ch = raf.getChannel();
// this locks the first half of the file - exclusive
FileLock exclusiveLock = ch.lock(0, raf.length()/2, false);
/** Now modify the data . . . */
exclusiveLock.release();
// this locks the second half of the file - shared
FileLock sharedLock = ch.lock(raf.length()/2+1, raf.length(), true);
/** Now read the data . . . */
sharedLock.release();
} catch (java.io.IOException ioe) { } finally { }
}
Mandatory locks: hard afgedwongen
Bestand: lock
Advisory locks: kunnen genegeerd worden
best7-69
Blokgrootte Unix
GB
Data
Programma's
60
58
56
54
52
50
48
46
44
42
40
best7-70
Variabele blokgrootte
• Kleine blokken voor kleine bestanden
• Grote blokken voor grote bestanden
best7-71
Beperkte dynamische
informatie
• Voornamelijk toegangstijdstippen
best7-72
MBR
BB
schijf
Partitie B Partitie A
RAM-disk / tempfs
Fysiek geheugen
best7-73
MBR
BB
bestand
MBR
BB
Virtuele schijf
Partitie A
Virtuele schijf
best7-74
Disk caches
hoofdgeheugen
CVE
Disk cache
Spoorbuffer
best7-75
Free-behind
• Bij sequentieel lezen is het beter om
een gelezen blok vrij te geven bij het
inlezen van het volgende blok.
Read-ahead
• Bij sequentieel lezen een aantal extra
sequentiële blokken inlezen.
best7-76
Schijfcompressie
• Verhoogt de capaciteit van de schijf
• Verhoogt de effectieve bandbreedte
naar de schijf
best7-77
best7-78
Download