Файлова система - въведение

 

1.      Въведение

2.       Обединена файлова система (Unified file system). 1

3.       Видове файлове

4.      Някои основни директории. 1

5.       Inodes и директории. 1

 


1.     Въведение

Едно просто описание на Unix/Linux – Всичко в Unix/Linux е файл (дори и устройствата), а ако не е файл то е процес.

Не се прави разлика между файл и директория, защото директорията е файл, който съдържа имената на други файлове. Програмите, текстовете, клавиатурата, монитора,  видео материалите и т. н. т. са файлове. Входно-изходните устройства, въобще всички устройства са разглеждани като файлове.

Unix/Linux не се интересува от разширенията на файловете - може да се определи като "Extensionless System".  Разширението (еxtension) на файла  е последователност от 2-4 символа, след финалната точка в името на файла и под Windows се използва за определяне на типа на файла. Някои най-често използвани разширения:


Под Unix/Linux разширението се игнорира и не се използва за определяне на типа на файла. Така например ако даден файл  picture.png съдържа изображение, то той може да бъде преименуван на picture.txt или просто picture и Linux ще продължи да го разглежда като изображение.  

Типът на съдържанието на файла може да се определи с команда file.  Синтаксис:

       file [options] [filenames]

Командата тества всеки от своите аргументи за да определи типа му. Тя извършва три категории тестове за всеки свой аргумент:

filesystem test - Проверява дали файлът не е празен или е някакъв специален тип файл:

$ touch ff
$ file ff  /dev/sda
ff: empty
/dev/sda: block special (8/0)
$

magic test - използват се за да определят дали съдържанието на файла е в някакъв специален формат.

За да определи съдържанието на файла командата използва база от данни за проверка на началните байтове на файла (в някои случаи това не е достатъчно и се проверява на определени места в целия файл). Тази база от данни се съхранява като  "text magic pattern" фрагменти (оикновено в /etc/magic);  или в бинарен файл с име   magic.mgc, който се намира обикновено в  /usr/lib/file/magic.mgc или /usr/share/file/magic.mgc или подобна локация.   Базата от данни определя какви "magic patterns" трябва да бъдат търсени, какво съобщение или  "MIME type" да бъде изведен ако специфичен  pattern  бъде намерен и допълнителната информация, която да бъде извлечена от файла.  Допълнителна информация за базата данни  може да бъде намерена тук.

Командата file определя типът на файла в "human readable" формат  (например  ‘ASCII text’) или "media type" (известен също под старото име MIME -  Multipurpose Internet Mail Extensions тип например  ‘text/plain;charset=us-ascii’). 

Задаването на "media type" се задава без интервали с type/subtype, или с параметър за допълнително пояснение  -  type/subtype;parameter=value.  Например за media type text, подтипът  може например да бъде plain (plain text), html (HTML source code), или csv (за comma-separated value ) файлове.  

За файловете с тип  text, може да се използва параметър за определяне на типът (charset) на използваните символи. Ако не е специфициран, се подразбира us-ascii. За специфициране например на UTF-8 текстов файл  се използва "text/plain;charset=UTF-8".

Някои често използвани типове :

Internet Assigned Numbers Authority (IANA) управлява официалните "media type" , като последната им версия може да се намери в техните  Media Types страници.

Примери за използване на команда file:

При подаването на името на файл на командата се извежда името и типът на файла:

$ file file.txt
file.txt: ASCII text

За показване само типа на файла се използва опция -b

$ file -b file.txt
ASCII text

За показване на "media type" на файла се използва опция -i

$ file -i file.txt
file.txt: text/plain; charset=us-ascii

Ако се приеме, че файла somefile1.txt  е zip архива:

$ file somefile1.txt
somefile.txt: Zip archive data, at least v2.0 to extract

За да се покажат типовете на всички файлове в текущата директория:

$ file  *

2.     Обединена файлова система (Unified file system)

За да могат да се управляват файловете са подредени в единна дървовидна структура с един корен обозначаван с /Обединена файлова система, основните клони съдържат други клони и накрая завършват с листа, които представляват обикновените файлове.

Обединената файлова система е съставена от една или повече индивидуални файлови системи (клонове от обединената йерархия - дискови дялове, USB флашки, CD, мрежови системи ...), като не е задължително индивидуалната файлова система да се намира на същия компютър.

Всяка индивидуална файлова система съществува на отделно физическо устройство - диск, дисков дял (partition), CD, DVD, flash card, USB устройство или мрежово споделена файлова система. Тя има собствен корен (root), който може да се „вгради“ в директория без файлове на обединената файлова система чрез команда за монтиране (mount). Директорията в която се вгражда се нарича „mount point”.  Някои от тези индивидуални системи се монтират в процеса на инициализирането на системата, а други могат да бъдат монтирани  в процеса на работа.

По време на инициализирането на системата  индивидуалните файлови системи се монтират съгласно описанието направено във файла  /etc/fstab. Някои (като USB устройства) се монтират при включването на устройството или се правят   user-mountable за да може обикновен потребител да ги монтира и демонтира.

Монтирането на индивидуална файлова система става с команда

$  mount [-t type] device dir

която кара ядрото да монтира файловата система  намираща се на  устройството device, която е от тип  type, в директория dir. Ако не бъде подадена опцията за типа, командата сама определя типа на файловата система.

Повечето устройства се задават с тяхното име, което може да се види в директория /dev например /dev/sda1 (първи дял на диск от тип Small Computer System Interface (SCSI) ), но може да се задава чрез интернет ресурс локатор и чрез  filesystem label or UUID (обяснен по-долу).

Командата 

$   mount -a [-t type] [-O optlist]

Обикновено използвана в инициализиращи скриптове монтира всички файлови системи от  /etc/fstab с изключение на тези, които съдържат  noauto.

Монтиране на USB устройства.

USB устройствата имат огромното предимство, че използват стандартно множество от протоколи. Те не се нуждаят от специализирани драйвери, което ги прави  преносими на различни хардуерни платформи.

При работна станция USB устройствата се монтират автоматично при включването им в директория  /media/<username>. При сървър монтирането трябва да стане ръчно. Трябва да се проверят наличните в системата запаметяващи устройства, след което да се създаде празна директория и да се монтира устройството


$  sudo fdisk -l 

$sudo mkdir /media/myUsb

mount [-t type] 'device' /media/myUsb

 

Демонтирането на файлова система става с команда:

$   umount [options] dir

Например  ако USB key device (флашка), е монтирана  в директория  /mnt/usb, то  демонтирането става с 

$   umount  /mnt/usb

Демонтирането трябва да се извърши преди физическото изключване на устройството. Процедурата е подобна на  "Safely Remove" в Windows. Тук обаче тя е изключително важна защото Unix базираните системи изключително често използват отложено физическо записване на утройствата за увеличаване на скоростта на работа. Това се отнася за всички физически устройства както и  за файлови системи като NFS. 

Не демонтирането преди физическото изключване може да доведе до загуба на данни и дори до разрушаване на индивидуалната файловата система.

Демонтирането не винаги е възможно веднага. То не може да се извърши, ако файловата система в момента е "busy" - ползвана от някаква команда (процес). За да се демонтира процесът трябва да завърши по един или друг начин.

Има различни опции, които могат да се ползват, когато файловата система е "busy" без ясна причина. Опцията  -l (i.e., lazy) разкача веднага файловата система и в последствие изчиства всички референции към откачваната система, когато тя вече не е  "busy". 

Опцията  -f (forces) се използва за демонтиране на недостъпна файлова система - например NFS (network filesystem), която вече не е налична, или флашка, която е извадена без демонтиране.

Файлът fstab се използва за съхранение на конфигурацията за файловите системи  и кога и къде да бъдат монтирани:

$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda2 during installation
UUID=e1519945-4af4-418e-be15-19d6648c1fb8 /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
UUID=cb3a9866-24a2-41ea-a6cc-c5bc0fa9c190 /boot           ext2    defaults        0       2
# /home was on /dev/sda6 during installation
UUID=2124df99-d79e-482b-9e70-f00f3428ffb2 /home           ext4    defaults        0       2
# swap was on /dev/sda5 during installation
UUID=bcfa2b70-92b7-424e-ba5f-d6a024222c6d none            swap    sw              0       0
$

На всеки ред се задава отделна файлова система, като описанието включва  следните секции разделени с табулации или празен интервал :<file system> <mount point>   <type>  <options>       <dump>  <pass>

<file system> - задава се с UUID(Universally Unique Identifier ), който се присвоява на файловата система при нейното форматиране;

<mount point> - директорията; където е монтирана;

<type> -  Linux поддържа широко множество от файлови системи, като някои се нуждаят от инсталирането на допълнителен софтуер. Някои от най-често използваните:

<options>  - някои от най-често използваните (останалите могат да се видят с man mount)

<dump> -  може да има стойности "0" (командата Backup  игнорира файловата система) и "1";

<pass>  - може да бъде 0, 1, 2 и означaва последователността на fsck (file system check). "0" означава, че не се проверява, "1" се използва за Root  partition,  "2" e за всички останали, които ще се проверяват..

На работеща система информация относно индивидуалните файлови системи и техните точки на монтиране се вижда чрез df команда (disk full,  disk free), която с -h ( human readable) опция подобрява четимостта

$ df -h

Командата показва информация само за активните non-swap файлови системи, които включват всички видове монтирани  файлови системи 

При включването на ново дисково устройство, системата го разпознава и го включва автоматично в директорията /dev.  За да може да се определи кое е новото устройство може да се използва командата lsblk стартирана преди и след включване на устройството. Например преди включването на USB флашка:

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 138,9M  1 loop /snap/chromium/1558
loop1    7:1    0 138,9M  1 loop /snap/chromium/1564
loop2    7:2    0  55,5M  1 loop /snap/core18/1988
loop3    7:3    0  55,5M  1 loop /snap/core18/1997
loop4    7:4    0 162,9M  1 loop /snap/gnome-3-28-1804/145
loop5    7:5    0   219M  1 loop /snap/gnome-3-34-1804/66
loop6    7:6    0  64,8M  1 loop /snap/gtk-common-themes/1514
loop7    7:7    0  65,1M  1 loop /snap/gtk-common-themes/1515
loop8    7:8    0    51M  1 loop /snap/snap-store/518
loop9    7:9    0  32,3M  1 loop /snap/snapd/11402
loop10   7:10   0  32,3M  1 loop /snap/snapd/11588
sda      8:0    0    40G  0 disk
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0     1K  0 part
└─sda5   8:5    0  39,5G  0 part /
sr0     11:0    1  58,3M  0 rom  /media/imom/VBox_GAs_6.1.18

Като се изключат устройстваta loop (Това са виртуални устройства, които правят обикновени файлове - например .iso да бъдат достъпвани като block devices)  в системата има един твърд диск - sda (създаден за виртуалната машина) разделен на три дяла (partitions) -  sda1, sda2 sda3; както и един CD драйв  - sr0.

След включването на флашката, командата извежда:

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 138,9M  1 loop /snap/chromium/1558
loop1    7:1    0 138,9M  1 loop /snap/chromium/1564
loop2    7:2    0  55,5M  1 loop /snap/core18/1988
loop3    7:3    0  55,5M  1 loop /snap/core18/1997
loop4    7:4    0 162,9M  1 loop /snap/gnome-3-28-1804/145
loop5    7:5    0   219M  1 loop /snap/gnome-3-34-1804/66
loop6    7:6    0  64,8M  1 loop /snap/gtk-common-themes/1514
loop7    7:7    0  65,1M  1 loop /snap/gtk-common-themes/1515
loop8    7:8    0    51M  1 loop /snap/snap-store/518
loop9    7:9    0  32,3M  1 loop /snap/snapd/11402
loop10   7:10   0  32,3M  1 loop /snap/snapd/11588
sda      8:0    0    40G  0 disk
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0     1K  0 part
└─sda5   8:5    0  39,5G  0 part /
sdb      8:16   1   1,9G  0 disk
└─sdb1   8:17   1   1,9G  0 part /media/imom/MOVIE
sr0     11:0    1  58,3M  0 rom  /media/imom/VBox_GAs_6.1.18

Появява се ново устройство - sdb, с един дял - sdb1, който е монтиран в  /media/imom/MOVIE

За същата цел може да се използва командата  fdisk -l стартирана преди и след включване на устройството. 

Внимание! Командата fdisk с параметър устройство е опасна! Тя се използва за създаване и изтриване на дисови дялове и се нуждае от административни права (стартира се с sudo).


     3.     Видове файлове

Опцията  -l на командата ls показва типа на файла използвайки първият символ на всяка линия:

Символ

Значение

-

Regular file

d

Directory

l

Link

c

Special file

s

Socket

p

Named pipe

b

Block device

Нормалните потребители работят с нормалните файлове, директориите, изпълнимите файлове и връзките


4.     Някои основни директории

Стандартната структура на директориите в Ubuntu Linux следва Filesystem Hierarchy Standard , където може да бъде намерена по-подробна информация. Тук ще бъдат показани само някои от основните директории:

/bin        основни програми на операционната система, ползвани от терминални команди - като ls, mv, cp ...
/boot     ядрото на операционната система
/dev      файловете (устройства), отговарящи на хардуерa
/etc       глобални конфигурационни файлове, които засягат всички потребители
/home   личните директории на потребителите
/lib        най-важните системни библиотеки
/media  е предназначено като точка за монтиране на външни устройств, като твърди дискове или, CDs, DVDs ...
/mnt      също е място за монтиране обикновено на мрежови файлови системи
/opt       се използва за допълнителен софтуер не управляван от стандартното управление на пакети
/proc     достъп до различни параметри на операционната система
/root     личната директория на root потребителя
/sbin     основни програми използвани от root
/tmp      временни файлове
/usr       повечето инсталирани програми, помощната информация и др.
/var       променливи данни, като лог файлове, бази от данни, уеб сайтове. Важна директория тук е /var/log.

5.     Inodes и директории

В Unix/Linux индивидуална файлова система всеки файл се представя от inode (index node). Това е структура от данни в традиционна Unix/Linux файлова система като ext2, ext3 или ext4, която съхранява метаданните на файла и се намира на отделно място, а не във фаила. В индивидуалната файлова система inode са номерирани (номерът често се наричат inum).

Всяка индивидуална файлова система (дисков дял, CD, DVD …) притежава свое собствено множество от inodes. В обединената файлова система може да има няколко файла с еднакъв inode номер, които се различават обаче  с идентификатора на индивидуалната файлова система.

Когато се инициализира (форматира) физическо устройство с Unix/Linux файлова система се създават фиксиран брой inode. Броят им задава максималният брой файлове от всички типове, които едновременно могат да се поместят в индивидуалната файлова система. Типично се отделя по 1 inode за от 2 до 8 KB памет. Теоретично ако файловата система включва огромно количество много малки файлове то може да се стигне  до изчепването им ( но това е по-скоро теоретична отколкоте реална възможност). 

В момента на създаването на файл той получава свободен inode, съхраняващ следната информация:

С други думи може да се счита, че inode идентифицира еднозначно файла.


 Командата  df -i извежда броят на inodes  във  индивидуална файлова система.

$  df -i /dev/sda2
Filesystem       Inodes      IUsed    IFree         IUse% Mounted on
/dev/sda2      24420352   230979   24189373    1%            /

Извежданата информация включва:

Ако се използва командата

$  df -h  /dev/sda2
Filesystem      Size  Used   Avail   Use%   Mounted on
/dev/sda2       367G   19G  330G     6%         /

Се вижда , че в конкретния случай изчерпването на дисковото пространство е  6%, докато общият брой използвани inodes е 1%

Командата ls –i извежда inode номера на файла:

$ ls -i /etc/passwd

Командата stat позволява извеждането на inode номера и атрибутите на файла, съхранявани в него :

$ stat /etc/passwd
  File: /etc/passwd
  Size: 2780          Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d    Inode: 1574718     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-04-25 18:26:52.288479970 +0300
Modify: 2021-03-01 18:17:19.589527286 +0200
Change: 2021-03-01 18:17:19.593527291 +0200
 Birth: -

 Подадена без параметри командата  извежда следната информация за файла:

За получаване на информация за файловата система, в която се намира файла, командата се подава с опция -f :

$ stat -f /etc/passwd
  File: "/etc/passwd"
    ID: 81a217b30fc15e8a Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 10125888   Free: 7675150    Available: 7153358
Inodes: Total: 2588672    Free: 2374526

Извежданата в този случай информация:

Допълнителна информация за Inodes ще намерите в раздела за файлови връзки.