Файловая система и объекты в ней

Долги за прошлую лекцию

Поменять цвет текста в man можно, изменив переменную окружения.

На самом деле, нет никакого цвета букв, есть только специальные esc последовательности. Это последовательности, которые не выводятся на экран, а управляют терминалом.

Пример:

Cat ^[[35m

То же самое относится к управлению курсора, т.е. мы вручную вмешиваемся в настройки системы и меняем ее параметры под свои нужды. Мы изучали подсистемы документации. Одной из них является info но навигация по ней крайне не удобна, оно сделано наподобие управления emax (сложно). Поэтому вместо info можно использовать pinfo (удобней управление). Но, как мы помним из прошлой лекции, pinfo не хотел выводить какие-либо документы. Дело в том, что pinfo было некоторое время заброшен, Это привело к тому, что он долго не обновлялся. Для того чтобы pinfo заработал, нужно просто его обновить.

Пример

До обновления

cd /usr/share/man/man1
pinfi nano – не работатет, т.к. не знает файлы типа hz

Для того, чтобы это заработало, нужно обновить pinfo. После обновления видим, что верся программы поменялась

rpm –qi pinfo 

Теперь работает

pinfo  nano

Пример показательный: что-то не нравится в Linux, просто взял и поменял. Причем от вас не требуются какие-то особое знания: чуть-чуть знания c и все. Свободные ос позволяют такие вещи.

Новая тема

Сегодня разговор пойдет о том, что командная строка (инвариант операционной системы) базируется на двух других инвариантах Linux, приехавших из Unix, а именно о том, что все в Linux – это файлы и то, что с ними работает – процессы, больше ничего. Т.е. ОС – это только взаимодействие файлов и процессов.

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

/bin содержит исполняемые файлы. Нужно помнить, что для того, чтобы получать доступ к файлам в корне, нужно писать

ls /

Красные файлы – запускаемые.

Ls -1 

Вывод в столбик.

Есть еще один каталог, содержащий исполняемые файлы – это /usr/bin/

/bin содержит основные исполняемые файлы, а /usr/bin содержит вообще все. Большинство программ содержится именно тут. Когда мы запускаем программы в терминале, он берет их именно в тут (в этом можно убедиться, просмотрев переменную PATH)

Для удобства есть еще и /usr/local/bin.

Если кому-то известно, во многих ОС есть динамическое связывание файлов, когда все нужные функции есть в файле с библиотеками. В /usr/lib64 лежат файлы вида libчего-нибудь. Идея в том, что без библиотек программы просто не заработают, т.к. в библиотеках лежат необходимые для работы функции.

l /lib64 

Тоже содержит библиотеки

Из всего выше сказанного следуют, что нельзя просто взять скопировать бинарный файл, т.к. без библиотек он не будет работать. Можно посмотреть, какие библиотеки нужны для работы программы (например dig):

ls /usr/bin/dig 

На компьютере могут быть установлены как 64 разрядные программы, так и 32 разрядные, поэтому нужно иметь /lib и для 64, и для 32. Такие каталоги есть и в корне, так и в /usr/. Минимум лежит в корне, все остальное в /usr/.

ls /usr/share – там многовсего

Идея: если есть какой-то пакет, то ее бинарники лежат в /usr/bin/.

Бинарные файлы специфичны для разных архитектур (зависят от архитектуры), а если в пакет входят архитектуро-независимые файлы, то такие файлы лежат в /usr/shar/название_пакет или usr/share/doc - там лежит вся документация.

Каталог /usr/share. Название share происходит из того, что в давние времена, когда жесткие диски были дорогие, но сеть уже использовалась, часто реализовывали следующую схему: есть некоторое количество дисков и много машин. Машины берут платформо-независимые файлы из удаленного диска, а архитектуро-зависимые вещи хранятся на самой машине. Таким образом экономилась память. => разделение архитектуро-зависимые и архитектуро-независимые файлов – хорошая идея.

/usr/share/man - там лежат страницы man. В man есть 9 секций

  1. Команды
  2. Системные вызовы
  3. Пользовательские вызовы
  4. Файлы и устройства
  5. Форматы файлов
  6. Игры
  7. Разное, в том числе стандарты
  8. Команды, которые обычно пользователю не нужны
  9. Не существует

ls /usr/share/man/man8

А команда man просто запускает интерпретатор, которой форматирует текст из страницы мана (т.к. страница man – это архив) и запускает less, чтобы показать текст на экране.

Раз есть команды, которые нужны только администратору. Они лежат в /sbin.

Каталог /usr/local В нем опять есть bin, share, sbin. Мы имеем дело с дистрибутивом, значит, все файлы пришли из пакетов => они могут быть удалены с удалением пакетов. Но может случиться так, что в системы установлены локальные вещи: сценарии, самописные программы и т.д. Для этого нужен local. Таким же свойством обладает каталог opt. Идея в том, что если в /usr/local/ файлы раскладываются в разные каталоги как им это предписано, то в opt они все лежат в одном месте. Туда ставится все, что не имеет структурированного начала, или пришло не из пакета.

Есть 3 способа запустить программы оттуда

  1. Просто добавтить в PATH
  2. По полному пути

Замечание: whatis – просматривает только заголовок мана apropos – выдает все заголовки со словом

  1. сделать ее запускаемой на рабочем стале методами граф окружения

Каталог /etc. Сначала туда просто складывали все, что не удалось классифицировать. Сейчас там лежат все настройки (настроечные файлы)

less /etc/dictionaries-common/words - настроечный файл программы словарей онлайн. 

Настройка выглядит так:

№ -комментарий
{}- секция
Команды управления

Никакого стандарта на структуру config файла не существует Пример

less /etc/rearj.cfg - совсем другой

Довольно часто config файлы являются кусками программы на языке shell Пример

less /etc/sysconfig/xserver.cfg   

Это сценарий запуска графического окружения. Стандартная ситуация: есть сценарий, который что-то делает, а конфигурационный файл – другой сценарий, который его дополняет. Большинство файлов настройки – текстовые (human readable) формат, который легко читать и изменять. В каталоге /etc содержится сценарий для запуска ОС по старому способу с использованием init.

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

Каталог /var содержит файлы переменного размера: кеш, логи и т.д.

Когда мы говорим про файловую систему, то с одной стороны имеем в виду структуру каталогов, а с другой - именно последовательность байт в которой файлы хранятся на диске (особо размеченное пространство, на котором будут храниться данные). Эти два определения примыкают друг к другу в том, что в линуксе все устройства, содержащие структуру файлов, прикрепляются (монтируются) к общему дереву (корню). В нашем случае в нашей машине 2 диска => смонтированно 2 файловые системы к общему дереву. Именно поэтому мы можем говорить о едином пространстве имен. Поэтому в документации есть отдельно корень /usr и /var. Обычно /var вообще монтируется отдельно, т.к. хотелось бы чтобы он был не чувствителен к переполнению. К тому же, например, в /etc писать нужно редка, а вот в /var запись и чтение происходят часто.

Еще одно место: каталог /dev, в котором лежат файлы, которые не являются файлами. Если туда посмотреть, то можно увидеть, что там есть файлы, которые не имеют размера, вместо него там 2 числа – id устройства. Это потому что это не файлы, а виртуальные устройства.

Например

/dev/null - устройство, в которое может писать и читать кто угодно

/dev/zero – там лежат 0, столько сколько хочешь

/dev/urandom – выдает случайные байты в любом количестве

В частности, есть так же устройства доступа к памяти, к жесткому диску, к терминалу (тоже устройство). Таким образом, подключение соответствующего раздела (или псевдоустройства) происходит командой maunt.

Этот способ представления информации очень удобен: можно не только монтировать каталоги, но и получить представление о системе, просто посмотрев на дерево каталогов. Пример

ls /sys/class/power_supply/C1B4/type – питание (устройство)
/sys/class/power_supply/C1B4/online  

Каталог /sys не соответствует никакому диску, но в нем в виде файловой системы представлена информация о системе. Отдельна разговор о каталоге /tmp – это файловая система в памяти. Нужна затем, что обращение к оперативной памяти гораздо быстрее, чем обращение к диску.

Немного про работу с файлами

ls, rm – показать и удалить

Пути бывают относительные и полные. Полный путь начинается с корня / а относительный – с текущего каталога. Команда touch нужна для того, чтобы менять время последней правки файла. Файловая система может хранить время создания, просмотра и правки файла.

Для того чтобы сделать какой-нибудь каталог текущим, нужно написать cd путь .

Просто cd возвращает в домашний каталог.

./ нужно для того чтобы указать текущий каталог.

Если написать ls –al, то можно увидеть что в любом каталоге есть 2 каталога: текущий и предыдущий cd - единственная команда shell, которая не может быть программой, т.к. текущий каталог – атрибут только текущего процесса. Соответственно, команда cd не может быть внешней, т.к. иначе по ее завершению, каталог менялся бы на первоначальный. Можно создать каталог с помощью mkdir название

Создать файл cat > название

Файл можно переименовать с помощью mv старое_название новое_название.

Файл можно копировать с помощью cp откуда куда

diff файл_1 файл_2  - сравнение файлов

diff –u файл_1 файл_2 – удобней сравнение

cmp файл_1 файл_2 – просто определяет, являются ли файлы разными, или одинаковыми

Можно одному и тому же файлу выдать несколько имен с помощью ln название_файла название_ссылки, (как в питоне) Но это не работает для каталогов и для разных типов файловой системы Поэтому если вы хотите сделать ссылку на каталог: ln –s название_каталога название_ссылки. Ссылка - это файл, в котором лежит просто путь до папки, который раскрывается при подстановке в другие команды. ls –l показывает количество имен у данного файла alias – определяет команды в shell Идентификатор для большинства Unix систем – это индексный дескриптор ls –I – показывает файлы с индексом дескриптора