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