Linux. Полное руководство.

Глава 2. Файловая система LINUX.

2.1. Видимая сторона файловой системы.

С точки зрения пользователя, файловая система — это логическая структура каталогов и файлов. В отличие от Windows, где каждый логический диск хранит отдельное дерево каталогов, во всех UNIX-подобных системах эта древовидная структура растет из одного корня: она начинается с корневого каталога, родительского по отношению ко всем остальным, а физические файловые системы разного типа, находящиеся на разных разделах и даже на удаленных машинах, представляются как ветви этого дерева.

2.1.1. Имена файлов и каталогов.

Имена файлов и каталогов могут иметь длину до 255 символов. Символы «/» (слэш) и символ с кодом 0 запрещены. Кроме того, ряд символов имеет специальное значение для командного интерпретатора, и их использование не рекомендуется. Это символы:

~ ! @ # $ & % * ( ) [] {} ' " \ : ; > < ` пробел.

Если вам все-таки нужно употребить один их этих символов в имени файла, то при указании его имени в команде этот символ нужно экранировать знаком «\» (обратный слэш) или заключать все имя в двойные кавычки. Например, вы хотите вывести на экран командой cat содержимое текстового файла с именем my file, содержащим символ пробела:

$ cat my file # неправильно.

Cat: my: No such file or directory.

Cat: file: No such file or directory.

$cat "my file" # правильно.

Привет!

$cat my\ file # правильно.

Привет!

Знак # — это символ комментария для командного интерпретатора bash, о котором подробнее рассказано в главе 8. Командный интерпретатор игнорирует все символы от этого знака до конца введенной строки. Возможность комментировать не слишком полезна при вводе команд с консоли, но неоценима при написании командных сценариев, о которых мы еще будем говорить.

Заметьте, что точки среди специальных символов нет, и имена вроде this.is.а.text.file.containing.the.famous.string.hello.world допустимы и широко распространены. Часто последняя отделенная точкой часть имени используется подобно «расширению имени» в Windows, обозначая файл определенного типа, но это обозначение несет смысл только для человека. Так, человеку имя файла ivan_home.tar.gz подсказывает, что это домашний каталог пользователя ivan, упакованный архиватором tar и сжатый компрессором gzip.

Если имя файла начинается с точки, то этот файл считается скрытым: некоторые команды его «не видят». Например, введя в своем домашнем каталоге команду просмотра содержимого каталога ls с ключом -а, означающим «показывать скрытые файлы», вы увидите больше файлов, чем введя ту же команду без ключей.

Linux различает регистр символов в именах файлов: так, в одном каталоге могут находиться два разных файла README и Readme. Кстати, файлы с подобными именами обычно содержат информацию, действительно достойную прочтения.

Имена каталогов строятся по точно тем же правилам, что и имена файлов.

Полным именем файла (или путем к файлу) называется список вложенных друг в друга каталогов, заканчивающийся собственно именем файла. Начинаться он может с любого каталога, потому что в древовидной структуре между любыми двумя узлами существует путь. Если этот список начинается с корневого каталога, то путь называется абсолютным. Если с любого другого — то относительным (по отношению к этому каталогу).

Корневой каталог обозначается символом «/» (слэш), и этим же символом разделяются имена каталогов в списке. Таким образом, абсолютным именем файла README в домашнем каталоге пользователя den будет /home/den/README.

В каждом каталоге существуют два особых «подкаталога» с именами «две точки» и «точка». Первый из них служит указанием на однозначно определенный родительский каталог, а второй — на сам данный каталог. Для корневого каталога, у которого нет родителя, оба эти «подкаталога» указывают на корневой каталог. С помощью этих имен образуются относительные имена файлов. Так, именем вышеупомянутого файла README относительно домашнего каталога /home/ivan пользователя ivan будет ../den/README.

2.1.2. Назначение основных системных каталогов.

В системных каталогах находятся файлы, необходимые для управления и сопровождения системы, а также стандартные программы. Их имена, расположение и содержание почти одинаковы почти во всех ОС Linux, поэтому эти каталоги называют также стандартными. Впрочем, на данный момент эпитет «стандартные» отражает скорее благие пожелания, чем действительность: иерархия каталогов одинакова только для дистрибутивов, связанных единством происхождения, а исторически сложившиеся различия создают опасность несовместимости разных дистрибутивов. Стандарт файловой иерархии для UNIX-подобных систем разрабатывает группа добровольцев, и с его текущей версией можно ознакомиться по адресу http://www.pathname.com/fhs.

Краткое описание основных каталогов линии Red Hat и Fedora Core сведено в табл. 2.1.

Стандартные каталоги Таблица 2.1.

Каталог Назначение
/bin Основные программы, необходимые для работы в системе: командные оболочки, файловые утилиты и т.п.
/sbin Команды для системного администрирования, а также программы, выполняемые в ходе загрузки
/boot Файлы, необходимые для загрузки системы (образ ядра)
/home Домашние каталоги пользователей, кроме root
/dev Файлы устройств
/etc Файлы настроек: стартовые сценарии, конфигурационные файлы графической системы и различных приложений
/lib Системные библиотеки, необходимые для основных программ, и модули ядра
/lost+found Восстановленные после аварийного размонтирования части файловой системы
/media Сюда обычно монтируются съёмные носители: компакт-диски, flash-накопители
/mnt Временные точки монтирования жестких дисков Использовать этот каталог необязательно: подмонтировать файловую систему можно к любому другому каталогу
/opt Дополнительные пакеты программ. Если программа, установленная сюда, больше не нужна, то достаточно удалить ее каталог без обычной процедуры деинсталляции
/proc Виртуальная файловая система, дающая доступ к информации ядра (например, выведите на экран файл /proc/cpuinfo). Другие файлы в этом каталоге в каждый момент времени содержат информацию о выполняющихся в этот момент программах
/root Домашний каталог суперпользователя. Домашние каталоги всех остальных могут находиться на отдельном разделе, но /root должен быть в корневой файловой системе, чтобы администратор всегда мог войти в систему для ремонтных работ
/tmp Временные файлы
/var Часто меняющиеся данные: системные журналы и протоколы приложений, замки. Почтовые ящики, очереди печати и т.п.
/usr Практически все остальное: программы, исходные коды, документация. Сюда по умолчанию устанавливаются новые программы

Скорее всего, в ваш дистрибутив включена man-страница hier, подробно описывающая назначение этих каталогов и их основных подкаталогов.

2.1.3. Типы файлов.

С точки зрения UNIX-подобных ОС, файл представляет собой поток или последовательность байтов. Такой подход позволяет распространить понятие файла на множество ресурсов не только локального компьютера, но и удаленного, связанного с локальным сетью любого рода. Доступ к любому такому ресурсу осуществляется через универсальный интерфейс, благодаря чему запись данных в файл, отправка их на физическое устройство или обмен ими с другой работающей программой происходит аналогично. Это очень упрощает организацию данных и обмен ими.

В ОС Linux можно выделить следующие типы файлов:

♦ обычные файлы — последовательность байтов (текстовые документы, исполняемые программы, библиотеки и т.п.);

♦ каталоги — именованные наборы ссылок на другие файлы;

♦ файлы физических устройств, подразделяющихся на:

 • файлы блочных устройств, драйверы которых буферизуют ввод-вывод с помощью ядра и.

 • файлы байт-ориентированных, или символьных, устройств, позволяющих связанным с ними драйверам выполнять буферизацию собственными средствами;

♦ символические ссылки (symlink, symbolic link);

♦ именованные каналы (named pipes);

♦ гнезда (sockets).

Обычные файлы и каталоги.

Свойства (атрибуты) файлов и каталогов можно вывести на терминал с помощью команды ls с ключом -l:

$ls -l /home/den/README.

-rwxr-xr-- 1 den users 0 Feb 14 19:08 /home/den/README.

Что это за свойства?

Первый символ выведенной строки, в данном случае дефис, обозначает тип файла. Другие значения этого свойства: d — каталог, b — блочное устройство, с — символьное устройство, l — символическая ссылка, p — именованный канал и s — гнездо.

Следующие 9 символов означают права доступа к файлу. Они делятся на три тройки, обозначающие права: владельца, членов его группы и всех остальных. Внутри каждой тройки может присутствовать или отсутствовать: право чтения (r), записи (w) и исполнения (x, от execute). Отсутствие права обозначается символом дефиса. С файлом README из нашего примера владелец (в общем случае, пользователь, создавший его) имеет право делать все, что угодно; члены его группы — только читать и запускать файл на выполнение; все остальные — только читать.

О следующем свойстве, количестве ссылок на файл, будет сказано в параграфе о символических ссылках.

Далее указаны имя владельца файла и имя его группы; размер файла в байтах; дата и время последней модификации и имя файла.

Для каталога вывод команды ls выглядит так же, но значение некоторых свойств отличается.

$ls -l -a /home/den.

Drwx------ 3 den users 4096 Feb 14 19:02 .

Drwxr-xr-x 4 root root 4096 Feb 02 11:32 ..

[...]

Ключ -а нужен, чтобы увидеть псевдоподкаталоги «.» и «..» (их имена начинаются с точки, поэтому эти файлы скрыты).

Бит чтения в правах доступа означает право просматривать содержание каталога, записи — право создавать и удалять файлы в каталоге, исполнения — право переходить в этот каталог (делать его своим текущим каталогом).

Файлы физических устройств.

Все подключенные к компьютеру устройства понимаются операционной системой как файлы: вывод информации на терминал, печать на принтере, отправка почты — все это, с точки зрения ОС, есть запись в файл. Технически файл устройства — это коммуникационный интерфейс драйвера, ведающего взаимодействием с этим устройством. Большинство таких файлов располагается в каталоге /dev.

Загляните в этот каталог, введя команду ls -l /dev. Вывод этой команды займет несколько экранов, что создает повод для знакомства с командой-фильтром more, выводящей поступающие к ней на вход данные по одному экрану за раз:

$ ls -l /dev | more.

Чтобы увидеть следующий экран, нажмите пробел; чтобы прервать работу команды — Ctrl+С. О символе вертикальной черты, разделяющей команды ls и more, подробнее сказано в п. 3.3.1.

Об именах устройств, соответствующих разделам жесткого диска, сказано в главе 1. В следующей таблице приведена краткая справка по именам других часто используемых устройств. Символ N означает номер устройства в группе однотипных с ним устройств.

Наиболее часто используемые стандартные имена устройств Таблица 2.2.

Файл Устройство
null Пустое устройство. Все данные, выводимые в него, просто исчезают. Удобно использовать его для вывода ненужных сообщений
console Системная консоль, т.е. физически подключенные клавиатура и монитор
ttyN Пользовательская (виртуальная) консоль. Linux поддерживает до 6 таких консолей, для переключения между которыми служит комбинация клавиш Alt+Fn, где n — число от 1 до 6
pts/N Виртуальный терминал. Программа графического режима, в окне которой можно работать как в консоли
mouseN Мышь
audioN Звуковая карта
ttySN Последовательный порт. Файл /dev/ttyS0 соответствует порту COM1 в MS-DOS. /dev/ttyS1 — порту COM2
lpN Параллельный порт
cuaN Специальное устройство для работы с модемом
ethN Сетевая плата
fdN Дисковод для гибких дисков. Первому, то есть А:, соответствует /dev/fd0, для В: используется имя /dev/fd1
hdxN Жесткий диск с интерфейсом IDE, где x — буква, обозначающая номер такого диска (начиная с а), N — номер раздела на диске
sdxN Жесткий диск с интерфейсом SCSI

Вместо размера файла команда ls выдает два числа. Это так называемые старший и младший номера устройства. Старший номер несет информацию о драйвере, к которому относится данный файл, а младший номер указывает, к какому именно из однотипных устройств следует обращаться.

Жесткие и символические ссылки.

Жесткая ссылка является просто другим именем для исходного файла. После создания такой ссылки ее невозможно отличить от исходного имени файла. «Настоящего» имени у файла нет, точнее, все такие имена будут настоящими. Команда ls показывает количество именно таких жестких ссылок. Удаление файла по любому из его имен уменьшает на единицу количество ссылок, и окончательно файл будет удален только тогда, когда это количество станет равным нулю. Поэтому удобно использовать жесткие ссылки для того, чтобы предотвратить случайное удаление важного файла.

Создадим жесткую ссылку на файл README и посмотрим, что изменилось в его свойствах:

$ln /home/den/README /home/den/readme_too.

$ls -l /home/den/README.

-rwxr-xr-- 2 den users 0 Feb 14 19:08 /home/den/README.

Жесткую ссылку можно создавать в любом каталоге, но обязательно на том же физическом носителе (то есть в той же файловой системе), что и исходный файл. О причине этого будет сказано в п. 2.2.1.

Другой тип ссылок представляют собой символические ссылки. По назначению они аналогичны ярлыкам в ОС Windows: указывают на файл, расположенный где угодно (например, на съемном носителе), и после удаления такого файла или размонтирования съемного носителя становятся бесполезны.

Символическая ссылка создается той же командой ln с ключом -s:

$ln -s /home/den/README /home/den/do.not.readme.

$ls -l /home/den/do.not.readme.

Lrwxrwxrwx 1 den users 16 Feb 14 19:17 /home/den/do.not.readme -> /home/den/README.

В поле имени файла после стрелки указано его настоящее имя. Права доступа у всех символических ссылок одинаковы и не значат ничего: возможность доступа к файлу определяется правами исходного файла. Заметьте, что в отличие от файла-оригинала файл-ссылка имеет ненулевую длину: в нем хранится абсолютное имя исходного файла. Попытайтесь вывести файл-ссылку на экран с помощью команды cat, и вы увидите содержание исходного, пустого, файла:

$ cat /home/den/do.not.readme.

$

Значение самой ссылки, то есть имя файла, на который она ссылается, можно узнать с помощью команды readlink.

Символические ссылки на каталог создаются и выглядят точно так же, как символические ссылки на обычный файл. Можно создать и цепочку ссылок на ссылки: ядро ОС проследует по всей цепочке и в итоге подставит вместо ссылки имя исходного файла.

Можно даже закольцевать такую цепочку:

$ touch a1.

$ ln -s a1 a2; rm a1.

$ ln -s a2 a1.

$ ls -l a? # это шаблон имени. Ему соответствуют все имена из двух букв, первая «а».

A1 -> a2.

A2 -> a1.

$ cat a1.

Cat: a1: Too many levels of symbolic links.

Практический смысл этого упражнения — убедить вас в том, что Linux корректно справляется с разрешением ссылок даже в намеренно некорректной ситуации.

Символическая ссылка на каталог может участвовать в образовании полного имени файла, но есть одна тонкость: по ссылке нельзя проследовать обратно в направлении корня дерева каталогов. Вместо псевдоподкаталога «..» подставляется родительский каталог каталога-оригинала. Так, если в домашнем каталоге пользователя ivan есть ссылка на домашний каталог пользователя den, то путь /home/ivan/link_to_den_home/.. эквивалентен не /home/ivan, a /home/den/.., то есть /home.

Именованные каналы.

Этот тип файла еще называется буфером FIFO (First In — First Out). Через файлы такого типа два независимых процесса (две работающих программы) могут обмениваться данными: все, что записано в файл одним процессом, может быть прочитано оттуда другим. Именованный канал создается командой mkfifo.

Гнезда.

Механизм гнезд (сокетов, sockets) впервые появился в версии 4.3 BSD UNIX (ветвь UNIX, начавшая развиваться в калифорнийском университете Беркли). Позже он превратился в одну из самых популярных систем сетевого обмена сообщениями, реализованную во многих, не только UNIX-подобных, операционных системах. В честь создателей этот механизм до сих пор называют Berkeley Sockets.

Собственно гнездо — это абстрактная конечная точка сетевого соединения. Процесс отправляет данные в сеть, записывая их в файл гнезда. При этом процессы, установившие связь через пару гнезд, могут быть запущены как на разных компьютерах, так и на одном.

Межпроцессный обмен через гнезда используется такими стандартными компонентами Linux, как служба учета syslog и оконная система X Window.

2.1.4. Команды работы с файлами и каталогами.

Предварительно замечу, что командой в ОС Linux называется все, что может быть выполнено: исполняемый файл, встроенная команда текущей программы и даже формируемая на ходу последовательность символов. Синтаксис обычной команды:

Имя_команды [короткие_ключи] [длинные_ключи] [аргументы].

Где в квадратные скобки взяты необязательные данные. Ключи можно указывать в любом порядке, разделяя их пробелами. Аргументы тоже отделяются друг от друга пробелами.

Имена коротких ключей, или опций, состоят из одной буквы, перед которой стоит символ «-» (дефис). У ключа может быть свой аргумент. Короткие ключи, у которых нет аргументов, можно соединять под одним дефисом: так, команда ls -l -a -d эквивалентна команде ls -lad.

Имена длинных ключей — это осмысленные слова, перед которыми стоят два символа «-» (дефис). Большинство команд понимают ключи --help и --usage, требующие вывести краткую справку об использовании команды. Необязательный ключ «--» сигнализирует об окончании списка ключей и начале аргументов.

Справку о ключах и аргументах команды можно получить по команде man.

Текущий каталог.

Текущий каталог — это каталог, от которого отсчитываются относительные пути. В каждый момент времени с каждой работающей программой, в том числе с командной оболочкой, связан единственный такой каталог. Узнать, какой каталог сейчас является текущим, можно с помощью команды pwd без аргументов.

Сменить текущий каталог можно командой.

Cd [новый_каталог].

Для смены текущего каталога на домашний каталог пользователя можно вместо имени нового каталога указать специальный символ ~: cd ~.Разрешается переходить также в псевдоподкаталоги «.» и «..». В первом случае ничего не изменится, а во втором текущим каталогом станет родительский.

Просмотр содержимого каталога.

Уже знакомая команда ls [имя_каталога] выводит его содержимое на экран. Если не указывать имя каталога, команда выведет содержание текущего каталога.

Вместо имени каталога можно указать шаблон имен файлов: например, ls my* покажет все файлы и подкаталоги, имена которых начинаются с «my».

Подробнее об аргументах и ключах команды ls (как, впрочем, и любой другой команды) можно узнать у справочной системы, набрав команду man ls.

Создание и удаление файла.

Создать пустой файл можно командой.

Touch <имя_файла>

Вообще-то она предназначена для того, чтобы для всех заинтересованных программ (например, утилиты сборки проекта make) файл выглядел новее, чем на самом деле: она меняет время последнего изменения файла на текущее время. Но если файла с таким именем не существует, то она его создаст.

Текстовые файлы можно создавать, вводя текст с консоли:

$ cat > hello.world.

Привет!

Оказывается, команду cat можно заставить не только выводить файл на консоль, но и вводить с нее. Это достигается перенаправлением ввода-вывода, о котором подробнее будет сказано в главе 8. В таком режиме команда cat считает своими входными данными поток байтов, поступающий с клавиатуры, и выводит его в указанный файл. Иными словами, в файл записывается все, что вы после этой команды введете с клавиатуры. Чтобы закончить ввод, нажмите Ctrl+D.

Если файл с указанным именем существует, то команда cat перепишет его. Чтобы вместо этого добавить данные в конец файла, перенаправьте ее вывод с помощью символов >>:

$ cat >> hello.world.

Каталог создается командой.

Mkdir <имя_каталога>

Чтобы операция создания файла или подкаталога прошла успешно, вы должны иметь право записи в каталог, в котором вы его создаете.

Удалить пустой каталог можно командой.

Rmdir <имя_каталога>

Удаляется файл командой.

Rm <имя_файла>

При этом наличие прав на запись и даже чтение этого файла не требуется: достаточно иметь право на запись в каталог, где находится этот файл. Ключи команды rm:

♦ -i: требует подтверждения удаления для каждого удаляемого файла. Если вы заказали удаление группы файлов (например, по шаблону имени rm chernovik*), то среди них может оказаться файл, который вам еще нужен: безопаснее применить ключ -i. Подтвердите удаление каждого файла или откажитесь от него, введя символ Y или N соответственно;

♦ -f: не запрашивать подтверждения, не выводить сообщений об ошибках. Если указаны оба ключа -i и -f, то срабатывает последний указанный;

♦ -r: рекурсивное удаление каталога со всеми его подкаталогами. Непустой каталог можно удалить только так.

Копирование и перемещение файла.

Файл копируется командой cp. Формат этой команды:

Cp [ключи] <исходный_файл> {<файл_назначения> | <каталог_назначения>}.

Полезные ключи команды cp:

♦ -i: требовать подтверждения перед перезаписью существующего файла;

♦ -f: не требовать подтверждения;

♦ -r: рекурсивно копировать каталог со всеми подкаталогами;

♦ -а: сохранять атрибуты файла;

♦ -d: копировать символические ссылки вместо файлов, на которые они указывают;

♦ -s: создавать символические ссылки вместо копирования (-l — жесткие);

♦ -u: не переписывать существующий файл, если он модифицирован позже;

♦ -х: игнорировать подкаталоги, расположенные в других файловых системах.

Кстати, команда cat с перенаправленным выводом тоже может скопировать файл:

$ cat hello.world > copy.of.hello.world.

Команда mv перемещает или переименовывает файлы. Формат команды:

Mv [ключи] <исходный_файл> {<файл_назначения> | <каталог_назначения>}.

Ключи -i, -f имеют тот же смысл, что для команд cp и rm.

Просмотр текстовых файлов.

Перед тем, как просматривать файл, неплохо было бы убедиться, что он действительно является текстовым, то есть содержит только печатные ASCII-символы. Для проверки типа файла служит команда.

File <имя_файла>

Если ее ответ содержит слово «text», то файл можно безопасно вывести на терминал. Вывод двоичного файла может сбить кодировку так, что вместо набираемых на клавиатуре символов вы увидите черт знает что. Если это все же случилось, введите вслепую команду.

$ tput reset.

(или, если вы работаете в графическом режиме в окне виртуального терминала, выберите в его меню команду Терминал|Сброс и очистка для среды GNOME или Edit|Reset & Clear Terminal для среды KDE).

Кроме уже упомянутой команды cat, для вывода файла на терминал служат команда.

More <имя_файла>

И ее улучшенный вариант less.

Команда-фильтр more разбивает поток своего вывода на порции размером в экран и ожидает ввода пользователя для отображения следующей порции. Чтобы увидеть следующую строку, нажмите <Ввод>; чтобы увидеть следующий экран, нажмите <пробел>; чтобы прервать работу команды, нажмите <Q> или Ctrl+C.

Утилита less позволяет листать выводимый файл не только вперед, но и назад (клавишами PgDn и PgUp), перемещаться к указанному месту в файле, искать по образцу и дает еще много полезных возможностей. В общем, man less.

Если интересующая вас информация находится в конце файла (например, вы хотите просмотреть журнал системных сообщений messages в каталоге /var/log, чтобы узнать, что именно только что пошло наперекосяк), то вам поможет команда.

Tail [-N] [имя_файла].

Где N — число выводимых строк файла, считая от последней. Командой.

Head [-N] [имя_файла].

Можно просмотреть, наоборот, только первые N его строк. Значение N по умолчанию равно 10.

Если вы хотите просмотреть не весь файл, а только те его строки, которые содержат заданный фрагмент текста, используйте команду-фильтр grep. Например, я хочу сменить клавишу переключения раскладки клавиатуры в графическом режиме. Я знаю, что строки конфигурационного файла /etc/X11/xorg.conf, имеющие отношение к клавиатуре, содержат фрагмент XKB… а может, Xkb или xkb? Неважно:

$ grep -in xkb /etc/X11/xorg.conf.

[...]

65: Option "XkbLayout" "us,ru".

66: Option "XkbOptions" "grp:shift_toggle,grp_led:scroll".

Я указал ключи: -i, требующий игнорировать различия регистра в образце для поиска и файле, и -n, требующий выводить номера строк, в которых встречается образен xkb.

Для всех команд ключи без аргументов можно соединять: запись -in эквивалентна записи -i -n.

Редактирование текстовых файлов.

Вышеприведенный пример показывает, что переключением раскладки клавиатуры в графическом режиме управляет комбинация клавиш Shift + Shift. Неудобно: в консольном режиме я привык к Ctrl+Shift. Надо заменить значение shift_toggle на ctrl_shift_toggle. Такие мелкие правки конфигурационных файлов — обычное дело для администратора, поэтому средство их внесения присутствовало в UNIX-системах всегда. Это консольный редактор vi, входящий в каждый дистрибутив Linux (в дистрибутив Fedora Core 3 включен его улучшенный вариант vim, но команда vi тоже доступна: она стала псевдонимом для команды vim).

Итак, я делаю на всякий случай резервную копию конфигурационного файла /etc/X11/xorg.conf и приступаю к его редактированию:

$ cp /etc/X11/xorg.conf /etc/X11/xorg.conf.sav.

$ vi /etc/X11/xorg.conf.

Перемещаюсь к строке 66 командой 66G (буква G заглавная: редактор vi различает регистры). Клавишами управления курсором перемещаюсь к началу слова shift.

Включаю режим вставки командой i (строчная буква). Набираю ctrl_. Выключаю режим вставки клавишей Esc. Сохраняю изменения командой :w. Выхожу по команде :q.

Сложно и на вид бессистемно? Да. Зато есть команда :help.

Как полноэкранный редактор, vi может находиться в одном из двух режимов. В режиме вставки вводимые символы поступают в редактируемый файл, в командном режиме они воспринимаются как команды. Перечислю коротко самые употребительные команды редактора vi:

РЕЖИМ ВСТАВКИ.

Включение режима вставки:

♦ i в текущей позиции курсора;

♦ I перед первым непробельным символом в текущей строке;

♦ w в новой строке, добавленной после текущей;

♦ W в новой строке, добавленной перед текущей.

Выключение режима вставки:

♦ <Esc>

Команды режима вставки:

♦ Ctrl+a повторить предыдущую вставку;

♦ Ctrl+у вставить символ, находящийся над курсором (в предыдущей строке);

♦ Ctrl+e вставить символ, находящийся под курсором (в следующей строке).

КОМАНДНЫЙ РЕЖИМ.

Удаление (здесь и далее N — это число):

♦ N x N символов под курсором и справа от него;

♦ N X N символов слева от курсора;

♦ N dd N строк;

♦ D до конца текущей строки;

♦ N D до конца текущей строки и еще N-1 строку.

Копирование и вставка строк:

♦ N yy взять в буфер N строк от текущей и ниже;

♦ p вставить содержимое буфера после текущей строки;

♦ P вставить содержимое буфера перед текущей строкой.

Поиск и переход:

♦ N G перейти к строке с номером N;

♦ $ G перейти к последней строке файла;

♦ /<образец> искать образец вниз от курсора;

♦ ?<образец> искать образец вверх от курсора;

♦ n повторить поиск в том же направлении;

♦ N (буквально «N»): повторить поиск в обратном направлении.

Сохранение и выход:

♦ :w сохранить текущий файл;

♦ :w <имя> сохранить под новым именем, если файл <имя> еще не существует;

♦ :w! <имя> сохранить пол новым именем, переписав существующий файл;

♦ :q выйти;

♦ :q! принудительно выйти без сохранения;

♦ :wq сохранить и выйти.

Разное полезное:

♦ N u отменить последние N изменений;

♦ N Ctrl+r вернуть последние N отмененных изменений;

♦ U отменить изменения в последней строке;

♦ N r <символ> заменить N следующих символов на <символ>;

♦ N >> добавить отступ (Tab) в N следующих строк;

♦ N << удалить один отступ (Tab) из N следующих строк;

♦ :sh временно выйти в оболочку (вернуться — exit);

♦ :!<команда> выполнить команду оболочки.

Поиск файлов.

Быстрый поиск имени программы можно выполнить прямо из командной строки: для этого введите первые буквы нужной вам команды и нажмите <Tab>. Если введенные вами буквы однозначно определяют команду или исполняемый файл, то ее имя появится в командной строке. Эта функция называется автозаполнением командной строки. Если не появилось ничего, нажмите <Tab> еще раз для вывода списка всех доступных команд, начинающихся со введенных букв. Если таких команд окажется больше сотни, у вас попросят подтверждения того, что вы действительно хотите увидеть их все.

В разных каталогах может оказаться несколько исполняемых файлов с одинаковыми именами. Какой из них будет исполнен? На этот вопрос отвечает команда which. Она просматривает каталоги, перечисленные в переменной окружения PATH, в поисках исполняемого файла с указанным именем, и выводит абсолютное имя первого встреченного из них.

Команда whereis ищет не только исполняемый файл, но и его справочные страницы и исходный код.

Команда locate ищет файл по образцу имени, опираясь на свою базу данных о файловой системе. Ее вариант с повышенной безопасностью slocate сохраняет данные о правах доступа к файлам, так что пользователь не увидит тех файлов, на которые у него нет прав. В дистрибутиве Fedora Core 3 команда locate представляет собой символическую ссылку на утилиту slocate.

Команда find ищет файл по его атрибутам в указанном каталоге и его подкаталогах на заданную глубину. Например, при установке операционной системы я отказался устанавливать файловый менеджер Midnight Commander, а теперь он мне понадобился. Для каждого из 4 компакт- дисков дистрибутива запускаю команду поиска по шаблону имени «mc*», то есть всех файлов, имена которых начинаются с mc:

$find /media -name mc*

/media/cdrecorder/Fedora/RPMS/mc-4.6.1-0.8.i386.rpm.

В итоге на третьем диске найден пакет RPM. Об установке программного обеспечения из пакетов RPM будет сказано в главе 7.

Изменение прав доступа к файлу.

Как многопользовательская операционная система, ОС Linux содержит механизм разграничения доступа к данным, позволяющий как защитить данные одного пользователя от нежелательного вмешательства других, так и разрешить другим доступ к этим данным для совместной работы.

Как уже сказано, любой ресурс компьютера под управлением ОС Linux представляется как файл, поэтому мы будем говорить только о правах доступа к файлу.

По отношению к файлу пользователь может входить в одну из трех категорий: владелец, член группы владельца, все остальные. Для каждой из этих категорий есть свой набор прав доступа.

Первым владельцем файла становится его создатель. Дальше файл можно передать другому владельцу или в другую группу командой.

Chown [ключи] <новый_пользователь>[:новая_группа] <файл>

Или.

Chgrp [ключи] <новая_группа> <файл>

В некоторых реализациях Linux передать файл другому владельцу имеет право только суперпользователь, а в других — также его текущий владелец.

Набор прав доступа состоит из прав на чтение, запись и исполнение файла. В символьном представлении он выглядит как строка «rwx», где вместо любого символа может стоять дефис. Буква означает наличие права (r — чтение, w — запись, x — исполнение), дефис — его отсутствие.

Очевидно, что эти три бита могут быть записаны еще и как восьмеричное число. Так, права доступа r-x (чтение и исполнение без записи) понимаются как три двоичные цифры 101 или как восьмеричная цифра 5. Численное представление прав доступа называется абсолютным, или двоичной маской.

Полная строка прав доступа в символьном представлении устроена так:

<права_владельца><права_группы><права_остальных>

В абсолютном представлении права владельца являются старшим разрядом восьмеричного числа, права группы — вторым и права остальных — третьим. Так, права rwxr-x--x выглядят как число 111 101 001, или 751.

Команда изменения прав доступа chmod понимает как абсолютное, так и символьное указание прав.

Назначим файлу /home/den/README права rw-r-----, то есть разрешим себе чтение и запись, группе только чтение, остальным пользователям — ничего:

$cd ~ # переход в свой домашний каталог.

$chmod 640 README # 110 100 000 == 640.

$ls -l README.

-rw-r----- 1 den users 0 Feb 14 19:08 /home/den/README.

В символьном представлении можно явно указывать, кому какое право мы хотим добавить, отнять или присвоить. Добавим право на исполнение файла README группе и всем остальным:

$chmod go+x README.

$ls -l README.

-rw-r-x--x 1 den users 0 Feb 14 19:08 /home/den/README.

Формат символьного режима:

Chmod <категория><действие><набор_прав> <файл>

Возможные значения аргументов команды представлены в таблице 2.3.

Аргументы команды chmod в символьном режиме Таблица 2.3.

Аргумент Значение
Категория u Владелец
g Группа владельца
o Прочие
a Все пользователи, то есть «a» эквивалентно «ugo»
Действие + Добавить набор прав
- Отменить набор прав
= Назначить набор прав
Право r Право на чтение
w Право на запись
x Право на исполнение
s Право смены идентификатора пользователя или группы
t Бит прилипчивости (sticky-бит)
u Такие же права, как у владельца
g Такие же права, как у группы
o Такие же права, как у прочих

Название бита прилипчивости унаследовано от тех времен, когда объем оперативной памяти был маленьким, а процесс подкачки медленным. Этот бит позволял оставлять небольшие часто используемые программы в памяти для ускорения их запуска. Сейчас его значение переосмыслено: этот бит, установленный для каталога, приводит к тому, что удалять файлы из этого каталога могут только владелец файла и владелец каталога. Обычно это используется в каталогах, открытых для записи всем (например, /tmp).

Права смены пользователя и группы (SUlD-бит и SGID-бит) означают следующее. Обычно исполняемый файл (программа или командный сценарий) получает те же права на доступ к файлам, что и пользователь, который запустил его на выполнение. Но у этого файла есть еще и владелец, полномочия которого могут быть совсем другими. Наличие одного из этих битов позволяет выполняющейся программе пользоваться полномочиями владельца программного файла или члена его группы.

Так, команда su (substitute user), позволяющая «стать» другим пользователем без завершения своего сеанса и входа под новым именем (это нужно, например, чтобы быстро выполнить административную задачу от имени суперпользователя), имеет следующие атрибуты:

$ls -l `which su`

-rwsr-xr-x 1 root root [размер, дата, время] /bin/su.

Биты «x» сообщают, что любой пользователь может запустить эту программу, а бит «s» — о том, что во время ее выполнения он будет пользоваться правами суперпользователя root (если, конечно, знает пароль).

Обратите внимание на применение обратных апострофов: они нужны для того, чтобы направить вывод команды which на вход команды ls.

Следует учитывать, что программы, требующие установления SUID (или SGID) для своей работы, являются потенциальными дырами в системе безопасности. Представьте такую ситуацию: у вас в системе установлена программа superformat, которая предназначена для форматирования дисков. Создание файловой системы, пусть даже на дискете, — это привилегированная операция, требующая полномочий суперпользователя.

При установке этой программы для нее сразу устанавливается право SUID, чтобы разрешить пользователям форматировать дискеты. Пользователь запускает ее для форматирования дискеты. Программа запускается, получает права root, форматирует дискету и нормально завершает работу.

А если она завершает работу аварийно, например, по ошибке переполнения стека (такие случаи отмечались)? Тогда запустивший ее пользователь получит права root! Неквалифицированный пользователь с правами root — это намного хуже, чем просто крах системы. Помните о потенциальной опасности при работе с такими программами и по возможности избегайте использования прав SUID и SGID.

Справедливости ради нужно заметить, что ряд системных программ (в частности, демон установления интернет-соединения pppd) разрабатывался с учетом прав SUID и SGID, и эти программы являются максимально защищенными, хотя полной уверенности в этом нет. Поэтому использовать право SUID нужно только в самых крайних случаях.

Я позволю себе сделать еще несколько замечаний относительно прав доступа SUID и SGID:

1. Лучше не использовать программы, требующие привилегий, на сервере, точнее, не разрешать обыкновенным пользователям их использовать. Использование права доступа SUID вы можете себе позволить только на своей домашней машине, например, для установления того же коммутируемого соединения, чтобы каждый раз при подключении к Интернету не вводить команду su.

2. Перед использованием программ, требующих привилегии root, убедитесь в их надежности. Если программа получена из ненадежного источника, лучше ее не использовать. Надежными источниками считаются сайты или FTP-серверы разработчиков дистрибутивов Linux, Желательно получить исходный код такой программы, чтобы убедиться, что она не производит каких-либо несанкционированных действий.

3. Нет ни одной причины, по какой нужно было бы разрешить использование SUlD-программ в домашних каталогах пользователей. Для разделов, в которые разрешена запись обыкновенным пользователям, установите опцию nosuid в файле /etc/fstab.

2.2. Изнанка файловой системы.

С точки зрения операционной системы, под файловой системой понимается внутренняя управляющая структура, заведующая хранением данных на физическом носителе, их поиском, извлечением и записью по запросам программ. Такие управляющие структуры в каждом семействе операционных систем строятся по схожим принципам. Так, DOS/Windows используют файловую систему FAT с вариантами FAT32 и VFAT. Файловые системы UNIX-подобных ОС разнообразнее, но тоже могут быть объединены в одно семейство. Linux умеет работать со множеством файловых систем, как с родными, и с еще большим их количеством обмениваться данными.

Примечание. Хотя существуют средства установки Linux в раздел FAT/FAT32 — Lin4Win, я не рекомендую их использовать, т.к. в этом случае Linux работает крайне нестабильно и медленно.

Типичным представителем файловых систем UNIX является «вторая расширенная файловая система» ext2fs, основная до недавнего времени файловая система Linux. С момента выхода ядра версии 2.4.16 она начала уступать место «файловой системы по умолчанию» полностью совместимой с ней системе ext3fs. Рекомендуется использовать именно ext3fs, и именно она устанавливается по умолчанию инсталляторами большинства современных дистрибутивов.

2.2.1. Файловая система ext2fs — предшественница ext3fs.

Рассмотрим логическую структуру файловой системы ext2fs.

Физически жесткий диск разбит на сектора размером 512 байт. Первый сектор дискового раздела в любой файловой системе считается загрузочной областью. В первичном разделе эта область содержит загрузочную запись — фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Остальные сектора объединены в логические блоки размером 1, 2 или 4 килобайта. Логический блок есть наименьшая адресуемая порция данных: данные каждого файла занимают целое число блоков. Блоки, в свою очередь, объединяются в группы блоков. Группы блоков и блоки внутри группы нумеруются последовательно, начиная с 1.

Раздел диска, на котором сформирована файловая система ext2fs, может быть представлен такой схемой:

Структуры данных, применяемые при работе с файловой системой ext2fs, описаны в заголовочном файле /usr/include/linux/ext2fs.h.

Суперблок служит начальной точкой файловой системы и хранит всю информацию о ней. Он имеет размер 1024 байта и располагается по смещению 1024 байта от начала файловой системы. В каждой группе блоков он дублируется, что позволяет быстро восстановить его после сбоев.

В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память и все изменения файловой системы вначале находят отображение в копии суперблока, находящейся в ОП, и записываются на диск только периодически. Это позволяет повысить производительность системы, так как многие пользователи и процессы постоянно обновляют файлы. С другой стороны, при останове системы суперблок обязательно должен быть записан на диск, что не позволяет выключать компьютер простым выключением питания. В противном случае, при следующей загрузке информация, записанная в суперблоке, окажется не соответствующей реальному состоянию файловой системы.

Linux. Полное руководство.

Рис. 2.1. Структура файловой системы.

После суперблока следует описание (дескриптор) группы блоков. Хранящаяся в нем информация позволяет найти битовые карты блоков и индексных дескрипторов, а также таблицу индексных дескрипторов.

Битовой картой блоков (block bitmap) называется структура, каждый бит которой показывает, отведен ли такой же по счету блок какому-либо файлу. Значение 1 показывает, что блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл.

Битовая карта индексных дескрипторов выполняет аналогичную функцию по отношению к таблице индексных дескрипторов: показывает, какие именно дескрипторы заняты.

Каждому файлу соответствует один и только один индексный дескриптор (inode, i-узел, информационный узел), который идентифицируется своим порядковым номером — индексом файла. В индексном дескрипторе хранятся метаданные файла. Среди них — все атрибуты файла, кроме его имени, и указатель на данные файла.

Для обычного файла или каталога этот указатель представляет собой массив из 15 адресов блоков. Первые 12 адресов в этом массиве являются прямыми ссылками на номера блоков, в которых хранятся данные файла. Если данные не помещаются в 12 блоков, то включается механизм косвенной адресации. Следующий адрес в этом массиве является косвенной ссылкой, то есть адресом блока, в котором хранится список адресов следующих блоков с данными из этого файла.

Сколько блоков с данными можно так адресовать? Адрес блока занимает 4 байта, блок, как уже сказано, — 1, 2 или 4 килобайта. Значит, путем косвенной адресации можно разместить 256 — 1024 блока. Размер файла, занимающего столько блоков, считайте сами.

А если файл еще длиннее? Следующий адрес в массиве-указателе указывает на блок двойной косвенной адресации (double indirect block). Этот блок содержит список адресов блоков, которые, в свою очередь, содержат списки адресов следующих блоков данных.

И, наконец, последний адрес в массиве-указателе задает адрес блока тройной косвенной адресации, то есть блока со списком адресов блоков, которые являются блоками двойной косвенной адресации.

Пока остается непонятным, где находится имя файла, если его нет ни среди данных файла, ни среди его метаданных, В UNIX-подобных системах имя файла есть атрибут не самого файла, а файловой системы, понимаемой как логическая структура каталогов. Имя файла хранится только в каталоге, к которому файл приписан, и больше нигде. Из этого вытекают любопытные следствия.

Во-первых, одному индексному дескриптору может соответствовать любое количество имен, приписанных к разным каталогам, и все они являются настоящими. Количество имен (жестких ссылок) учитывается в индексном дескрипторе. Именно это количество вы можете увидеть по команде ls -l.

Во-вторых, удаление файла означает просто удаление записи о нем из данных каталога и уменьшение на 1 счетчика ссылок.

В-третьих, сопоставить имя можно только номеру индексного дескриптора внутри одной и той же файловой системы, именно поэтому нельзя создать жесткую ссылку в другую файловую систему (символическую — можно, у нее другой механизм хранения).

Сам каталог таким же образом приписан к своему родительскому каталогу. Корневой каталог всегда записан в индексный дескриптор с номером 2 (номер 1 отведен для списка адресов дефектных блоков). В каждом каталоге хранится ссылка на него самого и на его родительский каталог — это и есть псевдоподкаталоги «.» и «..».

Таким образом, количество ссылок на каталог равно количеству его подкаталогов плюс два.

Данные каталога представляют собой связный список с записями переменной длины и выглядят примерно так, как на рис. 2.2.

Linux. Полное руководство.

Рис. 2.2. Строение каталога в ext2fs.

А как же файлы физических устройств? Они могут находиться в тех же каталогах, что и обычные файлы: в каталоге нет никаких данных, говорящих о принадлежности имени файлу на диске или устройству. Разница находится на уровне индексного дескриптора. Если i-узел обычного файла указывает на дисковые блоки, где хранятся его данные, то в i-узле файла устройства содержится указатель на список драйверов устройств в ядре — тот элемент списка, который соответствует старшему номеру устройства (рис. 2.3).

Linux. Полное руководство.

Рис. 2.3. Разница между обычным файлом и файлом устройства.

Свойства файловой системы ext2fs:

♦ Максимальный размер файловой системы — 4 Тбайт.

♦ Максимальный размер файла — 2 Гбайт.

♦ Максимальная длина имени файла — 255 символов.

♦ Минимальный размер блока — 1024 байт.

♦ Количество выделяемых индексных дескрипторов — 1 на 4096 байт раздела.

2.2.2. Журналируемые файловые системы.

Представим такую ситуацию. У вас есть жесткий диск, скажем, на 80 Гб. Сегодня таким объемом никого не удивишь, не так ли? Вы поленились разбить его на разделы, и у вас есть один большой раздел, занимающий все ваши 80 Гб. И вот в момент записи на диск произошло отключение питания. Хорошо, если это случилось во время записи данных какого-то файла, пусть и очень важного: файл можно восстановить хотя бы частично. А вот если свет погас, когда операционная система записывала метаданные, то расположение файла на диске перестанет соответствовать списку принадлежащих ему блоков в индексном дескрипторе. Файловая система может утратить целостность, то есть такое состояние, когда каждый блок принадлежит не более чем одному файлу (inode). В результате вы можете не досчитаться не одного, а сотни файлов.

Признаком потери целостности служит бит чистого размонтирования (clean bit), точнее, его отсутствие. Этот бит сбрасывается при подключении (монтировании) файловой системы в знак того, что файловая система сейчас используется. После успешного размонтирования файловой системы этот бит устанавливается снова.

Если при монтировании файловой системы в процессе загрузки операционная система обнаруживает, что чистый бит не установлен, она запускает средство проверки файловой системы — программу fsck. Представляете, сколько времени займет такая проверка? Даже при условии, что ошибок будет мало или вообще не будет, придется ждать довольно долго. А если еще будет нарушена целостность, тогда восстановление этой целостности займет еще несколько минут вашего времени.

Все это справедливо для обычной файловой системы. Журналируемая же файловая система перед тем, как что-то сделать с файлами, записывает на диск некое описание планируемой операции и вычеркивает каждый пункт плана только после того, как он успешно выполнен. Тогда после сбоя можно будет не проверять на целостность весь огромный раздел, а только просмотреть журнал и откатить незаконченные операции.

Имейте в виду, что целью журналирования является обеспечение целостности файловой системы, а не сохранность пользовательских данных как таковых.

Журналировать операции записи самих данных тоже можно: в этом случае есть вероятность, что данные после сбоя будут восстановлены. Правда, согласно золотому правилу механики, за все нужно платить, и платить приходится быстродействием.

Решают вопрос разными ухищрениями: например, запись происходит в момент наименьшей активности, некоторые журналируемые файловые системы позволяют разместить журнал на другом физическом диске. Да и фактически время работы с журналом намного меньше, чем работа непосредственно с данными. И, естественно, некоторый полезный объем теперь приходится отводить под сам журнал, но его размеры обычно не превышают 32 Мбайт, что по нынешним временам не так уж и много.

И все же лучшим средством от неожиданного отключения до сих пор являются источники бесперебойного питания…

Современные версии ядра Linux (2.6.x) поддерживают в качестве родных четыре журналируемые файловые системы: ReiserFS, ext3fs, XFS и JFS. Из них журналирование данных поддерживает только ext3fs. Список файловых систем, которые поддерживаются вашим ядром, содержится в файле /proc/filesystems.

ReiserFS.

Разработана Хансом Райзером (Hans Reiser) и его компанией Namesys ( http://www.namesys.com) и официально включена в ядро 2.4.4. Преимущества данной ФС в основном проявляются в работе с мелкими файлами: они целиком хранятся в своих i-узлах (inode), без выделения блоков в области данных. Вместе с экономией места это способствует и росту производительности, так как данные и метаданные хранятся в непосредственной близости и могут быть считаны одной операцией ввода/вывода.

Другая особенность ReiserFS состоит в том, что хвосты файлов длиной меньше чем в один блок могут быть упакованы в один дисковый блок (режим тайлинга). Это обеспечивает около 5% экономии дискового пространства. Именно работа с маленькими файлами (меньше килобайта) и обслуживание большого их количества выделяет данную ФС среди прочих.

ReiserFS несовместима с ext2fs на уровне утилит обслуживания файловой системы, однако соответствующий инструментарий, объединенный в пакет reiserfsprogs, уже давно включается в стандартную поставку современных дистрибутивов. Если у вас его нет, то скачать можно по адресу ftp://ftp.namesys.com/pub/reiserfsprogs/reiserfsprogs-3.6.19.tar.gz.

Там же можно взять патчи для ядра 2.4.x.

К сожалению, загрузчики Linux (LILO и GRUB) не способны загрузить ядро Linux с раздела ReiserFS, оптимизированного в режиме тайлинга. Поэтому под каталог /boot лучше отводить отдельный раздел с файловой системой, совместимой с ext2fs.

XFS.

При работе с огромными (терабайтными) файлами вне конкуренции остается файловая система XFS, разработанная компанией Silicon Graphics (сейчас SGI) специально для операций с мультимедийными данными и впервые появившаяся в 1994 г. в версии ОС Irix 5.3. Она использует 64-битную адресацию, что позволяет увеличить максимальный размер файловой системы до 18 тысяч петабайт (при этом предельный размер файла составляет 9 тысяч петабайт).

Особенностью этой файловой системы является устройство журнала: в журнал пишется часть метаданных самой файловой системы таким образом, что весь процесс восстановления после сбоя сводится к копированию этих данных из журнала в файловую систему. Размер журнала задается при создании системы, он должен быть не меньше 32 мегабайт.

XFS эффективно распараллеливает операции ввода-вывода: она делит все пространство раздела на несколько равных областей (allocation group), служащих своего рода автономными файловыми системами в рамках единой XFS.

Пакет утилит обслуживания xfsprogs можно скачать с http://oss.sgi.com/projects/xfs/download.html (содержит ссылку на российское зеркало).

JFS.

Разработана IBM для рабочих станций под управлением ОС AIX, затем портирована для Linux и выпущена по Стандартной Общественной Лицензии. Всю необходимую информацию о ней можно найти по адресу http://jfs.sourceforge.net.

Размер журнала составляет примерно 40% от размера файловой системы. Эта файловая система может содержать несколько сегментов, содержащих журнал и данные. Такие сегменты называются агрегатами и могут монтироваться отдельно. Умеет она также хранить маленькие файлы и каталог и, содержащие не больше 8 файлов, в пределах индексного дескриптора.

Широкого признания пока не получила.

Ext3fs.

Файловая система ext3fs официально включена в ядро Linux с версии 2.4.16. Впервые она появилась в дистрибутивах RedHat и SuSE. Современные дистрибутивы, основанные на ядре 2.6.x, предлагают установить ext3fs по умолчанию.

Некоторые источники утверждают, что ext3fs — это всего лишь «надстройка» над файловой системой ext2fs, а не самостоятельная файловая система. Благодаря такому происхождению ext3fs совместима со всеми программами для обслуживания и настройки файловой системы ext2fs. И перейти на ext3fs можно простым добавлением файла журнала к ext2fs, не только без переформатирования раздела, но даже и без перезагрузки машины. Более того, ОС Linux на старых ядрах, не поддерживающих ext3fs, могут работать с разделами, на которых сформирована эта файловая система, просто подключая их как разделы ext2fs.

Кроме того, ext3fs — самая надежная из рассмотренных в этом параграфе новых файловых систем: в ней предусмотрено журналирование операций не только с метаданными, но и с данными файлов.

Журнал может быть включен в одном из следующих режимов:

♦ полного журналирования (journal);

♦ последовательном (ordered, применяется по умолчанию);

♦ обратной записи (writeback).

Режим полного журналирования позволяет минимизировать ваши потери при отключении питания, но является наиболее медленным из всех трех режимов. Этот режим и подразумевает журналирование записи пользовательских данных.

Самый быстрый режим — это «обратная запись». Это обыкновенное журналирование только метаданных.

Режим «последовательный» представляет собой компромисс между скоростью и полнотой. Официально журналируются только метаданные, но блоки соответствующих им данных записываются первыми. В большинстве случаев такой режим гарантирует сохранность данных, особенно если данные дописывались в конец файла, как обычно и бывает.

Какой режим выбрать? Если ваш сервер является файловым (FTP, WWW-сервер), то есть таким, который используется пользователями для хранения файлов, выберите режим полного журналирования — пользователи будут вам благодарны. Пусть в этом режиме сервер будет работать чуть медленнее, зато в случае ЧП можно минимизировать потери информации. Во всех остальных случаях нужно установить режим «Последовательный», точнее вообще не нужно ничего устанавливать — он используется по умолчанию.

2.3. Создание и монтирование файловых систем.

Создание файловой системы «вручную». Команда mkfs.

Из предыдущего параграфа следует, что создать файловую систему на разделе жесткого диска или внешнем носителе — это значит разметить его сектора на структуры данных, специфические для этой файловой системы (суперблок, список i-узлов, блоки данных). В DOS/Windows этот процесс называется форматированием. В UNIX-системах понятие форматирования не используется, а процедура и соответствующая команда так и называются — создание файловой системы.

В ходе установки Linux файловые системы на разделах жесткого диска создал для вас инсталлятор, и переделывать за ним ничего не нужно. Ручное создание ФС может понадобиться при подключении нового диска или, что гораздо чаще, дискеты. Выполняет его команда mkfs:

Mkfs [-t <тип>] [опции_ФС] ФС [блоков].

Типы и описание файловых систем, поддерживаемых Linux, вы найдете в справочной системе по команде man fs. Те типы, которые чаще всего используются на съемных носителях, перечислены в таблице 4.3. Ясно, что если вы «отформатируете» дискету с типом vfat, то она будет читаться и из-под Windows, а если с типом ext2/ext3 — только из-под Linux.

Если не указывать тип, то будет создана ФС с типом по умолчанию — в настоящий момент это ext2.

В качестве аргумента ФС можно указывать либо имя устройства ( /dev/fd0), либо точку монтирования ( /media/usbdisk). Последним аргументом можно указать количество блоков, которые нужно отвести под новую файловую систему.

Опции_ФС — это параметры, специфические для файловой системы определенного типа. Например, для ext2/ext3 можно указать:

♦  -b <размер_блока> (по умолчанию 4096 байт, но может быть и 1024 или 2048);

♦  -N <количество_i-узлов>,

♦  -i <байт_на_i-узел>.

Утилита mkfs передает эти опции настоящему конструктору ФС, которого вызывает в зависимости от указанного типа. Установленные у вас конструкторы можно найти по команде ls /sbin/mkfs*, а список опций конкретной ФС посмотреть на man-странице соответствующего конструктора (например, man mkfs.vfat).

Замечу только, что для ext3fs после ключа -J можно указать опции журналирования: size=<размер> — размер журнального файла в мегабайтах, и device=<устройство> — внешний журнал, заранее созданный на другом разделе.

Как я уже сказал, преобразовать существующий раздел ext2fs в ext3fs можно без перезагрузки системы, простым добавлением журнала командой tune2fs:

# tune2fs -j /dev/hd5.

Дополнительные конструкторы (для ReiserFS, XFS и т.п.) устанавливаются из пакетов reiserfsprogs и xfsprogs соответственно.

В результате на новом разделе образуется корневой каталог новой файловой системы и в нем — подкаталог /lost+found. Не удаляйте этот подкаталог: утилита fsck, предназначенная для проверки целостности ФС, помещает в него найденные куски нарушенных файлов.

Настройка автоматического монтирования при загрузке компьютера. Команда mount.

Чтобы с новой файловой системой можно было работать, она должна быть при помощи операции монтирования включена в общее дерево каталогов (п.1.1.3). О ручном монтировании/размонтировании применительно к съемным носителям сказано в п.4.2.5, а здесь я скажу, как сделать так, чтобы разделы жесткого диска автоматически монтировались при загрузке системы и демонтировались при останове. Для этого их нужно прописать в файл /etc/fstab, который читает команда mount в ходе начальной загрузки (об этапах загрузки и загрузочных сценариях см. п.9.1).

Каждая строка этого файла соответствует одной файловой системе и состоит из шести полей, разделенных пробельными символами:

<устройство> <точка_монтирования> <тип> <опции> <дамп> <номер_fsck>

♦ Устройство — это файл устройства, к которому подключен раздел (например, /dev/hda5). Для сетевой файловой системы здесь должно быть указано имя сервера и каталог на нем.

♦ Точка_монтирования — это имя каталога, к которому файловая система будет подключена. Он должен существовать и (желательно) быть пустым. Для раздела подкачки (swap) значение этого поля не используется, но в файле /etc/fstab присутствовать все равно должно.

♦ Вместо типа ФС можно указать значение auto: в этом случае команда mount попытается определить тип самостоятельно.

♦ Дамп — это отметка о необходимости резервного копирования данной ФС программой dump (п.10.4.3). Значение 1 говорит о том, что резервировать нужно, значение 0 — нет.

♦ Номер_fsck: утилита fsck обычно запускается перед автоматическим монтированием ФС, проверяет ее на целостность и пытается исправить найденные ошибки. Это процедура долгая, и для ускорения загрузки можно либо отключить проверку для некоторых ФС (значение 0), либо для некоторых разделов запускать ее параллельно. Значение этого поля задает порядок проверки разных ФС: если номера одинаковые, то системы будут проверяться параллельно. Ясно, что ускорение может получиться только в том случае, когда параллельно проверяемые разделы находятся на разных физических дисках.

Справку об опциях монтирования команды mount можно получить по команде man mount. В таблице 2.4 перечислены самые употребительные из них.

Основные опции монтирования Таблица 2.4.

Опция Назначение
auto ФС может быть смонтирована автоматически
га Смонтировать файловую систему в режиме «только чтение»
rw Смонтировать файловую систему для чтения и для записи (по умолчанию)
dev ФС может содержать файлы блочных и символьных устройств. Они интерпретируются как специальные файлы
exec Файлы на ФС могут быть исполняемыми
suid Разрешить использование битов SUID и SGID
user Разрешить непривилегированному пользователю монтировать и размонтировать данную файловую систему. Это значение влечет за собой noexec, nosuid и nodev, если после него явно не указано exec, suid или dev
noauto nodev noexec nosuid nouser Значения, противоположные соответствующим без «no»
defaults Установки по умолчанию: rw, suid, dev, exec, auto, nouser, async
codepage=<значение> Интерпретировать символы в именах файлов согласно кодовой странице
iocharset=<значение> Выводить символы в именах файлов согласно набору символов

Программа установки создала файл /etc/fstab, в котором перечислены все ваши Linux-разделы (корневой, swap и, если вы послушались п.1.3.4, /home). Теперь нужно сделать так, чтобы из-под Linux были видны данные на ваших Windows-разделах. Проверьте, поддерживает ли ваше ядро типы ФС на Windows-разделах ( cat /proc/filesystems, в выводе команды должны присутствовать слова vfat и/или ntfs). Обычно ядро, поставляемое с дистрибутивом, собрано без поддержки NTFS — если ваш Windows-раздел отформатирован с этим типом, то вам придется либо пересобрать ядро, либо, что гораздо проще, конвертировать раздел в тип FAT32.

Итак, после всех этих проверок я вписал в файл /etc/fstab строку:

/dev/hda6 /mnt/disk_e vfat rw,codepage=866,iocharset=utf8.

…и получил каталог /mnt/disk_e, всем файлам в котором приписан в качестве владельца root, а в качестве прав доступа — rwx-rxr-x. Если вас такой режим доступа не устраивает и хочется иметь право писать в этот каталог от имени непривилегированного пользователя, прочитайте на man-странице команды mount об опциях uid, gid и umask.