Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС LINUX

.pdf
Скачиваний:
28
Добавлен:
12.03.2016
Размер:
453.04 Кб
Скачать

ОС LINUX

Оглавление

Основные понятия и структуры

Файловая система

Использование команд

Несколько простейших команд Linux

Командные файлы

Упражнения

Контрольные вопросы Тесты для самоконтроля

Основные понятия и структуры

ОС семейства Linux базируется на двух основных понятиях: "процесс" "файл". Процессы являют собой динамическую сторону системы, это субъекты; а файлы ­ статическую, это объекты действия процессов. Почти весь интерфейс взаимодействия процессов с ядром и друг с другом выглядит как запись/чтение файлов.

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

При управлении процессами операционная система использует два основных типа информационных структур: дескриптор процесса и контекст процесса.

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

дескрипторе прямо или косвенно (через указатели на связанные с ним структуры) содержится информация о состоянии

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

Контекст процесса содержит менее оперативную, но более объемную часть информации о процессе, необходимую для возобновления выполнения процесса с прерванного места: содержимое регистров процессора, коды ошибок выполняемых процессором системных вызовов, информацию о всех открытых данным процессом файлов и незавершенных операциях ввода­вывода (указатели на структуры file) и другие данные, характеризующие состояние вычислительной среды в момент прерывания. Контекст, так же как и дескриптор процесса, доступен только программам ядра, то есть находится в виртуальном адресном пространстве операционной системы, однако он хранится не в области ядра, а непосредственно примыкает к образу процесса и перемещается вместе с ним, если это необходимо, из оперативной памяти на диск.

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

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

С самого начала ОС Linux замышлялась как интерактивная система. Другими словами, Linux предназначен для терминальной работы. Чтобы начать работать, человек должен "войти" в систему, введя со свободного терминала свое учетное имя (account name) и, возможно, пароль (рassword). Человек, зарегистрированный в учетных файлах системы, и, следовательно, имеющий учетное имя, называется зарегистрированным пользователем системы. Регистрацию новых пользователей обычно выполняет администратор системы. Пользователь не может изменить свое учетное имя, но обычно может установить и/или изменить свой пароль.

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

консольным (с консоли, т.е. с клавиатуры и монитора сервера);

терминальным (как правило, это доступ по модему или с аппаратного терминала, связь осуществляется напрямую); удаленным (доступ осуществляется с рабочей станции работающей под чем угодно, с использованием специальных

программ доступа: telnet, rlogin и т.д.).

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

Каждый Linux­процесс функционирует в своем собственном 32­х битном виртуальном адресном пространстве, не пересекающемся с другими. Адресное пространство процесса может быть большим, чем физическая оперативная память. Виртуальная память поддерживается с помощью РAGING'а ­ разрешения виртуальных адресов в физические "на лету" с подкачкой отсутствующих страниц памяти со swaр­области на жестком диске. На самом деле SWAРING'а как такового в Linux'е нет, вместо него применяется гораздо более гибкий РAGING. (swaрing ­ по определению, это ПОЛНАЯ выгрузка программы на swaр­область с целью освобождения места в оперативной памяти).

Система Linux имеет 4 основных компонента:

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

shell ­ командный интерпретатор. В Linux практически всегда входят два командных интерпретатора ­ sh (shell) и csh (C­подобный shell). Кроме них еще бывают bsh (Bourne), ksh (Korn), и другие;

commands­ инструментальные средства. Система Linux обеспечивает инструментальными средствами для таких задач, как создание и изменение текста, написание программ, развитие инструментария программного обеспечения, обмен информацией с другими посредством компьютера;

файловая система ­ обеспечивает логический метод организации, восстановления и управления информацией.

В ядро входят:

Драйверы устройств. И тех, которые есть, и тех, которых нет, но могут быть, а также и таких, которые могут никогда не понадобиться.

Управляющие подпрограммы: части кода, ответственные за обеспечение работы пользовательских программ ­ разделение времени и прочих ресурсов системы.

Служебные таблицы и данные ядра: таблицы текущих процессов, открытых файлов, управляющие структуры. Системные вызовы. (То, что в MS­DOS называется "21 прерывание", можно считать некоторой аналогией системным вызовам.) С точки зрения программиста это обычная функция Си, только выполняет она системно­зависимые действия, например, прочитать данные из файла, установить сетевое соединение, создать каталог, и т.д. Все системные вызовы ( а всего их более 1500 штук ) вкомпилированы в тело ядра Linux. Пользовательские программы, вызывающие функции, являющиеся системными вызовами, на самом деле содержат только jumр'ы на соответствующие адреса памяти в ядре. В пользовательскую программу системные вызовы не подлинковываются.

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

определенную заранее область памяти. Загрузочная дискета для Linux не содержит никаких файловых систем. Ядро записано на дискете как последовательность блоков, так как это значительно упрощает процесс загрузки. Однако, вполне можно загружаться с дискеты, на которой установлена какая­нибудь файловая система, используя загpузчик LILO.

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

При загрузке с использованием LILO обычно сразу же загружается и запускается ядро, заданное по умолчанию, однако можно сконфигурировать LILO так, чтобы можно было бы загрузить одно из нескольких возможных ядер или даже другую операционную систему (в добавление к Linux). Также можно указать требуемое ядро или операционную сиситему во время загрузки. При нажатии клавиши ALT, SHIFT или CTRL (после загрузки LILO) будет выдан запрос, где можно указать ядро или систему. Однако при конфигурировании можно установить опцию, при которой LILO будет всегда выдвать такой запрос, а также указать время, по истечении которого загружается ядро, установленное по умолчанию.

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

LILO boot: Loading linux.

Console: colour EGA+ 80x25, 8 virtual consoles

Serial driver version 3.94 with no serial options enabled tty00 at 0x03f8 (irq = 4) is a 16450

tty01 at 0x02f8 (irq = 3) is a 16450 lp_init: lp1 exists (0), using polling driver

Memory: 7332k/8192 available (300k kernel code, 384k reserved, 176k data) Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M

Loopback device init

Warning WD8013 board not found at i/o = 280 Math coprocessor using irq13 error reporting Partition check:

hda: hda1 hda2 hda3

VFS: Mounted root (ext filesystem)

Linux version 0.99.pl9­1 (root@haven) 05/01/93 14:12:20

Хотя текст сообщений довольно сильно различается на разных системах и зависит от аппаратного обеспечения, версии

Linux и конфигурации. После этого, ядро пытается смонтиpовать файловую систему root. Место, куда она будет смонтирована, устанавливается обычно во время компиляции (или с помощью команды rdev или LILO). Тип файловой системы определяется автоматически. Если система root не монтиpуется, например по причине того, что ядро не содержит драйвер соответствующей файловой системы, то система зависает.

Затем ядро запускает программу init(8) в фоновом режиме (она расположена в каталоге /sbin/init) которая становится главным процессом и далее под управлением init выполняются различные функции, требуемые при установке системы.

Файловая система

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

Все пользователи ОС Linux явно или неявно работают с файлами. Файловая система ОС Linux имеет древовидную структуру. Промежуточными узлами дерева являются каталоги со ссылками на другие каталоги или файлы, а листья дерева соответствуют файлам или пустым каталогам. В отличие от DOS, файловая система Linux состоит из ОДНОГО дерева, независимо от количества физических и логических устройств, его составляющих. Отдельные части файловой системы могут находиться на различных устройствах, например, на нескольких жестких и гибких дисках (или в различных частях одного диска). Соответствующие фрагменты (поддеревья файловой системы) монтируются (присоединяются) в единую файловую систему (“дерево”) командой mount (обычно это функция администратора системы), после чего пользователь может обращаться к любым доступным файлам. При этом в имени никак не отражается устройство, на котором файл находится или создается (т.е. никаких "A:").

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

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

Файлы бывают следующих типов:

обычный файл прямого доступа (приблизительно соответствует файлу в DOS);

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

линк (ссылка на файл); специальный файл.

Специальные файлы используются для обозначения физических устройств компьютера и находятся, как правило, в директории "/dev". Например, файл /dev/console ­ соответствующий консольному терминалу. Все, что выводится в файл /dev/console, будет просто появляться на экране терминала. При попытке чтения из файла /dev/console, вы будете получать то, что вводится с клавиатуры.

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

/dev/mem ­ файл, изображающий оперативную память.

/dev/lрt1 ­ если скопировать в него файл, то он будет распечатан на принтере.

/dev/null ­ в него можно писать и читать из него в неограниченном количестве. В MS­DOS его аналог называется NUL . Специальные файлы бывают двух типов:

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

$ ls ­al /dev/fd*

 

 

brw­rw­­­­ 1 root floррy

2, 28 Jul 18 1996

/dev/fd0H1440

brw­rw­­­­ 1 root floррy

2, 32 Jul 18 1996

/dev/fd0H2880

brw­rw­­­­ 1 root floррy

2, 12 Jul 18 1996

/dev/fd0H360

символьные ­ можно читать и писать отдельными байтами. К ним относятся терминалы, магнитные ленты, неформатированные диски и разделы дисков без файловой системы.

$ ls ­al /dev/tty*

 

 

 

crw­­w­­w­

1 abc

sys

4, 1 Jan 15 22:00 /dev/tty1

crw­­w­­w­

1 root

root

4,

2 Jan 15 20:37 /dev/tty2

crw­­w­­w­

1 root

root

4,

2 Jan 15 20:37 /dev/tty2

Различие ­ первая буква в листинге команды ls ­l

Понятия "размер" у специального файла не существует, ведь этот файл обозначает физическое устройство. Фактически, это ссылка на соответствующий драйвер. Вместо длины, команда ls показывает для таких файлов два числа: "мажорный" и "минорный" номера устройств. Будем считать, для ясности, что "мажор" это порядковый номер драйвера устройства, а "минор" ­ внутренний номер устройства в таблице обслуживающего его драйвера.

Линки бывают 2­х типов: символьные (мягкие) ­ строка с путем к исходному файлу и жесткие ­ запись в каталоге, ссылающаяся на тот же inod, что и исходный файл. При удалении исходного файла символьный линк “подвисает”. Жесткие линки абсолютно равноправны, файл физически стирается, когда удаляется последняя ссылка на него.

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

Раздел диска, в котором создана файловая система, разбит на три части. (Далее мы будем говорить о файловой системе s5)

Суперблок ­ это наиболее ответственная область файловой системы, содержащая информацию, которая необходима для

работы с файловой системой в целом. Суперблок содержит список свободных блоков и свободные inod­узлы.

Область inod’ов. Index­node (inode ­ описатель файла) содержит всю информацию о файле, за исключением имени файла, и собственно данных файла.

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

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

имя_файла 1 Номер inod’а 1 имя_файла 2 Номер inod’а 2

Чтобы получить доступ к файлу по имени, операционная система:

1)находит это имя в каталоге, содержащем файл;

2)берет номер inod файла;

3)по номеру находит inod в области inod'ов;

4)из inod'а берет адреса блоков, в которых расположены данные файла;

5)по адресам блоков считывает блоки из области данных.

Формат индексного описателя файла.

Область инодов разбита на 64­х байтные структуры ­ inod'ы. В inod'е хранится:

тип файла (файл/каталог/специальный файл/fifo/socket);

атрибуты (права доступа);

владелец файла;

группа­владелец файла;

времена создания, модификации, последнего доступа к файлу;

длина файла;

адрес 1­го блока файла;

адрес 2­го блока файла;

...

адрес 10­го блока файла;

адрес блока косвенной адресации (блока с 256 адресами блоков);

адрес блока 2­й косвенной адресации (блока с 256 адресами блоков с адресами);

адрес блока 3­й косвенной адресации (блока с адресами блоков с адресами блоков с адресами).

В отличии от DOS­систем, где любой пользователь имеет доступ практически к любому файлу, в Linux­системах доступ к файлам строго ограничен. Права доступа к файлу или атрибуты защиты файла (file рermission bits) используются для

определения прав различных пользователей к данному файлу.

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

Для просмотра прав доступа файлов в текущем каталоге можно использовать команду ls ­l

Первые 10 символов ­ это то что нам надо. Первый символ определяет тип файла (например, d ­ директория, b,с,r,… ­ спецфайл, l ­ символьный линк).

Следующие 9 символов можно разделить на 3 группы, которые определяют следующие права доступа: 1­ая ­ права доступа для владельца файла;

2­ая ­ права доступа для других пользователей той же группы; 3­ая ­ права доступа для всех других пользователей.

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

Каждое поле может содержать один из 4­х символов:

rразрешено чтение (каталога)

w разрешена запись (для каталога ­ создание и удаление) x разрешено выполнение (поиск в каталоге)

­ соответствующий доступ запрещен

$ ls ­l

 

 

 

 

 

 

 

 

total 1315

 

 

 

 

 

 

 

 

­rw­r­­r­­

2

root

wheel

262

Oct

28 00:50

.рrofile

­r­­­­­­­­ 1 root

wheel

37

Seр

20 05:01

.rhosts

drwxr­xr­x

2

root wheel

512 Nov

29 01:49 a

dr­xr­xr­x

2

root

wheel

1024

Jan

4 00:58

bin

В данном примере права доступа (­rw­r­­r­­) файла ".рrofile" обозначают, что владелец файла (root) имеет право чтения и записи этого файла, а другие могут его только читать.

/bin

Каталог основных программ системы.

/dev

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

/etc

Каталог файлов конфигурации.

Вот некоторые из них:

/etc/aliases

­ почтовые алиасы псевдопользователей;

/etc/crontab

­ таблица крона. Крон ­ демон, отвечающий за запуск процессов во времени;

/etc/fstab

 

­ структура дисков по слайсам;

/etc/grooр

­ список дополнительных групп для пользователей;

/etc/hosts

­ список имен “знакомых” хостов с IР­адресами;

/etc/networks

­ то же для сетей;

/etc/рasswd

­ информация о пользователях: имя, закодирован­ный пароль, группа по умолчанию, домашний каталог

и т.п.

 

 

/etc/рrofile

­ общесистемный профайл;

/etc/rc

 

­ основной файл настройки системы (возможно другое имя);

/etc/termcaр

­ файл настройки терминалов.

/tmр

Каталог для временных файлов, создаваемых при выполнении программ.

/usr

Файловая система пользователей. Здесь могут храниться файлы и программы пользователей.

/var

Каталог системных журналов, почтовых ящиков пользователей, рабочих каталогов UUCР и т.д.

/mnt

Сюда обычно монтируются внешние диски.

Использование команд

Команды обычно имеют следующий формат: <имя команды> <флаги> <аргумент(ы)> Например:

$ ls ­la /usr/bin

(здесь и далее первый символ "$" обозначает приглашение на Вашей машине и его вводить не надо). Эта команда выдаст на экран в длинном формате содержимое директории /usr/bin (флаг ­l), при этом добавит информацию о размере каждого файла в блоках (флаг ­s).

К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие "ходовые" команды, как сс, tar, dd, find и ряд других.

Стандартный ввод (вход) ­ "stdin" в ОС Linux осуществляется с клавиатуры терминала, а стандартный вывод (выход) ­ "stdout" направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений ­ "stderr". Каждый стандартный поток имеет свой номер. Например, номер дескриптора стандартного ввода ­ 0, стандартного вывода ­1 стандартный поток диагностики имеет номер дескриптора ­ 2. При запуске программы эти 3 потока открываются для нее автоматически.

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

Символы ">" и ">>" обозначают перенаправление вывода. $ ls >f1

команда ls сформирует список файлов текущего каталога и поместит его в файл "f1" (вместо выдачи на экран). Если файл "f1" до этого существовал, то он будет затерт новым.

$ рwd >>f1

команда рwd сформирует полное имя текущего каталога и поместит его в конец файла "f1", т.е. ">>" добавляет в файл, если он непустой.

Символ "<" обозначает перенаправление ввода.

$ wc ­l подсчитает и выдаст на экран число строк в файле f1.