учебники, программирование, основы, введение в,

 

Файловая система: разделы, файлы и каталоги

Оптимизация размеров разделов
Вопрос об оптимизации дисковой подсистемы обычно встает как неизбежный результат отсутствия детального планирования системы в целом. Поэтому первым правилом, которое следует соблюдать системному администратору, желающему видеть свою систему быстрой и надежной, будет "планируй все заранее".
Когда требуется установить новый сервер Solaris, стоит подумать, чем этот сервер будет занят. В современном мире задачи компьютеров меняются быстрее, чем оборудование. Если пять лет назад почтовый сервер, обслуживающий сто пользователей, мог работать на медленном компьютере с диском 1 Гбайт, то нынче с почтой связано намного больше задач, чем просто прием, передача и хранение. Современный почтовый сервер для тех же ста пользователей принимает почту, проверяет ее на вирусы, блокирует спам, возможно, выполняет контекстный анализ письма для фильтрации спама и только после этого сохраняет его на диске. Объемы передаваемой почты тоже существенно возросли. Письма часто отправляются в формате HTML, а многие адресаты вкладывают в письма не только текстовые документы, но и фотографии, музыкальные файлы и видеоклипы. Поэтому, планируя свой новый почтовый сервер с запасом, вы не ошибетесь. Сейчас средний пользователь хранит в своем почтовом ящике несколько сотен мегабайт информации, следует ожидать, что в ближайшее время придется оценивать возможную нагрузку на файловую систему почтового сервера исходя из 5-10 Гбайт на каждого пользователя. Это не относится к серверам, которые только передают почту, но не хранят почтовые ящики пользователей.
Для передачи и приема нескольких писем в секунду придется установить новый компьютер с процессором Pentium IV, если на сервере будет запущена программа контекстного анализа писем для фильтрации спама (например, spamasassin). Объем памяти, естественно, тоже должен быть достаточным для одновременного запуска десятков копий программы sendmail или ее аналога.
Из этого видно, что характер работы сервера надо планировать еще до начала его установки. Во время установки следует задать верные размеры файловых систем. Это избавит вас от необходимости модифицировать их размеры в дальнейшем.
В Solaris размер корневой файловой системы / вполне может быть менее 3 Гбайт. Даже с учетом возможного обновления системы этого достаточно. Но файловая система /usr, куда будут устанавливаться все новые пакеты, должна быть спланирована с запасом. Если работа сервера будет связана с большой дисковой нагрузкой (кэширование http-запросов, хранение файлов или почты), то для этих специфических целей (например, кэш http-запросов) можно выделить отдельный раздел и назначить ему такой размер, который соответствует вашим потребностям.
Надо будет учесть такие факторы, как возможный рост потребностей, требуемая производительность (для подсистем SCSI лучше установить шесть дисков по 9 Гбайт, чем один размером 54 Гбайт, - так будет быстрее) и не забыть учесть "запас", который создает система на каждом разделе.
Как узнать, сколько места осталось на диске?
Оценить, как в текущий момент используется диск, поможет программа df:
df
/            (/dev/dsk/c0d0s0):      1787406 blocks 419477 files
/boot        (/dev/dsk/c0d0p0:boot): 19452 blocks   -1 files
/proc        (/proc               ): 0 blocks       2896 files
/etc/mnttab  (mnttab              ): 0 blocks       0 files
/dev/fd      (fd                  ): 0 blocks       0 files
/var/run     (swap                ): 1265832 blocks 30240 files
/tmp         (swap                ): 1265832 blocks 30240 files
/export/home (/dev/dsk/c0d0s7     ): 7647080 blocks 481212 files

Чтобы получить более удобную картину, в которой размер занятых блоков приводится в килобайтах, следует дать команду df -k:
df -k
Filesystem           kbytes  used   avail   capacity Mounted on
/dev/dsk/c0d0s0      1857844 964142 837967  54%      /
/dev/dsk/c0d0p0:boot 11234   1508   9726    14%      /boot
/proc                0       0      0       0%       /proc
Mnttab               0       0      0       0%       /etc/mnttab
Fd                   0       0      0       0%       /dev/fd
Swap                 632924  20     632904  1%       /var/run
Swap                 633208  304    632904  1%       /tmp
/dev/dsk/c0d0s7      3823549 9      3785305 1%       /export/home

Команда
df -o i

сообщит о количестве свободных и занятых индексных дескрипторов на разделе. Обратите внимание на то, что в других вариантах UNIX это делается с помощью команды
df -i

Для оценки размеров подкаталогов любого каталога используйте du. Например, для определения того, сколько места на дисках занимают подкаталоги корневого каталога, дайте команду du -s /*:
du -s /*
2       /bin
3011    /boot
87255   /cdrom
1424    /core
3068    /dev
76      /devices
6262    /etc
26      /export
6       /floppy
4       /format.log
1       /home
20702   /kernel
2       /lib
16      /lost+found
2       /Mail
2       /mnt
1       /net
2       /nsmail
14      /opt
3822    /platform
730131  /proc
50      /qq
2       /qqqq
34154   /sbin
640     /tmp
46      /TT_DB
1811752 /usr
46138   /var
0       /vol
19      /xfn

В этой команде ключ -s указывает, что следует выдать суммарные значения по всем подкаталогам, а аргумент /* требует, чтобы была посчитана статистика по всем подкаталогам и файлам корневого каталога. Без указания ключа -s программа du сообщит о том, сколько места занимает каждый из "листьев" дерева каталогов, т.е. выдаст длинный и подробный список всех подкаталогов вообще, включая подкаталоги подкаталогов подкаталогов...
Минимальное свободное пространство
При создании файловой системы часть раздела диска резервируется на всякий случай. Эта доля задается параметром minfree (параметр free при запуске программы mkfs) и по умолчанию составляет 10% общего объема файловой системы. Ко "всяким случаям" относят переполнение диска, т.е. превышение выделенного лимита пространства размещенными на разделе файлами, необходимость срочно найти свободный дисковый блок, когда диск почти заполнен, и тому подобное. В современных системах, когда файловые системы размером в сотни гигабайт - явление обычное, 10% свободного объема составляет значительный объем дискового пространства.
Чтобы уменьшить такие колоссальные издержки, значение minfree достаточно установить равным 1%. Кстати, при установке Solaris 9 на мой ноутбук ThinkPad 390X с диском размером 4 Гбайт, по умолчанию файловая система была создана именно с таким minfree. Несмотря на это, документация на mkfs_ufs утверждала, что 10% является значением по умолчанию. При создании файловой системы минимальное свободное пространство можно задать так:
mkfs_ufs -o free=1

или так:
newfs -m 1

Изменить параметры файловой системы UNIX можно с помощью программы tunefs.
После того как на диске осталось свободного пространства менее, чем указано в minfree, запись на диск сможет выполнить только root.

Фрагментация
Любая файловая система так или иначе ищет компромисс между бесконтрольной фрагментацией, как в системе FAT, и полным запретом на фрагментацию, как в файловой системе ОС RT-11. Одной из проблем FAT является необходимость регулярно дефрагментировать раздел, а в файловой системе RT-11 приходилось регулярно выполнять программу squeese, которая записывала друг за другом, последовательно, все файлы, разбросанные по диску. Фрагментация FAT приводила к снижению производительности ввода-вывода, а запрет на фрагментацию в RT-11 делал невозможным запись на диск большого файла, даже если на диске имелось полно участков, размер которых был лишь немногим меньше его длины, так как файл должен был быть записан только в последовательно расположенные блоки.
В файловой системе проблема фрагментации решается очень изящно. Фактически, фрагментация диска редко превышает 1-2% от его объема, что в мире Windows считается превосходным показателем.
Как удается достичь такого? Нужно ли что-то делать системному администратору, чтобы фрагментация не мешала производительности в UNIX?
Надо отметить, что термин "фрагментация" в UNIX означает явление, совсем не похожее на фрагментацию в FAT. В UFS, если на диск записывается файл размером меньше блока, ему выделяется фрагмент блока, но фактически "резервируется" целый блок, и файл, таким образом, имеет резерв для расширения до размера блока. Файлы размером больше блока записываются в свободные (по-возможности, последовательные) блоки файловой системы. Однако размер файла не всегда кратен длине блока, поэтому последний из блоков, в которые записан файл, будет, скорее всего, заполнен не до конца. В этот блок в UFS можно записать фрагмент другого файла. В этом смысле "фрагментом" файла в UFS называется часть файла, меньшая по размеру, чем блок. Фрагменты одного файла не могут храниться в разных блоках. Это иллюстрирует.
Индексный дескриптор хранит достаточно информации для того, чтобы идентифицировать не только блок, но и номер фрагмента в блоке, когда речь идет о размещении файла на диске.
Фрагментации в том смысле, в котором она мучает пользователей Windows, в файловой системе UFS не бывает, так как драйвер файловой системы сам заботится о том, чтобы размещать файл по-возможности в пределах одного цилиндра.
Чтобы выяснить, много ли фрагментов (в понимании UFS) на разделе, можно использовать команду fsck -n.
Для уменьшения числа фрагментов (в понимании FAT), т.е. частей файла, записанных на разделе в разных цилиндрах вдали друг от друга, и для записи файла в последовательные блоки следует воспользоваться коммерческими программами дефрагментации (см., например, http://www.eaglesoft.com/products.html - только для платформы SPARC) или выполнить резервное копирование всех файлов раздела и обратное их восстановление посредством программ ufsdump/ufsrestore.
Изменение размеров раздела
Для изменения размеров раздела UFS можно воспользоваться программой growfs. Если же изменить размер раздела по какой-либо причине не представляется возможным, следует установить новый диск и перенести часть информации на него, возможно, создав соответствующие символические ссылки на переполненном разделе. Подробнее об изменении размеров разделов дисков и повышении их производительности сказано в лекции 17.
Дерево каталогов
Все файлы в UNIX организованы древовидно: всегда существует корневой каталог, который обозначается "/". В нем есть подкаталоги. Обычно используются подкаталоги, перечисленные в .
Каталог /bin в Solaris является символической ссылкой на каталог /usr/bin.
Характерным свойством Solaris является выделение отдельного каталога /exports, в котором сосредотачиваются разделяемые по сети подкаталоги, доступные для пользователей других компьютеров. Каталог /opt, куда устанавливается некоторое дополнительное программное обеспечение (от optional, необязательное) тоже есть в системах Solaris, но отсутствует во многих других системах UNIX.


Таблица 6.1. Обычные подкаталоги корневого каталога Solaris 9

lrwxrwxrwx

1 root

root

9

Янв 22 14:54

bin -> ./usr/bin

drwxr-xr-x

1 root

root

16384

Янв 1 1970

boot

drwxr-xr-x

2 root

root

512

Янв 29 14:42

cdrom

drwxr-xr-x

14 root

sys

3584

Мар 16 15:49

dev

drwxr-xr-x

5 root

sys

512

Янв 22 15:03

devices

drwxr-xr-x

51 root

sys

3584

Мар 16 15:49

etc

drwxr-xr-x

3 root

other

512

Янв 28 17:38

exports

drwxr-xr-x

3 root

nobody

512

Янв 28 16:57

floppy

dr-xr-xr-x

1 root

root

1

Мар 16 15:49

home

drwxr-xr-x

12 root

sys

512

Янв 22 14:56

kernel

drwx------

2 root

root

8192

Янв 22 14:53

lost+found

drwxr-xr-x

2 root

sys

512

Янв 22 14:54

mnt

drwxr-xr-x

3 root

sys

512

Янв 22 15:48

opt

dr-xr-xr-x

63 root

root

30912

Мар 16 15:52

proc

drwxr-xr-x

2 root

sys

1024

Янв 22 15:51

sbin

drwxrwxrwt

6 root

sys

368

Мар 16 15:50

tmp

drwxr-xr-x

34 root

sys

1024

Янв 28 19:16

usr

drwxr-xr-x

32 root

sys

512

Янв 22 15:57

var

Каталог для временных файлов /tmp монтируется в Solaris на отдельную виртуальную файловую систему типа tmpfs. Это особый тип файловой системы. Если в системе есть свободная оперативная память, то драйвер tmpfs хранит данные, записанные на файловую систему этого типа, в оперативной памяти, а не диске. Если объем свободной памяти сокращается и она начинает требоваться другим программам, файлы из tmpfs записываются на раздел свопинга. Получается, что файлы, размещенные в файловой системе типа tmpfs, всегда занимают остаток оперативной памяти системы, для того чтобы она использовалась эффективно. Если свободной памяти нет, tmpfs размещается в пространстве свопинга.
Это автоматически приводит к тому, что записанные в файловую систему tmpfs файлы теряются после перезагрузки. Поэтому не следует хранить в /tmp какие-либо полезные файлы.
Скорость работы файловой системы tmpfs высока, т.к. часто все ее файлы физически расположены в оперативной памяти. Вследствие этого кэширование файлов на tmpfs не производится: они и так хранятся не на диске.
Казалось бы, использование tmpfs таит в себе резерв увеличения производительности любого приложения, поскольку достаточно записать данные в каталог /tmp и работать с ними там, чтобы скорость доступа к данным возросла многократно. На самом деле это не так, потому что чтение и запись любых дисков кэшируется, и лишь для некоторых приложений использование tmpfs оправдано. Несомненно увеличивается быстродействие компиляторов и других программ с большими объемами промежуточных файлов - но они и так используют /tmp для хранения временной информации в процессе работы.
По умолчанию Solaris применяет tmpfs только для /tmp. При этом система избегает существенного объема дискового ввода-вывода, так как /tmp используется для временных файлов различных программ.
Внимание: создание отдельного раздела /tmp на диске приведет к тому, что /tmp не будет создан системой автоматически с типом файловой системы tmpfs и производительность системы может уменьшиться!

Файлы и каталоги
Типы файлов
Если дать команду ls -l, то тип файла будет указан первым символом первого столбца вывода:
ls -l /etc
lrwxrwxrwx 1 root root   14 Янв 22 14:59 aliases ->
./mail/aliases
drwxr-xr-x 2 root bin   512 Янв 22 15:53 apache
...
-rw-r--r-- 1 root root   12 Янв 23 08:35 defaultrouter
-r--r--r-- 1 root root 1825 Янв 22 15:42 device.tab
-rw-r--r-- 1 root sys  2467 Янв 22 15:02 devlink.tab
drwxr-xr-x 2 root sys   512 Янв 22 14:54 dfs
prw------- 1 root root    0 Мар 16 15:50 initpipe
-rw-r--r-- 1 root sys  1087 Янв 23 08:33 inittab

Вывод команды ls для каталога /etc в этом примере сильно обрезан, на самом деле там несравнимо больше файлов. Нас интересуют различные типы файлов, которые мы здесь встретим.
В системах UNIX файлы могут быть обычными (этому типу соответствует обозначение -), а также представлять собой каталог (d), файл символьного (c) или блочного (b) устройства, символьную ссылку на другой файл (l), программный канал (p). В Solaris есть еще специальный тип door (дверь), ассоциированный с набором потоков в системе и требуемый для программирования взаимодействия потоков.
Обычный файл может содержать текст или двоичные данные - система не делает никаких предположений о содержимом файла в зависимости от его имени, в отличие от Windows-систем. Возможность запустить файл определяется исключительно правами доступа к файлу. Если вы попытаетесь запустить двоичный файл, система будет искать в нем корректный заголовок исполняемого кода. Если этот файл на самом деле не является программой UNIX, система просто сообщит об ошибке. При попытке выполнить текстовый файл он будет рассматриваться как скрипт командного процессора (если иное не указано в первой строке файла, где можно указать иной интерпретатор). Если файл не является скриптом, командный процессор завалит вас сообщениями об ошибках. Он будет выдавать не меньше одного ругательного сообщения на каждую строку. Не пытайтесь запускать то, что не должно запускаться!
Каталог представляет собой файл специального формата, содержащий имена файлов, которые лежат в этом каталоге, и номера их индексных дескрипторов. Подробнее об индексных дескрипторах рассказано в разделе "Индексные дескрипторы".
Файлы символьных или блочных устройств - это файлы, которые располагаются в каталоге /dev или связанном с ним (см. лекцию 5). Обмен данными с символьным устройством (например, с терминалом) идет посимвольно, с блочным (например, с диском) - поблочно.
О символическихссылках будет рассказано ниже в разделе "Ссылки"; это - файлы специального типа, аналог ярлыка в Windows.
Программный канал - это файл, образующийся в некоторых случаях при организации каналов связи между процессами. От администратора обычно не требуется никаких действий в отношении файлов типа p.
В каталоге /etc мы видим обычные файлы, символические ссылки, каталоги и даже один программный канал. Файлы этих типов (за исключением файлов каналов) и составляют большинство в системе.
Таким образом, в Solaris используются следующие типы файлов:
d каталог (directory);
D дверь (door);
l символическая ссылка (symbolic link);
b файл блочного устройства (block);
с файл символического устройства, устройства прямого доступа (character);
p специальный файл программного канала (FIFO, named pipe);
s сокет;
- обычный файл.

Имена файлов и каталогов
На имена файлов и каталогов распространяются одинаковые ограничения. Так, длина имени файла не должна превышать 255 символов, полное имя файла (т.е. путь от корня файловой системы до файла) не должен быть длиннее 1023 символов.
Имена файлов и каталогов в UNIX состоят из латинских букв верхнего и нижнего регистра, цифр и знаков препинания. Регистр букв имеет значение! Буквы верхнего и нижнего регистра в UNIX считаются разными символами, имена Alliance и alliance - это разные имена, хотя и отличаются всего лишь регистром одной буквы.
Из знаков препинания рекомендуется использовать только точку ".", тире "-" и подчеркивание "_". Использование других знаков (запятых, скобок, звездочки, решетки, вопросительного и восклицательного знаков и других) теоретически возможно, но неудобно. Дело в том, что командные процессоры и стандартные системные функции в UNIX интерпретируют такие знаки специальным образом (а именно, как шаблоны имен файлов или модификаторы команд в командном процессоре). Обращаться к файлу с именем ,/?*&^q-+|! придется тоже специальным образом, а это быстро надоест.
В UNIX не используется понятие "расширение имени файла", так как точка считается равноправным символом в имени. Следовательно, имя several.news.from.New.York смотрится в UNIX не более экзотично, чем index.html. UNIX не делает предположений о содержимом или назначении файла в зависимости от его имени и того, какие символы стоят справа от самой правой точки в имени.
Для того чтобы узнать, что содержится в файле, не открывая его, можно использовать программу file:
file bad.words
English text
       
Программа file использует специальный файл образцов - /etc/magic. Он содержит сведения о том, как должен выглядеть файл, чтобы его можно было отнести к какому-либо известному типу: текст (text), текст программы на языке С (C program), исполняемый код (executable file), данные (data) и т.д.
Имя может быть полным (абсолютным) или относительным. Полное имя файла - это имя с указанием пути к файлу от корневого каталога, например, /usr/local/squid/etc/squid.conf. Полное имя легко идентифицировать: оно всегда начинается с символа "/".
Относительное имя файла может быть очень коротким, например, просто f. Если в имени файла вообще нет знака "/" (слэш), то имя относится к файлу текущего каталога. Если слэш есть (но не в начале имени - например, squid/etc/squid.conf), то все, что находится слева от первого в имени слэша, расценивается как подкаталог текущего каталога.
Полное имя любого файла не должно быть длиннее 1023 символов. Однако, для обращения к файлу, расположенному очень глубоко в структуре каталогов, следует перейти в промежуточный каталог командой cd и оттуда обратиться к файлу по относительному имени. Скажем, вместо
vi /usr/home/ivan/projects/united_states/texas/cowboys/horses/
red/seats/sellers_training
       
можно обратиться к тому же файлу так:
cd /usr/home/ivan/projects/united_states
vi texas/cowboys/horses/red/seats/sellers_training
       
Кстати, обратите внимание на ввод многострочных команд: при необходимости перехода на другую строку при вводе длинной команды следует использовать символ экранирования (обратный слэш) "\". Следующий за ним символ перевода строки в таком случае будет интерпретирован как пустой символ, а не как символ завершения команды.
Полное имя файла также называют "путем к файлу", "путем файла" или "путевым именем файла".
Символ "~" (тильда) в большинстве командных интерпретаторов обозначает домашний каталог пользователя. Например, команда
cd ~anna/
       
требует перейти в домашний каталог пользователя anna, а знак "~" без имени пользователя означает домашний каталог текущего пользователя. Впрочем, интерпретатор sh знак ~ так не воспринимает, пользуйтесь bash!
Действия с файлами и каталогами
Обычный (regular) файл может содержать текст или двоичные данные.
Создать текстовый файл можно в любом текстовом редакторе или перенаправив вывод какой-либо программы в файл. Часто для создания какого-нибудь тестового короткого файла так и делают. Например, после установки web-сервера можно проверить, корректно ли он откликается на внешний запрос, только если у нас уже есть файл index.html, который он должен выдать в ответ на запрос. Быстрее всего создать этот файл так:
#cat > index.html
<HTML>
<BODY>
Hello everybody!
</BODY>
</HTML>
^D
#
       
Пустой файл можно создать командой touch, которая изначально была придумана для изменения времени модификации файла на текущее системное время:
touch filename
       
Эта операция бывает нужна при сборке программы из нескольких файлов, если мы хотим, чтобы были перекомпилированы все исходные тексты (по умолчанию компилируются только свежие).
Файлы копируют командой cp:
cp file1 file2
       
Переименование файла выполняет команда mv:
mv file1 file2
       
Командой mv файл можно переместить в другой каталог:
mv file /usr/progs/useless/
       
Если вы переносите или копируете файл или несколько файлов в каталог, то имя каталога правильнее указывать с завершающим слэшем в конце имени (например, /usr/progs/useless/). Это явным образом указывает на то, что имеется в виду именно каталог.
Если произошла ошибка и последний аргумент команды оказался не каталогом, а файлом, программа сообщит об этом. Если слэш не указать, то в случае ошибки старое содержимое файла, в который копируется новая информация, будет безвозвратно утеряно.
Файлы удаляют с помощью команды rm. В системах UNIX не предусмотрена возможность восстановления удаленных файлов (unerase), поэтому все, что стерто, пропадает навсегда. Системы UNIX в структуре файловой системы не имеют "мусорной корзины" (trash), в которую файлы попадают перед окончательным удалением. Правда, большинство графических сред обеспечивают такую "корзину", но только для тех файлов, которые были удалены программами, специально написанными с учетом этой возможности среды. Так, в Solaris в CDE есть своя корзина. В нее попадают те файлы и каталоги, которые были удалены программами, знающими об этой корзине. Как правило, о ее существовании подозревает только File Manager CDE. Возможность восстановления стертых файлов предоставляется не операционной системой, а графической оболочкой CDE, поэтому не стоит рассчитывать, что любой файл можно восстановить из корзины CDE. Например, если файл был удален командой rm из командной строки xterm (эмулятор тер минала для графической среды), то его уже не восстановить. Команда rm не знает о существовании корзины в CDE, даже если запускается в окне терминала в графическом режиме.
Вывести файл на экран можно командами cat, more, less, pg, page.
Программы cat и more есть в любой системе UNIX, другие перечисленные выше команды - это варианты команды more и присутствуют не всегда. Назначение more и ее "коллег" - поэкранный вывод длинных файлов. При выводе информации программа more останавливается, заполнив экран содержимым очередной страницы файла, и ждет команды. При нажатии "Enter" выводится следующая строка, при нажатии "пробела" - следующая страница. Можно искать подстроку в тексте, по команде
/подстрока
       
Клавишами <Ctrl-B>, <Ctrl-F> можно перемещаться назад и вперед на одну страницу, клавиша q служит для выхода из программы во время просмотра текста.
Каталоги
Слово "каталог" употребляется наряду со словом "директория" (directory). В терминологии большинства Windows-систем то же самое обозначает слово "папка" (folder). Среди системных администраторов UNIX принято употреблять термин "каталог".
Каталог представляет собой файл особого типа, который содержит таблицу из двух столбцов: в первом значится имя файла, во втором - номер индексного дескриптора, который описывает файл. В одном каталоге не может быть файлов или подкаталогов с одинаковыми именами.
Каталог может содержать и файлы, и подкаталоги. Пустой каталог создается командой mkdir. Удалить пустой каталог можно командой rmdir, непустой каталог удаляется командой
rm -rf каталог
       
Например, по команде
rm -rf /usr/local/squid/
       
будут удалены каталог /usr/local/squid, а также все файлы в нем и все его подкаталоги.
Перенести или переименовать каталог можно командой mv, для копирования каталогов вместе с подкаталогами используется команда cp -Rp.
Список файлов и подкаталогов в каталоге выдает команда ls. Если запустить ls без параметров, она выдаст только список имен фaйлов. Эта команда имеет множество ключей, из которых наиболее полезны перечисленные в.


Таблица 6.2. Некоторые ключи программы ls

l (long)

вывести полную информацию о файле

a (all)

вывести все файлы, в том числе те, чьи имена начинаются с точки

i (i-nodes)

вывести номера индексных дескрипторов

t (time)

отсортировать файлы по времени последней модификации

При создании каждого каталога в нем всегда появляются две записи - "." (точка) и ".." (две точки). "Точка" ссылается на сам текущий каталог, а "две точки" - на родительский каталог. В корневом каталоге обе эти записи указывают на корневой каталог.
По умолчанию программа ls выводит информацию обо всех файлах, за исключением тех, чьи имена начинаются с символа "." (точка). При указании ключа -a эти файлы тоже включаются в общий список.
Файлам, которые содержат важную конфигурационную или служебную информацию, традиционно дают имена, начинающиеся с символа "точка". Таковы, например, файлы .profile, .xsession, .bashrc, .history и другие.
Перейти из одного каталога в другой можно по команде
cd каталог

Команда cd без аргументов вызывает переход в домашний каталог текущего пользователя и эквивалентна cd ~.
Вывод на экран полного имени текущего каталога выполняется командой pwd.

Ссылки

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

# ls -li file*
  16852 -rw-r--r--    2 root    root    0 Mar 20 16:11 file
  16852 -rw-r--r--    2 root    root    0 Mar 20 16:11 file1
    

В этом примере видно, что в каталоге есть два файла с разными именами, но все остальные свойства у них одинаковы. Это обусловлено тем, что файлы имеют один и тот же индексный дескриптор (его номер выводится в первом столбце).
Число в третьем столбце показывает, сколько в файловой системе есть жестких ссылок на этот файл. Физически файл один, так как местоположение содержимого файла на диске определяется индексным дескриптором. При этом можно обратиться к этому файлу, называя его разными именами. Фактически, после создания жесткой ссылки на файл определить, какое из имен было придумано раньше, невозможно. Права доступа ко всем жестким ссылкам на файл одинаковы, так как определяются одним и тем же индексным дескриптором.
Смысл жесткой ссылки состоит в возможности поместить в разные каталоги записи об одном и том же файле, без многократного копирования этого файла во все каталоги, где нужна запись о нем. При модификации файла, независимо от того, через какую именно жесткую ссылку к нему обратились, изменяется информация в самом файле. Если модифицировать файл, обратившись к нему по одному имени (через одну жесткую ссылку), и записать сделанные изменения, то при последующем обращении к нему через другую жесткую ссылку вы увидите уже новую, модифицированную информацию.
Жесткие ссылки создает команда ln:

ln старое_имя новое_имя
    

При создании жесткой ссылки сам файл не модифицируется, старое имя никак не изменяется, результат выполнения команды проявляется только в создании еще одного имени этого файла.
Нельзя создать жесткую ссылку на файл, который располагается на другом разделе UNIX. Это связано с тем, что каждый раздел файловой системы имеет свою таблицу индексных дескрипторов, а указать в каталоге индексный дескриптор чужого раздела невозможно. Также нельзя создать жесткую ссылку на любой каталог.
Файл в любой файловой системе UNIX считается удаленным только тогда, когда удалены все жесткие ссылки на него. Удаление жесткой ссылки выполняется командой rm и внешне ничем не отличается от удаления обычного файла.
Найти все жесткие ссылки на файл можно с помощью команды find:

find откуда_искать -inum номер_индексного_дескриптора_файла
    

Например, find / -inum 16852.
Символическая ссылка - это запись в каталоге, ссылающаяся на файл с определенным именем. Фактически, символическая ссылка - это отдельный файл типа "символическая ссылка", и индексный дескриптор этого файла содержит только путь к файлу или каталогу, на который указывает ссылка:

ls -l
lrwxrwxrwx 1 root root :. qq ->/usr/home/qq
    

Можно создать символическую ссылку на любой каталог, а также на файл, находящийся в другом разделе UNIX. Символическая ссылка является аналогом ярлыка (shortcut) в системах Windows. При удалении символической ссылки с файлом или каталогом, на который она ссылается, ничего не происходит. При удалении файла, на который указывает символическая ссылка, она "повисает в воздухе", ссылаясь на пустоту. В последнем случае при обращении к такой "пустой" ссылке возникнет ошибка file not found, несмотря на то, что сама ссылка будет видна и доступна в списке файлов.
Обычно по команде ls -l выдается не только информация о типе файла 1, если это символическая ссылка, но и указывается, на что она ссылается. Если эта информация не появилась, попробуйте дать команду ls -F. В разных системах UNIX ключи программы ls могут незначительно отличаться.
Права доступа
Давно известно, что в Москве раньше были две угнетаемые нации: "погазоны" и "улюки". Их никто никогда не видел, но всем было их очень жалко. Куда ни пойдешь, везде пестрели надписи: "Погазонам не ходить", "Машины улюков не ставить".
В каждой многопользовательской системе полагается развешивать такие таблички по каталогам, чтобы доступ к информации имели только те, кому он разрешен.
Система безопасности UNIX основана на правах доступа к объектам файловой системы - файлам и каталогам. У каждого каталога или файла есть один владелец и один групповой владелец. Группового владельца файла мы будем для краткости называть группой файла.
Словосочетание "группа файла" не означает, что файлы объединены в какие-то группы. Группа файла - это группа пользователей, которой даны некие специальные права на доступ к этому файлу.
Дав команду ls -l в любом каталоге, мы увидим нечто вроде
-rw-r--r--    1 root    root    433 Feb 2 10:30 acd.c

Первый столбец - это тип файла (первый символ) и права доступа (остальные девять символов). Затем указаны число жестких ссылок на файл, владелец и группа файла, размер файла в байтах, дата последней модификации в формате "Месяц Число Год Время" и имя файла. Год часто не указывается для тех файлов, которые были модифицированы в течение последних 12 месяцев.
Права доступа делятся на три части: права, данные, соответственно, владельцу файла, группе файла и всем остальным (обозначаются термином other или world). Таким образом, девять бит слова прав доступа делятся на три части по три бита:
rwx | rw- | r--|
u     g     o

Часть, обозначенная буквой u (user), определяет права доступа владельца файла, буквой g - права доступа группы файла, буквой o - права всех остальных. Существуют права трех типов: на чтение (r, read), запись (w, write) и запуск на выполнение (x, execute). Пользователю, который хочет обратиться к файлу, даются права доступа либо владельца, либо группы файла, либо "всех остальных". Права доступа проверяются так (см, на примере слова прав доступа rwxrw-r--):
Когда процесс, работающий от имени пользователя, пытается получить доступ к файлу, система выясняет, является ли он владельцем файла. Если является, то он получает права доступа, определенные для владельца файла. Если он - не владелец, но входит в группу, которая является группой файла, то он получает права доступа, определенные для группы файла. Если он не относится ни к одной из этих двух категорий, он получает права, определенные для всех остальных. Права разных категорий пользователей не складываются: если доступ к файлу хочет получить его владелец, и он входит в группу файла, но права группы более широкие, чем права владельца (например, слово прав доступа r-xrwxr--), то он все равно получит права владельца (в последнем примере - r-x). Для большинства файлов и каталогов права их владельца обычно шире, чем у группы.
Слово прав доступа представляет собой последовательность из двенадцати бит. Для назначения прав доступа обычно используются только обсужденные выше младшие девять бит, поэтому права доступа часто записываются в виде трех десятичных чисел, показывающих права владельца, группы и всех остальных соответственно. Установленный в единицу бит говорит о наличии соответствующего права:

  • мнемоническое обозначение слова прав доступа: rwxrw-r--
  • двоичное представление слова прав доступа: 111 110 100
  • десятичное представление слова прав доступа: 7 6 4

В документации часто встречается требование при установке какой-либо программы установить для некоего каталога права доступа 755. Имеются в виду права rwxr-xr-x, что соответствует полному доступу владельцу и доступу на чтение и запуск группе и всем остальным.
Право запуска в отношении каталога определяется как право поиска в каталоге, что на практике означает право на чтение индексных дескрипторов файлов и подкаталогов этого каталога. Действительно, возможность узнать, какие именно файлы есть в каталоге, определяется правом на чтение каталога. А вот более подробная информация о файлах (кто их хозяин, где лежат и т.п.) доступна только тем, кто имеет право на поиск в каталоге. Наличие или отсутствие права поиска в каталоге не влияет на права пользователя root: ему разрешен поиск в любом каталоге.
Старшие три бита слова прав доступа относятся к запуску файла, поэтому детально они рассмотрены в лекции 7. Вот как выглядит слово прав доступа:
su sg t    r w x r    w x r    w x

Старшие три бита - это бит установки владельца при запуске файла (suid), бит установки группы (sgid) при запуске файла и бит запрета выгрузки файла на диск при выполнении (t).
Для каталога биты suid и sgid имеют другое значение. По умолчанию при создании файла он наследует владельца и группу от процесса, который его создал. Аналогичное правило распространяется и на каталоги. Однако если в правах доступа к каталогу установлен бит suid, то созданный в нем файл или подкаталог будет принадлежать не владельцу по умолчанию, а владельцу каталога с битом suid. Это правило не работает для систем Solaris, хотя справедливо для некоторых других систем UNIX.
В Solaris это правило распространяется только на группу файла, но не на владельца. То есть владельцем нового файла будет владелец создавшего его процесса, независимо от наличия бита suid у каталога, где создан файл. Но если каталог имеет установленный бит sgid, то группой нового файла станет группа процесса-создателя.
Бит запрета выгрузки файла на диск при выполнении (sticky bit) в старых версиях UNIX использовался для указания того, что при выполнении программы, записанной в этом файле, ее страницы запрещено выгружать на диск. В настоящее время sticky bit используется для каталогов, с тем, чтобы указать особые условия удаления файлов из каталога. Если sticky bit установлен для каталога, то все пользователи, кроме root, могут удалять из каталога только те файлы, которые им принадлежат, независимо от прав доступа к каталогу. В разных системах UNIX он может интерпретироваться по-разному, поэтому смотрите для уточнений man sticky и man chmod.
Индексные дескрипторы
Формат таблицы индексных дескрипторов и самих дескрипторов обсуждался в лекции 5. Следует сказать, что непосредственное изменение индексного дескриптора невозможно, так как модификацию дескриптора выполняют различные программы в процессе своей работы. Нет необходимости вмешиваться в содержимое индексного дескриптора напрямую. Для восстановления таблицы индексных дескрипторов после сбоя следует воспользоваться программой fsck.
Списки ACL
Стандартные права доступа в UNIX не всегда идеальным образом подходят для решения задач администрирования системы. Например, что сделает администратор, если доступ к файлу на чтение и запись надо дать одной группе пользователей? Конечно, сделает эту группу владелицей файла, а затем делегирует право чтения и записи файла этой группе, вот так:
chgrp нужная_группа файл
chmod g=rw файл

А если надо дать право доступа только одному из членов этой группы? Тогда можно создать новую группу специально для этой цели, сделать ее членом только одного пользователя, и затем указать, что эта новая группа будет владеть файлом:
addgroup новая_группа
chgrp новая_группа файл
chmod g=rw файл
#редактируем /etc/group и добавляем в новую группу
существующего пользователя
vi /etc/group

Такое ухищрение нам помогло, но что делать, если надо дать право чтения, записи и запуска двум разным пользователям, а еще двум - право чтения и записи, а еще одному - только чтения? А всем остальным - вообще не дать доступ к этому файлу? На такой вопрос нет ответа, если вы работаете в "классической" версии UNIX. Однако некоторые современные системы UNIX (например, Solaris Linux и FreeBSD) обладают требуемым механизмом. Это - списки управления доступом к файловой системе, access control lists (ACLs).
Списки управления доступом дают более гибкие возможности назначения прав доступа, чем традиционные права доступа UNIX. С помощью ACL можно назначить как права доступа хозяина файла, группы файла и всех остальных, так и отдельные права для указанных пользователей и групп, а также максимальные права доступа по умолчанию, которые разрешено иметь любому пользователю.
Здесь и далее мы будем называть ACL для файлов и каталогов "расширенными правами доступа". Расширенные права доступа к файлам и каталогам устанавливаются командой setfacl.
Они представляют собой ряд полей, разделенных двоеточиями:
entry_type:[uid|gid]:perms

Здесь entry_type - тип расширенного права доступа, uid и gid - идентификаторы пользователя и группы, соответственно, а perms - собственно назначаемые права доступа.
Расширенные права доступа (ACL) к файлам
Расширенные права доступа к файлу могут быть такими, как показано в .


Таблица 6.3. Расширенные права доступа к файлам

u[ser]::perms

права доступа хозяина файла

g[roup]::perms

права доступа группы файла

o[ther]:perms

права всех остальных

m[ask]:perms

маска ACL

u[ser]:uid:perms

права доступа указанного пользователя; в качестве uid можно указать и UID, и имя пользователя

g[roup]:gid:perms

права доступа указанной группы; в качестве gid можно указать и GID, и имя группы

Маска задает максимальные права доступа для всех пользователей, за исключением хозяина и групп. Установка маски представляет собой самый быстрый путь изменить фактические (эффективные) права доступа всех пользователей и групп. Например, маска r-- показывает, что пользователи и группы не могут иметь больших прав, чем просто чтение, даже если им назначены права доступа на чтение и запись.
Расширенные права доступа (ACL) к каталогам
Кроме расширенных прав доступа к файлу, которые могут быть назначены и каталогу, существуют специфические права доступа к каталогу, а именно права доступа по умолчанию. Файлы и подкаталоги, которые будут создаваться в этом каталоге, будут получать такие же расширенные права доступа по умолчанию, которые заданы в расширенных правах доступа к этому каталогу.


Таблица 6.4. Расширенные права доступа к каталогам

d[efault]:u[ser]::perms

права хозяина файла по умолчанию

d[efault]:g[roup]::perms

права группы файла по умолчанию

d[efault]:o[ther]:perms

права остальных пользователей по умолчанию

d[efault]:m[ask]:perms

маска ACL по умолчанию

d[efault]:u[ser]:uid:perms

права доступа по умолчанию для указанного пользователя; в качестве uid можно указать и UID, и имя пользователя

d[efault]:g[roup]:gid:perms

права доступа по умолчанию для указанной группы; в качестве gid можно указать и GID, и имя группы

Устанавливая права доступа по умолчанию для конкретных пользователей и групп, необходимо также установить права доступа по умолчанию для хозяина и группы файла, а также всех остальных, а также маску ACL (эти четыре обязательных записи указаны выше по тексту - первыми в таблице расширенных прав доступа к файлу).
Присвоение расширенных прав доступа осуществляется программой setfacl с ключом -s (set). Без этого ключа расширенные права доступа модифицируются, с ним - устанавливаются в точности такими, как указано в данной команде setfacl.
Например, чтобы установить права на чтение и запись файла project07 для пользователей lena и petr, надлежит выполнить команду
setfacl -m user:lena:rw-,user:petr:rw-    project07

Ключ -m служит для добавления прав доступа, а не для их замены. Эффективные (т.е. те, которые в самом деле будут иметь место) права доступа пользователей lena и petr определяются не только их персональными правами доступа к этому файлу, но и маской, которая показывает права доступа по умолчанию. Из персональных прав и маски выбираются наиболее строгие ограничения, поэтому, если в персональных правах доступа или в маске для файла project07 отсутствует право на запись, то ни lena, ни petr не получат реальной возможности изменить файл project07.
Расширенные права доступа не показываются в выводе программы ls, но команда ls -l позволяет установить наличие расширенных прав доступа к файлу или каталогу. Если они назначены, то в первой колонке после стандартных прав доступа владельца, группы файла и остальных будет стоять знак "+" ("плюс"). Узнать, какие именно расширенные права доступа назначены, можно с помощью команды
getfacl имя_файла

Более подробную информацию о ключах setfacl и getfacl следует получить из man.
Помните, что назначение прав доступа с помощью chmod может привести к изменению записей ACL, а изменение маски ACL может повлиять на фактические права доступа к объекту для его владельца, группы и всех остальных пользователей.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика