Файлова система - въведение
2. Обединена файлова система (Unified file system)
Едно просто описание на Unix/Linux – Всичко в Unix/Linux е файл (дори и устройствата), а ако не е файл то е процес.
Не се прави разлика между файл и директория, защото директорията е файл, който съдържа имената на други файлове. Програмите, текстовете, клавиатурата, монитора, видео материалите и т. н. т. са файлове. Входно-изходните устройства, въобще всички устройства са разглеждани като файлове.
Unix/Linux не се интересува от разширенията на файловете - може да се определи като "Extensionless System". Разширението (еxtension) на файла е последователност от 2-4 символа, след финалната точка в името на файла и под Windows се използва за определяне на типа на файла. Някои най-често използвани разширения:
Под Unix/Linux разширението се игнорира и не се използва за определяне на типа на файла. Така например ако даден файл picture.png съдържа изображение, то той може да бъде преименуван на picture.txt или просто picture и Linux ще продължи да го разглежда като изображение.
Типът на съдържанието на файла може да се определи с команда file. Синтаксис:
file [options] [filename [filename2]...]
Командата тества всеки от своите аргументи за да определи типа му. Тя извършва три категории тестове за всеки свой аргумент - filesystem test, magic test и language test.
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" трябва да бъдат търсени, какво съобщение или "media type" да бъде изведен ако специфичен pattern бъде намерен и допълнителната информация, която да бъде извлечена от файла. Допълнителна информация за базата данни може да бъде намерена тук.
language test - търси определени низове, които могат да се появят в първите няколко блока на файла.
Командата 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 *
Допълнителна информация за командата, както и възможните опции може да бъде намерена с:
$ man file
За да могат да се управляват файловете са подредени в единна дървовидна структура с един корен обозначаван с / – Обединена файлова система, основните клони съдържат други клони и накрая завършват с листа, които представляват обикновените файлове.
Обединената файлова система е съставена от една или повече индивидуални файлови системи (клонове от обединената йерархия - дискови дялове, 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 (обяснен по-долу).
Закачените към системата устройства могат да се проверят с команда
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0
4K 1 loop /snap/bare/5
loop1 7:1 0 63.3M 1
loop /snap/core20/1852
loop2 7:2 0
73M 1 loop /snap/core22/583
loop3 7:3 0 63.3M 1
loop /snap/core20/1828
loop4 7:4 0
73M 1 loop /snap/core22/607
loop5 7:5 0 241.6M 1 loop
/snap/firefox/2432
loop6 7:6 0 239.9M 1 loop
/snap/firefox/2487
loop7 7:7 0 346.3M 1 loop
/snap/gnome-3-38-2004/119
loop8 7:8 0 349.7M 1 loop
/snap/gnome-3-38-2004/137
loop9 7:9 0 460.4M 1 loop
/snap/gnome-42-2204/68
loop10 7:10 0 91.7M 1 loop
/snap/gtk-common-themes/1535
loop11 7:11 0 45.9M 1 loop
/snap/snap-store/582
loop12 7:12 0 45.9M 1 loop
/snap/snap-store/638
loop13 7:13 0 49.8M 1 loop
/snap/snapd/18357
loop14 7:14 0 49.8M 1 loop
/snap/snapd/18596
loop15 7:15 0 304K 1 loop
/snap/snapd-desktop-integration/49
loop16 7:16 0 428K 1 loop
/snap/snapd-desktop-integration/57
loop17 7:17 0 460.6M 1 loop
/snap/gnome-42-2204/87
sda 8:0
0 40G 0 disk
├─sda1 8:1 0
1M 0 part
├─sda2 8:2 0 513M 0
part /boot/efi
└─sda3 8:3 0 39.5G 0 part
/var/snap/firefox/common/host-hunspell
loop са виртуални устройства, които правят обикновени файлове - например .iso да бъдат достъпвани като block devices. Snap пакетите се използват по този начин.
Командата
$ mount -a [-t type] [-O optlist]
Обикновено използвана в инициализиращи скриптове монтира всички файлови системи от /etc/fstab с изключение на тези, които съдържат noauto.
Проверка на монтираните файлови системи може да се извърши с
$ df -h
Filesystem Size Used Avail Use%
Mounted on
tmpfs
383M 1.5M 382M 1% /run
/dev/sda3 39G
14G 23G 38% /
tmpfs
1.9G 0 1.9G 0% /dev/shm
tmpfs
5.0M 4.0K 5.0M 1% /run/lock
/dev/sda2 512M 6.1M
506M 2% /boot/efi
tmpfs
383M 120K 383M 1% /run/user/1000
/dev/sr0
51M 51M 0 100%
/media/vbu/VBox_GAs_7.0.6
Монтиране на 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).
Опцията -l на командата ls показва типа на файла използвайки първият символ на всяка линия:
Символ |
Значение |
- |
Regular file |
d |
Directory |
l |
Link |
c |
Special file |
s |
Socket |
p |
Named pipe |
b |
Block device |
Нормалните потребители работят с нормалните файлове, директориите, изпълнимите файлове и връзките
Стандартната структура на
директориите в 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.
В 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
550050 /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 ще намерите в раздела за файлови връзки.