Л. любит «принципы» — так проще описывать сложные системы. Всё можно понять — это значит, ничего не запрещено понимать и вся информация налицо.
Все мы процессы, потому что не пользователь удаляет файл с диска, а запущенный им процесс (действующий субъект). С объектами (файлами) работают только процессы, они получают или не получают доступ и т. п. «Процесс — Полномочный Представитель Пользователя в системе».
Все они, т. е. объекты системы — файлы («всё — файл»). Если что-то может получать и отдавать данные потоком (write и read), это что-то надо сделать файлом. Имя (полный путь) файла — идентификатор, как ключевое поле в БД.
Все наши файлы, то есть файлы, которые мы напрямую модифицируем и читаем — текстовые. Причём текст этот размеченный.
Для каждой подзадачи существуют удобные программки — «утилиты». Shell ими управляет, заставляет взаимодействовать, вот и получается управление системой.
О примерах.
При нажатии на ссылку с примером запустится окно DemoScreen, если ещё не запущен. Он тут же уедет на соседний рабочий стол. Их три. Первый — для презентации, второй — для окна с примерами, третий — на всякий случай.
Выполненная команда отображается в дополнительной нижней строке DemoScreen.
Только процессы имеют доступ к файлам. Каждый процесс имеет уникальный номер — PID. ps
показывает таблицу процессов, которые выводят на тот же терминал. Можно посмотреть все процессы. Это очень старая утилита.
Когда вы регистрируетесь в системе, запускается Shell. Этот Shell получает ваш UID. И все процессы, которые он породит, тоже получают ваш UID, наследуют его. PID-ы у всех разные. Но есть отношение «дочерний–родительский». Дочерних может быть много, из них только один и выводит на экран, и вводит с клавиатуры («активный»), а остальные могут только выводить («фоновые»). “&
” для запуска процесса в фоне, когда shell не дожидается конца работы. tclock
— это часы такие. Процесс запустился, у него есть PID. Как узнать PID? из ps
или из pidof процесс
. Можно послать сигнал. Сигнал — короткое сообщение, которое процесс обязан обработать; а если не умеет, за него обработает система. В этом случае процесс, скорее всего, остановится. Команда kill
посылает сигнал (по умолчанию — KILL) процессу с указанным PID. Команда killall
— всем процессам с указанным именем (выполняет pidof).
Если всё — файл, то файловая система — это такая БД, где у каждой записи есть ключ — имя файла (точнее, путь от корневого каталога). Если предусмотреть много полезных утилит для файлов (а их в Linux сотни), можно будет удобно работать. При наличии документации.
Про файлы и каталоги, и почему они образуют дерево корнями вверх, всё и так ясно. Просмотр каталога — ls
(т. е. «list»). У ls
очень много разных ключей, см. man ls. Просмотр файла (точнее, выдача на стандартный вывод содержимого) — cat
(«catenate»). Настоящий просмотр (постраничный, с поиском и пр.) — less
.
Создание и удаление каталога — mkdir
и rmdir
. Непустой каталог удалить нельзя. (Можно, но другой командой). Копирование файлов — cp
(«copy»), переименование и перемещение — mv
(«move»), удаление — rm
(«remove»). Как создать файл? В следующей лекции рассказано, на самом деле это редко надо.
Рабочий (текущий) каталог: если имя файла начинается не с “/
”, то файл ищется в рабочем каталоге. Вместо /home/altlinux/.bashrc
можно писать просто .bashrc
(относительное имя файла), если каталог /home/altlinux
— текущий. pwd
— «print work directory». Он всегда имеет второе имя — “.
”, а родительский — “..
”. Смена рабочего каталога — cd
(«change directory»). Домашний каталог- это тот, который делается текущим сразу после входа в систему. cd
без параметров переводит в домашний каталог.
Если имя файла начинается с “/
” — это полное имя (путь) файла, список всех вложенных подкаталогов, в самом внутреннем из которых он лежит.
Есть некоторая группа товарищей, стандартизирующая (по мере разумного) названия всех каталогов в дереве — Filesystem Hierarchy Standard (FHS). Это удобно: всегда знаешь, где лежат программы, где — библиотеки, где — настроечные файлы и т. п. В “/
” лежит только необходимое (“/bin
” — программы, “/etc
” — настройки, “/tmp
” — временные файлы и т. п.). В “/usr
” снова есть “/usr/bin
” — все остальные программы (которые не нужны при начальной загрузке). В “/var
” лежат файлы, размер и количество которых может всё время меняться (напр., системные журналы).
Отступление: команда ls -l
(«long»). Первый символ — тип, следующие девять — права доступа, затем количество имён файла (см. ln
), хозяин файла, группа пользователей (см. «права доступа»), размер и дата.
Если вся файловая система — одно дерево, значит, надо уметь прививать к нему ветки: внешние носители, разные диски или несколько разделов одного. Это делается командой mount
: например, mount /dev/cdrom /media/cdrom
— и содержимое файловой системы на CD доступно в подкаталогах /mуdia/cdrom
. Обратно — umount
(особенно если кеш на запись).
Ещё нужно «поближе положить» — вместо длинного полного пути к файлу использовать что-то короткое. Два варианта. Можно завести ещё одно имя у файла (командой ln
, «link», синтаксис — как у cp
), это будет несколько имён одного и того же файла. Не работает для каталогов и между каталогами, один из которых смонтирован (между файловыми системами). Второй вариант — т. н. символьная ссылка, команда ln -s что куда
, при этом заводится специальный (типа “l
”) файл с именем куда, в котором лежит настоящее имя что. При обращении куда заменяется на что.
Специальные файл (файлы-дырки) — объекты файловой системы, имеющие имя, в них можно писать, из них читать, но они не файлы, не лежат на диске в виде последовательности секторов. Например, устройство — такой файл (как правило, в “/dev
”) который передаёт и принимает данные от пользовательского процесса к «драйверу устройства» и обратно. Например “/dev/input/mice
” — это все мыши. Бывают и ещё файлы-дырки, например, каналы (FIFO), в которые один процесс пишет, а другой тут же читает. Такое дупло, через которое Маша общается с Дубровским. И другие.
Файловая система может вообще не лежать на диске. Её может «сочинять» ядро на ходу. Например, много информации о системе и обо всех процессах есть в каталоге “/proc
”, его подкаталоги и файлы — не «настоящие», они нигде не лежат, но при чтении в них появляется актуальная информация. Это виртуальная ФС, ProcFS: “/proc/cpuinfo
” — о процессоре, “/proc/loadavg
” — загруженность системы и т. п. Есть и другие, например SysFS — информация об аппаратуре, или TmpFS — файловая система в памяти (LiveCD её использует).
Процесс не должны мешать друг другу при работе с системными объектами (в основном это — файлы). Поэтому надо определить, (1) кто, (2) кому, (3) к какому объекту (4) какой доступ разрешает.
У объекта есть UID, указывающий на хозяина, он и разрешает доступ. Есть GID — группа пользователей объекта (может быть несколько пользователей в группе, пользователь может состоять в нескольких группах). Если UID процесса совпадает с UID файла — это процесс-хозяин (user) файла. Если не совпадает, зато GID одной из групп, в которых числится пользователь, совпадает с GID файла — это процесс-член группы (group) файла. Если ни то, ни другое — это чужой (other) по отношению к файлу. Группы имеют название и уникальный номер, свои группы можно посмотреть id
.
Три вида доступа: чтение (read), запись (write) и использование (execute). Чтение — право получать информацию, запись — право её изменять, использование — право заставить систему воспользоваться этой информацией. Получается 3 тройки вида “rwx
”, где если нет доступа, вместо буквы стоит “-
”. Это и отображается в ls -l
.
Использование файла — право запустит его как программу, использование каталога — право сделать его рабочим (точнее, право воспользоваться именами файлов в этом каталоге для доступа к самом файлам). Каталог с правами “r--
” можно просмотреть, но нельзя посмотреть в файлы, в нём находящиеся, только имена. Каталог “--x
” нельзя просмотреть, но если вы знаете имя файла, можно с этим файлом работать.
Специальный пользователь root
(UID=0) имеет любой доступ к любому файлу.
Зачем нарушать правила? Чтобы пользователь мог запустит не свою программу, которая изменит файл, самому пользователю недоступный. Например, umount
— отключает (размонтирует) файловые системы. Это нельзя давать пользователю, но иногда надо. Выход: программа mount
должна как-то получать права root-а, а потом сама проверять, разрешено ли её выполнять. Специальный атрибут файла “s
” (setUID): при запуске этой программы UID не наследуется, а делается равным UID-у самого файла, в котором программа. Например, root
. Это довольно опасно делать без разбору.
В учебнике обо всём этом рассказано много подробнее, в целых шести лекциях.