Из лекции Структура файловой системы Мефодий узнал, как пользоваться файловой системой и какую структуру она имеет с точки зрения программы, работающей с файлами в ней. Про то, как огранизована файловая система изнутри, что именно находится от начала устройства hda5
до его конца, существует немало больших статей, защищено немало кандидатских (и более одной докторской) диссертаций. Разработка файловой системы — сложный и интересный процесс, требующий одновременно владения высшей математикой, статистикой, умения безошибочно программировать и полного знания того, как работает то или иное дисковое устройство. Поэтому файловых систем не так много, и каждая из них устроена по-особому, в соответствии с тем, как решал тот или иной творческий коолектив задачу быстрого и надёжного доступа к файлам.
Принципы организации данных на диске
Во всех файловых системах есть и немало общего. Например, в каждой из них решается вопрос метаданных, то есть информации, не имеющей прямого отношения к содержимому, допустим, файла, но описывающей, как до этого содержимого добраться. В файловой системе обычно различается системная область, в которой записываются метаданные, и область данных, в где хранятся собственно файлы. Системная область может составлять заметную долю общего дискового пространства, и вот почему.
Различают устройство последовательного доступа (например, накопители на магнитных лентах) и устройства прямого доступа (например, жёсткие диски). Чтение (и запись) данных на устройствах последовательного доступа идёт последовательно: если сейчас записан первый блок носителя, то следующим будет доступен второй, за ним — третий и т. д. Если доступен пятый блок, а нужен первый или тысячный, выполняется длительная операция позиционирования, причём она тем длиннее, чем дальше отстоит нужный блок от текущего: лента перематывается. Работа с устройствами прямого доступа легче: каков бы ни был текущий прочитанный блок, время, за которое будет прочтан любой другой примерно одинаково.
Файлы на магнитной ленте удобнее хранить целиком, каждый файл — одним длинным куском. У такого способа есть один существенный недостаток: если на ленту объёмом в гигабайт записать 1024 мегабайтных файла, а потом удалить каждый второй, то образуется полгигабайта свободного места, но кусочками по мегабату каждый. Тогда запись, скажем, двухмегабайтного файла потребует трёх операций: сначала надо переписать какой-нибудь мегабайтный файл на свобоное место, затем удалить старую его копию, и только затем записать на образовавшееся место большой файл.
На устройстве прямого доступа можно избежать этой неприятной ситуации, если постановить, что файл может размещаться на нём в области данныхпо частям, а карта размещения этих частей будет записана в системную область. Если, не мудрствуя особо, предположить, что в системную область записываются номера полукилобайтных секторов, в которых лежит файл (по 32 бита каждый номер), то выходит, что размер системной области, который может потребоваться, всего в 16 раз меньше файловой. Но в Linux в системную область записываются индексные дескрипторы, размер которых существенно больше. Количество индексных дескрипторов может быть намного меньше количества блоков, но всё же системная область занимает примерно такую же (от пяти до десяти процентов) долю общего дискового пространства.
- индексный дескриптор
- Внутренний объект файловой системы Linux, однозначно определяющий принадлежащий ей файл. Индексный дескриптор содержит атрибуты файла, размер, указывает расположение файла на диске и т. п. Каждому индексному дескриптору соответвтует единственный в данной файловой системе идентификатор-целое число.
На самом деле, даже на жёстком диске блоки, расположенные подряд, считываются (и записываются) быстрее, чем блоки, расположенные как попало. Эффект связан с механическим устройством жестких дисков, пояснять которое Мефодию Гуревич не стал, ссылаясь на общеизвестность. Суть его в том, что задержки при чтении данных, находящихся на разных цилиндрах диска, растут линейно, как для ленты (чем дальше, тем дольше). Один из остроумных способов оптимизировать работу с диском состоит в том, чтобы разбить все цилиндры на группы, а внутри каждой группы выделить свою системную область и область данных. Тогда сами файлы и их индексные дескрипторы будут лежать, если это возможно, на соседних цилиндрах, и доступ ускорится.
Другое, более общее решение — использование кеширования, при котором данные с диска частично дублируются в памяти. Если какой-то процесс прочитал данные из файла, эти данные некоторое время находятся в памяти, на случай, если они ему (или кому-нибудь другому) опять понадобятся. Повторное обращение уже не дойдёт до диска, система вернёт процессу данные из кеша, раз уж они ничем не отличаются от тех, что на диске. Если процесс записал данные на диск, содержимое кеша обновляется, оставаясь актуальным.
Ещё эффективней кеш на запись: операции записи накапливаются в памяти, а до диска добираются не сразу, и в том порядке, в каком быстрее пройдёт запись, а не в том, в каком были выполнены. Если запись шла во временный файл, который, в конце концов, удалили, обращений к диску может и вообще не случиться. Однако с кешированием операций записи следует обращаться бережно: а вдруг сбой в электроснабжении произойдёт именно тогда, когда часть данных уже записана, а часть — ещё нет? А если не полностью, кусочками, обновилась системная область, состояние файловой системы после того, как питание опять включат, может оказаться совсем плачевным — настолько, что даже умная утилита восстановления fsck может оказаться бессильной. Поэтому системные области либо вообще не кешируются на запись, либо исключительно с помощью будущих кандидатов и докторов наук, что рассчитывают безопасные алгоритмы обновления файловой системы из кеша на запись...
Работа с файловыми системами
Итак, Linux свободно работает (и даже предпочитает работать) с несколькими разделами диска, содержащими, возможно, разные типы файловых систем.
Монтирование и размонтирование
Из лекции Структура файловой системы Мефодий знает, что файловые системы на различных разделах «прививаются» в виде ветвей общего дерева каталогов, растущего из «/
». Делается это при помощи команды mount -o настройки_монтирования устройство точка_монтирования
, где устройство
— это имя блочного файла-дырки, точка_монтирования
(mountpoint) — полный путь к каталогу, а настройки_монтирования
определяют особые параметры, разные для разных файловых систем. После выполнения этой команды содержимое файловой системы, размещённой на устройстве
(как правило, дисковом разделе), становится доступным в виде дерева подкаталогов точки_монтирования
. Посмотреть список всех смонтированных фаловых систем можно с помощью команды mount
без параметров:
[root@localhost root]# mount
/dev/hda5 on / type ext3 (rw)
/dev/hda7 on /home type ext3 (rw)
/dev/fd0 on /mnt/floppy type subfs (rw,nosuid,nodev,sync)
/dev/hdc on /mnt/cdrom type subfs (ro,nosuid,nodev)
proc on /proc type proc (rw,gid=19)
devpts on /dev/pts type devpts (rw,gid=5,mode=0620)
[root@localhost root]# umount /home
[root@localhost root]# ls /home
[root@localhost root]# mount /dev/hda7 /home
[root@localhost root]# ls /home
methody shogun tmpuser
Пример 7. Просмотр списка смонтированных файловых систем
Оба Linux-раздела смонтированы при старте системы: /dev/hda5
образует корневую файловую систему, а /dev/hda7
используется для хранения пользовательских домашних каталогов.
Мефодий заметил, что /tmp
и /var
не смонтированы никуда, и, следовательно, корневая файловая система, вопреки рекомендациям FHS, слишком часто используется на запись.
Суперпользователь может размонтировать файловую систему вручную с помощью команды umount точка_монтирования
, если на ней не открыто никаких файлов и никто не использует какой-либо её каталог в качестве текущего. Для того, чтобы файловые системы монтировались при загрузке системы, их описывают в файле /etc/fstab
:
/dev/hda5 / ext3 defaults 1 1
devpts /dev/pts devpts gid=5,mode=0620 0 0
/dev/hda7 /home ext3 defaults 1 2
proc /proc proc gid=19 0 0
/dev/hda6 swap swap defaults 0 0
/dev/fd0 /mnt/floppy subfs fs=floppyfss,sync,nodev,nosuid
/dev/cdrom /mnt/cdrom subfs fs=cdfss,nodev,nosuid
Пример 8. Содержимое /etc/fstab
Первое поле каждой строки этого файла — устройство или название виртуальной файловой системы, второе — точка монтирования, третье — тип файловой системы, четвёртое — настройки монтирования, а пятое и шестое относятся к организации резервного копирования и процедуре проверки цельности. Содержимое fstab
практически повторяет выдачу mount
(dev/cdrom
на этой машине — ссылка на /dev/hdc
). Здесь указывается и область подкачки, которую ядро не монтирует, а использует напрямую. Утилита mount
поддерживает усечённый вариант командной строки mount точка_монтирования
, при котором она самостоятельно ищет в /etc/fstab
, каким способом должна быть смонтирована точка_монтирования
. Для того, чтобы при загрузке системы какое-либо устройство не монтировалось, а усечённым mount
его можно было смонтировать вручную, в поле «настройки монтирования» добавляется ключевое слово noauto
.
Две последних строки относятся к монтированию съёмных (removable) носителей: лазерного и гибкого дисков. Съёмные носители приходится монтировать гораздо чаще несъёмных, не во время загрузки системы, а всякий раз, когда носитель сменился, и содержимое нового необходимо пользователю. Мало того, надо разрешить выполнять операцию mount
пользователю, который принёс дискету и желает поработать с ней. С другой стороны, нельзя всем и каждому давать право запускать mount
и особенно umount
с любыми параметрами! Есть четыре способа разрешить возникающее противоречие:
- Воспользоваться усечённым вариантом
mount
(запись с настройкойnoauto
вfstab
) и утилитойsudo
, при помощи которой позволить пользователю выполнять, скажем, только командыmount /cdrom
иumount /cdrom
. - Воспользоваться усечённым вариантом
mount
и настройкойowner
вfstab
, которая позволяет выполнять операцию монтирования хозяину устройства; при этом/dev/hdc
отдаётся во владение первому зарегистрированному пользователю так же, как/dev/audio
и прочие устройства персонального использования. Этот способ лучше предыдущего тем, что исключает ситуацию, когда один пользователь монтирует диск, а другой немедленно его размонтирует. - Воспользоваться специальным демоном из пакета
autofs
, который отслеживает обращения пользователей к некоторому каталогу (например,/mnt/cdrom/auto
), и самостоятельно выполняет операциюmount
, а если к содержимому носителя долгое время никто не обращался —umount
. Этот способ лучше предыдущего тем, что пользователю вообще никаких дополнительных команд подавать не приходится. - Воспользоваться специализированным модулем ядра (в примере —
subfs
), который всегда сообщает программе пользователя, что устройство смонтировано и готово к работе, а с тем, поменялся ли носитель, разбирается самостоятельно. Этот способ лучше предыдущего тем, что пользователю не приходится ждать «долгое время», пока система не соизволит размонтировать и «отдать» лазерный диск. Кроме того,subfs
может снабжать пользователя данными из кеша, даже если диск давно уже вынут (речь идёт, разумеется, об операциях чтения).
Во всех случаях, когда диск монтирует не системный администратор, стоит предпринять некоторые дополнительные действия. Например, диск должен монтироваться так, чтобы с него не работал запуск с подменой идентификатора (setUID), и чтобы на нём нельзя было создавать файлы-дырки (чтобы не потворствовать хулиганству, вроде запуска setUID-оболочки или записи прямо в устройство, соответствующее hda
). За это отвечают настройки nosuid
и nodev
, упомянутые в /etc/fstab
.
Кроме того, лазерные приводы имеют «защёлку», не позволяющую извлечь диск, пока он используется, а дисководы или устройства USB Flash — нет (хотя, казалось бы, она нужнее там, где происходит запись). Единственная надежда — на то, что пользователь не будет выдёргивать дискету из дисковода, пока он занимается записью, и на нём горит зелёная лампочка. Чтобы каждая операция записи немедленно приводила к передаче данных, необходимо полностью отключить кеш записи, то есть использовать синхронный режим работы файловой системы. Это делается при помощи настройки sync
.
Поддерживаемые Linux файловые системы
Если бы на компьютере из примера использовался способ монтирования лазерного диска 1
или 2
, то в поле «тип» fstab
было бы написано iso9660
. Так называется тип файловой системы, обычно используемой на лазерных дисках. Что же касается жёстких дисков, то на них может использоваться несколько типов файловых систем, даже на одном Linux-компьютере.
Основная файловая система в Linux называется «Ext2». Имя происходит от слова «extended» (расширенная) и появилось после того, как самая первая версия файловой системы ранних Linux, повторяющая возможности одного из вариантов файловой системы UNIX, окончательно устарела. Пришлось переписать соответствующую часть ядра, расширив уже имеющиеся возможности. Так появилась «ExtFS». Когда и она устарела, возможности снова расширили, и к названию добавилось число «2». Повсеместно используемая в дистрибутивах Linux файловая система «Ext3» — «трижды расширенная»! — отличается от Ext2 поддержкой журнализации.
Журналируемая файловая система ведёт постоянный учёт всех операций записи на диск. Получающийся журнал обращений сам, в свою очередь, записывается на диск. Разница между записью журнала и записью самих данных в том, что данные следует записывать в строго определённое место, а журнал устроен так, чтобы записываться как можно быстрее. Выгода от такой двухступенчатой процедуры особенно остро ощущается после сбоя электропитания: все операции, записи, которые ещё не успели завершиться, записаны в журнале, так что стоит после включения компьютера «проиграть» их ещё раз, и файловая система войдёт в норму! Если часть данных уже была записана на диск, повторная (по требованию журнала) запись тех же самых данных на то же самое место ничем повредить не может. Наконец, если операция записи не попала даже в журнал (что бывает редко), то файловая система всё равно останется в рабочем состоянии, каким оно было до начала этой операции.
Журналирование поддерживается и другими файловыми системами, используемыми в Linux — XFS и ReiserFS. ReiserFS вообще похожа скорее на базу данных: внутри неё используется своя собственная система индексации и быстрого поиска данных, а индексные дескрипторы и каталоги в стиле Linux выполнены в виде одной из возможных надстроек над этой системой. Традиционно считается, что ReiserFS отлично подходит для хранения огромного числа маленьких файлов (что было одной из целей проекта), а XFS — для хранения очень больших файлов, в котороых постоянно что-нибудь дописывается или изменяется.
В Linux поддерживается, кроме собственных, немало форматов файловых систем, используемых другими ОС. Если способ записи на эти файловые системы известен и не слишком замысловат, то работает и запись, и чтение, в противном случае — только чтение (чего нередко бывает достаточно). Полностью поддерживаются файловые системы FAT12/FAT16/FAT32 (тип vfat
), используемые в MS-DOS и Windows, ранние версии UFS, используемые в системах семества BSD. Новые версии UFS (например, UFS2 из FreeBSD5, обладающая свойствами, которые не входят в стандарт Linux) поддерживаются только на чтение, как и созданная на основе DEC VMS, но впоследствии многократно переработанная файловая система NTFS из Windows.
Для того, чтобы смонтировать файловую систему, имеющую заданный тип, команде mount
необходимо указать его с помощью ключа «-t
»:
[root@localhost root]# fdisk -l
. . .
Device Boot Start End Blocks Id System
/dev/hda1 * 1 25 100768+ 6 FAT16
/dev/hda2 26 520 1995840 5 Extended
/dev/hda5 26 282 1036192+ 83 Linux
/dev/hda6 283 334 209632+ 82 Linux swap
/dev/hda7 335 520 749920+ 83 Linux
[root@localhost root]# mount -t vfat /dev/hda1 /mnt/disk
[root@localhost root]# ls /mnt/disk
autoexec.bat config.sys fdconfig.sys freedos.bss
command.com fdconfig.old fdos kernel.sys
Пример 9. Монтирование файловой системы FAT16
Виртуальные и сетевые файловые системы
В /etc/fstab
Мефодий сразу заметил две строки, начинающися не с имени устройства, а с названия виртуальной файловой системы, содержимое которой доступно в соответствующей точке монтирования. Виртуальная файловая система обычно не обращается ни к какому внешнему устройству, а «придумывает» всё дерево каталогов и находящиеся в них файлы сама. Такова, например, файловая система в памяти (ROMFS, или аналогичная ей TMPFS, поддерживающая операции записи), используемая в стартовом виртуальном диске. Как правило, виртуальные файловые системы используются для того, чтобы предоставить доступ по чтению/записи к некоторой иерархической структуре данных.
Во многих версиях UNIX программа ps
работает непосредственно с устройством /dev/kmem
(памятью ядра), чтобы добыть оттуда информацию о таблицах процессов; это — сложная и даже опасная программа, имеющая доступ к святая святых системы. В Linux ps
может быть переписана чуть ли что не на shell, потому что таблица процессов и масса другой информации о системе доступны в виде дерева подкаталогов /proc
:
[root@localhost root]# ls -F /proc
1/ 585/ 793/ 882/ es1371 irq/ modules stat
1041/ 598/ 794/ acpi/ execdomains kcore mounts@ swaps
16/ 6/ 795/ bus/ fb kmsg mtrr sys/
2/ 681/ 796/ cmdline filesystems ksyms net/ sysrq-trigger
3/ 697/ 797/ cpufreq fs/ loadavg partitions sysvipc/
4/ 7/ 798/ cpuinfo ide/ locks pci tty/
492/ 725/ 8/ devices interrupts mdstat scsi/ uptime
5/ 751/ 840/ dma iomem meminfo self@ version
572/ 784/ 844/ driver/ ioports misc slabinfo
[root@localhost root]# ls -l /proc/1
total 0
-r--r--r-- 1 root proc 0 Dec 4 16:15 cmdline
lrwxrwxrwx 1 root proc 0 Dec 4 16:15 cwd -> /
-r-------- 1 root proc 0 Dec 4 16:15 environ
lrwxrwxrwx 1 root proc 0 Dec 4 16:15 exe -> /sbin/init
dr-x------ 2 root proc 0 Dec 4 16:15 fd
-r--r--r-- 1 root proc 0 Dec 4 16:15 maps
-rw------- 1 root proc 0 Dec 4 16:15 mem
-r--r--r-- 1 root proc 0 Dec 4 16:15 mounts
lrwxrwxrwx 1 root proc 0 Dec 4 16:15 root -> /
-r--r--r-- 1 root proc 0 Dec 4 16:15 stat
-r--r--r-- 1 root proc 0 Dec 4 16:15 statm
-r--r--r-- 1 root proc 0 Dec 4 16:15 status
[root@localhost root]# cat /proc/1/environ ; echo
OME=/TERM=linux
Пример 10. Виртуальная файловая система PROCFS
В частности, подкаталоги /proc
с числовыми именами содержат информацию о процессах с соответствующими PID. Файл exe
такого подкаталога — символьная ссылка на запущенную программу, файл cmdline
содержит командную строку, а environ
— окружение процесса. Мефодий углубился в чтение man proc
, руководства по PROCFS, и, как всегда, убедился, что для полного понимания всего, что есть в /proc
, ему пока не хватает званий.
Файловая система devpts
— шаг навстречу динамическому именованию устройств. Она предназначена для эмуляторов терминала, таких как sshd
, xterm
или screen
. Задача эмулятора терминала — предоставить пользователю полноценный интерфейс командной строки (с запуском командного интерпретатора, с распознаванием и передачей сигналов и т. п.) в отсутствие терминального оборудования — по сети или из графической подсистемы, или при необходимости сымитировать несколько терминалов. Раньше для этого использовались пары устройств /dev/pty##
— /dev/tty##
, где ##
— двухсимвольный идентификатор. Программа-эмулятор начинала обмениваться данными (от пользователея или из сети) с первым свободным устройством (скажем, ptya2
, которое, в свою очередь, было привязано к соответствующему терминальному устройству (ttya2
). Именно с этим устройством и взаимодействовал командный интерпретатор и прочие процессы Linux, находясь в полной уверенности, что это — полноценный терминал.
Выходило, что пар tty##-pty##
при статическом именовании устройств могло не хватить, даже если создать их очень много (достаточно запустить ещё больше эмуляторов терминала). Поэтому придумали завести одно устройство типа pty
— /dev/ptmx
и виртуальную файловую систему /dev/pts
для терминальных файл-дырок. Каждая программа, открывающая ptmx
, получает свой дескриптор), а в pts/
заводится очередное терминальное устройство, имя которого совпадает с порядковым номером. Когда дескриптор закрывается, терминальное устройство исчезает.
Среди файловых систем есть и такие, что не выдумывают содержимое сами, а обращаются за ним ещё куда-нибудь, например, в сеть. Так работают удалённые файловые системы, например, NFS (network file system), стандартная для всех UNIX-подобных ОС. Вместо поля «устройство» обычно указывается сетевой адрес компьютера-сервера и имя ресурса (название каталога), который необходимо смонтировать по сети. Поддерживается и работа с удалёнными файловыми системами Windows, причём как на уровне модулей ядра, с помощью mount -t smbfs
), так и без монтирования, с помощью утилиты smbclient
. Linux и сам может служить сервером, предоставляющим удалённый доступ к файлам, причём служба samba
, занимающаяся файловыми системами для Windows под управлением Linux, работает зачастую быстрее, чем Windows, запущенный на том же компьютере для тех же целей.
Возможности файловых систем этим не исчерпываются! Например, можно смонтировать образ устройства из файла, если вызвавть команду mount
с ключом -o loop
. Образ устройства — это файл, содержимое которого в точности повторяет содержимое устройства; его можно, например, получить с помощью команды cat устройство образ
. Именно образами устройств манипулируют программы записи на лазерные носители. Смонтировать образ бывает нужно для проверки или изменения содержимого перед записью, или для хранения содержимого нескольких дисков в исходном виде:
[root@localhost root]# ls -l floppy.flp
-rw-r--r-- 1 root root 1474560 Dec 4 16:53 floppy.flp
[root@localhost root]# mount -t vfat -o loop floppy.flp /mnt/disk/
[root@localhost root]# ls /mnt/disk/
command.com kernel.sys
[root@localhost root]# mount | grep disk
/root/floppy.flp on /mnt/disk type vfat (rw,loop=/dev/loop0)
Пример 11. Монтирование содержимого файла при помощи mount -o loop
Как заметил Мефодий, mount
создаёт для такого способа монтирования специальное устройство — /dev/loop0
, и уже с его помощью работает с файлом.
Обширное поле для экспериментов — т. н. пользовательская файловая система (linux userland file system, LUFS). Это — модуль ядра и набор библиотек, позволяющий организовать файловую систему, обращающуюся за информацией к обычному процессу Linux. Так организованы разнообразные сетевые «эмуляторы» файловых систем с использованием протокола FTP или Secure Shell. Так работает и доступ на запись к файловой системе NTFS: некоторая программа обращается к устройству, содержащему файловую систему, задействует драйвер NTFS, взятый из лицензионной копии самой Windows (это можно сделать с помощью библиотек wine
, подсистемы, распознающей исполняемые форматы Windows), и обменивается данными с модулем LUFS, который и предоставляет обычный файловый доступ процессам.
Проверка файловой системы
Если доступная на запись файловая система не была размонтирована перед выключением компьютера, после включения она окажется в нештатном состоянии, независимо от того, испортилось на ней что-либо или нет. Проверкой цельности файловой системы занимается утилита fsck
(file system check). На самом деле таких утилит несколько — по одной для каждого из основных типов файловых систем (есть fsck
даже для VFAT). Как уже говорилось в лекции Этапы загрузки системы, fsck
запускается при старте Linux, если файловая система находится в нештатном состоянии, или для профилактики, если файловую систему просто давно не проверяли.
В самом лучшем случае fsck
не находит ничего подозрительного, и система продолжает загрузку. Чаще всего, даже если в файловой системе не всё в порядке, её журнал не испорчен, и fsck
«проигрывает» его, после чего всё опять приходит в норму. Запустить fsck
можно и вручную, в виде fsck устройство
или fsck точка_монтирования
, однако прежде следует размонтировать файловую систему:
[root@localhost root]# fsck -fy /home
fsck 1.35 (28-Feb-2004)
/dev/hda7 is mounted.
WARNING!!! Running e2fsck on a mounted filesystem may cause
SEVERE filesystem damage.
Do you really want to continue (y/n)? no
check aborted.
[root@localhost root]# umount /home
[root@localhost root]# fsck /home
fsck 1.35 (28-Feb-2004)
e2fsck 1.35 (28-Feb-2004)
/dev/hda7: clean, 168/93888 files, 7269/187480 blocks
[root@localhost root]# fsck -f /home
fsck 1.35 (28-Feb-2004)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/hda7: 168/93888 files (0.6% non-contiguous), 7269/187480 blocks
Пример 12. Использование fsck
Со второго раза fsck
работать тоже не захотела, ссылаясь на то, что файловая система и так находится в штатном систоянии (её аккуратно размонтировали).
Мефодий заметил, что для файловой системы Ext3 запустиласть специализированная версия e2fsck
, подходящая также и для Ext2.
>Пришлось применить ключ «-f
» (force), который заставляет fsck
работать — конечно же, никаких ошибок найдено не было. Сама процедура проверки довольно сложна, она состоит из пяти этапов, каждый из которых отнюдь не тривиален, и в этой лекции не описывается. Кстати сказать, для того, чтобы проверить корневую файловую систему, её приходится сначала монтировать только на чтение, находить там /sbin/fsck
, проверять, и только после этого монтировать на чтение-запись. Если корневая файловая система испорчена настолько, что /sbin/fsck
в ней найти невозможно, остаётся пробовать загрузку с других носителей (например, с установочного CD), и разбираться.
Если какая-то порча файловой системы всё-таки обнаружилась, fsck
может поступить двояко. Во-первых, все ошибки, которые не приводят к изменению данных на диске, можно попробовать исправить автоматически. Например, индексные дескрипторы, на которые не ссылается ни одно имя (т. н. потерянные файлы, unref files), помещаются в специальный каталог /lost+found
под именами, соответствующими номерам этих индексных дескрипторов. Впоследствии администратор может посмотреть в эти файлы и решить, нужны они или нет. Во-вторых, когда fsck
встречается с ошибкой, исправление которой приведёт к изменению данных на диске, загрузка Linux останавливается, и система переходит в однопользовательский режим. Предполагается, что администратор сам запустит fsck
: либо интерактивно, тогда каждому изменению в файловой системе будет требоваться подтверждение с клавиатуры, либо пакетно, с ключом «-y
», тогда считается, что на все такие запросы администратор заранее ответил «yes».
Когда-то такие вот запуски fsck -y
производили катастрофические разрушения по вине неумелых администраторов, а нынче Мефодий, как ни нажимал «Reset» на многострадальной двухсистемной машине, не смог добиться ничего, кроме двух-трёх мнговенных воспроизведений журнала и жестокого нагоняя от Гуревича.