Введение в процесс загрузки и запуска Linux. Этапы загрузки системы Последовательную схему загрузки ос linux

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

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

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

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

Когда включается питание, запускается на выполнение загрузочный код, хранящий­ся в ПЗУ. Он должен запустить ядро. Ядро опрашивает состояние аппаратных устройств, а затем запускает демон init , идентификатор которого всегда равен 1.

Прежде чем на экране появится регистрационное приглашение, должен произой­ти целый ряд событий. Файловые системы должны быть проверены и смонтированы, а системные демоны - запущены. Соответствующие процедуры реализуются с помо­щью сценариев интерпретатора команд, которые последовательно запускаются демоном init. Эти сценарии часто называют rc-файлами, поскольку они имеют префикс “ rc ”. Он расшифровывается как “run command” (команда запуска) и является пережитком, оставшимся в наследство от операционной системы CTSS, существовавшей примерно в 1965 году. Конкретная структура сценариев и способ их выполнения зависят от системы.

Автоматическая и ручная загрузка

Linux-системы могут загружаться автоматически либо вручную. В первом случае система запускается самостоятельно, без какого-либо вмешательства извне. Во втором случае также все происходит автоматически до определенного момента, а перед вы­полнением основных инициализирующих сценариев управление передается оператору (человеку, сидящему за терминалом). В этот момент система входит в так называемый “однопользовательский режим”. Большинство системных процессов еще не начало вы­полняться, и вход других пользователей в систему невозможен.

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

Этапы загрузки

Типичная процедура начальной загрузки системы Linux состоит из шести этапов:

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

    Инициализация ядра

    Ядро Linux представляет собой программу, и первым этапом начальной загрузки является запись этой программы в память для последующего выполнения. Файл ядра обычно называется /vmlinuz или /boot/vmlinuz .

    В Linux загрузка ядра осуществляется в два этапа. Сначала в память компьютера с диска считывается (с помощью кода, записанного в ПЗУ) небольшая программа началь­ной загрузки, которая затем выполняет собственно загрузку ядра.

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

    Конфигурирование аппаратных средств

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

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

    Процессы ядра

    После завершения этапа базовой инициализации ядро создает в области памяти, вы­деленной для пользовательских программ, несколько “самовыполняющихся” процессов. Это происходит “в обход” стандартного системного вызова fork .

    Количество и характер таких процессов зависят от операционной системы. В Linux это демон init (всегда имеет идентификатор 1; процесс с идентификатором 0 отсутст­вует) и различные обработчики памяти и сигналов ядра, в том числе те, которые пред­ставлены в табл. 1. Все эти процессы имеют идентификаторы с низкими номерами, а их имена в списках ps заключены в квадратные скобки (например, ). Иногда имена процессов могут содержать в конце символ косой черты и цифру, как, например, . Число указывает процессор, на котором выполняется данный процесс. Эта информация может быть полезна при настройке многопроцессорной системы.

    Таблица 1. Некоторые наиболее часто встречающиеся процессы ядра Linux

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

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

    Действия оператора (только при ручной загрузке)

    Если систему нужно запустить в однопользовательском режиме, оператор уста­навливает в командной строке специальный флаг (слово “ single ”), а ядро передает эту информацию демону init . Последний, в свою очередь, передает управление команде sulogin - специальной версии команды login , - которая выдает приглашение ввести пароль пользователя root . Если он введен правильно, запускается интерпретатор команд с правами суперпользователя. Можно не задавать пароль, а просто нажать < Ctrl+D >, после чего загрузка продолжится в многопользовательском режиме.

    В однопользовательском режиме команды выполняются почти так же, как и в пол­ностью загруженной системе. Однако в SUSE, Debian и Ubuntu обычно монтируется только корневой раздел. Чтобы можно было использовать программы, находящиеся вне каталогов /bin , /sbin или /etc , необходимо вручную смонтировать остальные файло­вые системы.

    Во многих однопользовательских средах корневой каталог файловой системы мон­тируется в режиме только для чтения. Если /tmp является частью корневой файловой системы, выполнение множества команд, которые используют временные файлы (таких как vi), будет невозможно. Чтобы выйти из положения, придется начать однопользова­тельский сеанс с повторного монтирования каталога / в режиме чтения/записи. Нужное действие выполняет команда:

    # mount -o rw,remount /

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

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

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

    Выполнение сценариев запуска системы

    В тот момент, когда система сможет выполнять сценарии запуска, ее уже можно на­звать Linux. Это еще не полностью загруженная система, но “загадочных” этапов про­цесса загрузки больше не осталось. Файлы сценариев представляют собой обычные ко­мандные файлы, которые выбираются и запускаются демоном init по сложному, но, в общем-то, понятному алгоритму.

    Точное местонахождение, содержимое и организация сценариев запуска заслуживают отдельного изучения.

    Работа в многопользовательском режиме

    После выполнения сценариев запуска система полностью готова к работе, за одним исключением: никто не может в нее войти. Для того чтобы с конкретного терминала (включая системную консоль) можно было зарегистрироваться в системе, должен быть запущен процесс getty , ожидающий поступления запросов от этого терминала. Демон init порождает все необходимые процессы getty , заканчивая этап начальной загрузки. Если система сконфигурирована для работы в графическом режиме, демон init также порождает соответствующие регистрационные процессы, такие как xdm или gdm.

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

    Загрузка Linux на персональном компьютере

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

    Загрузка системы на персональном компьютере - это многоступенчатый процесс. Когда включается компьютер, начинает выполняться код, записанный в ПЗУ. Точное его местонахождение и структура зависят от типа оборудования. В компьютерах, соз­данных специально для UNIX или другой коммерческой операционной системы, код “прошивается” разработчиком, который заранее задает алгоритм подключения уст­ройств, базовой инициализации сети и распознавания локальных файловых систем. Это очень удобно для системного администратора. Ему достаточно ввести лишь имя нового файла ядра, а код ПЗУ автоматически обнаружит и прочитает этот файл.

    На персональных компьютерах код начальной загрузки представлен в виде базовой подсистемы ввода-вывода - BIOS (Basic Input/Output System), которая чрезвычайно уп­рощена в сравнении с фирменным кодом UNIX-станций. В действительности в BIOS есть несколько уровней кода: для самого компьютера, для видеоплаты, для SCSI-адаптера, если таковой имеется, и, иногда, для других периферийных устройств вроде сетевых плат.

    Встроенному коду BIOS известно об устройствах, расположенных на материнской плате, в частности контроллере IDE (и жестких дисках), плате сетевого адаптера, кон­троллере клавиатуры, последовательных и параллельных портах. SCSI-адаптеры знают только об устройствах, подключенных непосредственно к ним. К счастью, за последние несколько лет сложные взаимодействия, необходимые для обеспечения совместной ра­боты этих устройств, были стандартизованы и теперь почти не требуют вмешательства оператора.

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

    В режиме конфигурирования можно выбрать, с какого устройства требуется загру­жаться, хотя выбор не так уж велик. Обычно последовательность загрузки задается в виде правила, например: “сначала - дисковод для гибких дисков, затем - дисковод CD-ROM, в последнюю очередь - жесткий диск”. К сожалению, в некоторых BIOS за­грузка ограничена возможностью загрузки с первого IDE-дисковода CD-ROM или пер­вого жесткого диска IDE. Могут также распознаваться SCSI-адаптеры.

    Когда компьютер определил, с какого устройства следует загружаться, считываются первые 512 байтов с диска. Этот сегмент диска называется главной загрузочной записью (ГЗЗ). В ней хранится программа, которая сообщает компьютеру о том, в каком разделе диска расположена программа вторичной загрузки (загрузчик операционной системы).

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

    Найдя раздел, с которого будет выполняться загрузка системы, программа ГЗЗ пыта­ется запустить загрузочную программу, связанную с этим разделом. В случае успеха этой программе передаются полномочия по дальнейшей загрузке ядра.

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

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

    Рассмотрим досистемную загрузку

    Задача досистемной загрузки — выбрать как загружать ядро операционной системы .

    То, как именно загрузить ядро пользователь может выбрать самостоятельно. Для того, чтобы выбрать нужна специальная система управления. Такую систему управления принято называть загрузчик . В Linux наиболее популярными и часто используемыми загрузчиками являются загрузчик LILO (Linux Loader) и загрузчик GRUB (Grand Unified Bootloader) . Они предоставляют пользователю возможность выбрать заранее настроенный тип загрузки. Оба эти загрузчика имеют текстовый (консольный) и графический варианты интерфейса. Основная и ключевая задача таких загрузчиков: загрузить в память компьютера ядро и всё необходимое для успешного старта системы.

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

    Таким нехитрым образом мы разобрались с «загрузчик ядра ОС Linux «!

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

      В момент запуска процессор передаёт управление по определённому физическому адресу в ПЗУ. В этот момент начинается выполнение кода BIOS/UEFI. Производится инициализация оборудования и выбирается загрузочный носитель. В случае BIOS происходит считывание в ОЗУ начального загрузчика и передача управления на него. Начальный загрузчик обычно занимает один сектор на диске (MBR) и ограничен размером 384 байт (512 байт – сектор диска, минус 128 байт – таблица разделов). В зависимости от типа загрузочного устройства загрузочный сектор может считываться из разных мест:

      • При загрузке с дискеты или HDD загрузчик читается из первого сектора физического носителя;
      • При загрузке с CD/DVD – из первого сектора образа загрузочного диска, размещённого в структуре данных CD;
      • При сетевой загрузке – из первого сектора образа загрузочного диска, скачиваемого с сервера по протоколу tftp.

      При форматировании диска в MBR вместо загрузчика иногда пишется программа, которая пишет на экране информационный текст "No bootable device -- insert boot disk and prress any key"

    1.1 Начальный загрузчик считывает в память основной загрузчик (GRUB, LiLo, NTLDR) и передаёт управление ему. Поскольку начальный загрузчик очень мал, то, как правило, в его код жестко прописывают сектора, из которых надо прочитать код основного загрузчика. На HDD это может быть пространство между MBR и первым разделом на диске (нулевая дорожка) или зарезервированное место внутри ФС (зарезервированный Inode в ext2fs). На дискете и при использовании образа диска при загрузке с CD или по сети – основной загрузчик может располагаться сразу вслед за первичным загрузчиком и занимать весь объём образа.

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

      Загрузка ядра (vmlinuz) и вспомогательного образа диска (initrd, initramfs). Загрузчик GRUB представляет из себя мини ОС, поддерживающую все основные файловые системы. GRUB ищет конфигурационный файл, в котором прописаны пути к образу ядра и образу вспомогательного диска. При необходимости образ ядра распаковывается в ОЗУ, формируется область памяти, содержащая параметры, передаваемые из загрузчика в ядро, в том числе адрес образа вспомогательного диска.

      Ядро загружаемое через GRUB должно соответствовать соглашениям multiboot или multiboot2 . В соответствии с соглашением, образ ядра включает структуру (например в секции данных), которая начинается с магического числа и содержит информацию о желаемом положении ядра в памяти и точке на которую надо передать управление. Перед передачей управления в ядро в регистр EAX помещается ещё одно магическое число, а в регистр EBX - адрес таблицы с параметрами, подготовленными загрузчиком.

      Вспомогательный диск необходим современным Linux системам из-за модульности ядра и содержит драйверы (ATA, NFS, RAID и т.п.), необходимые для получения доступа к основной файловой системе. Внутри образа находится файловая система в формате архива cpio.

      На этом этапе создаётся процесс с pid=1 , в котором происходит выполнение скрипта init , находящегося в корневом каталоге вспомогательного диска. Параметры, передаваемые ядру, фактически передаются в init , как аргументы командной строки.

      Скрипт содержит команды загрузки необходимых драйверов в виде модулей ядра, создание временных файлов устройств в каталоге /dev для доступа к этим модулям, сканирование дисковых разделов для обнаружения и инициализации RAIDов и логических томов. После инициализации логических дисков, делается попытка смонтировать корневую файловую систему, заданную параметром root= . В случае бездисковой сетевой загрузки корневой каталог подключается по NFS.

      На экран выдаются сообщения о загрузке драйверов и о поиске виртуальных томов подсистемы LVM. Этап завершается перемонтированием корневого каталога на основную файловую систему и загрузку в процесс с pid=1 основной программы /sbin/init (или её аналога).

      В классическом UNIX"е и старых версиях Linux (примерно до 2012 года) программа init считывает конфигурационный файл /etc/inittab , инициализирует текстовые консоли и, как правило, запускает необходимые службы с помощью набора скриптов, расположенных в каталогах /etc/init.d и /etc/rc*.d . В современных дистрибутивах Linux в файле /sbin/init находится более современная программа запуска служб. Наиболее популярной из подобных программ является systemd , который позволяют существенно сократить время этого этапа загрузки.

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

    Загрузчик GRUB

    Загрузиться с установочного диска в режим восстановления - Rescue mode. Для этого в момент загрузки на приглашение boot: необходимо ввести linux rescue

    Если всё пойдёт нормально, то корневой каталог основной системы будет смонтирован в /mnt/sysimage , загрузочный каталог в /mnt/sysimage/boot . Кроме того текущие каталоги /proc , /sys и /dev будут смонтированы в соответствующие подкаталоги /mnt/sysimage . Если это не случится, то придётся проделать эти операции вручную.

    Когда все каталоги смонтированы, можно сменить корневой каталог

    #если выяснится, что вы что-то забыли смонтировать, то можно выйти по ^D chroot /mnt/sysimage

    и пересобрать initrd

    #копируем старый файл cp -p /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak #создаём новый dracut -f #если версия ядра в основной системе отличается от версии на установочном диске, указываем её явно dracut -f /boot/initramfs-2.6.32-358.el6.x86_64.img 2.6.32-358.el6.x86_64

    #копируем старый файл cp -p /boot/initrd-$(uname -r).img /boot/initrd-$(uname -r).img.bak #создаём новый mkinitrd -f -v /boot/initrd-$(uname -r).img $(uname -r) #если версия ядра в основной системе отличается от версии на установочном диске, указываем её явно mkinitrd -f -v /boot/initrd-2.6.18-371.el5.img 2.6.18-371.el5

    Cd / sync telinit 6

    Полный пример с драйвером i2o_block (SCSI адаптер Adaptec 2010S), который не загружается автоматически. Пример выполняется в CentOS 5, поскольку в стандартном ядре CentOS 6 поддержка этого драйвера отключена.

    После загрузки с CD в Rescue mode выдаётся сообщение, что Linux разделы не найдены и их надо монтировать самостоятельно.

    #Загружаем драйвер insmod i2o_block #Проверяем, что всё сработало lsmod .... dmesg ... #Создаём файлы устройств на основе информации в dmesg mkdir /dev/i2o mknod /dev/i2o/hda b 80 0 mknod /dev/i2o/hda1 b 80 1 mknod /dev/i2o/hda2 b 80 2 #Активируем VolumeGroup lvm vgchange -a y #Монтируем тома mkdir /mnt/sysimage mount /dev/mapper/VolGroup00-LogVol00 /mnt/sysimage mount /dev/i2o/hda1 /mnt/sysimage/boot #Монтируем спецкаталоги mount --bind /proc /mnt/sysimage/proc mount --bind /dev /mnt/sysimage/dev mount --bind /sys /mnt/sysimage/sys

    Далее по инструкции, только при создании образа диска надо указать программе mkinitrd дополнительную опцию --preload=i2o_block и отключить сервисы readahead , поскольку они приводят к зависанию драйвера i2o_block:

    Chkconfig early-readahead off chkconfig later-readahead off

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

    В этой лекции я расскажу, что делает классическая программа init в сочетании со скриптами rc.d в стиле System V (Систем пять). System V - это классическая версия UNIX на которой построены коммерческие UNIX.

    Судя по названию, rc.d это некий каталог. Есть такая традиция UNIX - если вся конфигурация чего-либо умещается в один файл, и он называет config, то при разбиении его на отдельные файлы, которые подключаются к основному, создают каталог с аналогичным именем и добавляют к имени.d – config.d. Буква d означает, что это директория и там лежат вспомогательные части конфигурационного файла. У формата конфигурационных файлов программы init есть две традиции: вариант System V, в котором каждая деталь конфигурации держится в отдельном файле в каталоге rc.d, и традиция BSD систем, в которой есть один файл /etc/rc, содержащий много скриптов и переменных, которые отвечают за поведение системы.

    В любом случае, при старте системы у нас создается процесс с PID=1, в котором запущена программа, которая называется init. Как вы видели в прошлый раз, если программу init убить, то ядро впадает в панику и прекращает всяческую работу.

    Классический System V init читает файл /etc/inittab и выполняет ряд предписаний, которые прописаны в этом файле. Inittab этот текстовый файл каждая строка которого, это, по сути дела, одна команда или какое-то правило поведения. Inittab выглядит так:

    id:3:initdefault:

    si::sysinit:/etc/rc.d/rc.sysinit

    l3:3:wait:/etc/rc.d/rc 3

    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    Вначале строки стоит метка. В чем большой смысл этой метки я не очень понимаю. Можно считать, что это простой текст и все. Вторым пунктом стоит либо так называемый уровень загрузки, либо пустое значение. Уровень загрузки - это либо одно число от 0 до 6, либо список чисел через запятую. Дальше идет некое действие. Действия бывают следующие: wait, respawn, sysinit, ctrlaltdel. Есть и другие действия, но это самые используемые. Наконец, в конце строки написана некая команда с именем исполняемого файла и аргументов, которые этой команде надо передать.

    Действие sysinit выполняется однократно при старте системы.

    Действие ctrlaltdel это на самом деле не совсем действие – это обработчик сочетания клавиш control alt del. Само нажатие перехватывается ядром системы, и информация об этом пересылается в процесс init, который должен выполнить определенную команду. Например, может быть выполнена команда shutdown, которая выполнит выключение компьютера. В принципе сюда можно прописать любую другую программу, например, echo, которая после нажатия control alt del будет выдавать на все терминалы системы какое-нибудь сообщение. камина консолью так

    Действие wait означает, что необходимо запустить команду, дождаться пока она закончится и только после этого продолжить обработку следующих строк. Не знаю, могут ли запускаться такие действия в параллель. Скорее всего, нет.

    Действие respawn означает, что надо запустить программу и не дожидаясь ее завершения, перейти в дальнейшем действиям. Если эта программа в последующем завершится, то необходимо ее рестартовать.

    Итак, есть однократное выполнение с ожиданием результатов и многократное выполнение в асинхронном режиме – запустились, дождались пока закончить, запустили слова.

    Уровни загрузки - это некая условность, которая позволяет управлять загружаемыми службами. Ближайший аналог в windows – это загрузка в безопасном режиме, когда грузится только ограниченное число драйверов и стартует минимальное количество служб, загрузка с отладкой, когда каждое действие дополнительно протоколируются и обычная полноценная загрузка.

    В Linux по традиции выделяется 6 вариантов загрузки. Это деление довольно условно.

    0 и 6 это выключение. 0 - полное выключение электричество, а 6 - режим перезагрузки.

    4 в Linux вообще пропущен

    Остаются четыре уровня загрузки:

    1 - однопользовательский режим. Если передать загрузчику ключевое слово single, то мы окажемся в однопользовательском режиме, где запущен только один процесса и это шелл администратора системы. Этот режим используется для восстановления системы.

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

    2 - тоже текстовый режим, но без подключения сетевых дисков. Дело в том, что традиционные сетевая файловая система nfs, которая используется в UNIX, чрезвычайно устойчива к повреждениям сети. Если мы выключили файловый сервер или обрезали сетевой кабель, то сетевая файловая система nfs будет предпринимать многочисленные попытки восстановиться и эти попытки настолько длительны, что я ни разу не смог дождаться времени, когда же наконец появится сообщение об ошибке. Возможно это произойдёт через час, а может и через 6 часов. Всё это время драйвер nfs будет держать компьютер, не давая ничего сделать. Поэтому, если у нас упала сеть или файловый сервер в настройках написано, что при старте необходимо подмонтировать внешние диски, то попытка загрузится в полноценный режим приведёт к тому, что у вас все зависнет. Для этого случая и предусмотрен второй вариант загрузки - все как в третьем, только сетевые диски не подключаются. Сам сетевой адаптер работает, IP адрес назначается, интернет доступен.

    5 - то же самое что и 3, но с запуском x window - графического интерфейса.

    режим 2 включает себя 1 + многопользовательский режим. 3 включает 2 + монтирование сетевых файловых систем. Наконец, 5 включает в себя 3 + запуск графической подсистемы. Будет ли это реализовано последовательно или нет - это проблема дистрибутива. Вообще говоря, администраторы могут самостоятельно настроить файл inittab так, чтобы эти режимы запускались последовательно, а можно сделать так чтобы все было абсолютно независимо - переключаясь в очередной режим, убираем все что было сделано на предыдущем шаге, и настраиваем все с нуля.

    Рассмотрим строки реального файла. Они очень просты.

    l3:3:wait:/etc/rc.d/rc 3

    Запускается какая-то программа, которая должна выполнить все необходимые действия, которые ожидаются на третьем уровне. Наверно, на третьем уровне нужно настроить сетевые интерфейсы, запустить драйвер терминалов, стартовать какие-то службы. Только после того, как всё этого завершится мы сможем работать в системе. Поскольку надо дождаться завершения запуска, мы выбираем действие wait.

    Программа запуска называется rc и запускается с номером уровня в качестве параметра. Сама программа init достаточно простая. Она умеет построчно читать свой файл с простым синтаксисом и стартовать новые процессы, запуская какие-то вспомогательные программы. Вся логика уровней загрузки спрятана в скрипте rc. Запустив rc с параметром 3 мы перейдем на третий уровень, с параметром 5 - на пятый.

    Программа rc тоже очень простая. Это скрипт который выполняет все файлы в каталогах, соответствующих уровню загрузки, например, /etc/rc3.d/. В этих каталогах находятся исполняемые файлы, которые принимают один параметр - либо start, либо stop. Если файл запущен с параметром start, то он стартует службу, если с параметром stop, то останавливает её. Например, network start будет настраивать сетевые интерфейсы, а network stop будет переводить интерфейсы в выключенное состояние. Кроме сетевых интерфейсов есть скрипты подключения/отключение сетевых файловых систем, запуска/остановки сервисов и т.д.

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

    Скрипт rc просматриваем содержимого каталога rc3 и выбирает оттуда все файлы которые начинаются с буквы K (kill). Файлы упорядочиваются в порядке возрастания номера и выполняются с параметром stop. Потом те же действия выполняются с файлами на букву S (start), которые запускаются с параметром start. Вот в общем и вся процедура перехода на определенный уровень.

    Можно предположить, что в каталоге /etc/rc0.d/ лежат только файлы, начинающиеся на букву K, поскольку при выключении надо все остановить, а в каталоге /etc/rc1.d/ будет один файл на буку S для запуска консоли администратора.

    Для простоты программирования есть отдельный каталог /etc/init.d/, в котором лежат те же самые файлы только без буквы цифр в начале имени. На самом деле, файлы в каталогах уровней это просто символические ссылки на основные файлы. Так /etc/rc3.d/S10apache это ссылка на файл /etc/init.d/apache. Буквы и цифры в названии ссылок нужны для того, чтобы скрипт rc вызвал их в нужном порядке и с нужными аргументами.

    В системах, которые построены по такому принципу, чтобы стартовать или остановить какую-либо службу в каталоге /etc/init.d/ надо найти файл который, который ей соответствует, и запустить его с параметром start или stop. Чем не нравится запускать службы именно таким способом - явно вызывая скрипты. Дело в том, что в командной строке linux замечательно работает автодополнение. С его помощью очень быстро можно ввести путь до файла запуска.

    Чтобы спрятать от пользователя конкретную реализацию поверх системы скриптов и символических ссылок написаны две вспомогательные программы.

    Программа chkconfig позволяет манипулировать символическими ссылками на соответствующие скрипты. Чтобы посмотреть, что стартует, а что останавливаться на каждом из уровней можно воспользоваться командой ls и выдать список скриптов в соответствующем каталоге, но проще воспользоваться командой chkconfig –list. Программа chkconfig пробегает по всем каталогам rc и выдает список того что стартует, а что останавливается на каждом уровне. Если мы хотим, чтобы при старте системы у нас что-то автоматически стартовала определенная службу мы выполняем chkconfig <имя службы> on и скрипт создает ссылку для запуска в нужном каталоге и с правильным именем. Запуск chkconfig <имя службы> off приводит к удалению ссылки для запуска и созданию ссылки для остановки. Таким образом программа chkconfig позволяет управлять списком служб, которые стартуют в момент старта системы.

    Ещё одна программа - service используется для ручного запуска и остановки служб. Service это обертка, которая позволяет не обращаться напрямую к скрипту, а указать имя службы и сказать хотим мы ее стартовать или остановить. В bash, который я использую, нет автодополнения для команды service, поэтому мне проще набрать путь к скриптам.

    В стартовых скриптах аргументы start и stop должны обрабатываться обязательно. Кроме того, можно придумать какие-то свои аргументы, которые будут делать что-то полезное.

    В большинстве скриптов реализована опция status, которая показывает запущена служба или нет. Когда мы выполняем start, то скрипт после успешного запуска службы получает ее идентификатор PID и записывать его в определенный файл. По команде stop файл удаляется. Обычно такие файлы создаются в каталоге /var/run/. Команда status проверяет есть ли такой файл. Его нет, то сообщает, что служба не запущена. Если файл есть, то она извлекает из него идентификатор процесса и проверяет текущий список процессов. Если этот идентификатор присутствует все запущено, если программа по каким-то причинам поломалась, то статус выдаёт, что была сделана попытка запустить эту службу - файл существует, но сама служба не запущена.

    Опция restart последовательно выполняет внутри скрипта две команды – сначала stop, а потом старт. Это совершенно необязательная команда - просто удобная. Наконец, есть службы, которые позволяет на ходу перечитать какие-то конфигурационные файлы. Для них добавляют команду reload, задачей которой является отправка службе сигнала о том, что конфигурация изменилась. Отдельный случай, команды save и load для сохранения конфигурации брандмауэра.

    Если администратор системы вместо остановки или старта отдельных службы хочет всю систему перевести на определенный уровень, то этого можно достичь одним из двух способов. Можно вызвать прямо программу /sbin/init. Если ее вызвать с определенным числом в качестве параметра, то она выполнит все инструкцию из файла inittab, для которых прописывал соответствующий уровень. Если запустить, например, /sbin/init 1, то init найдет в своем конфигурационном файле все строчки, в которых есть уровень 1 и выполнит их. В некоторых системах команда shutdown реализована как /sbin/init 0, поскольку нулевой уровень соответствует остановке системы. В последнее время для перехода между уровнями появилась специальная программа под названием telinit, которая является ссылкой на init. Её задача – переслать процессу init сигнал о том, что администратор желает перейти на определенный уровень. telinit q сообщает init о том, что надо перечитать файл inittab. В старых системах это достигалось посылкой сигнала SIGHUP процессу с PID=1 (kill –HUP 1).

    Ещё несколько строк в inittab, это запуск терминалов

    1:2345:respawn:/sbin/mingetty tty1

    Для того, чтобы обеспечить диалоговую доступ к системе, вы inittabе может присутствовать некоторое количество строчек такого рода. 2345 это уровни, на которых надо запускать команду, respawn означает, что программу надо перезапускать в случае завершения. Программа getty – это программа управления терминалом. Традиционно терминал в UNIX называется телетайпом, поскольку первыми терминалами были электрические пишущие машинка. Соответственно, tty это сокращение от телетайпа. Mingetty – программа, которая умеет работать с виртуальными терминалами на персональном компьютере. Она умеет настраивать драйвер терминала, а в качестве параметров получает имя устройства терминала, который надо настроить. В каталоге /dev/ есть файл устройства tty1, который соответствует первому виртуальному терминалу. Если бы у нас был модем и мы хотели бы инициализировать его момент загрузки, то могли бы вызвать getty с параметром ttyS0, который соответствует порту COM1. При инициализации модема можно было бы задать дополнительные параметры: скорость соединения 19200 бод, 7 или 8 бит в байте, четность, количество стоп-битов.

    S0:2345:respawn:/sbin/getty ttyS0 19200 8 n 1

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

    Текстовые пользовательские сеансы устроены на таких цепочках: сначала init делает свою копию и запускает в ней программу mingetty. Mingetty инициализирует терминал и клавиатуру, а потом запускает в том же процессе программу login. Login выводит на экран приглашения на ввод имени и пароля и, если все прошло успешно то назначает себе привилегии пользователя и в том же процессе, затирая самого себя, запускает интерпретатор пользователя, например, bash. Когда пользователь набирает команду exit, то интерпретатор завершает жизненный путь этого процесса. Когда процесс завершается, init получает об этом сигнал. Init смотрит, что полагается делать, видит действие respawn, снова запускает программу mingetty, которая заново инициализирует терминал и все повторяется. Таким образом каждый сеанс находится внутри одного процесса. Как только мы вышли из сеанса наш процесс закончился и тотчас же запустилась программа, которая почистит за нами терминал и восстановит все настройки по умолчанию.

    В файле inittab есть есть ещё одно специальное ключевое слово initdefault - уровень по умолчанию. Если через ядро init получил параметр single, то мы загрузимся на уровень 1. Если через загрузчик ничего не передали, то используется значение по умолчанию. Если после установки графической оболочки оказалось, что наш компьютер слабоват для графики, то можно установит уровень по умолчанию на 3, и после следующей перезагрузки мы попадаем на третий уровень - то есть в текстовый режим. Установили систему без графического режима, потом доустановили все пакеты для x window, поменяли уровень по умолчанию на 5 и после следующей перезагрузки попали сразу в графический режим.

    В этой системе скриптов иногда хочется сделать что-то свое, например, при старте удалить все файлы в каталоге /tmp/. Для этого есть отдельный файл под названием /etc/rc.local, который запускается после всех остальных. Это просто скрипт без параметров, в который можно прописать всё, что угодно. Например, на одном из моих роутеров в момент старта системы в этом файле прописываются таблицы маршрутизации. Мне было лень искать где находятся соответствующие стандартные скрипты из дистрибутива и проще оказалось прописать команды в rc.local.

    Итак, инсталляция Linux завершена, и вы перезапускаете компьютер. Если Linux - единственная операционная система, установленная на вашем компьютере (а, значит, загрузчик LILO размещается в главной загрузочной записи - MBR), то после обычного тестирования аппаратуры, выполняемого BIOS, ненадолго появится надпись

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

    Linux Version 2.0.36, Compiled #1 Tue Dec 29 13:11:11 EST 1998
    One Intel 486 DX/2-WB Processor, 16M RAM, 33.28 Bogomips Total
    Black Cat Linux release 5.2 (Fulcrun)
    Kernel 2.0.36 on an i486 localhost login:

    Я привел здесь то сообщение, которое появлялось у меня при одном из вариантов установки, когда я ставил Black Cat версии 5.2; у вас, конечно, сообщение будет отличаться в некоторых деталях. Если у вас хватит терпения дочитать эту книгу, то вы узнаете, что выдаваемое при загрузке сообщение при желании можно изменить, так что будет выдаваться что-нибудь вроде "Привет, дружище! Сегодня 11 ноября 2001 года. Сейчас 19 часов 22 минуты. Введи, пожалуйста, свое имя и пароль". Однако пока рано говорить о том, как это делается.

    Если вы загружались с дискеты, то загрузка происходит точно также, только чуть медленнее.

    Если Linux не единственная ОС на вашем компьютере, и вы используете LILO для организации многовариантной загрузки, то в тот момент, когда на экране появится надпись LILO boot: вы должны нажать клавишу ‹Tab› или ‹?›. Тогда LILO выдаст вам список меток, которые сопоставлены разным ОС. В версии 21 LILO уже автоматически выводит этот список на экран в виде меню. Необходимо выбрать из меню или ввести (набрать на клавиатуре) одну из этих меток и нажать клавишу ‹Enter›. Если вы выберете метку, соответствующую Linux, то в конце концов вы все равно должны увидеть слово login:, которое в данном случае служит приглашением к вводу вашего пользовательского имени.

    3.2. Вход в систему

    Как вы понимаете, в ответ на это приглашение необходимо ввести имя пользователя, а потом, по запросу, и пароль для входа в систему. Если это первый вход в систему после ее установки, то входить надо под именем ""root"". Это единственный пользователь, для которого обязательно заводится счет или бюджет (account) во время инсталляции. Этот пользователь является полным хозяином системы (как сейчас, так и в последующем), то есть имеет неограниченный доступ к ее ресурсам, может заводить и удалять других пользователей, останавливать систему и т. д. Неосторожное поведение пользователя с такими правами легко может привести к печальным последствиям, вплоть до полного краха системы. Поэтому обычно под этим именем входят в систему только для выполнения административных задач. Но у нас сейчас как раз такой случай, так что в ответ на приглашение login: вводим "root" и нажимаем клавишу ‹Enter› (или ‹Return›). Система выдаст запрос на ввод пароля:

    Очевидно, что в ответ надо вводить пароль того пользователя, имя которого было введено ранее. При первой загрузке надо ввести тот пароль, которой был задан для пользователя root в процессе инсталляции, и нажать ‹Enter›. Заметим, что если после ввода имени очень долго не вводить пароль, то система снова вернется к запросу имени пользователя. После ввода пароля вы увидите примерно такую надпись:

    Такая строка называется приглашением. Появление приглашения означает, что система готова воспринять и выполнить вашу команду. Сейчас это свидетельствует о том, что вы успешно вошли в систему. Вы видите черный экран и приглашение системы к вводу команды - то, что в MS-DOS или Windows принято называть режимом командной строки. Мы будем называть этот режим текстовым (в отличие от графического режима, предоставляемого системой X Window).

    В приведенном примере приглашение включает в себя указание имени пользователя (root), имени системы (localhost) и тукущего каталога (/root). Вид приглашения тоже можно изменить. Во всех последующих примерах мы будем использовать приглашение, состоящее только из имени пользователя.

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

    Первая команда, которую стоит ввести - команда useradd. После имени команды надо ввести пробел и имя пользователя, например, jim:

    После этого система будет знать о существовании пользователя jim (говорят, будет "открыт счет для пользователя jim"). Однако войти в систему (или, как обычно говорят, "логироваться") под этим именем еще невозможно. Для того, чтобы система разрешила работать пользователю с именем jim, надо задать ему пароль. Для этого вводим команду

    Появится строка

    Вводите пароль. После того, как вы завершите ввод нажатием клавиши ‹Enter›, система попросит ввести его повторно:

    Если вы не ошиблись при вводе (пароль приходится вводить "вслепую", поскольку он не отображается на экране), появится сообщение: passwd: all authentication tokens updated successfully и приглашение системы. Если вы выбрали пароль не очень удачно (слишком короткий или простой), вам будет выдано предупреждение, но система все равно примет пароль и позволит новому пользователю входить с ним в систему.

    Таким образом, вы познакомились с первыми двумя командами системы Linux: useradd и passwd. Следующая команда, о которой нужно знать каждому пользователю любой UNIX-системы - это команда man. Команда man - это система встроенной помощи системы Linux. Вводить ее надо с параметром - именем другой команды или ключевым словом, например,

    В ответ вы получите описание соответствующей команды или информацию по теме, обозначенной ключевым словом. Поскольку информация обычно не помещается на одном экране, при просмотре можно пользоваться клавишами ‹PageUp› и ‹PageDown›, а также клавишей пробела. Нажатие клавиши ‹Q› в любой момент приводит к выходу из режима просмотра и возврату в режим ввода команд. Попробуйте просмотреть информацию по рассмотренным уже командам login и passwd. Заметим, что точно также можно получить информацию по самой команде man. Введите

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

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

    Таблица 3.1. Простейшие команды Linux.

    Команда Краткое описание
    whoami Сообщает имя, с которым вы вошли в систему в данном сеансе работы
    w или who Сообщает, какие пользователи работают в данный момент в системе
    pwd Сообщает имя текущего каталога
    ls -l Выдает список файлов и подкаталогов текущего каталога
    cd ‹имя_каталога› Осуществляет смену текущего каталога
    ps ax Выдает список выполняющихся процессов

    Просмотрите описания этих команд с помощью команды man.

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

    3.3. Консоль, виртуальные терминалы и оболочка

    Итак, вы приобрели первый опыт работы в текстовом, или "консольном", режиме системы Linux. Понятия "терминала" и "консоли", которые встретятся нам еще не раз, требуется, вероятно, дополнительно пояснить.

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

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

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

    Но, кроме консоли, Linux позволяет подключать к компьютеру и удаленные терминалы и, более того, обеспечивает возможность работы с несколькими виртуальными терминалами с одной консоли. Нажмите комбинацию клавиш ‹Ctrl›+‹Alt›+‹F2›. Вы снова увидите приглашение login:. Однако это не возврат к началу работы с системой - вы просто переключились в другой виртуальный терминал. Здесь вы можете зарегистрироваться под другим именем. Попробуйте войти в систему под именем только что заведенного пользователя. После этого нажмите комбинацию клавиш ‹Ctrl›+‹Alt›+‹F1›. Вы вернетесь к первому экрану. По умолчанию Red Hat Linux открывает при запуске 6 параллельных сеансов работы (виртуальных терминалов), и этим иногда очень удобно пользоваться. Для переключения между виртуальными терминалами используются комбинации ‹Ctrl›+‹Alt›+‹F1› - ‹Ctrl›+‹Alt›+‹F6›. (Заметим, что при работе в текстовом режиме тот же результат можно получить, используя комбинации ‹Alt›+‹F1› - ‹Alt›+‹F6›, однако в графическом режиме без клавиши ‹Ctrl› не обойтись, так что лучше сразу привыкать к комбинациям из 3 клавиш). Кстати, если в процессе работы вы забыли, в каком терминале находитесь в данный момент, воспользуйтесь командой tty, которая выводит имя терминала в следующем формате: /dev/tty2.

    Сразу же скажем, что, если вы хотите завершить сеанс работы с системой в одном из терминалов, вы можете сделать это нажатием комбинации клавиш ‹Ctrl›+‹D›. Это не приведет ни к остановке работы компьютера, ни к перезагрузке системы. Не забывайте, что Linux - многозадачная и многопользовательская система. Завершение работы одного пользователя не означает, что надо выключать компьютер. Просто завершается сеанс работы одного из пользователей, и система снова выводит в данном терминале приглашение, которое вы уже видели. Можно завершить сеанс работы и введя одну из команд logout или exit.

    Зная теперь как открыть и закрыть сеанс работы в системе, выполните приведенные выше рекомендации, т. е. заведите себя как рядового пользователя (без суперпользовательских прав), завершите все сеансы работы, открытые от имени root, и снова войдите в систему под своим новым именем.

    Теперь надо сказать несколько слов об оболочке. Оболочка, или просто shell (это слово часто не переводят, а оставляют в английском написании), - это программа, которая осуществляет все общение с пользователем. Именно оболочка воспринимает все команды, вводимые пользователем с клавиатуры, и организует исполнение этих команд. Поэтому оболочку можно назвать еще командным процессором (более привычный термин для пользователя DOS, не правда ли?). Строго говоря, когда выше говорилось, например, "система выводит приглашение", это неправильно, поскольку приглашение выводит именно оболочка, ожидая ввода пользователем очередной команды. Каждый раз, когда очередной пользователь входит в систему, команда login запускает для него командный процессор - оболочку. Если вы логировались со второго терминала под именем пользователя jim (или под другим выбранным вами именем), то обратите теперь внимание на различие в приглашениях у пользователей root и jim. У пользователя root приглашение оканчивается символом #, а у всех остальных пользователей - символом $.

    Оболочку может запускать не только команда login. Вы можете просто ввести команду bash (именно так называется программа-оболочка в системе Red Hat Linux) и тем самым запустить новый экземпляр оболочки. Выходя из него (по команде exit или по комбинации клавиш ‹Ctrl ›+‹ D›) вы вернетесь к предыдущему экземпляру оболочки.

    Оболочка bash является не только командным процессором, но и мощным языком программирования. В ней имеется целый ряд встроенных (внутренних) команд и операторов, а, кроме того, в качестве команды может использоваться любая программа, хранящаяся в виде файла на диске. Список встроенных команд можно получить по команде help. Попробуйте! Детальную информацию по конкретной встроенной команде выдает та же команда help с указанием в качестве параметра имени встроенной команды, например: help cd.

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

    Рассмотрим теперь еще одну команду, которую вам необходимо знать, поскольку все же компьютер у вас персональный (неважно, дома ли это происходит, или на работе). А это значит, что вы и есть суперпользователь данного компьютера. Но, как уже было сказано выше, входить в систему под именем суперпользователя не рекомендуется, поскольку любое неосторожное действие суперпользователя может привести к нежелательным последствиям. Входя под именем простого пользователя, вы, по крайней мере, не можете по неосторожности удалить или испортить системные файлы. В то же время, имеется ряд действий (например, монтирование файловых систем), выполнить которые может только суперпользователь. Не перезагружать же каждый раз компьютер! Именно в таких ситуациях выручает команда su. Достаточно ввести команду su и текущая оболочка (так и хочется сказать "система") запустит для вас новый экземпляр оболочки, в который вы попадете уже с правами пользователя root. Естественно, что для этого вам придется (в ответ на соответствующий запрос) ввести пароль этого пользователя. Закончив выполнять администраторские действия, выйдите из оболочки, и вы снова станете непривилегированным пользователем с отведенными ему полномочиями.

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

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

    Но в ОС Linux есть еще одна возможность временно переключаться в бюджет пользователя root для выполнения административных функций. Вспомните, что Linux - это многопользовательская система, в ней одновременно могут работать несколько пользователей. Поэтому в первом виртуальном терминале можно войти под именем root, а в любом другом терминале - под именем простого пользователя. Основную работу вы можете выполнять как простой пользователь, а когда потребуется выполнить административные функции, вы "зовете системного администратора". Для этого достаточно нажать ‹Ctrl›+‹Alt›+‹F1› - и системный администратор уже тут. По завершении операции, которую может выполнить только суперпользователь, вы немедленно должны вернуться в бюджет простого пользователя. В таком случае вы не рискуете нарушить что-либо в системе, пока еще не набрались необходимого опыта.

    3.4. Редактирование командной строки. История команд

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

    Примечание . Приводимые ниже описания команд относятся к оболочке GNU bash версии 1.14.7(1). Думается, что они будут верны и для последующих версий этой оболочки.

    Таблица 3.2. Клавиши редактирования командной строки

    Клавиша Описание реакции системы
    ‹Стрелка вправо› или ‹Ctrl›+‹F› Перемещение вправо по командной строке в пределах уже набранной цепочки символов плюс один символ справа (место для ввода следующего символа)
    ‹Стрелка влево› или ‹Ctrl›+‹B› Перемещение на один символ влево
    ‹Esc›+‹F› Перемещение на одно слово вправо
    ‹Esc›+‹B› Перемещение на одно слово влево
    ‹Home› или ‹Ctrl›+‹A› Перемещение в начало набранной цепочки символов
    ‹End› или ‹Ctrl›+‹E› Перемещение в начало/конец набранной цепочки символов
    ‹Del› или ‹Ctrl›+‹D› Удаление символа, на который показывает курсор
    ‹Backspase› Удаление символа в позиции, предшествующей курсору
    ‹Ctrl›+‹K› Удалить правую часть строки, начиная с символа, на который указывает курсор
    ‹Ctrl›+‹U› Удалить левую часть строки, включая символ, который находится слева от курсора
    ‹Enter› или ‹Ctrl›+‹M› Запуск на выполнение команды, определяемой набранной цепочкой символов
    ‹Ctrl›+‹L› Очистить экран и поместить текущую команду в верхней строке экрана
    ‹Ctrl›+‹T› Поменять местами два символа: символ, на который показывает курсор, и символ слева от курсора, затем, курсор переместить на один символ вправо
    ‹Esc›+‹T› Поменять местами два слова: слово, на которое указывает курсор и слово слева от первого
    ‹Ctrl›+‹K› Вырезать часть строки от текущей позиции курсора до конца строки (вырезанная часть строки сохраняется в буфере, ее можно вставить в другое место строки)
    ‹Esc›+‹D› Вырезать часть строки от текущей позиции курсора до конца текущего слова (если курсор указывает на пробел между словами, то вырезается все слово справа от курсора)
    ‹Esc›+‹Del› Вырезать часть строки от текущей позиции курсора до начала текущего слова (если курсор указывает на пробел между словами, то вырезается все слово слева от курсора)
    ‹Ctrl›+‹W› Вырезать часть строки от текущей позиции курсора до предыдущего пробела
    ‹Ctrl›+‹Y› Вставить последний вырезанный текст в позицию курсора
    ‹Esc›+‹C› Символ, на который указывает курсор, заменить на тот же, но заглавный, а курсор переместить на первый пробел справа от текущего слова
    ‹Esc›+‹U› Сделать символы данного слова заглавными, начиная с символа, на который указывает курсор, а курсор установить на пробел справа от слова
    ‹Esc›+‹L› Превратить символы, начиная с символа, на который указывает курсор, до конца данного слова в прописные (маленькие) буквы, а курсор установить на пробел справа от слова
    ‹Shift›+‹PgUp› ‹Shift›+‹PgDown› Эти команды позволяют просмотреть несколько страниц экранного вывода (количество зависит от размера видеопамяти); полезны в тех случаях, когда та или иная команда выводит на экран очень много информации, быстро пробегающей по экрану и как бы исчезающей для пользователя; как видите, эта информация не пропадает
    ‹Ctrl›+‹C› Прервать выполнение запущенной команды
    ‹Ctrl›+‹D› Выход из оболочки bash

    Примечание . Если вы работаете не просто в оболочке bash, а запустили программу Midnight Commander, то такие клавиши как ‹Стрелка вправо›, ‹Стрелка влево›, ‹Home›, ‹End›, ‹Del› не могут использоваться так, как указано в приведенной таблице, поскольку они используются для перемещения подсветки в текущей панели . Но указанные выше в скобках комбинации символьных клавиш с клавишами ‹Ctrl› и ‹Esc› по-прежнему действуют для редактирования командной строки.

    Список возможных команд не ограничивается только приведенными в табл. 3.2, но из-за ограниченности объема книги невозможно привести здесь полный перечень клавиатурных команд. Для получения дополнительной информации воспользуйтесь командой info bash.

    Заметим, что оболочка bash имеет встроенную подпрограмму, предназначенную для облегчения ввода команд в командной строке. Эта подпрограмма вызывается при двукратном нажатии клавиши ‹Tab› после того, как вы уже ввели некоторое число символов. Если эти символы являются началом названия одной из стандартных команд, которые известны оболочке, то возможны два варианта реакции оболочки на двукратное нажатие клавиши ‹Tab›. Если по введенным символам команда определяется однозначно, оболочка просто добавляет окончание команды в командную строку. Если однозначно восстановить имя команды по введенным символам невозможно, то выдается список возможных вариантов продолжения для того, чтобы пользователь мог ввести еще несколько символов, позволяющих однозначно завершить ввод команды нажатием клавиши ‹Tab›.

    Если вы попробуете дважды ввести символ табуляции в пустой командной строке, то после первого ввода вы получите только звуковой сигнал, а после второго - примерно следующее сообщение: "There are 1217 possibilities. Do you really wish to see them all? (y or n)" ("Возможны 1217 вариантов завершения. Вы действительно хотите увидеть их все?").

    Если дважды нажать клавишу табуляции после того, как введена одна из команд и пробел, оболочка предполагает, что вы ищете имя файла, который должен вводиться как параметр команды, и выдает в качестве подсказки список файлов текущего каталога. Если же достаточная часть имени файла введена, то заканчивается ввод этого имени в командную строку. Аналогичным образом можно пытаться угадывать окончания переменных окружения, если вместо клавиши ‹Tab› воспользоваться комбинацией ‹Esc›+‹$›.

    Для практической работы с оболочкой также полезно знать, что оболочка запоминает некоторое число введенных команд (по умолчанию 1000, это значение задается в переменной HISTSIZE; см. гл. 5) и позволяет вызывать их путем выбора из списка - так называемой истории команд. Историю команд можно просмотреть, введя в командной строке history (здесь вы сможете воспользоваться комбинациями клавиш ‹Shift›+‹PgUp› и ‹Shift›+‹PgDown›, чтобы просмотреть то, что выдаст эта команда). История команд сохраняется в файле, определяемом переменной HISTFILE (обычно $HOME/.bash_history). Для работы с историей команд в оболочке bash используются следующие комбинации клавиш.

    Таблица 3.3. Клавиши для управления историей команд.

    Клавиша Описание реакции системы
    ‹Стрелка вверх› или ‹Ctrl›+‹P› Переход к предыдущей команде в списке (движение назад по списку)
    ‹Стрелка вниз› или ‹Ctrl›+‹N› Переход к следующей команде в списке (движение вперед по списку)
    ‹PgUp› Переход к (вызов в командную строку) самой первой команде, сохраненной в истории команд
    ‹!›, ‹N› Выполняется (без нажатия клавиши ‹Enter›) n-ная команда из списка истории команд
    ‹!›, ‹-›, ‹N› Выполняется n-ая от конца списка команда
    ‹!›, строка символов Выполняется команда, имя которой начинается на строку символов (поиск нужной команды осуществляется движением в обратном порядке от конца файла истории и выполняется первая попавшаяся команда, которая начинается на строку символов)
    ‹Ctrl›+‹O› То же что нажатие клавиши ‹Enter›, затем отображается очередная команда из файла истории

    3.5. Завершение работы системы Linux

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

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

    Команда shutdown может быть выполнена только пользователем root , так что вы либо должны были войти в систему под этим именем, либо должны предварительно выполнить команду su, чтобы приобрести соответствующие права.

    Команда shutdown имеет следующий синтаксис:

    # shutdown ‹options› ‹time› ‹warning-massage›

    Замечание

    Существует некоторая вероятность того, что запустив команду, вы получите ответ "command not found". Это значит, что оболочка не знает, где находится файл программы. В таком случае вам необходимо ввести команду с указанием полного пути, в данном случае в виде /sbin/shutdown -h, поскольку для команды shutdown файл программы лежит в каталоге /sbin.

    Из опций программы shutdown наиболее часто используются две:

    H - полная остановка системы (компьютер будет выключен);

    R - перезагрузить систему.

    Параметр time указывает время, когда должна быть выполнена команда (не обязательно выполнять ее немедленно). Время можно указать в форме задержки от текущего момента. Например, если вы хотите, чтобы система остановилась через 5 минут, вводите команду

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

    когда вы захотите просто выключить компьютер. Эквивалентом команды

    является команда halt. При нажатии известной комбинации клавиш ‹Ctrl›+‹Alt›+‹Del› в Red Hat Linux выполняются действия, аналогичные команде

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

    3.6. Помощь по работе с Linux

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

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

    Страницы интерактивного руководства man;

    Гипертекстовое руководство info;

    Документация, прилагаемая к пакетам ПО;

    Текстовые файлы HOWTO и FAQ проекта Linux Documentation Project;

    Команда locate.

    Необходимо сразу сказать, что большую часть информации из этих источников вы будете получать на английском языке. Только для русифицированных дистрибутивов часть страниц интерактивного руководства man выдается на русском языке. Можно дополнительно скачать из Интернета имеющиеся там страницы руководства man, переведенные на русский язык [П5.1], и разместить их в соответствующих каталогах. Но все равно, на русский переведено далеко не все. Учитывая это замечание, рассмотрим каждый из перечисленных выше источников информации подробнее.

    3.6.2. Страницы интерактивного руководства man

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

    Таблица 3.4. Основные секции интерактивного руководства man

    Секция Содержание
    1 Команды пользователя
    8 Системные команды
    2 Системные вызовы
    3 Библиотечные вызовы (подпрограммы)
    4 Устройства
    5 Форматы файлов
    6 Игры
    7 Разное
    9 Ядро (kernel internals)
    n Tcl/Tk commands

    Порядок перечисления секций в этой таблице не случаен. Дело в том, что файлы с информацией расположены в подкаталогах каталога /usr/man и команда man ищет нужную информацию, просматривая эти подкаталоги именно в том порядке, который приведен табл. 3.4. Если вы, например, дадите команду

    то получите справку о команде swapon из секции 8. Поэтому если вы хотите получить справку по системному вызову swapon, надо дать команду

    указывая номер секции, в которой надо искать информацию.

    Страницы man просматриваются с помощью команды less (что дает возможность просматривать информацию поэкранно и перемещаться по этим экранам вперед и назад), так что для управления процессом вывода информации можно использовать клавиши, используемые в программе less. Наиболее употребительные:

    Таблица 3.5. Клавиатурные команды, используемые при просмотре man-страниц

    Клавиша Назначение
    ‹Q› Выход из программы
    ‹Enter› Просмотр строка за строкой
    ‹Space› Вывод следующего экрана информации
    ‹B›

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

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

    Когда включается питание, запускается на выполнение загрузочный код, хранящийся на постоянном запоминающем устройстве. Он должен запустить ядро. Ядро опрашивает состояние аппаратных устройств, а затем запускает демон init, идентификатор которого всегда равен 1.

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

    Главное - активизировать командную оболочку

    При нормальной работе системы сами выполняют начальную загрузку в автономном режиме, после чего к ним могут получить удаленный доступ администраторы и пользователи. Однако администраторам необходимо иметь инструмент восстановления системы в случае, если неожиданный отказ дисковода или какая-нибудь проблема конфигурации помешает системе нормально выполнить процесс начальной загрузки. Системы UNIX (вместо загрузки «по полной программе») могут ограничиться только самым необходимым, а именно активизацией командной оболочки на системной консоли. Этот вариант называют входом системы в так называемый «однопользовательский режим», режим восстановления или профилактический режим - все эти термины взаимозаменяемы. Однопользовательский режим не позволяет выполнять сетевые операции, а для использования системной консоли вам нужно иметь физический доступ к ней.

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

    Этапы загрузки

    Типичная процедура начальной загрузки состоит из шести отдельных этапов:

    • считывание начального загрузчика с главной загрузочной записи;
    • обнаружение и конфигурирование устройств;
    • создание процессов ядра;
    • вмешательство администратора (только в однопользовательском режиме);
    • выполнение системных сценариев запуска.

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

    Инициализация ядра

    Ядро представляет собой программу, и в качестве первой задачи начальной загрузки выполняется запись этой программы в память для последующего выполнения. Имя файлу ядра дает его изготовитель, но по традиции оно называется /unix или /vmunix . В Linux-системах ядро обычно получает путевое имя в виде вариации на тему /boot/ vmlinuz .

    В большинстве систем загрузка осуществляется в два этапа. Сначала в память компьютера с диска считывается (с помощью кода, записанного на постоянном запоминающем устройстве) небольшая программа начальной загрузки (именуемая начальным загрузчиком), которая затем выполняет собственно загрузку ядра. Эта процедура совершается вне UNIX-домена и поэтому не стандартизирована среди систем.

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

    Конфигурирование аппаратных средств

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

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

    Создание процессов ядра

    После завершения этапа базовой инициализации ядро создает в области памяти, выделенной для пользовательских программ, несколько «самовыполняющихся» процессов. Это происходит «в обход» стандартного системного механизма fork .

    Количество таких процессов зависит от операционной системы, хотя демон init всегда имеет идентификатор процесса (PID ), равный 1. Большинство систем UNIX использует sched в качестве процесса с идентификатором 0.В Linux процесс с идентификатором PID, равным 0, отсутствует. Демон init работает в сопровождении с различными обработчиками памяти и сигналов ядра. Все эти процессы имеют идентификаторы с низкими номерами, а их имена в листингах команды ps заключены в квадратные скобки (например, ). Иногда имена процессов могут содержать в конце символ косой черты и цифру, как, например, . Число указывает процессор, на котором выполняется данный процесс. Эта информация может быть полезна при настройке многопроцессорной системы.

    Некоторые наиболее часто встречающиеся процессы ядра в Linux-системах
    Процесс Назначение

    k journald Записывает обновления журнала на диска
    kswapd Выполняет подкачку процессов при недостаточном объеме физической памяти

    ksoftirqd Обрабатывает мягкие прерывания, если ими нельзя заняться во время переключения контекста

    khubd Выполняет конфигурирование USB-устройств

    Для каждой смонтированной файловой системы ext3 или ext4 существует один процесс kjoumald.

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

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

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

    Действия оператора (только в режиме восстановления)

    Если систему нужно запустить в режиме восстановления, оператор устанавливает в командной строке специальный флаг, а ядро передает эту информацию демону init в качестве уведомления о запуске. Во время однопользовательской загрузки вы должны получить приглашение ввести пароль пользователя root. Если он введен правильно, запускается интерпретатор команд с правами суперпользователя. Можно не задавать пароль, а просто нажать комбинацию клавиш , после чего загрузка продолжится в многопользовательском режиме

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

    Во многих однопользовательских средах корневой каталог файловой системы монтируется в режиме только для чтения. Если каталог /etc является частью корневой файловой системы (обычная ситуация), редактирование многих файлов конфигурации будет невозможно. Чтобы выйти из положения, придется начать однопользовательский сеанс с повторного монтирования каталога / в режиме чтения/записи. Нужное действие в Linux-системах выполняет следующая команда.

    # mount -о rw,remount /

    В большинстве других систем вы можете выполнить команду mount / , чтобы реализовать обращение к файлу fstab или vfstab и выяснить, как должна быть смонтирована файловая система.

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

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

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

    Выполнение сценариев запуска системы

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

    Точное местонахождение, содержимое и организация сценариев запуска заслуживают отдельного изучения.

    Завершение процесса загрузки

    После выполнения сценариев инициализации система полностью готова к работе. Такие системные демоны, как DNS- и SMTP-серверы, принимают и обслуживают подключения. Не забывайте о том, что демон init продолжает играть важную роль даже по завершении начальной загрузки.

    У демона init есть один однопользовательский и несколько многопользовательских «уровней выполнения», определяющих, какие ресурсы системы будут доступны пользователю.



    В продолжение темы:
    Android

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